void GOSTTests::testSerialisation() { CPPUNIT_ASSERT((gost = CryptoFactory::i()->getAsymmetricAlgorithm("gost"))); // Get GOST R 34.10-2001 params-A domain parameters ECParameters* p = new ECParameters; p->setEC(ByteString("06072a850302022301")); // Serialise the parameters ByteString serialisedParams = p->serialise(); // Deserialise the parameters AsymmetricParameters* dEC; CPPUNIT_ASSERT(gost->reconstructParameters(&dEC, serialisedParams)); CPPUNIT_ASSERT(dEC->areOfType(ECParameters::type)); ECParameters* ddEC = (ECParameters*) dEC; CPPUNIT_ASSERT(p->getEC() == ddEC->getEC()); // Generate a key-pair AsymmetricKeyPair* kp; CPPUNIT_ASSERT(gost->generateKeyPair(&kp, dEC)); // Serialise the key-pair ByteString serialisedKP = kp->serialise(); // Deserialise the key-pair AsymmetricKeyPair* dKP; CPPUNIT_ASSERT(gost->reconstructKeyPair(&dKP, serialisedKP)); // Check the deserialised key-pair GOSTPrivateKey* privKey = (GOSTPrivateKey*) kp->getPrivateKey(); GOSTPublicKey* pubKey = (GOSTPublicKey*) kp->getPublicKey(); GOSTPrivateKey* dPrivKey = (GOSTPrivateKey*) dKP->getPrivateKey(); GOSTPublicKey* dPubKey = (GOSTPublicKey*) dKP->getPublicKey(); CPPUNIT_ASSERT(privKey->getD() == dPrivKey->getD()); CPPUNIT_ASSERT(pubKey->getQ() == dPubKey->getQ()); gost->recycleParameters(p); gost->recycleParameters(dEC); gost->recycleKeyPair(kp); gost->recycleKeyPair(dKP); CryptoFactory::i()->recycleAsymmetricAlgorithm(gost); gost = NULL; }
void ECDSATests::testSerialisation() { // Get prime256v1 domain parameters ECParameters* p = new ECParameters; p->setEC(ByteString("06082a8648ce3d030107")); // Serialise the parameters ByteString serialisedParams = p->serialise(); // Deserialise the parameters AsymmetricParameters* dEC; CPPUNIT_ASSERT(ecdsa->reconstructParameters(&dEC, serialisedParams)); CPPUNIT_ASSERT(dEC->areOfType(ECParameters::type)); ECParameters* ddEC = (ECParameters*) dEC; CPPUNIT_ASSERT(p->getEC() == ddEC->getEC()); // Generate a key-pair AsymmetricKeyPair* kp; CPPUNIT_ASSERT(ecdsa->generateKeyPair(&kp, dEC)); // Serialise the key-pair ByteString serialisedKP = kp->serialise(); // Deserialise the key-pair AsymmetricKeyPair* dKP; CPPUNIT_ASSERT(ecdsa->reconstructKeyPair(&dKP, serialisedKP)); // Check the deserialised key-pair ECPrivateKey* privKey = (ECPrivateKey*) kp->getPrivateKey(); ECPublicKey* pubKey = (ECPublicKey*) kp->getPublicKey(); ECPrivateKey* dPrivKey = (ECPrivateKey*) dKP->getPrivateKey(); ECPublicKey* dPubKey = (ECPublicKey*) dKP->getPublicKey(); CPPUNIT_ASSERT(privKey->getEC() == dPrivKey->getEC()); CPPUNIT_ASSERT(privKey->getD() == dPrivKey->getD()); CPPUNIT_ASSERT(pubKey->getEC() == dPubKey->getEC()); CPPUNIT_ASSERT(pubKey->getQ() == dPubKey->getQ()); ecdsa->recycleParameters(p); ecdsa->recycleParameters(dEC); ecdsa->recycleKeyPair(kp); ecdsa->recycleKeyPair(dKP); }
// Key factory bool OSSLECDSA::generateKeyPair(AsymmetricKeyPair** ppKeyPair, AsymmetricParameters* parameters, RNG* rng /* = NULL */) { // Check parameters if ((ppKeyPair == NULL) || (parameters == NULL)) { return false; } if (!parameters->areOfType(ECParameters::type)) { ERROR_MSG("Invalid parameters supplied for ECDSA key generation"); return false; } ECParameters* params = (ECParameters*) parameters; // Generate the key-pair EC_KEY* eckey = EC_KEY_new(); if (eckey == NULL) { ERROR_MSG("Failed to instantiate OpenSSL ECDSA object"); return false; } EC_GROUP* grp = OSSL::byteString2grp(params->getEC()); EC_KEY_set_group(eckey, grp); EC_GROUP_free(grp); if (!EC_KEY_generate_key(eckey)) { ERROR_MSG("ECDSA key generation failed (0x%08X)", ERR_get_error()); EC_KEY_free(eckey); return false; } // Create an asymmetric key-pair object to return OSSLECKeyPair* kp = new OSSLECKeyPair(); ((OSSLECPublicKey*) kp->getPublicKey())->setFromOSSL(eckey); ((OSSLECPrivateKey*) kp->getPrivateKey())->setFromOSSL(eckey); *ppKeyPair = kp; // Release the key EC_KEY_free(eckey); return true; }
// Key factory bool BotanECDH::generateKeyPair(AsymmetricKeyPair** ppKeyPair, AsymmetricParameters* parameters, RNG* /*rng = NULL */) { // Check parameters if ((ppKeyPair == NULL) || (parameters == NULL)) { return false; } if (!parameters->areOfType(ECParameters::type)) { ERROR_MSG("Invalid parameters supplied for ECDH key generation"); return false; } ECParameters* params = (ECParameters*) parameters; // Generate the key-pair Botan::ECDH_PrivateKey* eckp = NULL; try { BotanRNG* rng = (BotanRNG*)BotanCryptoFactory::i()->getRNG(); eckp = new Botan::ECDH_PrivateKey(*rng->getRNG(), BotanUtil::byteString2ECGroup(params->getEC())); } catch (...) { ERROR_MSG("ECDH key generation failed"); return false; } // Create an asymmetric key-pair object to return BotanECDHKeyPair* kp = new BotanECDHKeyPair(); ((BotanECDHPublicKey*) kp->getPublicKey())->setFromBotan(eckp); ((BotanECDHPrivateKey*) kp->getPrivateKey())->setFromBotan(eckp); *ppKeyPair = kp; // Release the key delete eckp; return true; }
// Key factory bool OSSLGOST::generateKeyPair(AsymmetricKeyPair** ppKeyPair, AsymmetricParameters* parameters, RNG* /*rng = NULL */) { // Check parameters if ((ppKeyPair == NULL) || (parameters == NULL)) { return false; } if (!parameters->areOfType(ECParameters::type)) { ERROR_MSG("Invalid parameters supplied for GOST key generation"); return false; } ECParameters* params = (ECParameters*) parameters; ByteString paramA = "06072a850302022301"; if (params->getEC() != paramA) { ERROR_MSG("unsupported parameters"); return false; } // Generate the key-pair EVP_PKEY_CTX* ctx = NULL; EVP_PKEY* pkey = NULL; OSSLGOSTKeyPair* kp; ctx = EVP_PKEY_CTX_new_id(NID_id_GostR3410_2001, NULL); if (ctx == NULL) { ERROR_MSG("EVP_PKEY_CTX_new_id failed"); goto err; } if (EVP_PKEY_keygen_init(ctx) <= 0) { ERROR_MSG("EVP_PKEY_keygen_init failed"); goto err; } if (EVP_PKEY_CTX_ctrl_str(ctx, "paramset", "A") <= 0) { ERROR_MSG("EVP_PKEY_CTX_ctrl_str failed"); goto err; } if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { ERROR_MSG("EVP_PKEY_keygen failed"); goto err; } EVP_PKEY_CTX_free(ctx); ctx = NULL; // Create an asymmetric key-pair object to return kp = new OSSLGOSTKeyPair(); ((OSSLGOSTPublicKey*) kp->getPublicKey())->setFromOSSL(pkey); ((OSSLGOSTPrivateKey*) kp->getPrivateKey())->setFromOSSL(pkey); *ppKeyPair = kp; // Release the key EVP_PKEY_free(pkey); return true; err: if (ctx != NULL) EVP_PKEY_CTX_free(ctx); if (pkey != NULL) EVP_PKEY_free(pkey); return false; }