blob: 227a5c1e5f23fea3e8aa3a32b7f3f4d1500251de [file] [log] [blame]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <err.h>
#include <stdio.h>
#include <openssl/ec.h>
#include <openssl/pem.h>
static void GenerateKeyPair(void) {
// We use a P256 curve.
EC_KEY* key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
if (key == NULL) {
errx(EXIT_FAILURE, "Failed to create a new EC key.");
}
EC_KEY_set_asn1_flag(key, OPENSSL_EC_NAMED_CURVE);
if (EC_KEY_generate_key(key) == 0) {
errx(EXIT_FAILURE, "Failed to generate the EC key.");
}
if (EC_KEY_check_key(key) == 0) {
errx(EXIT_FAILURE, "Failed to validate the EC key.");
}
if (PEM_write_ECPrivateKey(stdout, key, NULL, NULL, 0, 0, NULL) == 0) {
errx(EXIT_FAILURE, "Failed to print the private key.");
}
if (PEM_write_EC_PUBKEY(stdout, key) == 0) {
errx(EXIT_FAILURE, "Failed to print the public key.");
}
EC_KEY_free(key);
}
static void ShowHelpAndExit(void) {
fprintf(
stderr,
"cros_oobe_crypto\n"
"\n"
"\tGenerates a prime256v1 key pair for OOBE autoconfiguration signing.\n"
"\n"
"\tThe private key is printed in PEM format on the first 5 lines of\n"
"\toutput. The public key printed out in PEM format on the following 4\n"
"\tlines.\n"
"\n"
"\tEach invocation of `cros_oobe_crypto` will create a new keypair.\n");
exit(EXIT_FAILURE);
}
int main(int argc, char** argv) {
if (argc > 1) {
ShowHelpAndExit();
}
GenerateKeyPair();
return EXIT_SUCCESS;
}