mark all block comments that need format preserving so that
[openssl.git] / crypto / dsa / dsa_ameth.c
1 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
2  * project 2006.
3  */
4 /* ====================================================================
5  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer. 
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  *
19  * 3. All advertising materials mentioning features or use of this
20  *    software must display the following acknowledgment:
21  *    "This product includes software developed by the OpenSSL Project
22  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
23  *
24  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
25  *    endorse or promote products derived from this software without
26  *    prior written permission. For written permission, please contact
27  *    licensing@OpenSSL.org.
28  *
29  * 5. Products derived from this software may not be called "OpenSSL"
30  *    nor may "OpenSSL" appear in their names without prior written
31  *    permission of the OpenSSL Project.
32  *
33  * 6. Redistributions of any form whatsoever must retain the following
34  *    acknowledgment:
35  *    "This product includes software developed by the OpenSSL Project
36  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
37  *
38  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
39  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
42  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49  * OF THE POSSIBILITY OF SUCH DAMAGE.
50  * ====================================================================
51  *
52  * This product includes cryptographic software written by Eric Young
53  * (eay@cryptsoft.com).  This product includes software written by Tim
54  * Hudson (tjh@cryptsoft.com).
55  *
56  */
57
58 #include <stdio.h>
59 #include "cryptlib.h"
60 #include <openssl/x509.h>
61 #include <openssl/asn1.h>
62 #include <openssl/dsa.h>
63 #include <openssl/bn.h>
64 #ifndef OPENSSL_NO_CMS
65 #include <openssl/cms.h>
66 #endif
67 #include "asn1_locl.h"
68
69 static int dsa_pub_decode(EVP_PKEY *pkey, X509_PUBKEY *pubkey)
70         {
71         const unsigned char *p, *pm;
72         int pklen, pmlen;
73         int ptype;
74         void *pval;
75         ASN1_STRING *pstr;
76         X509_ALGOR *palg;
77         ASN1_INTEGER *public_key = NULL;
78
79         DSA *dsa = NULL;
80
81         if (!X509_PUBKEY_get0_param(NULL, &p, &pklen, &palg, pubkey))
82                 return 0;
83         X509_ALGOR_get0(NULL, &ptype, &pval, palg);
84
85
86         if (ptype == V_ASN1_SEQUENCE)
87                 {
88                 pstr = pval;    
89                 pm = pstr->data;
90                 pmlen = pstr->length;
91
92                 if (!(dsa = d2i_DSAparams(NULL, &pm, pmlen)))
93                         {
94                         DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
95                         goto err;
96                         }
97
98                 }
99         else if ((ptype == V_ASN1_NULL) || (ptype == V_ASN1_UNDEF))
100                 {
101                 if (!(dsa = DSA_new()))
102                         {
103                         DSAerr(DSA_F_DSA_PUB_DECODE, ERR_R_MALLOC_FAILURE);
104                         goto err;
105                         }
106                 }
107         else
108                 {
109                 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_PARAMETER_ENCODING_ERROR);
110                 goto err;
111                 }
112
113         if (!(public_key=d2i_ASN1_INTEGER(NULL, &p, pklen)))
114                 {
115                 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_DECODE_ERROR);
116                 goto err;
117                 }
118
119         if (!(dsa->pub_key = ASN1_INTEGER_to_BN(public_key, NULL)))
120                 {
121                 DSAerr(DSA_F_DSA_PUB_DECODE, DSA_R_BN_DECODE_ERROR);
122                 goto err;
123                 }
124
125         ASN1_INTEGER_free(public_key);
126         EVP_PKEY_assign_DSA(pkey, dsa);
127         return 1;
128
129         err:
130         if (public_key)
131                 ASN1_INTEGER_free(public_key);
132         if (dsa)
133                 DSA_free(dsa);
134         return 0;
135
136         }
137
138 static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
139         {
140         DSA *dsa;
141         void *pval = NULL;
142         int ptype;
143         unsigned char *penc = NULL;
144         int penclen;
145
146         dsa=pkey->pkey.dsa;
147         if (pkey->save_parameters && dsa->p && dsa->q && dsa->g)
148                 {
149                 ASN1_STRING *str;
150                 str = ASN1_STRING_new();
151                 str->length = i2d_DSAparams(dsa, &str->data);
152                 if (str->length <= 0)
153                         {
154                         DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
155                         goto err;
156                         }
157                 pval = str;
158                 ptype = V_ASN1_SEQUENCE;
159                 }
160         else
161                 ptype = V_ASN1_UNDEF;
162
163         dsa->write_params=0;
164
165         penclen = i2d_DSAPublicKey(dsa, &penc);
166
167         if (penclen <= 0)
168                 {
169                 DSAerr(DSA_F_DSA_PUB_ENCODE, ERR_R_MALLOC_FAILURE);
170                 goto err;
171                 }
172
173         if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_DSA),
174                                 ptype, pval, penc, penclen))
175                 return 1;
176
177         err:
178         if (penc)
179                 OPENSSL_free(penc);
180         if (pval)
181                 ASN1_STRING_free(pval);
182
183         return 0;
184         }
185
186 /* In PKCS#8 DSA: you just get a private key integer and parameters in the
187  * AlgorithmIdentifier the pubkey must be recalculated.
188  */
189         
190 static int dsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8)
191         {
192         const unsigned char *p, *pm;
193         int pklen, pmlen;
194         int ptype;
195         void *pval;
196         ASN1_STRING *pstr;
197         X509_ALGOR *palg;
198         ASN1_INTEGER *privkey = NULL;
199         BN_CTX *ctx = NULL;
200
201         STACK_OF(ASN1_TYPE) *ndsa = NULL;
202         DSA *dsa = NULL;
203
204         if (!PKCS8_pkey_get0(NULL, &p, &pklen, &palg, p8))
205                 return 0;
206         X509_ALGOR_get0(NULL, &ptype, &pval, palg);
207
208         /* Check for broken DSA PKCS#8, UGH! */
209         if (*p == (V_ASN1_SEQUENCE|V_ASN1_CONSTRUCTED))
210                 {
211                 ASN1_TYPE *t1, *t2;
212                 if(!(ndsa = d2i_ASN1_SEQUENCE_ANY(NULL, &p, pklen)))
213                         goto decerr;
214                 if (sk_ASN1_TYPE_num(ndsa) != 2)
215                         goto decerr;
216                 /*-
217                  * Handle Two broken types:
218                  * SEQUENCE {parameters, priv_key}
219                  * SEQUENCE {pub_key, priv_key}
220                  */
221
222                 t1 = sk_ASN1_TYPE_value(ndsa, 0);
223                 t2 = sk_ASN1_TYPE_value(ndsa, 1);
224                 if (t1->type == V_ASN1_SEQUENCE)
225                         {
226                         p8->broken = PKCS8_EMBEDDED_PARAM;
227                         pval = t1->value.ptr;
228                         }
229                 else if (ptype == V_ASN1_SEQUENCE)
230                         p8->broken = PKCS8_NS_DB;
231                 else
232                         goto decerr;
233
234                 if (t2->type != V_ASN1_INTEGER)
235                         goto decerr;
236
237                 privkey = t2->value.integer;
238                 }
239         else
240                 {
241                 const unsigned char *q = p;
242                 if (!(privkey=d2i_ASN1_INTEGER(NULL, &p, pklen)))
243                         goto decerr;
244                 if (privkey->type == V_ASN1_NEG_INTEGER)
245                         {
246                         p8->broken = PKCS8_NEG_PRIVKEY;
247                         ASN1_INTEGER_free(privkey);
248                         if (!(privkey=d2i_ASN1_UINTEGER(NULL, &q, pklen)))
249                                 goto decerr;
250                         }
251                 if (ptype != V_ASN1_SEQUENCE)
252                         goto decerr;
253                 }
254
255         pstr = pval;    
256         pm = pstr->data;
257         pmlen = pstr->length;
258         if (!(dsa = d2i_DSAparams(NULL, &pm, pmlen)))
259                 goto decerr;
260         /* We have parameters now set private key */
261         if (!(dsa->priv_key = ASN1_INTEGER_to_BN(privkey, NULL)))
262                 {
263                 DSAerr(DSA_F_DSA_PRIV_DECODE,DSA_R_BN_ERROR);
264                 goto dsaerr;
265                 }
266         /* Calculate public key */
267         if (!(dsa->pub_key = BN_new()))
268                 {
269                 DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
270                 goto dsaerr;
271                 }
272         if (!(ctx = BN_CTX_new()))
273                 {
274                 DSAerr(DSA_F_DSA_PRIV_DECODE, ERR_R_MALLOC_FAILURE);
275                 goto dsaerr;
276                 }
277                         
278         if (!BN_mod_exp(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx))
279                 {
280                 DSAerr(DSA_F_DSA_PRIV_DECODE,DSA_R_BN_ERROR);
281                 goto dsaerr;
282                 }
283
284         EVP_PKEY_assign_DSA(pkey, dsa);
285         BN_CTX_free (ctx);
286         if(ndsa)
287                 sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free);
288         else
289                 ASN1_INTEGER_free(privkey);
290
291         return 1;
292
293         decerr:
294         DSAerr(DSA_F_DSA_PRIV_DECODE, EVP_R_DECODE_ERROR);
295         dsaerr:
296         BN_CTX_free (ctx);
297         if (privkey)
298                 ASN1_INTEGER_free(privkey);
299         sk_ASN1_TYPE_pop_free(ndsa, ASN1_TYPE_free);
300         DSA_free(dsa);
301         return 0;
302         }
303
304 static int dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
305 {
306         ASN1_STRING *params = NULL;
307         ASN1_INTEGER *prkey = NULL;
308         unsigned char *dp = NULL;
309         int dplen;
310
311         if (!pkey->pkey.dsa || !pkey->pkey.dsa->priv_key)
312                 {
313                 DSAerr(DSA_F_DSA_PRIV_ENCODE,DSA_R_MISSING_PARAMETERS);
314                 goto err;
315                 }
316
317         params = ASN1_STRING_new();
318
319         if (!params)
320                 {
321                 DSAerr(DSA_F_DSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE);
322                 goto err;
323                 }
324
325         params->length = i2d_DSAparams(pkey->pkey.dsa, &params->data);
326         if (params->length <= 0)
327                 {
328                 DSAerr(DSA_F_DSA_PRIV_ENCODE,ERR_R_MALLOC_FAILURE);
329                 goto err;
330                 }
331         params->type = V_ASN1_SEQUENCE;
332
333         /* Get private key into integer */
334         prkey = BN_to_ASN1_INTEGER(pkey->pkey.dsa->priv_key, NULL);
335
336         if (!prkey)
337                 {
338                 DSAerr(DSA_F_DSA_PRIV_ENCODE,DSA_R_BN_ERROR);
339                 goto err;
340                 }
341
342         dplen = i2d_ASN1_INTEGER(prkey, &dp);
343
344         ASN1_INTEGER_free(prkey);
345
346         if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_dsa), 0,
347                                 V_ASN1_SEQUENCE, params, dp, dplen))
348                 goto err;
349
350         return 1;
351
352 err:
353         if (dp != NULL)
354                 OPENSSL_free(dp);
355         if (params != NULL)
356                 ASN1_STRING_free(params);
357         if (prkey != NULL)
358                 ASN1_INTEGER_free(prkey);
359         return 0;
360 }
361
362 static int int_dsa_size(const EVP_PKEY *pkey)
363         {
364         return(DSA_size(pkey->pkey.dsa));
365         }
366
367 static int dsa_bits(const EVP_PKEY *pkey)
368         {
369         return BN_num_bits(pkey->pkey.dsa->p);
370         }
371
372 static int dsa_security_bits(const EVP_PKEY *pkey)
373         {
374         return DSA_security_bits(pkey->pkey.dsa);
375         }
376
377 static int dsa_missing_parameters(const EVP_PKEY *pkey)
378         {
379         DSA *dsa;
380         dsa=pkey->pkey.dsa;
381         if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))
382                         return 1;
383         return 0;
384         }
385
386 static int dsa_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from)
387         {
388         BIGNUM *a;
389
390         if ((a=BN_dup(from->pkey.dsa->p)) == NULL)
391                 return 0;
392         if (to->pkey.dsa->p != NULL)
393                 BN_free(to->pkey.dsa->p);
394         to->pkey.dsa->p=a;
395
396         if ((a=BN_dup(from->pkey.dsa->q)) == NULL)
397                 return 0;
398         if (to->pkey.dsa->q != NULL)
399                 BN_free(to->pkey.dsa->q);
400         to->pkey.dsa->q=a;
401
402         if ((a=BN_dup(from->pkey.dsa->g)) == NULL)
403                 return 0;
404         if (to->pkey.dsa->g != NULL)
405                 BN_free(to->pkey.dsa->g);
406         to->pkey.dsa->g=a;
407         return 1;
408         }
409
410 static int dsa_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b)
411         {
412         if (    BN_cmp(a->pkey.dsa->p,b->pkey.dsa->p) ||
413                 BN_cmp(a->pkey.dsa->q,b->pkey.dsa->q) ||
414                 BN_cmp(a->pkey.dsa->g,b->pkey.dsa->g))
415                 return 0;
416         else
417                 return 1;
418         }
419
420 static int dsa_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
421         {
422         if (BN_cmp(b->pkey.dsa->pub_key,a->pkey.dsa->pub_key) != 0)
423                 return 0;
424         else
425                 return 1;
426         }
427
428 static void int_dsa_free(EVP_PKEY *pkey)
429         {
430         DSA_free(pkey->pkey.dsa);
431         }
432
433 static void update_buflen(const BIGNUM *b, size_t *pbuflen)
434         {
435         size_t i;
436         if (!b)
437                 return;
438         if (*pbuflen < (i = (size_t)BN_num_bytes(b)))
439                         *pbuflen = i;
440         }
441
442 static int do_dsa_print(BIO *bp, const DSA *x, int off, int ptype)
443         {
444         unsigned char *m=NULL;
445         int ret=0;
446         size_t buf_len=0;
447         const char *ktype = NULL;
448
449         const BIGNUM *priv_key, *pub_key;
450
451         if (ptype == 2)
452                 priv_key = x->priv_key;
453         else
454                 priv_key = NULL;
455
456         if (ptype > 0)
457                 pub_key = x->pub_key;
458         else
459                 pub_key = NULL;
460
461         if (ptype == 2)
462                 ktype = "Private-Key";
463         else if (ptype == 1)
464                 ktype = "Public-Key";
465         else
466                 ktype = "DSA-Parameters";
467
468         update_buflen(x->p, &buf_len);
469         update_buflen(x->q, &buf_len);
470         update_buflen(x->g, &buf_len);
471         update_buflen(priv_key, &buf_len);
472         update_buflen(pub_key, &buf_len);
473
474         m=(unsigned char *)OPENSSL_malloc(buf_len+10);
475         if (m == NULL)
476                 {
477                 DSAerr(DSA_F_DO_DSA_PRINT,ERR_R_MALLOC_FAILURE);
478                 goto err;
479                 }
480
481         if (priv_key)
482                 {
483                 if(!BIO_indent(bp,off,128))
484                    goto err;
485                 if (BIO_printf(bp,"%s: (%d bit)\n",ktype, BN_num_bits(x->p))
486                         <= 0) goto err;
487                 }
488
489         if (!ASN1_bn_print(bp,"priv:",priv_key,m,off))
490                 goto err;
491         if (!ASN1_bn_print(bp,"pub: ",pub_key,m,off))
492                 goto err;
493         if (!ASN1_bn_print(bp,"P:   ",x->p,m,off)) goto err;
494         if (!ASN1_bn_print(bp,"Q:   ",x->q,m,off)) goto err;
495         if (!ASN1_bn_print(bp,"G:   ",x->g,m,off)) goto err;
496         ret=1;
497 err:
498         if (m != NULL) OPENSSL_free(m);
499         return(ret);
500         }
501
502 static int dsa_param_decode(EVP_PKEY *pkey,
503                                         const unsigned char **pder, int derlen)
504         {
505         DSA *dsa;
506         if (!(dsa = d2i_DSAparams(NULL, pder, derlen)))
507                 {
508                 DSAerr(DSA_F_DSA_PARAM_DECODE, ERR_R_DSA_LIB);
509                 return 0;
510                 }
511         EVP_PKEY_assign_DSA(pkey, dsa);
512         return 1;
513         }
514
515 static int dsa_param_encode(const EVP_PKEY *pkey, unsigned char **pder)
516         {
517         return i2d_DSAparams(pkey->pkey.dsa, pder);
518         }
519
520 static int dsa_param_print(BIO *bp, const EVP_PKEY *pkey, int indent,
521                                                         ASN1_PCTX *ctx)
522         {
523         return do_dsa_print(bp, pkey->pkey.dsa, indent, 0);
524         }
525
526 static int dsa_pub_print(BIO *bp, const EVP_PKEY *pkey, int indent,
527                                                         ASN1_PCTX *ctx)
528         {
529         return do_dsa_print(bp, pkey->pkey.dsa, indent, 1);
530         }
531
532
533 static int dsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
534                                                         ASN1_PCTX *ctx)
535         {
536         return do_dsa_print(bp, pkey->pkey.dsa, indent, 2);
537         }
538
539 static int old_dsa_priv_decode(EVP_PKEY *pkey,
540                                         const unsigned char **pder, int derlen)
541         {
542         DSA *dsa;
543         if (!(dsa = d2i_DSAPrivateKey (NULL, pder, derlen)))
544                 {
545                 DSAerr(DSA_F_OLD_DSA_PRIV_DECODE, ERR_R_DSA_LIB);
546                 return 0;
547                 }
548         EVP_PKEY_assign_DSA(pkey, dsa);
549         return 1;
550         }
551
552 static int old_dsa_priv_encode(const EVP_PKEY *pkey, unsigned char **pder)
553         {
554         return i2d_DSAPrivateKey(pkey->pkey.dsa, pder);
555         }
556
557 static int dsa_sig_print(BIO *bp, const X509_ALGOR *sigalg,
558                                         const ASN1_STRING *sig,
559                                         int indent, ASN1_PCTX *pctx)
560         {
561         DSA_SIG *dsa_sig;
562         const unsigned char *p;
563         if (!sig)
564                 {
565                 if (BIO_puts(bp, "\n") <= 0)
566                         return 0;
567                 else
568                         return 1;
569                 }
570         p = sig->data;
571         dsa_sig = d2i_DSA_SIG(NULL, &p, sig->length);
572         if (dsa_sig)
573                 {
574                 int rv = 0;
575                 size_t buf_len = 0;
576                 unsigned char *m=NULL;
577                 update_buflen(dsa_sig->r, &buf_len);
578                 update_buflen(dsa_sig->s, &buf_len);
579                 m = OPENSSL_malloc(buf_len+10);
580                 if (m == NULL)
581                         {
582                         DSAerr(DSA_F_DSA_SIG_PRINT,ERR_R_MALLOC_FAILURE);
583                         goto err;
584                         }
585
586                 if (BIO_write(bp, "\n", 1) != 1)
587                         goto err;
588
589                 if (!ASN1_bn_print(bp,"r:   ",dsa_sig->r,m,indent))
590                         goto err;
591                 if (!ASN1_bn_print(bp,"s:   ",dsa_sig->s,m,indent))
592                         goto err;
593                 rv = 1;
594                 err:
595                 if (m)
596                         OPENSSL_free(m);
597                 DSA_SIG_free(dsa_sig);
598                 return rv;
599                 }
600         return X509_signature_dump(bp, sig, indent);
601         }
602
603 static int dsa_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
604         {
605         switch (op)
606                 {
607                 case ASN1_PKEY_CTRL_PKCS7_SIGN:
608                 if (arg1 == 0)
609                         {
610                         int snid, hnid;
611                         X509_ALGOR *alg1, *alg2;
612                         PKCS7_SIGNER_INFO_get0_algs(arg2, NULL, &alg1, &alg2);
613                         if (alg1 == NULL || alg1->algorithm == NULL)
614                                 return -1;
615                         hnid = OBJ_obj2nid(alg1->algorithm);
616                         if (hnid == NID_undef)
617                                 return -1;
618                         if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
619                                 return -1; 
620                         X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
621                         }
622                 return 1;
623 #ifndef OPENSSL_NO_CMS
624                 case ASN1_PKEY_CTRL_CMS_SIGN:
625                 if (arg1 == 0)
626                         {
627                         int snid, hnid;
628                         X509_ALGOR *alg1, *alg2;
629                         CMS_SignerInfo_get0_algs(arg2, NULL, NULL, &alg1, &alg2);
630                         if (alg1 == NULL || alg1->algorithm == NULL)
631                                 return -1;
632                         hnid = OBJ_obj2nid(alg1->algorithm);
633                         if (hnid == NID_undef)
634                                 return -1;
635                         if (!OBJ_find_sigid_by_algs(&snid, hnid, EVP_PKEY_id(pkey)))
636                                 return -1; 
637                         X509_ALGOR_set0(alg2, OBJ_nid2obj(snid), V_ASN1_UNDEF, 0);
638                         }
639                 return 1;
640
641                 case ASN1_PKEY_CTRL_CMS_RI_TYPE:
642                 *(int *)arg2 = CMS_RECIPINFO_NONE;
643                 return 1;
644 #endif
645
646                 case ASN1_PKEY_CTRL_DEFAULT_MD_NID:
647                 *(int *)arg2 = NID_sha256;
648                 return 2;
649
650                 default:
651                 return -2;
652
653                 }
654
655         }
656
657 /* NB these are sorted in pkey_id order, lowest first */
658
659 const EVP_PKEY_ASN1_METHOD dsa_asn1_meths[] = 
660         {
661
662                 {
663                 EVP_PKEY_DSA2,
664                 EVP_PKEY_DSA,
665                 ASN1_PKEY_ALIAS
666                 },
667
668                 {
669                 EVP_PKEY_DSA1,
670                 EVP_PKEY_DSA,
671                 ASN1_PKEY_ALIAS
672                 },
673
674                 {
675                 EVP_PKEY_DSA4,
676                 EVP_PKEY_DSA,
677                 ASN1_PKEY_ALIAS
678                 },
679
680                 {
681                 EVP_PKEY_DSA3,
682                 EVP_PKEY_DSA,
683                 ASN1_PKEY_ALIAS
684                 },
685
686                 {
687                 EVP_PKEY_DSA,
688                 EVP_PKEY_DSA,
689                 0,
690
691                 "DSA",
692                 "OpenSSL DSA method",
693
694                 dsa_pub_decode,
695                 dsa_pub_encode,
696                 dsa_pub_cmp,
697                 dsa_pub_print,
698
699                 dsa_priv_decode,
700                 dsa_priv_encode,
701                 dsa_priv_print,
702
703                 int_dsa_size,
704                 dsa_bits,
705                 dsa_security_bits,
706
707                 dsa_param_decode,
708                 dsa_param_encode,
709                 dsa_missing_parameters,
710                 dsa_copy_parameters,
711                 dsa_cmp_parameters,
712                 dsa_param_print,
713                 dsa_sig_print,
714
715                 int_dsa_free,
716                 dsa_pkey_ctrl,
717                 old_dsa_priv_decode,
718                 old_dsa_priv_encode
719                 }
720         };