bool BotanDSA::generateParameters(AsymmetricParameters** ppParams, void* parameters /* = NULL */, RNG* rng /* = NULL*/) { if ((ppParams == NULL) || (parameters == NULL)) { return false; } size_t bitLen = (size_t) parameters; if (bitLen < getMinKeySize() || bitLen > getMaxKeySize()) { ERROR_MSG("This DSA key size is not supported"); return false; } Botan::DL_Group* group = NULL; // Taken from OpenSSL size_t qLen = bitLen >= 2048 ? 256 : 160; try { BotanRNG* brng = (BotanRNG*)BotanCryptoFactory::i()->getRNG(); group = new Botan::DL_Group(*brng->getRNG(), Botan::DL_Group::Prime_Subgroup, bitLen, qLen); } catch (...) { ERROR_MSG("Failed to generate %d bit DSA parameters", bitLen); return false; } // Store the DSA parameters DSAParameters* params = new DSAParameters(); ByteString p = BotanUtil::bigInt2ByteString(group->get_p()); params->setP(p); ByteString q = BotanUtil::bigInt2ByteString(group->get_q()); params->setQ(q); ByteString g = BotanUtil::bigInt2ByteString(group->get_g()); params->setG(g); *ppParams = params; delete group; return true; }
bool BotanDH::generateParameters(AsymmetricParameters** ppParams, void* parameters /* = NULL */, RNG* rng /* = NULL*/) { if ((ppParams == NULL) || (parameters == NULL)) { return false; } size_t bitLen = (size_t) parameters; if (bitLen < getMinKeySize() || bitLen > getMaxKeySize()) { ERROR_MSG("This DH key size is not supported"); return false; } Botan::DL_Group* group = NULL; try { BotanRNG* brng = (BotanRNG*)BotanCryptoFactory::i()->getRNG(); group = new Botan::DL_Group(*brng->getRNG(), Botan::DL_Group::Strong, bitLen); } catch (...) { ERROR_MSG("Failed to generate %d bit DH parameters", bitLen); return false; } // Store the DH parameters DHParameters* params = new DHParameters(); ByteString p = BotanUtil::bigInt2ByteString(group->get_p()); params->setP(p); ByteString g = BotanUtil::bigInt2ByteString(group->get_g()); params->setG(g); *ppParams = params; delete group; return true; }
bool OSSLDSA::generateParameters(AsymmetricParameters** ppParams, void* parameters /* = NULL */, RNG* /*rng = NULL*/) { if ((ppParams == NULL) || (parameters == NULL)) { return false; } size_t bitLen = (size_t) parameters; if (bitLen < getMinKeySize() || bitLen > getMaxKeySize()) { ERROR_MSG("This DSA key size is not supported"); return false; } DSA* dsa = DSA_generate_parameters(bitLen, NULL, 0, NULL, NULL, NULL, NULL); if (dsa == NULL) { ERROR_MSG("Failed to generate %d bit DSA parameters", bitLen); return false; } // Store the DSA parameters DSAParameters* params = new DSAParameters(); ByteString p = OSSL::bn2ByteString(dsa->p); params->setP(p); ByteString q = OSSL::bn2ByteString(dsa->q); params->setQ(q); ByteString g = OSSL::bn2ByteString(dsa->g); params->setG(g); *ppParams = params; DSA_free(dsa); return true; }
bool OSSLDH::generateParameters(AsymmetricParameters** ppParams, void* parameters /* = NULL */, RNG* rng /* = NULL*/) { if ((ppParams == NULL) || (parameters == NULL)) { return false; } size_t bitLen = (size_t) parameters; if (bitLen < getMinKeySize() || bitLen > getMaxKeySize()) { ERROR_MSG("This DH key size is not supported"); return false; } DH* dh = DH_generate_parameters(bitLen, 2, NULL, NULL); if (dh == NULL) { ERROR_MSG("Failed to generate %d bit DH parameters", bitLen); return false; } // Store the DH parameters DHParameters* params = new DHParameters(); ByteString p = OSSL::bn2ByteString(dh->p); params->setP(p); ByteString g = OSSL::bn2ByteString(dh->g); params->setG(g); *ppParams = params; DH_free(dh); return true; }
// Key factory bool BotanRSA::generateKeyPair(AsymmetricKeyPair** ppKeyPair, AsymmetricParameters* parameters, RNG* /*rng = NULL */) { // Check parameters if ((ppKeyPair == NULL) || (parameters == NULL)) { return false; } if (!parameters->areOfType(RSAParameters::type)) { ERROR_MSG("Invalid parameters supplied for RSA key generation"); return false; } RSAParameters* params = (RSAParameters*) parameters; if (params->getBitLength() < getMinKeySize() || params->getBitLength() > getMaxKeySize()) { ERROR_MSG("This RSA key size (%lu) is not supported", params->getBitLength()); return false; } // Retrieve the desired public exponent unsigned long e = params->getE().long_val(); // Check the public exponent if ((e == 0) || (e % 2 != 1)) { ERROR_MSG("Invalid RSA public exponent %d", e); return false; } // Create an asymmetric key-pair object to return BotanRSAKeyPair* kp = new BotanRSAKeyPair(); // Generate the key-pair Botan::RSA_PrivateKey* rsa = NULL; try { BotanRNG* rng = (BotanRNG*)BotanCryptoFactory::i()->getRNG(); rsa = new Botan::RSA_PrivateKey(*rng->getRNG(), params->getBitLength(), e); } catch (std::exception& ex) { ERROR_MSG("RSA key generation failed: %s", ex.what()); delete kp; return false; } ((BotanRSAPublicKey*) kp->getPublicKey())->setFromBotan(rsa); ((BotanRSAPrivateKey*) kp->getPrivateKey())->setFromBotan(rsa); *ppKeyPair = kp; // Release the key delete rsa; return true; }
// Key factory bool OSSLRSA::generateKeyPair(AsymmetricKeyPair** ppKeyPair, AsymmetricParameters* parameters, RNG* /*rng = NULL */) { // Check parameters if ((ppKeyPair == NULL) || (parameters == NULL)) { return false; } if (!parameters->areOfType(RSAParameters::type)) { ERROR_MSG("Invalid parameters supplied for RSA key generation"); return false; } RSAParameters* params = (RSAParameters*) parameters; if (params->getBitLength() < getMinKeySize() || params->getBitLength() > getMaxKeySize()) { ERROR_MSG("This RSA key size (%lu) is not supported", params->getBitLength()); return false; } if (params->getBitLength() < 1024) { WARNING_MSG("Using an RSA key size < 1024 bits is not recommended"); } // Retrieve the desired public exponent unsigned long e = params->getE().long_val(); // Check the public exponent if ((e == 0) || (e % 2 != 1)) { ERROR_MSG("Invalid RSA public exponent %d", e); return false; } // Generate the key-pair RSA* rsa = RSA_generate_key(params->getBitLength(), e, NULL, NULL); // Check if the key was successfully generated if (rsa == NULL) { ERROR_MSG("RSA key generation failed (0x%08X)", ERR_get_error()); return false; } // Create an asymmetric key-pair object to return OSSLRSAKeyPair* kp = new OSSLRSAKeyPair(); ((OSSLRSAPublicKey*) kp->getPublicKey())->setFromOSSL(rsa); ((OSSLRSAPrivateKey*) kp->getPrivateKey())->setFromOSSL(rsa); *ppKeyPair = kp; // Release the key RSA_free(rsa); return true; }