OpenCoverage

dh_pmeth.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/dh/dh_pmeth.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: dh_pmeth.c,v 1.10 2017/01/29 17:49:22 beck Exp $ */-
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL-
3 * project 2006.-
4 */-
5/* ====================================================================-
6 * Copyright (c) 2006 The OpenSSL Project. All rights reserved.-
7 *-
8 * Redistribution and use in source and binary forms, with or without-
9 * modification, are permitted provided that the following conditions-
10 * are met:-
11 *-
12 * 1. Redistributions of source code must retain the above copyright-
13 * notice, this list of conditions and the following disclaimer. -
14 *-
15 * 2. Redistributions in binary form must reproduce the above copyright-
16 * notice, this list of conditions and the following disclaimer in-
17 * the documentation and/or other materials provided with the-
18 * distribution.-
19 *-
20 * 3. All advertising materials mentioning features or use of this-
21 * software must display the following acknowledgment:-
22 * "This product includes software developed by the OpenSSL Project-
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"-
24 *-
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to-
26 * endorse or promote products derived from this software without-
27 * prior written permission. For written permission, please contact-
28 * licensing@OpenSSL.org.-
29 *-
30 * 5. Products derived from this software may not be called "OpenSSL"-
31 * nor may "OpenSSL" appear in their names without prior written-
32 * permission of the OpenSSL Project.-
33 *-
34 * 6. Redistributions of any form whatsoever must retain the following-
35 * acknowledgment:-
36 * "This product includes software developed by the OpenSSL Project-
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"-
38 *-
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY-
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR-
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR-
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,-
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT-
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;-
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,-
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)-
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED-
50 * OF THE POSSIBILITY OF SUCH DAMAGE.-
51 * ====================================================================-
52 *-
53 * This product includes cryptographic software written by Eric Young-
54 * (eay@cryptsoft.com). This product includes software written by Tim-
55 * Hudson (tjh@cryptsoft.com).-
56 *-
57 */-
58-
59#include <limits.h>-
60#include <stdio.h>-
61#include <string.h>-
62-
63#include <openssl/asn1t.h>-
64#include <openssl/bn.h>-
65#include <openssl/dh.h>-
66#include <openssl/err.h>-
67#include <openssl/evp.h>-
68#include <openssl/x509.h>-
69-
70#include "evp_locl.h"-
71-
72/* DH pkey context structure */-
73-
74typedef struct {-
75 /* Parameter gen parameters */-
76 int prime_len;-
77 int generator;-
78 int use_dsa;-
79 /* Keygen callback info */-
80 int gentmp[2];-
81 /* message digest */-
82} DH_PKEY_CTX;-
83-
84static int-
85pkey_dh_init(EVP_PKEY_CTX *ctx)-
86{-
87 DH_PKEY_CTX *dctx;-
88-
89 dctx = malloc(sizeof(DH_PKEY_CTX));-
90 if (!dctx)
!dctxDescription
TRUEnever evaluated
FALSEnever evaluated
0
91 return 0;
never executed: return 0;
0
92 dctx->prime_len = 1024;-
93 dctx->generator = 2;-
94 dctx->use_dsa = 0;-
95-
96 ctx->data = dctx;-
97 ctx->keygen_info = dctx->gentmp;-
98 ctx->keygen_info_count = 2;-
99 -
100 return 1;
never executed: return 1;
0
101}-
102-
103static int-
104pkey_dh_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)-
105{-
106 DH_PKEY_CTX *dctx, *sctx;-
107-
108 if (!pkey_dh_init(dst))
!pkey_dh_init(dst)Description
TRUEnever evaluated
FALSEnever evaluated
0
109 return 0;
never executed: return 0;
0
110 sctx = src->data;-
111 dctx = dst->data;-
112 dctx->prime_len = sctx->prime_len;-
113 dctx->generator = sctx->generator;-
114 dctx->use_dsa = sctx->use_dsa;-
115 return 1;
never executed: return 1;
0
116}-
117-
118static void-
119pkey_dh_cleanup(EVP_PKEY_CTX *ctx)-
120{-
121 DH_PKEY_CTX *dctx = ctx->data;-
122-
123 free(dctx);-
124}
never executed: end of block
0
125-
126static int-
127pkey_dh_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)-
128{-
129 DH_PKEY_CTX *dctx = ctx->data;-
130-
131 switch (type) {-
132 case EVP_PKEY_CTRL_DH_PARAMGEN_PRIME_LEN:
never executed: case (0x1000 + 1):
0
133 if (p1 < 256)
p1 < 256Description
TRUEnever evaluated
FALSEnever evaluated
0
134 return -2;
never executed: return -2;
0
135 dctx->prime_len = p1;-
136 return 1;
never executed: return 1;
0
137-
138 case EVP_PKEY_CTRL_DH_PARAMGEN_GENERATOR:
never executed: case (0x1000 + 2):
0
139 dctx->generator = p1;-
140 return 1;
never executed: return 1;
0
141-
142 case EVP_PKEY_CTRL_PEER_KEY:
never executed: case 2:
0
143 /* Default behaviour is OK */-
144 return 1;
never executed: return 1;
0
145-
146 default:
never executed: default:
0
147 return -2;
never executed: return -2;
0
148 }-
149}-
150 -
151static int-
152pkey_dh_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *value)-
153{-
154 long lval;-
155 char *ep;-
156 int len;-
157-
158 if (!strcmp(type, "dh_paramgen_prime_len")) {
never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "dh_paramgen_prime_len" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
! __extension_..._len" )))); })Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
159 errno = 0;-
160 lval = strtol(value, &ep, 10);-
161 if (value[0] == '\0' || *ep != '\0')
value[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
*ep != '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
162 goto not_a_number;
never executed: goto not_a_number;
0
163 if ((errno == ERANGE &&
(*__errno_location ()) == 34Description
TRUEnever evaluated
FALSEnever evaluated
0
164 (lval == LONG_MAX || lval == LONG_MIN)) ||
lval == 0x7fffffffffffffffLDescription
TRUEnever evaluated
FALSEnever evaluated
lval == (-0x7f...fffffffL - 1L)Description
TRUEnever evaluated
FALSEnever evaluated
0
165 (lval > INT_MAX || lval < INT_MIN))
lval > 0x7fffffffDescription
TRUEnever evaluated
FALSEnever evaluated
lval < (-0x7fffffff - 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
166 goto out_of_range;
never executed: goto out_of_range;
0
167 len = lval;-
168 return EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len);
never executed: return EVP_PKEY_CTX_ctrl(ctx, 28, (1<<1), (0x1000 + 1), len, ((void *)0) );
0
169 } else if (!strcmp(type, "dh_paramgen_generator")) {
never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "dh_paramgen_generator" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
! __extension_...ator" )))); })Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
170 errno = 0;-
171 lval = strtol(value, &ep, 10);-
172 if (value[0] == '\0' || *ep != '\0')
value[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
*ep != '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
173 goto not_a_number;
never executed: goto not_a_number;
0
174 if ((errno == ERANGE &&
(*__errno_location ()) == 34Description
TRUEnever evaluated
FALSEnever evaluated
0
175 (lval == LONG_MAX || lval == LONG_MIN)) ||
lval == 0x7fffffffffffffffLDescription
TRUEnever evaluated
FALSEnever evaluated
lval == (-0x7f...fffffffL - 1L)Description
TRUEnever evaluated
FALSEnever evaluated
0
176 (lval > INT_MAX || lval < INT_MIN))
lval > 0x7fffffffDescription
TRUEnever evaluated
FALSEnever evaluated
lval < (-0x7fffffff - 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
177 goto out_of_range;
never executed: goto out_of_range;
0
178 len = lval;-
179 return EVP_PKEY_CTX_set_dh_paramgen_generator(ctx, len);
never executed: return EVP_PKEY_CTX_ctrl(ctx, 28, (1<<1), (0x1000 + 2), len, ((void *)0) );
0
180 }-
181-
182not_a_number:
code before this statement never executed: not_a_number:
0
183out_of_range:-
184 return -2;
never executed: return -2;
0
185}-
186-
187static int-
188pkey_dh_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)-
189{-
190 DH *dh = NULL;-
191 DH_PKEY_CTX *dctx = ctx->data;-
192 BN_GENCB *pcb, cb;-
193 int ret;-
194-
195 if (ctx->pkey_gencb) {
ctx->pkey_gencbDescription
TRUEnever evaluated
FALSEnever evaluated
0
196 pcb = &cb;-
197 evp_pkey_set_cb_translate(pcb, ctx);-
198 } else
never executed: end of block
0
199 pcb = NULL;
never executed: pcb = ((void *)0) ;
0
200 dh = DH_new();-
201 if (!dh)
!dhDescription
TRUEnever evaluated
FALSEnever evaluated
0
202 return 0;
never executed: return 0;
0
203 ret = DH_generate_parameters_ex(dh, dctx->prime_len, dctx->generator,-
204 pcb);-
205 if (ret)
retDescription
TRUEnever evaluated
FALSEnever evaluated
0
206 EVP_PKEY_assign_DH(pkey, dh);
never executed: EVP_PKEY_assign((pkey),28, (char *)(dh));
0
207 else-
208 DH_free(dh);
never executed: DH_free(dh);
0
209 return ret;
never executed: return ret;
0
210}-
211-
212static int-
213pkey_dh_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)-
214{-
215 DH *dh = NULL;-
216-
217 if (ctx->pkey == NULL) {
ctx->pkey == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
218 DHerror(DH_R_NO_PARAMETERS_SET);-
219 return 0;
never executed: return 0;
0
220 }-
221 dh = DH_new();-
222 if (!dh)
!dhDescription
TRUEnever evaluated
FALSEnever evaluated
0
223 return 0;
never executed: return 0;
0
224 EVP_PKEY_assign_DH(pkey, dh);-
225 /* Note: if error return, pkey is freed by parent routine */-
226 if (!EVP_PKEY_copy_parameters(pkey, ctx->pkey))
!EVP_PKEY_copy...ey, ctx->pkey)Description
TRUEnever evaluated
FALSEnever evaluated
0
227 return 0;
never executed: return 0;
0
228 return DH_generate_key(pkey->pkey.dh);
never executed: return DH_generate_key(pkey->pkey.dh);
0
229}-
230-
231static int-
232pkey_dh_derive(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)-
233{-
234 int ret;-
235-
236 if (!ctx->pkey || !ctx->peerkey) {
!ctx->pkeyDescription
TRUEnever evaluated
FALSEnever evaluated
!ctx->peerkeyDescription
TRUEnever evaluated
FALSEnever evaluated
0
237 DHerror(DH_R_KEYS_NOT_SET);-
238 return 0;
never executed: return 0;
0
239 }-
240 ret = DH_compute_key(key, ctx->peerkey->pkey.dh->pub_key,-
241 ctx->pkey->pkey.dh);-
242 if (ret < 0)
ret < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
243 return ret;
never executed: return ret;
0
244 *keylen = ret;-
245 return 1;
never executed: return 1;
0
246}-
247-
248const EVP_PKEY_METHOD dh_pkey_meth = {-
249 .pkey_id = EVP_PKEY_DH,-
250 .flags = EVP_PKEY_FLAG_AUTOARGLEN,-
251-
252 .init = pkey_dh_init,-
253 .copy = pkey_dh_copy,-
254 .cleanup = pkey_dh_cleanup,-
255-
256 .paramgen = pkey_dh_paramgen,-
257-
258 .keygen = pkey_dh_keygen,-
259-
260 .derive = pkey_dh_derive,-
261-
262 .ctrl = pkey_dh_ctrl,-
263 .ctrl_str = pkey_dh_ctrl_str-
264};-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2