Using keys manager for verification/decryption.: XML Security Library Reference Manual

## Using keys manager for verification/decryption.

If more than one key could be used for signature or encryption, then using `signKey` member of xmlSecDSigCtx structure or `encKey` member of xmlSecEncCtx structure is not possible. Instead, the application should load known keys in the keys manager and use <dsig:KeyName/> element to specify the key name.

Example 18. Initializing keys manager and loading DES keys from binary files.

    /**
     * load_des_keys:
     * @files:		the list of filenames.
     * @files_size:		the number of filenames in #files.
     *
     * Creates default keys manager and load DES keys from #files in it.
     * The caller is responsible for destroing returned keys manager using
     * @xmlSecKeysMngrDestroy.
     *
     * Returns the pointer to newly created keys manager or NULL if an error
     * occurs.
     */
    xmlSecKeysMngrPtr
    load_des_keys(char** files, int files_size) {
        xmlSecKeysMngrPtr mngr;
        xmlSecKeyPtr key;
        int i;

        assert(files);
        assert(files_size > 0);

        /* create and initialize keys manager, we use a default list based
         * keys manager, implement your own xmlSecKeysStore klass if you need
         * something more sophisticated
         */
        mngr = xmlSecKeysMngrCreate();
        if(mngr == NULL) {
    	fprintf(stderr, "Error: failed to create keys manager.\n");
    	return(NULL);
        }
        if(xmlSecCryptoAppDefaultKeysMngrInit(mngr) < 0) {
    	fprintf(stderr, "Error: failed to initialize keys manager.\n");
    	xmlSecKeysMngrDestroy(mngr);
    	return(NULL);
        }

        for(i = 0; i < files_size; ++i) {
    	assert(files[i]);

    	/* load DES key */
    	key = xmlSecKeyReadBinaryFile(xmlSecKeyDataDesId, files[i]);
    	if(key == NULL) {
        	    fprintf(stderr,"Error: failed to load des key from binary file \"%s\"\n", files[i]);
    	    xmlSecKeysMngrDestroy(mngr);
    	    return(NULL);
    	}

    	/* set key name to the file name, this is just an example! */
    	if(xmlSecKeySetName(key, BAD_CAST files[i]) < 0) {
        	    fprintf(stderr,"Error: failed to set key name for key from \"%s\"\n", files[i]);
    	    xmlSecKeyDestroy(key);
    	    xmlSecKeysMngrDestroy(mngr);
    	    return(NULL);
    	}

    	/* add key to keys manager, from now on keys manager is responsible
    	 * for destroying key
    	 */
    	if(xmlSecCryptoAppDefaultKeysMngrAdoptKey(mngr, key) < 0) {
        	    fprintf(stderr,"Error: failed to add key from \"%s\" to keys manager\n", files[i]);
    	    xmlSecKeyDestroy(key);
    	    xmlSecKeysMngrDestroy(mngr);
    	    return(NULL);
    	}
        }

        return(mngr);
    }

Full program listing