03b40d0e5c9766118b38aefd71037d290fa1984a
[oweals/openssl.git] / crypto / dh / dh_ameth.c
1 /* Written by Dr Stephen N Henson (shenson@bigfoot.com) 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/dh.h>
63 #include "asn1_locl.h"
64
65 static void int_dh_free(EVP_PKEY *pkey)
66         {
67         DH_free(pkey->pkey.dh);
68         }
69
70 static int dh_param_decode(EVP_PKEY *pkey,
71                                         const unsigned char **pder, int derlen)
72         {
73         DH *dh;
74         if (!(dh = d2i_DHparams(NULL, pder, derlen)))
75                 {
76                 DHerr(DH_F_DH_PARAM_DECODE, ERR_R_DH_LIB);
77                 return 0;
78                 }
79         EVP_PKEY_assign_DH(pkey, dh);
80         return 1;
81         }
82
83 static int dh_param_encode(const EVP_PKEY *pkey, unsigned char **pder)
84         {
85         return i2d_DHparams(pkey->pkey.dh, pder);
86         }
87
88 static int do_dhparam_print(BIO *bp, const DH *x, int indent,
89                                                         ASN1_PCTX *ctx)
90         {
91         unsigned char *m=NULL;
92         int reason=ERR_R_BUF_LIB,ret=0;
93         size_t buf_len=0, i;
94
95         if (x->p)
96                 buf_len = (size_t)BN_num_bytes(x->p);
97         else
98                 {
99                 reason = ERR_R_PASSED_NULL_PARAMETER;
100                 goto err;
101                 }
102         if (x->g)
103                 if (buf_len < (i = (size_t)BN_num_bytes(x->g)))
104                         buf_len = i;
105         m=(unsigned char *)OPENSSL_malloc(buf_len+10);
106         if (m == NULL)
107                 {
108                 reason=ERR_R_MALLOC_FAILURE;
109                 goto err;
110                 }
111
112         BIO_indent(bp, indent, 128);
113         if (BIO_printf(bp,"Diffie-Hellman-Parameters: (%d bit)\n",
114                 BN_num_bits(x->p)) <= 0)
115                 goto err;
116         indent += 4;
117         if (!ASN1_bn_print(bp,"prime:",x->p,m,indent)) goto err;
118         if (!ASN1_bn_print(bp,"generator:",x->g,m,indent)) goto err;
119         if (x->length != 0)
120                 {
121                 BIO_indent(bp, indent, 128);
122                 if (BIO_printf(bp,"recommended-private-length: %d bits\n",
123                         (int)x->length) <= 0) goto err;
124                 }
125         ret=1;
126         if (0)
127                 {
128 err:
129                 DHerr(DH_F_DHPARAMS_PRINT,reason);
130                 }
131         if (m != NULL) OPENSSL_free(m);
132         return(ret);
133         }
134
135 static int dh_param_print(BIO *bp, const EVP_PKEY *pkey, int indent,
136                                                         ASN1_PCTX *ctx)
137         {
138         return do_dhparam_print(bp, pkey->pkey.dh, indent, ctx);
139         }
140
141 int DHparams_print(BIO *bp, const DH *x)
142         {
143         return do_dhparam_print(bp, x, 4, NULL);
144         }
145
146 const EVP_PKEY_ASN1_METHOD dh_asn1_meth = 
147         {
148         EVP_PKEY_DH,
149         EVP_PKEY_DH,
150         0,
151
152         "DH",
153         "OpenSSL PKCS#3 DH method",
154
155         0,
156         0,
157         0,
158         0,
159
160         0,
161         0,
162         0,
163
164         0,
165         0,
166
167         dh_param_decode,
168         dh_param_encode,
169         0,0,0,
170         dh_param_print,
171
172         int_dh_free,
173         0
174         };
175