]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/dsa/dsa_ameth.c
Following the license change, modify the boilerplates in crypto/dsa/
[thirdparty/openssl.git] / crypto / dsa / dsa_ameth.c
CommitLineData
0f113f3e 1/*
d2e9e320 2 * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
448be743 3 *
3cdbea65 4 * Licensed under the Apache License 2.0 (the "License"). You may not use
d2e9e320
RS
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
448be743
DSH
8 */
9
10#include <stdio.h>
b39fc560 11#include "internal/cryptlib.h"
448be743
DSH
12#include <openssl/x509.h>
13#include <openssl/asn1.h>
1258396d 14#include "dsa_locl.h"
1e26a8ba 15#include <openssl/bn.h>
3c27208f 16#include <openssl/cms.h>
5fe736e5 17#include "internal/asn1_int.h"
3aeb9348 18#include "internal/evp_int.h"
448be743
DSH
19
20static int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
0f113f3e
MC
21{
22 const unsigned char *p, *pm;
23 int pklen, pmlen;
24 int ptype;
ac4e2577
DSH
25 const void *pval;
26 const ASN1_STRING *pstr;
0f113f3e
MC
27 X509_ALGOR *palg;
28 ASN1_INTEGER *public_key = NULL;
29
30 DSA *dsa = NULL;
31
32 if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
33 return 0;
34 X509_ALGOR_get0(NULL, &ptype, &pval, palg);
35
36 if (ptype == V_ASN1_SEQUENCE) {
37 pstr = pval;
38 pm = pstr->data;
39 pmlen = pstr->length;
40
75ebbd9a 41 if ((dsa = d2i_DSAparams(NULL, &pm, pmlen)) == NULL) {
0f113f3e
MC
42 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
43 goto err;
44 }
45
46 } else if ((ptype == V_ASN1_NULL) || (ptype == V_ASN1_UNDEF)) {
75ebbd9a 47 if ((dsa = DSA_new()) == NULL) {
0f113f3e
MC
48 DSAerr(DSA_F_DSA_PUB_DECODE, ERR_R_MALLOC_FAILURE);
49 goto err;
50 }
51 } else {
52 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_PARAMETER_ENCODING_ERROR);
53 goto err;
54 }
55
75ebbd9a 56 if ((public_key = d2i_ASN1_INTEGER(NULL, &p, pklen)) == NULL) {
0f113f3e
MC
57 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
58 goto err;
59 }
60
75ebbd9a 61 if ((dsa->pub_key = ASN1_INTEGER_to_BN(public_key, NULL)) == NULL) {
0f113f3e
MC
62 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_BN_DECODE_ERROR);
63 goto err;
64 }
65
66 ASN1_INTEGER_free(public_key);
67 EVP_PKEY_assign_DSA(pkey, dsa);
68 return 1;
69
70 err:
2ace7450 71 ASN1_INTEGER_free(public_key);
d6407083 72 DSA_free(dsa);
0f113f3e
MC
73 return 0;
74
75}
448be743 76
6f81892e 77static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
0f113f3e
MC
78{
79 DSA *dsa;
0f113f3e
MC
80 int ptype;
81 unsigned char *penc = NULL;
82 int penclen;
0c7ca403 83 ASN1_STRING *str = NULL;
ea6b07b5 84 ASN1_INTEGER *pubint = NULL;
7760384b 85 ASN1_OBJECT *aobj;
0f113f3e
MC
86
87 dsa = pkey->pkey.dsa;
88 if (pkey->save_parameters && dsa->p && dsa->q && dsa->g) {
0f113f3e 89 str = ASN1_STRING_new();
90945fa3 90 if (str == NULL) {
0c7ca403
MC
91 DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
92 goto err;
93 }
0f113f3e
MC
94 str->length = i2d_DSAparams(dsa, &str->data);
95 if (str->length <= 0) {
96 DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
97 goto err;
98 }
0f113f3e
MC
99 ptype = V_ASN1_SEQUENCE;
100 } else
101 ptype = V_ASN1_UNDEF;
102
ea6b07b5 103 pubint = BN_to_ASN1_INTEGER(dsa->pub_key, NULL);
0f113f3e 104
ea6b07b5
DSH
105 if (pubint == NULL) {
106 DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
107 goto err;
108 }
109
110 penclen = i2d_ASN1_INTEGER(pubint, &penc);
111 ASN1_INTEGER_free(pubint);
0f113f3e
MC
112
113 if (penclen <= 0) {
114 DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
115 goto err;
116 }
117
7760384b
PK
118 aobj = OBJ_nid2obj(EVP_PKEY_DSA);
119 if (aobj == NULL)
120 goto err;
121
122 if (X509_PUBKEY_set0_param(pk, aobj, ptype, str, penc, penclen))
0f113f3e
MC
123 return 1;
124
125 err:
b548a1f1 126 OPENSSL_free(penc);
0dfb9398 127 ASN1_STRING_free(str);
0f113f3e
MC
128
129 return 0;
130}
131
132/*
133 * In PKCS#8 DSA: you just get a private key integer and parameters in the
448be743
DSH
134 * AlgorithmIdentifier the pubkey must be recalculated.
135 */
0f113f3e 136
245c6bc3 137static int dsa_priv_decode(EVP_PKEY *pkey, const PKCS8_PRIV_KEY_INFO *p8)
0f113f3e 138{
dfb10af9 139 const unsigned char *p, *pm;
0f113f3e
MC
140 int pklen, pmlen;
141 int ptype;
ac4e2577
DSH
142 const void *pval;
143 const ASN1_STRING *pstr;
245c6bc3 144 const X509_ALGOR *palg;
0f113f3e
MC
145 ASN1_INTEGER *privkey = NULL;
146 BN_CTX *ctx = NULL;
147
0f113f3e
MC
148 DSA *dsa = NULL;
149
ab4a81f6
DSH
150 int ret = 0;
151
0f113f3e
MC
152 if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8))
153 return 0;
154 X509_ALGOR_get0(NULL, &ptype, &pval, palg);
155
ab4a81f6
DSH
156 if ((privkey = d2i_ASN1_INTEGER(NULL, &p, pklen)) == NULL)
157 goto decerr;
dfb10af9 158 if (privkey->type == V_ASN1_NEG_INTEGER || ptype != V_ASN1_SEQUENCE)
ab4a81f6 159 goto decerr;
0f113f3e
MC
160
161 pstr = pval;
162 pm = pstr->data;
163 pmlen = pstr->length;
75ebbd9a 164 if ((dsa = d2i_DSAparams(NULL, &pm, pmlen)) == NULL)
0f113f3e
MC
165 goto decerr;
166 /* We have parameters now set private key */
74924dcb
RS
167 if ((dsa->priv_key = BN_secure_new()) == NULL
168 || !ASN1_INTEGER_to_BN(privkey, dsa->priv_key)) {
0f113f3e
MC
169 DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_BN_ERROR);
170 goto dsaerr;
171 }
172 /* Calculate public key */
75ebbd9a 173 if ((dsa->pub_key = BN_new()) == NULL) {
0f113f3e
MC
174 DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
175 goto dsaerr;
176 }
75ebbd9a 177 if ((ctx = BN_CTX_new()) == NULL) {
0f113f3e
MC
178 DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
179 goto dsaerr;
180 }
181
6364475a 182 BN_set_flags(dsa->priv_key, BN_FLG_CONSTTIME);
0f113f3e
MC
183 if (!BN_mod_exp(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx)) {
184 DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_BN_ERROR);
185 goto dsaerr;
186 }
187
188 EVP_PKEY_assign_DSA(pkey, dsa);
0f113f3e 189
ab4a81f6
DSH
190 ret = 1;
191 goto done;
0f113f3e
MC
192
193 decerr:
f6fb7f18 194 DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_DECODE_ERROR);
0f113f3e 195 dsaerr:
ab4a81f6
DSH
196 DSA_free(dsa);
197 done:
0f113f3e 198 BN_CTX_free(ctx);
2ace7450 199 ASN1_STRING_clear_free(privkey);
ab4a81f6 200 return ret;
0f113f3e 201}
448be743 202
6f81892e 203static int dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
448be743 204{
0f113f3e
MC
205 ASN1_STRING *params = NULL;
206 ASN1_INTEGER *prkey = NULL;
207 unsigned char *dp = NULL;
208 int dplen;
209
210 if (!pkey->pkey.dsa || !pkey->pkey.dsa->priv_key) {
211 DSAerr(DSA_F_DSA_PRIV_ENCODE, DSA_R_MISSING_PARAMETERS);
212 goto err;
213 }
214
215 params = ASN1_STRING_new();
216
90945fa3 217 if (params == NULL) {
0f113f3e
MC
218 DSAerr(DSA_F_DSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
219 goto err;
220 }
221
222 params->length = i2d_DSAparams(pkey->pkey.dsa, &params->data);
223 if (params->length <= 0) {
224 DSAerr(DSA_F_DSA_PRIV_ENCODE, ERR_R_MALLOC_FAILURE);
225 goto err;
226 }
227 params->type = V_ASN1_SEQUENCE;
228
229 /* Get private key into integer */
230 prkey = BN_to_ASN1_INTEGER(pkey->pkey.dsa->priv_key, NULL);
231
232 if (!prkey) {
233 DSAerr(DSA_F_DSA_PRIV_ENCODE, DSA_R_BN_ERROR);
234 goto err;
235 }
236
237 dplen = i2d_ASN1_INTEGER(prkey, &dp);
238
a8ae0891 239 ASN1_STRING_clear_free(prkey);
fa4629b6 240 prkey = NULL;
0f113f3e
MC
241
242 if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_dsa), 0,
243 V_ASN1_SEQUENCE, params, dp, dplen))
244 goto err;
245
246 return 1;
247
248 err:
b548a1f1 249 OPENSSL_free(dp);
0dfb9398 250 ASN1_STRING_free(params);
2ace7450 251 ASN1_STRING_clear_free(prkey);
0f113f3e 252 return 0;
448be743
DSH
253}
254
6f81892e 255static int int_dsa_size(const EVP_PKEY *pkey)
0f113f3e 256{
26a7d938 257 return DSA_size(pkey->pkey.dsa);
0f113f3e 258}
6f81892e
DSH
259
260static int dsa_bits(const EVP_PKEY *pkey)
0f113f3e 261{
5d8d9a8e 262 return DSA_bits(pkey->pkey.dsa);
0f113f3e 263}
6f81892e 264
2514fa79 265static int dsa_security_bits(const EVP_PKEY *pkey)
0f113f3e
MC
266{
267 return DSA_security_bits(pkey->pkey.dsa);
268}
2514fa79 269
6f81892e 270static int dsa_missing_parameters(const EVP_PKEY *pkey)
0f113f3e
MC
271{
272 DSA *dsa;
273 dsa = pkey->pkey.dsa;
f72f00d4 274 if (dsa == NULL || dsa->p == NULL || dsa->q == NULL || dsa->g == NULL)
0f113f3e
MC
275 return 1;
276 return 0;
277}
6f81892e
DSH
278
279static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
0f113f3e
MC
280{
281 BIGNUM *a;
282
2986ecdc
DSH
283 if (to->pkey.dsa == NULL) {
284 to->pkey.dsa = DSA_new();
285 if (to->pkey.dsa == NULL)
286 return 0;
287 }
288
0f113f3e
MC
289 if ((a = BN_dup(from->pkey.dsa->p)) == NULL)
290 return 0;
23a1d5e9 291 BN_free(to->pkey.dsa->p);
0f113f3e
MC
292 to->pkey.dsa->p = a;
293
294 if ((a = BN_dup(from->pkey.dsa->q)) == NULL)
295 return 0;
23a1d5e9 296 BN_free(to->pkey.dsa->q);
0f113f3e
MC
297 to->pkey.dsa->q = a;
298
299 if ((a = BN_dup(from->pkey.dsa->g)) == NULL)
300 return 0;
23a1d5e9 301 BN_free(to->pkey.dsa->g);
0f113f3e
MC
302 to->pkey.dsa->g = a;
303 return 1;
304}
6f81892e
DSH
305
306static int dsa_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
0f113f3e
MC
307{
308 if (BN_cmp(a->pkey.dsa->p, b->pkey.dsa->p) ||
309 BN_cmp(a->pkey.dsa->q, b->pkey.dsa->q) ||
310 BN_cmp(a->pkey.dsa->g, b->pkey.dsa->g))
311 return 0;
312 else
313 return 1;
314}
6f81892e 315
0cb8499b 316static int dsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
0f113f3e
MC
317{
318 if (BN_cmp(b->pkey.dsa->pub_key, a->pkey.dsa->pub_key) != 0)
319 return 0;
320 else
321 return 1;
322}
0cb8499b 323
6f81892e 324static void int_dsa_free(EVP_PKEY *pkey)
0f113f3e
MC
325{
326 DSA_free(pkey->pkey.dsa);
327}
6f81892e 328
777c47ac 329static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype)
0f113f3e 330{
0f113f3e 331 int ret = 0;
0f113f3e 332 const char *ktype = NULL;
0f113f3e
MC
333 const BIGNUM *priv_key, *pub_key;
334
335 if (ptype == 2)
336 priv_key = x->priv_key;
337 else
338 priv_key = NULL;
339
340 if (ptype > 0)
341 pub_key = x->pub_key;
342 else
343 pub_key = NULL;
344
345 if (ptype == 2)
346 ktype = "Private-Key";
347 else if (ptype == 1)
348 ktype = "Public-Key";
349 else
350 ktype = "DSA-Parameters";
351
0f113f3e
MC
352 if (priv_key) {
353 if (!BIO_indent(bp, off, 128))
354 goto err;
355 if (BIO_printf(bp, "%s: (%d bit)\n", ktype, BN_num_bits(x->p))
356 <= 0)
357 goto err;
358 }
359
a773b52a 360 if (!ASN1_bn_print(bp, "priv:", priv_key, NULL, off))
0f113f3e 361 goto err;
a773b52a 362 if (!ASN1_bn_print(bp, "pub: ", pub_key, NULL, off))
0f113f3e 363 goto err;
a773b52a 364 if (!ASN1_bn_print(bp, "P: ", x->p, NULL, off))
0f113f3e 365 goto err;
a773b52a 366 if (!ASN1_bn_print(bp, "Q: ", x->q, NULL, off))
0f113f3e 367 goto err;
a773b52a 368 if (!ASN1_bn_print(bp, "G: ", x->g, NULL, off))
0f113f3e
MC
369 goto err;
370 ret = 1;
371 err:
26a7d938 372 return ret;
0f113f3e 373}
35208f36 374
3e4585c8 375static int dsa_param_decode(EVP_PKEY *pkey,
0f113f3e
MC
376 const unsigned char **pder, int derlen)
377{
378 DSA *dsa;
75ebbd9a
RS
379
380 if ((dsa = d2i_DSAparams(NULL, pder, derlen)) == NULL) {
0f113f3e
MC
381 DSAerr(DSA_F_DSA_PARAM_DECODE, ERR_R_DSA_LIB);
382 return 0;
383 }
384 EVP_PKEY_assign_DSA(pkey, dsa);
385 return 1;
386}
3e4585c8
DSH
387
388static int dsa_param_encode(const EVP_PKEY *pkey, unsigned char **pder)
0f113f3e
MC
389{
390 return i2d_DSAparams(pkey->pkey.dsa, pder);
391}
35208f36
DSH
392
393static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent,
0f113f3e
MC
394 ASN1_PCTX *ctx)
395{
396 return do_dsa_print(bp, pkey->pkey.dsa, indent, 0);
397}
35208f36
DSH
398
399static int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent,
0f113f3e
MC
400 ASN1_PCTX *ctx)
401{
402 return do_dsa_print(bp, pkey->pkey.dsa, indent, 1);
403}
35208f36
DSH
404
405static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
0f113f3e
MC
406 ASN1_PCTX *ctx)
407{
408 return do_dsa_print(bp, pkey->pkey.dsa, indent, 2);
409}
35208f36 410
e4263314 411static int old_dsa_priv_decode(EVP_PKEY *pkey,
0f113f3e
MC
412 const unsigned char **pder, int derlen)
413{
414 DSA *dsa;
75ebbd9a
RS
415
416 if ((dsa = d2i_DSAPrivateKey(NULL, pder, derlen)) == NULL) {
0f113f3e
MC
417 DSAerr(DSA_F_OLD_DSA_PRIV_DECODE, ERR_R_DSA_LIB);
418 return 0;
419 }
420 EVP_PKEY_assign_DSA(pkey, dsa);
421 return 1;
422}
e4263314
DSH
423
424static int old_dsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
0f113f3e
MC
425{
426 return i2d_DSAPrivateKey(pkey->pkey.dsa, pder);
427}
e4263314 428
fa1ba589 429static int dsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
0f113f3e
MC
430 const ASN1_STRING *sig, int indent, ASN1_PCTX *pctx)
431{
432 DSA_SIG *dsa_sig;
433 const unsigned char *p;
a773b52a 434
0f113f3e
MC
435 if (!sig) {
436 if (BIO_puts(bp, "\n") <= 0)
437 return 0;
438 else
439 return 1;
440 }
441 p = sig->data;
442 dsa_sig = d2i_DSA_SIG(NULL, &p, sig->length);
443 if (dsa_sig) {
444 int rv = 0;
9267c11b 445 const BIGNUM *r, *s;
706a13f1 446
9267c11b 447 DSA_SIG_get0(dsa_sig, &r, &s);
0f113f3e
MC
448
449 if (BIO_write(bp, "\n", 1) != 1)
450 goto err;
451
706a13f1 452 if (!ASN1_bn_print(bp, "r: ", r, NULL, indent))
0f113f3e 453 goto err;
706a13f1 454 if (!ASN1_bn_print(bp, "s: ", s, NULL, indent))
0f113f3e
MC
455 goto err;
456 rv = 1;
457 err:
0f113f3e
MC
458 DSA_SIG_free(dsa_sig);
459 return rv;
460 }
461 return X509_signature_dump(bp, sig, indent);
462}
fa1ba589 463
492a9e24 464static int dsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
0f113f3e
MC
465{
466 switch (op) {
467 case ASN1_PKEY_CTRL_PKCS7_SIGN:
468 if (arg1 == 0) {
469 int snid, hnid;
470 X509_ALGOR *alg1, *alg2;
471 PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, &alg1, &alg2);
472 if (alg1 == NULL || alg1->algorithm == NULL)
473 return -1;
474 hnid = OBJ_obj2nid(alg1->algorithm);
475 if (hnid == NID_undef)
476 return -1;
477 if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
478 return -1;
479 X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
480 }
481 return 1;
8931b30d 482#ifndef OPENSSL_NO_CMS
0f113f3e
MC
483 case ASN1_PKEY_CTRL_CMS_SIGN:
484 if (arg1 == 0) {
485 int snid, hnid;
486 X509_ALGOR *alg1, *alg2;
487 CMS_SignerInfo_get0_algs(arg2, NULL, NULL, &alg1, &alg2);
488 if (alg1 == NULL || alg1->algorithm == NULL)
489 return -1;
490 hnid = OBJ_obj2nid(alg1->algorithm);
491 if (hnid == NID_undef)
492 return -1;
493 if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
494 return -1;
495 X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
496 }
497 return 1;
498
499 case ASN1_PKEY_CTRL_CMS_RI_TYPE:
500 *(int *)arg2 = CMS_RECIPINFO_NONE;
501 return 1;
8931b30d 502#endif
492a9e24 503
0f113f3e
MC
504 case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
505 *(int *)arg2 = NID_sha256;
506 return 2;
03919683 507
0f113f3e
MC
508 default:
509 return -2;
492a9e24 510
0f113f3e 511 }
492a9e24 512
0f113f3e 513}
492a9e24 514
448be743
DSH
515/* NB these are sorted in pkey_id order, lowest first */
516
578b5514 517const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[5] = {
0f113f3e
MC
518
519 {
520 EVP_PKEY_DSA2,
521 EVP_PKEY_DSA,
522 ASN1_PKEY_ALIAS},
523
524 {
525 EVP_PKEY_DSA1,
526 EVP_PKEY_DSA,
527 ASN1_PKEY_ALIAS},
528
529 {
530 EVP_PKEY_DSA4,
531 EVP_PKEY_DSA,
532 ASN1_PKEY_ALIAS},
533
534 {
535 EVP_PKEY_DSA3,
536 EVP_PKEY_DSA,
537 ASN1_PKEY_ALIAS},
538
539 {
540 EVP_PKEY_DSA,
541 EVP_PKEY_DSA,
542 0,
543
544 "DSA",
545 "OpenSSL DSA method",
546
547 dsa_pub_decode,
548 dsa_pub_encode,
549 dsa_pub_cmp,
550 dsa_pub_print,
551
552 dsa_priv_decode,
553 dsa_priv_encode,
554 dsa_priv_print,
555
556 int_dsa_size,
557 dsa_bits,
558 dsa_security_bits,
559
560 dsa_param_decode,
561 dsa_param_encode,
562 dsa_missing_parameters,
563 dsa_copy_parameters,
564 dsa_cmp_parameters,
565 dsa_param_print,
566 dsa_sig_print,
567
568 int_dsa_free,
569 dsa_pkey_ctrl,
570 old_dsa_priv_decode,
571 old_dsa_priv_encode}
572};