in xsec/tools/xtest/xtest.cpp [1933:2036]
void unitTestKeyEncrypt(
DOMImplementation* impl,
XSECCryptoKey* k,
const XMLCh* algorithm,
const XMLCh* mgf=NULL,
unsigned char* oaepParams=NULL,
unsigned int oaepParamsLen=0
) {
// Create a document that we will embed the encrypted key in
DOMDocument *doc = impl->createDocument(
0, // root element namespace URI.
MAKE_UNICODE_STRING("ADoc"), // root element name
NULL);// DOMDocumentType()); // document type object (DTD).
DOMElement *rootElem = doc->getDocumentElement();
// Use key k to wrap a test key, decrypt it and make sure it is still OK
XSECProvider prov;
XENCCipher * cipher;
try {
// Encrypt a dummy key
cerr << "encrypt ... ";
static unsigned char toEncryptStr[] = "A test key to use for da";
cipher = prov.newCipher(doc);
cipher->setXENCNSPrefix(MAKE_UNICODE_STRING("xenc"));
cipher->setPrettyPrint(true);
// Set a key
cipher->setKEK(k);
XENCEncryptedKey * encryptedKey;
encryptedKey = cipher->encryptKey(
toEncryptStr, (unsigned int) strlen((char *) toEncryptStr), algorithm, mgf, oaepParams, oaepParamsLen
);
Janitor<XENCEncryptedKey> j_encryptedKey(encryptedKey);
rootElem->appendChild(encryptedKey->getElement());
// Decrypt
cerr << "decrypt ... ";
XMLByte decBuf[64];
cipher->decryptKey(encryptedKey, decBuf, 64);
// Check
cerr << "comparing ... ";
if (memcmp(decBuf, toEncryptStr, strlen((char *) toEncryptStr)) == 0) {
cerr << "OK ... ";
}
else {
cerr << "different = failed!" << endl;
exit(2);
}
cerr << "decrypt from DOM ... ";
// Decrypt from DOM
DOMNode * keyNode = findXENCNode(doc, "EncryptedKey");
if (keyNode == NULL) {
cerr << "no key - failed!" << endl;
exit(2);
}
memset(decBuf, 0, 64);
cipher->decryptKey((DOMElement *) keyNode, decBuf, 64);
cerr << "comparing ... ";
if (memcmp(decBuf, toEncryptStr, strlen((char *) toEncryptStr)) == 0) {
cerr << "OK" << endl;
}
else {
cerr << "different = failed!" << endl;
exit(2);
}
}
catch (const XSECException &e)
{
cerr << "failed\n";
cerr << "An error occurred during signature processing\n Message: ";
char * ce = XMLString::transcode(e.getMsg());
cerr << ce << endl;
delete ce;
exit(1);
}
catch (const XSECCryptoException &e)
{
cerr << "failed\n";
cerr << "A cryptographic error occurred during signature processing\n Message: "
<< e.getMsg() << endl;
exit(1);
}
outputDoc(impl, doc);
doc->release();
}