in xsec/tools/xklient/xklient.cpp [3452:3572]
int doRecoverResultDump(XKMSRecoverResult *msg) {
cout << endl << "This is a RecoverResult Message" << endl;
unsigned int level = 1;
doMessageAbstractTypeDump(msg, level);
doResultTypeDump(msg, level);
int j;
if ((j = msg->getKeyBindingSize()) > 0) {
cout << endl;
levelSet(level);
cout << "Key Bindings" << endl << endl;
for (int i = 0; i < j ; ++i) {
doKeyBindingDump(msg->getKeyBindingItem(i), level + 1);
}
}
// Check if there is a private key
if (g_authPassPhrase) {
XKMSRSAKeyPair * kp = msg->getRSAKeyPair(g_authPassPhrase);
if (kp != NULL) {
cout << endl;
levelSet(level);
cout << "RSAKeyPair found" << endl << endl;
level += 1;
// Translate the parameters to char strings
char * sModulus = XMLString::transcode(kp->getModulus());
char * sExponent = XMLString::transcode(kp->getExponent());
char * sP = XMLString::transcode(kp->getP());
char * sQ = XMLString::transcode(kp->getQ());
char * sDP = XMLString::transcode(kp->getDP());
char * sDQ = XMLString::transcode(kp->getDQ());
char * sInverseQ = XMLString::transcode(kp->getInverseQ());
char * sD = XMLString::transcode(kp->getD());
#if defined (XSEC_HAVE_OPENSSL)
if (g_privateKeyFile != NULL) {
levelSet(level);
cout << "Writing private key to file " << g_privateKeyFile;
// Create the RSA key file
RSA * rsa = RSA_new();
RSA_set0_key(rsa,
OpenSSLCryptoBase64::b642BN(sModulus, (unsigned int) strlen(sModulus)),
OpenSSLCryptoBase64::b642BN(sExponent, (unsigned int) strlen(sExponent)),
OpenSSLCryptoBase64::b642BN(sD, (unsigned int) strlen(sD)));
RSA_set0_factors(rsa,
OpenSSLCryptoBase64::b642BN(sP, (unsigned int) strlen(sP)),
OpenSSLCryptoBase64::b642BN(sQ, (unsigned int) strlen(sQ)));
RSA_set0_crt_params(rsa,
OpenSSLCryptoBase64::b642BN(sDP, (unsigned int) strlen(sDP)),
OpenSSLCryptoBase64::b642BN(sDQ, (unsigned int) strlen(sDQ)),
OpenSSLCryptoBase64::b642BN(sInverseQ, (unsigned int) strlen(sInverseQ)));
// Write it to disk
BIO *out;
out = BIO_new_file(g_privateKeyFile, "w");
if(!out) cout << "Error occurred in opening file!" << endl << endl;
if (!PEM_write_bio_RSAPrivateKey(out, rsa, EVP_des_ede3_cbc(), NULL, 0, 0, g_privateKeyPassPhrase)) {
cout << "Error creating PEM output" << endl << endl;
}
BIO_free(out);
RSA_free(rsa);
cout << " done" << endl << endl;
}
#endif
// Now output
levelSet(level);
cout << "Modulus = " << sModulus << endl;
XSEC_RELEASE_XMLCH(sModulus);
levelSet(level);
cout << "Exponent = " << sExponent << endl;
XSEC_RELEASE_XMLCH(sExponent);
levelSet(level);
cout << "P = " << sP << endl;
XSEC_RELEASE_XMLCH(sP);
levelSet(level);
cout << "Q = " << sQ << endl;
XSEC_RELEASE_XMLCH(sQ);
levelSet(level);
cout << "DP = " << sDP << endl;
XSEC_RELEASE_XMLCH(sDP);
levelSet(level);
cout << "DQ = " << sDQ << endl;
XSEC_RELEASE_XMLCH(sDQ);
levelSet(level);
cout << "Inverse Q = " << sInverseQ << endl;
XSEC_RELEASE_XMLCH(sInverseQ);
levelSet(level);
cout << "D = " << sD << endl;
XSEC_RELEASE_XMLCH(sD);
}
}
else {
levelSet(level);
cout << "Not checking for private key as no decryption phrase set";
}
return 0;
}