On Wed, Jun 12, 2019 at 08:12:04AM +0200, Florian Obser wrote: > > I had a look yesterday and it looks mostly OK. > Something came up and I won't be around the next days. > > Someone can put it and and we can tweak it in tree or we wait a few > days. >
okie dokie, will commit tonight when I get home unless someone beats me to it :-) > On Tue, Jun 11, 2019 at 01:37:24PM +0200, Renaud Allard wrote: > > > > > > On 6/11/19 10:17 AM, Renaud Allard wrote: > > > > > > Hello, > > > > > > Here is a patch with ecdsa and rsa in %token after the domain key name > > > > > > OK? comments? > > > > I just made a small modification in the formatting of acme.conf man page, > > putting keytype as an arg. And also a cleaner key.h > > > > OK? > > > Index: Makefile > > =================================================================== > > RCS file: /cvs/src/usr.sbin/acme-client/Makefile,v > > retrieving revision 1.8 > > diff -u -p -r1.8 Makefile > > --- Makefile 3 Jul 2017 22:21:47 -0000 1.8 > > +++ Makefile 11 Jun 2019 11:35:24 -0000 > > @@ -2,7 +2,7 @@ > > PROG= acme-client > > SRCS= acctproc.c base64.c certproc.c chngproc.c dbg.c > > dnsproc.c > > SRCS+= fileproc.c http.c jsmn.c json.c keyproc.c main.c > > netproc.c > > -SRCS+= parse.y revokeproc.c rsa.c util.c > > +SRCS+= parse.y revokeproc.c key.c util.c > > > > MAN= acme-client.1 acme-client.conf.5 > > > > Index: acctproc.c > > =================================================================== > > RCS file: /cvs/src/usr.sbin/acme-client/acctproc.c,v > > retrieving revision 1.14 > > diff -u -p -r1.14 acctproc.c > > --- acctproc.c 8 Jun 2019 07:52:55 -0000 1.14 > > +++ acctproc.c 11 Jun 2019 11:35:24 -0000 > > @@ -29,7 +29,7 @@ > > #include <openssl/err.h> > > > > #include "extern.h" > > -#include "rsa.h" > > +#include "key.h" > > > > /* > > * Converts a BIGNUM to the form used in JWK. > > @@ -352,7 +352,9 @@ acctproc(int netsock, const char *acctke > > goto out; > > dodbg("%s: generated RSA account key", acctkey); > > } else { > > - if ((pkey = rsa_key_load(f, acctkey)) == NULL) > > + if ((pkey = key_load(f, acctkey)) == NULL) > > + goto out; > > + if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) > > goto out; > > doddbg("%s: loaded RSA account key", acctkey); > > } > > Index: acme-client.conf.5 > > =================================================================== > > RCS file: /cvs/src/usr.sbin/acme-client/acme-client.conf.5,v > > retrieving revision 1.17 > > diff -u -p -r1.17 acme-client.conf.5 > > --- acme-client.conf.5 8 Jan 2019 06:46:29 -0000 1.17 > > +++ acme-client.conf.5 11 Jun 2019 11:35:24 -0000 > > @@ -109,8 +109,10 @@ Specify a list of alternative names for > > The common name is included automatically if this option is present, > > but there is no automatic conversion/inclusion between "www." and > > plain domain name forms. > > -.It Ic domain key Ar file > > +.It Ic domain key Ar file Op Ar keytype > > The private key file for which the certificate will be obtained. > > +.Ar keytype > > +can be rsa or ecdsa. Defaults to rsa. > > .It Ic domain certificate Ar file > > The filename of the certificate that will be issued. > > This is optional if > > Index: extern.h > > =================================================================== > > RCS file: /cvs/src/usr.sbin/acme-client/extern.h,v > > retrieving revision 1.12 > > diff -u -p -r1.12 extern.h > > --- extern.h 8 Jun 2019 07:52:55 -0000 1.12 > > +++ extern.h 11 Jun 2019 11:35:24 -0000 > > @@ -276,6 +276,11 @@ char *json_fmt_signed(const char *, con > > int verbose; > > > > /* > > + * Should we switch to ecdsa? > > + */ > > +int ecdsa; > > + > > +/* > > * What component is the process within (COMP__MAX for none)? > > */ > > enum comp proccomp; > > Index: key.c > > =================================================================== > > RCS file: key.c > > diff -N key.c > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ key.c 11 Jun 2019 11:35:24 -0000 > > @@ -0,0 +1,149 @@ > > +/* $Id: rsa.c,v 1.7 2018/07/28 15:25:23 tb Exp $ */ > > +/* > > + * Copyright (c) 2019 Renaud Allard <ren...@allard.it> > > + * Copyright (c) 2016 Kristaps Dzonsons <krist...@bsd.lv> > > + * > > + * Permission to use, copy, modify, and distribute this software for any > > + * purpose with or without fee is hereby granted, provided that the above > > + * copyright notice and this permission notice appear in all copies. > > + * > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES > > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR > > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > + */ > > + > > +#include <err.h> > > +#include <stdlib.h> > > +#include <unistd.h> > > + > > +#include <openssl/evp.h> > > +#include <openssl/pem.h> > > +#include <openssl/rsa.h> > > +#include <openssl/ecdsa.h> > > +#include <openssl/ec.h> > > +#include <openssl/obj_mac.h> > > + > > +#include "key.h" > > + > > +/* > > + * Default number of bits when creating a new RSA key. > > + */ > > +#define KBITS 4096 > > +#define ECCTYPE NID_secp384r1 > > + > > +/* > > + * Create an RSA key with the default KBITS number of bits. > > + */ > > +EVP_PKEY * > > +rsa_key_create(FILE *f, const char *fname) > > +{ > > + EVP_PKEY_CTX *ctx = NULL; > > + EVP_PKEY *pkey = NULL; > > + > > + /* First, create the context and the key. */ > > + > > + if ((ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)) == NULL) { > > + warnx("EVP_PKEY_CTX_new_id"); > > + goto err; > > + } else if (EVP_PKEY_keygen_init(ctx) <= 0) { > > + warnx("EVP_PKEY_keygen_init"); > > + goto err; > > + } else if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, KBITS) <= 0) { > > + warnx("EVP_PKEY_set_rsa_keygen_bits"); > > + goto err; > > + } else if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { > > + warnx("EVP_PKEY_keygen"); > > + goto err; > > + } > > + > > + /* Serialise the key to the disc. */ > > + > > + if (PEM_write_PrivateKey(f, pkey, NULL, NULL, 0, NULL, NULL)) > > + goto out; > > + > > + warnx("%s: PEM_write_PrivateKey", fname); > > + > > +err: > > + EVP_PKEY_free(pkey); > > + pkey = NULL; > > +out: > > + EVP_PKEY_CTX_free(ctx); > > + return pkey; > > +} > > + > > +EVP_PKEY * > > +ec_key_create(FILE *f, const char *fname) > > +{ > > + EC_KEY *eckey = NULL; > > + EVP_PKEY *pkey = NULL; > > + > > + if ((eckey = EC_KEY_new()) == NULL ) { > > + warnx("EC_KEY_new"); > > + goto err; > > + } else if ((eckey = EC_KEY_new_by_curve_name(ECCTYPE)) == NULL ) { > > + warnx("EC_GROUP_new_by_curve_name"); > > + goto err; > > + } > > + > > + if (!EC_KEY_generate_key(eckey)) { > > + warnx("EC_KEY_generate_key"); > > + goto err; > > + } > > + > > + /* set OPENSSL_EC_NAMED_CURVE to be able to load the key */ > > + > > + EC_KEY_set_asn1_flag(eckey, OPENSSL_EC_NAMED_CURVE); > > + > > + /* Serialise the key to the disc in EC format */ > > + > > + if (!PEM_write_ECPrivateKey(f, eckey, NULL, NULL, 0, NULL, NULL)) { > > + warnx("PEM_write_ECPrivateKey"); > > + goto err; > > + } > > + > > + /* Convert the EC key into a PKEY structure */ > > + > > + if ((pkey=EVP_PKEY_new()) == NULL) { > > + warnx("EVP_PKEY_new"); > > + goto err; > > + } > > + if (!EVP_PKEY_set1_EC_KEY(pkey, eckey)) { > > + warnx("EVP_PKEY_assign_EC_KEY"); > > + goto err; > > + } > > + > > + warnx("%s: PEM_write_ECPrivateKey", fname); > > + > > + goto out; > > + > > +err: > > + EC_KEY_free(eckey); > > + EVP_PKEY_free(pkey); > > + pkey = NULL; > > +out: > > + return pkey; > > +} > > + > > + > > + > > +EVP_PKEY * > > +key_load(FILE *f, const char *fname) > > +{ > > + EVP_PKEY *pkey; > > + > > + pkey = PEM_read_PrivateKey(f, NULL, NULL, NULL); > > + if (pkey == NULL) { > > + warnx("%s: PEM_read_PrivateKey", fname); > > + return NULL; > > + } else if (EVP_PKEY_type(pkey->type) == EVP_PKEY_RSA || > > + EVP_PKEY_type(pkey->type) == EVP_PKEY_EC ) > > + return pkey; > > + > > + warnx("%s: unsupported key type", fname); > > + EVP_PKEY_free(pkey); > > + return NULL; > > +} > > Index: key.h > > =================================================================== > > RCS file: key.h > > diff -N key.h > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ key.h 11 Jun 2019 11:35:24 -0000 > > @@ -0,0 +1,25 @@ > > +/* $Id: rsa.h,v 1.1 2016/08/31 22:01:42 florian Exp $ */ > > +/* > > + * Copyright (c) 2019 Renaud Allard <ren...@allard.it> > > + * Copyright (c) 2016 Kristaps Dzonsons <krist...@bsd.lv> > > + * > > + * Permission to use, copy, modify, and distribute this software for any > > + * purpose with or without fee is hereby granted, provided that the above > > + * copyright notice and this permission notice appear in all copies. > > + * > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES > > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR > > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > + */ > > +#ifndef KEY_H > > +#define KEY_H > > + > > +EVP_PKEY *rsa_key_create(FILE *, const char *); > > +EVP_PKEY *ec_key_create(FILE *, const char *); > > +EVP_PKEY *key_load(FILE *, const char *); > > + > > +#endif /* ! KEY_H */ > > Index: keyproc.c > > =================================================================== > > RCS file: /cvs/src/usr.sbin/acme-client/keyproc.c,v > > retrieving revision 1.12 > > diff -u -p -r1.12 keyproc.c > > --- keyproc.c 8 Jun 2019 07:52:55 -0000 1.12 > > +++ keyproc.c 11 Jun 2019 11:35:25 -0000 > > @@ -30,7 +30,7 @@ > > #include <openssl/x509v3.h> > > > > #include "extern.h" > > -#include "rsa.h" > > +#include "key.h" > > > > /* > > * This was lifted more or less directly from demos/x509/mkreq.c of the > > @@ -117,13 +117,19 @@ keyproc(int netsock, const char *keyfile > > } > > > > if (newkey) { > > - if ((pkey = rsa_key_create(f, keyfile)) == NULL) > > - goto out; > > - dodbg("%s: generated RSA domain key", keyfile); > > + if (ecdsa) { > > + if ((pkey = ec_key_create(f, keyfile)) == NULL) > > + goto out; > > + dodbg("%s: generated ECDSA domain key", keyfile); > > + } else { > > + if ((pkey = rsa_key_create(f, keyfile)) == NULL) > > + goto out; > > + dodbg("%s: generated RSA domain key", keyfile); > > + } > > } else { > > - if ((pkey = rsa_key_load(f, keyfile)) == NULL) > > + if ((pkey = key_load(f, keyfile)) == NULL) > > goto out; > > - doddbg("%s: loaded RSA domain key", keyfile); > > + doddbg("%s: loaded domain key", keyfile); > > } > > > > fclose(f); > > Index: main.c > > =================================================================== > > RCS file: /cvs/src/usr.sbin/acme-client/main.c,v > > retrieving revision 1.47 > > diff -u -p -r1.47 main.c > > --- main.c 8 Jun 2019 07:52:55 -0000 1.47 > > +++ main.c 11 Jun 2019 11:35:25 -0000 > > @@ -49,6 +49,7 @@ main(int argc, char *argv[]) > > int popts = 0; > > pid_t pids[COMP__MAX]; > > extern int verbose; > > + extern int ecdsa; > > extern enum comp proccomp; > > size_t i, altsz, ne; > > > > @@ -145,6 +146,10 @@ main(int argc, char *argv[]) > > authority = authority_find(conf, auth); > > if (authority == NULL) > > errx(EXIT_FAILURE, "authority %s not found", auth); > > + } > > + > > + if (domain->keytype == 1) { > > + ecdsa = 1; > > } > > > > acctkey = authority->account; > > Index: parse.h > > =================================================================== > > RCS file: /cvs/src/usr.sbin/acme-client/parse.h,v > > retrieving revision 1.10 > > diff -u -p -r1.10 parse.h > > --- parse.h 8 Jun 2019 07:52:55 -0000 1.10 > > +++ parse.h 11 Jun 2019 11:35:25 -0000 > > @@ -38,6 +38,7 @@ struct domain_c { > > TAILQ_ENTRY(domain_c) entry; > > TAILQ_HEAD(, altname_c) altname_list; > > int altname_count; > > + int keytype; > > char *domain; > > char *key; > > char *cert; > > Index: parse.y > > =================================================================== > > RCS file: /cvs/src/usr.sbin/acme-client/parse.y,v > > retrieving revision 1.34 > > diff -u -p -r1.34 parse.y > > --- parse.y 8 Jun 2019 07:52:55 -0000 1.34 > > +++ parse.y 11 Jun 2019 11:35:25 -0000 > > @@ -38,6 +38,7 @@ > > #include <unistd.h> > > > > #include "parse.h" > > +#include "extern.h" > > > > TAILQ_HEAD(files, file) files = TAILQ_HEAD_INITIALIZER(files); > > static struct file { > > @@ -99,10 +100,11 @@ typedef struct { > > %} > > > > %token AUTHORITY URL API ACCOUNT > > -%token DOMAIN ALTERNATIVE NAMES CERT FULL CHAIN KEY SIGN WITH > > CHALLENGEDIR > > +%token DOMAIN ALTERNATIVE NAMES CERT FULL CHAIN KEY SIGN WITH > > CHALLENGEDIR KEYTYPE > > %token YES NO > > %token INCLUDE > > %token ERROR > > +%token RSA ECDSA > > %token <v.string> STRING > > %token <v.number> NUMBER > > %type <v.string> string > > @@ -258,12 +260,21 @@ domain : DOMAIN STRING { > > } > > ; > > > > +keytype : RSA { > > + domain->keytype = 0; > > + } > > + | ECDSA { > > + domain->keytype = 1; > > + } > > + | /* nothing */ > > + ; > > + > > domainopts_l : domainopts_l domainoptsl nl > > | domainoptsl optnl > > ; > > > > domainoptsl : ALTERNATIVE NAMES '{' altname_l '}' > > - | DOMAIN KEY STRING { > > + | DOMAIN KEY STRING keytype { > > char *s; > > if (domain->key != NULL) { > > yyerror("duplicate key"); > > @@ -427,10 +438,12 @@ lookup(char *s) > > {"chain", CHAIN}, > > {"challengedir", CHALLENGEDIR}, > > {"domain", DOMAIN}, > > + {"ecdsa", ECDSA}, > > {"full", FULL}, > > {"include", INCLUDE}, > > {"key", KEY}, > > {"names", NAMES}, > > + {"rsa", RSA}, > > {"sign", SIGN}, > > {"url", URL}, > > {"with", WITH}, > > Index: rsa.c > > =================================================================== > > RCS file: rsa.c > > diff -N rsa.c > > --- rsa.c 28 Jul 2018 15:25:23 -0000 1.7 > > +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > @@ -1,88 +0,0 @@ > > -/* $Id: rsa.c,v 1.7 2018/07/28 15:25:23 tb Exp $ */ > > -/* > > - * Copyright (c) 2016 Kristaps Dzonsons <krist...@bsd.lv> > > - * > > - * Permission to use, copy, modify, and distribute this software for any > > - * purpose with or without fee is hereby granted, provided that the above > > - * copyright notice and this permission notice appear in all copies. > > - * > > - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES > > - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > > - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR > > - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > > - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > > - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > > - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > - */ > > - > > -#include <err.h> > > -#include <stdlib.h> > > -#include <unistd.h> > > - > > -#include <openssl/evp.h> > > -#include <openssl/pem.h> > > -#include <openssl/rsa.h> > > - > > -#include "rsa.h" > > - > > -/* > > - * Default number of bits when creating a new key. > > - */ > > -#define KBITS 4096 > > - > > -/* > > - * Create an RSA key with the default KBITS number of bits. > > - */ > > -EVP_PKEY * > > -rsa_key_create(FILE *f, const char *fname) > > -{ > > - EVP_PKEY_CTX *ctx = NULL; > > - EVP_PKEY *pkey = NULL; > > - > > - /* First, create the context and the key. */ > > - > > - if ((ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)) == NULL) { > > - warnx("EVP_PKEY_CTX_new_id"); > > - goto err; > > - } else if (EVP_PKEY_keygen_init(ctx) <= 0) { > > - warnx("EVP_PKEY_keygen_init"); > > - goto err; > > - } else if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, KBITS) <= 0) { > > - warnx("EVP_PKEY_set_rsa_keygen_bits"); > > - goto err; > > - } else if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { > > - warnx("EVP_PKEY_keygen"); > > - goto err; > > - } > > - > > - /* Serialise the key to the disc. */ > > - > > - if (PEM_write_PrivateKey(f, pkey, NULL, NULL, 0, NULL, NULL)) > > - goto out; > > - > > - warnx("%s: PEM_write_PrivateKey", fname); > > -err: > > - EVP_PKEY_free(pkey); > > - pkey = NULL; > > -out: > > - EVP_PKEY_CTX_free(ctx); > > - return pkey; > > -} > > - > > - > > -EVP_PKEY * > > -rsa_key_load(FILE *f, const char *fname) > > -{ > > - EVP_PKEY *pkey; > > - > > - pkey = PEM_read_PrivateKey(f, NULL, NULL, NULL); > > - if (pkey == NULL) { > > - warnx("%s: PEM_read_PrivateKey", fname); > > - return NULL; > > - } else if (EVP_PKEY_type(pkey->type) == EVP_PKEY_RSA) > > - return pkey; > > - > > - warnx("%s: unsupported key type", fname); > > - EVP_PKEY_free(pkey); > > - return NULL; > > -} > > Index: rsa.h > > =================================================================== > > RCS file: rsa.h > > diff -N rsa.h > > --- rsa.h 31 Aug 2016 22:01:42 -0000 1.1 > > +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > @@ -1,23 +0,0 @@ > > -/* $Id: rsa.h,v 1.1 2016/08/31 22:01:42 florian Exp $ */ > > -/* > > - * Copyright (c) 2016 Kristaps Dzonsons <krist...@bsd.lv> > > - * > > - * Permission to use, copy, modify, and distribute this software for any > > - * purpose with or without fee is hereby granted, provided that the above > > - * copyright notice and this permission notice appear in all copies. > > - * > > - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES > > - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > > - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR > > - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > > - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > > - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > > - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > > - */ > > -#ifndef RSA_H > > -#define RSA_H > > - > > -EVP_PKEY *rsa_key_create(FILE *, const char *); > > -EVP_PKEY *rsa_key_load(FILE *, const char *); > > - > > -#endif /* ! RSA_H */ > > > > > -- > I'm not entirely sure you are real. > -- Gilles Chehade @poolpOrg https://www.poolp.org tip me: https://paypal.me/poolpOrg