1b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root/* Copyright (c) 2015, Google Inc. 2b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * 3b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * Permission to use, copy, modify, and/or distribute this software for any 4b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * purpose with or without fee is hereby granted, provided that the above 5b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * copyright notice and this permission notice appear in all copies. 6b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * 7b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 14b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 15b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root#include <openssl/bio.h> 16b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root#include <openssl/bn.h> 17b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root#include <openssl/err.h> 18b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root#include <openssl/pem.h> 19b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root#include <openssl/rsa.h> 20b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 21b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root#include "internal.h" 22b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 23b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 24b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Rootstatic const struct argument kArguments[] = { 25b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root { 26b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root "-bits", kOptionalArgument, 27b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root "The number of bits in the modulus (default: 2048)", 28b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root }, 29b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root { 30b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root "", kOptionalArgument, "", 31b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root }, 32b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root}; 33b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 34b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Rootbool GenerateRSAKey(const std::vector<std::string> &args) { 35b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root std::map<std::string, std::string> args_map; 36b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 37b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root if (!ParseKeyValueArguments(&args_map, args, kArguments)) { 38b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root PrintUsage(kArguments); 39b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root return false; 40b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root } 41b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 42572a4e2e687520da9e518528d7371b794b1decc0Robert Sloan unsigned bits; 43572a4e2e687520da9e518528d7371b794b1decc0Robert Sloan if (!GetUnsigned(&bits, "-bits", 2048, args_map)) { 44b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root PrintUsage(kArguments); 45b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root return false; 46b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root } 47b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 48f0c4a6c4bbde5229ceb86740703243fe5c436aadDavid Benjamin bssl::UniquePtr<RSA> rsa(RSA_new()); 49f0c4a6c4bbde5229ceb86740703243fe5c436aadDavid Benjamin bssl::UniquePtr<BIGNUM> e(BN_new()); 50f0c4a6c4bbde5229ceb86740703243fe5c436aadDavid Benjamin bssl::UniquePtr<BIO> bio(BIO_new_fp(stdout, BIO_NOCLOSE)); 51b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 52b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root if (!BN_set_word(e.get(), RSA_F4) || 53572a4e2e687520da9e518528d7371b794b1decc0Robert Sloan !RSA_generate_key_ex(rsa.get(), bits, e.get(), NULL) || 54b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root !PEM_write_bio_RSAPrivateKey(bio.get(), rsa.get(), NULL /* cipher */, 55b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root NULL /* key */, 0 /* key len */, 56b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root NULL /* password callback */, 57b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root NULL /* callback arg */)) { 58b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root ERR_print_errors_fp(stderr); 59b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root return false; 60b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root } 61b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root 62b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root return true; 63b8494591d1b1a143f3b192d845c238bbf3bc629dKenny Root} 64