Exemple #1
0
    unsigned char* CreatePrivateKey(size_t* len, size_t* pubLen) {
        AutoSeededRandomPool rand;

        InvertibleRSAFunction params;
        params.GenerateRandomWithKeySize(rand,4096);
        const Integer& modulus = params.GetModulus();
        const Integer& exponent = params.GetPublicExponent();
        const Integer& private_exponent = params.GetPrivateExponent();
        size_t dlen = 4+modulus.MinEncodedSize()+4+exponent.MinEncodedSize()+4+private_exponent.MinEncodedSize();
        unsigned char* izard = new unsigned char[dlen];
        unsigned char* str = izard;
        uint32_t cval = modulus.MinEncodedSize();
        memcpy(str,&cval,4);
        str+=4;
        modulus.Encode(str,modulus.MinEncodedSize());
        str+=modulus.MinEncodedSize();
        cval = exponent.MinEncodedSize();
        memcpy(str,&cval,4);
        str+=4;
        exponent.Encode(str,exponent.MinEncodedSize());
        str+=exponent.MinEncodedSize();
        cval = private_exponent.MinEncodedSize();
        memcpy(str,&cval,4);
        str+=4;
        *pubLen = ((size_t)str-(size_t)izard);
        private_exponent.Encode(str,private_exponent.MinEncodedSize());
        str+=private_exponent.MinEncodedSize();
        *len = dlen;
        return izard;
    }
int
main(int argc, char ** argv)
{
	if (argc != 2) {
		cout << "Usage: keygen <outputname>" << endl;
		return -1;
	}
	AutoSeededRandomPool rng;
	InvertibleRSAFunction params;
	params.GenerateRandomWithKeySize(rng, 3072);
	RSA::PublicKey pubkey(params);
	RSA::PrivateKey privkey(params);

	Integer m = params.GetModulus();
	Integer p = params.GetModulus();
	Integer q = params.GetModulus();
	Integer priv = params.GetPrivateExponent();
	Integer pub = params.GetPublicExponent();

	string privname = string(argv[1]).append(".priv");
	string pubname = string(argv[1]).append(".pub");

	CryptoEngine::pubkeyToFile(pubkey, pubname);
	CryptoEngine::privkeyToFile(privkey, privname);

	cout << "Loading and verifying..." << endl;

	RSA::PrivateKey newpriv = CryptoEngine::privkeyFromFile(privname);
	RSA::PublicKey newpub = CryptoEngine::pubkeyFromFile(pubname);

	cout << (m == newpriv.GetModulus() ? "TRUE" : "FALSE") << endl;
	cout << (priv == newpriv.GetPrivateExponent() ? "TRUE" : "FALSE") << endl;
	cout << (pub == newpriv.GetPublicExponent() ? "TRUE" : "FALSE") << endl;

	cout << (m == newpub.GetModulus() ? "TRUE" : "FALSE") << endl;
	cout << (pub == newpub.GetPublicExponent() ? "TRUE" : "FALSE") << endl;

	return 0;
}