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