Module Name: src Committed By: christos Date: Sun Jan 23 14:55:28 UTC 2022
Modified Files: src/crypto/dist/ipsec-tools/src/racoon: prsa_par.y Log Message: PR/56658: Juraj Hercek: Plain RSA keys are not loaded by racoon IKE daemon To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/crypto/dist/ipsec-tools/src/racoon/prsa_par.y Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/crypto/dist/ipsec-tools/src/racoon/prsa_par.y diff -u src/crypto/dist/ipsec-tools/src/racoon/prsa_par.y:1.7 src/crypto/dist/ipsec-tools/src/racoon/prsa_par.y:1.8 --- src/crypto/dist/ipsec-tools/src/racoon/prsa_par.y:1.7 Tue Feb 6 22:59:03 2018 +++ src/crypto/dist/ipsec-tools/src/racoon/prsa_par.y Sun Jan 23 09:55:28 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: prsa_par.y,v 1.7 2018/02/07 03:59:03 christos Exp $ */ +/* $NetBSD: prsa_par.y,v 1.8 2022/01/23 14:55:28 christos Exp $ */ /* Id: prsa_par.y,v 1.3 2004/11/08 12:04:23 ludvigm Exp */ @@ -87,6 +87,15 @@ enum rsa_key_type prsa_cur_type = RSA_TY static RSA *rsa_cur; +static BIGNUM *bn_n = NULL; /* Modulus */ +static BIGNUM *bn_e = NULL; /* Public Exponent */ +static BIGNUM *bn_d = NULL; /* Private Exponent */ +static BIGNUM *bn_p = NULL; /* Prime1 */ +static BIGNUM *bn_q = NULL; /* Prime2 */ +static BIGNUM *bn_dmp1 = NULL; /* Exponent1 */ +static BIGNUM *bn_dmq1 = NULL; /* Exponent2 */ +static BIGNUM *bn_iqmp = NULL; /* Coefficient */ + void prsaerror(const char *s, ...) { @@ -174,26 +183,35 @@ statement: rsa_statement: TAG_RSA OBRACE params EBRACE { - const BIGNUM *n, *e, *d; - RSA_get0_key(rsa_cur, &n, &e, &d); if (prsa_cur_type == RSA_TYPE_PUBLIC) { prsawarning("Using private key for public key purpose.\n"); - if (!n || !e) { - prsaerror("Incomplete key. Mandatory parameters are missing!\n"); + if (!bn_n || !bn_e) { + prsaerror("Either of mandatory public key parameters " + " - n, d - are missing!\n"); YYABORT; - } - } - else { - const BIGNUM *p, *q, *dmp1, *dmq1, *iqmp; - if (!n || !e || !d) { - prsaerror("Incomplete key. Mandatory parameters are missing!\n"); + } else if (1 != RSA_set0_key(rsa_cur, bn_n, bn_e, NULL)) { + prsaerror("Invalid parameters. Public key not set up!\n"); YYABORT; } - RSA_get0_factors(rsa_cur, &p, &q); - RSA_get0_crt_params(rsa_cur, &dmp1, &dmq1, &iqmp); - if (!p || !q || !dmp1 || !dmq1 || !iqmp) { - RSA_free(rsa_cur); - rsa_cur = RSA_new(); + } else { + if (!bn_n || !bn_e || !bn_d) { + prsaerror("Either of mandatory private key parameters " + "- n, e, d -- are missing!\n"); + YYABORT; + } else if (1 != RSA_set0_key(rsa_cur, bn_n, bn_e, bn_d)) { + prsaerror("Can not use mandatory private key parameters!\n"); + YYABORT; + } else if (!bn_p || !bn_q || !bn_dmp1 || !bn_dmq1 || !bn_iqmp) { + /* If any of the suplementary parameters is missing, continue + * without setting them up. + */ + } else if (1 != RSA_set0_factors(rsa_cur, bn_p, bn_q)) { + prsaerror("Invalid p or q parameter. Private key not set up!\n"); + YYABORT; + } else if (1 != RSA_set0_crt_params(rsa_cur, bn_dmp1, bn_dmq1, bn_iqmp)) { + prsaerror("Invalid dmp1, dmq1 or iqmp parameters. " + "Private key not set up!\n"); + YYABORT; } } $$ = rsa_cur; @@ -297,91 +315,75 @@ params: param: MODULUS COLON HEX { - const BIGNUM *n; - RSA_get0_key(rsa_cur, &n, NULL, NULL); - if (!n) - RSA_set0_key(rsa_cur, $3, NULL, NULL); - else { - prsaerror("Modulus already defined\n"); - YYABORT; - } + if (bn_n) { + prsaerror("Modulus already defined\n"); + YYABORT; + } else { + bn_n = $3; + } } | PUBLIC_EXPONENT COLON HEX { - const BIGNUM *e; - RSA_get0_key(rsa_cur, NULL, &e, NULL); - if (!e) - RSA_set0_key(rsa_cur, NULL, $3, NULL); - else { - prsaerror("PublicExponent already defined\n"); - YYABORT; - } + if (bn_e) { + prsaerror("PublicExponent already defined\n"); + YYABORT; + } else { + bn_e = $3; + } } | PRIVATE_EXPONENT COLON HEX { - const BIGNUM *d; - RSA_get0_key(rsa_cur, NULL, NULL, &d); - if (!d) - RSA_set0_key(rsa_cur, NULL, NULL, $3); - else { - prsaerror("PrivateExponent already defined\n"); - YYABORT; - } + if (bn_d) { + prsaerror("PrivateExponent already defined\n"); + YYABORT; + } else { + bn_d = $3; + } } | PRIME1 COLON HEX { - const BIGNUM *p; - RSA_get0_factors(rsa_cur, &p, NULL); - if (!p) - RSA_set0_factors(rsa_cur, $3, NULL); - else { - prsaerror("Prime1 already defined\n"); - YYABORT; - } + if (bn_p) { + prsaerror("Prime1 already defined\n"); + YYABORT; + } else { + bn_p = $3; + } } | PRIME2 COLON HEX { - const BIGNUM *q; - RSA_get0_factors(rsa_cur, NULL, &q); - if (!q) - RSA_set0_factors(rsa_cur, NULL, $3); - else { - prsaerror("Prime2 already defined\n"); - YYABORT; - } + if (bn_q) { + prsaerror("Prime2 already defined\n"); + YYABORT; + } else { + bn_q = $3; + } } | EXPONENT1 COLON HEX { - const BIGNUM *dmp1; - RSA_get0_crt_params(rsa_cur, &dmp1, NULL, NULL); - if (!dmp1) - RSA_set0_crt_params(rsa_cur, $3, NULL, NULL); - else { - prsaerror("Exponent1 already defined\n"); - YYABORT; - } + if (bn_dmp1) { + prsaerror("Exponent1 already defined\n"); + YYABORT; + } else { + bn_dmp1 = $3; + } } | EXPONENT2 COLON HEX { - const BIGNUM *dmq1; - RSA_get0_crt_params(rsa_cur, NULL, &dmq1, NULL); - if (!dmq1) - RSA_set0_crt_params(rsa_cur, NULL, $3, NULL); - else { - prsaerror("Exponent2 already defined\n"); - YYABORT; - } + if (bn_dmq1) { + prsaerror("Exponent2 already defined\n"); + YYABORT; + } else { + bn_dmq1 = $3; + } } | COEFFICIENT COLON HEX { - const BIGNUM *iqmp; - RSA_get0_crt_params(rsa_cur, NULL, NULL, &iqmp); - if (!iqmp) - RSA_set0_crt_params(rsa_cur, NULL, NULL, $3); - else { - prsaerror("Coefficient already defined\n"); - YYABORT; - } + if (bn_iqmp) { + prsaerror("Coefficient already defined\n"); + YYABORT; + } else { + bn_iqmp = $3; + } } ; %%