int doRecoverResultDump()

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;
}