common/crypto/key_generator.cpp (103 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #include "common/crypto/key_generator.h" #include <cryptopp/aes.h> #include <cryptopp/cmac.h> #include <cryptopp/dsa.h> #include <cryptopp/eccrypto.h> #include <cryptopp/filters.h> #include <cryptopp/hex.h> #include <cryptopp/osrng.h> #include <cryptopp/pssr.h> #include <cryptopp/rsa.h> #include <cryptopp/sha.h> #include <cryptopp/whrlpool.h> #include <cryptopp/xed25519.h> #include <glog/logging.h> //#include <cryptopp/modes.h> //#include <iomanip> namespace resdb { namespace { //============================================================================== // Return a KeyPairHex for each node. This function is used by the nodes to // obtain their keyPair SecretKey RsaGenerateHexKeyPair(unsigned int key_size) { SecretKey key_pair; // PGP Random Pool-like generator CryptoPP::AutoSeededRandomPool rng; // generate keys CryptoPP::RSA::PrivateKey private_key; private_key.GenerateRandomWithKeySize(rng, key_size); CryptoPP::RSA::PublicKey public_key(private_key); // save keys public_key.Save(CryptoPP::HexEncoder( new CryptoPP::StringSink(*key_pair.mutable_public_key())) .Ref()); private_key.Save(CryptoPP::HexEncoder(new CryptoPP::StringSink( *key_pair.mutable_private_key())) .Ref()); return key_pair; } // Initialize the signer and the keys for ED25519 SecretKey ED25519GenerateKeys() { CryptoPP::ed25519::Signer signer; SecretKey key_pair; CryptoPP::AutoSeededRandomPool prng; // Initilize signer; signer.AccessPrivateKey().GenerateRandom(prng); const CryptoPP::ed25519PrivateKey &private_key = dynamic_cast<const CryptoPP::ed25519PrivateKey &>(signer.GetPrivateKey()); key_pair.mutable_private_key()->assign( (char *)private_key.GetPrivateKeyBytePtr(), CryptoPP::ed25519PrivateKey::SECRET_KEYLENGTH); key_pair.mutable_public_key()->assign( (char *)private_key.GetPublicKeyBytePtr(), CryptoPP::ed25519PrivateKey::PUBLIC_KEYLENGTH); return key_pair; } // CMAC-AES key generator // Return a keyPairHex where just the priv key is set SecretKey CmacGenerateHexKey(unsigned int key_size) { SecretKey key_pair; std::string private_key; CryptoPP::AutoSeededRandomPool prng; // int keySize = 16 ; // AES::DEFAULT_KEYLENGTH CryptoPP::SecByteBlock key(key_size); prng.GenerateBlock( key.data(), key.size()); // Key is a SecByteBlock that contains the key. CryptoPP::StringSource ss(key.data(), key.size(), true, new CryptoPP::HexEncoder(new CryptoPP::StringSink( private_key)) // HexEncoder ); // StringSource key_pair.set_private_key(private_key); key_pair.set_public_key(private_key); return key_pair; } SecretKey ECDSAGenerateKeys() { CryptoPP::AutoSeededRandomPool prng; CryptoPP::ECDSA<CryptoPP::ECP, CryptoPP::SHA256>::PrivateKey privateKey; CryptoPP::DL_GroupParameters_EC<CryptoPP::ECP> params( CryptoPP::ASN1::secp256k1()); privateKey.Initialize(prng, params); CryptoPP::ECDSA<CryptoPP::ECP, CryptoPP::SHA256>::PublicKey publicKey; privateKey.MakePublicKey(publicKey); SecretKey key_pair; // save keys publicKey.Save(CryptoPP::HexEncoder( new CryptoPP::StringSink(*key_pair.mutable_public_key())) .Ref()); privateKey.Save(CryptoPP::HexEncoder( new CryptoPP::StringSink(*key_pair.mutable_private_key())) .Ref()); return key_pair; } } // namespace SecretKey KeyGenerator::GeneratorKeys(SignatureInfo::HashType type) { SecretKey key; switch (type) { case SignatureInfo::RSA: key = RsaGenerateHexKeyPair(3072); break; case SignatureInfo::ED25519: { key = ED25519GenerateKeys(); break; } case SignatureInfo::CMAC_AES: { key = CmacGenerateHexKey(16); break; } case SignatureInfo::ECDSA: { key = ECDSAGenerateKeys(); break; } default: break; } key.set_hash_type(type); return key; } } // namespace resdb