summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ecdh/ech_ossl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ecdh/ech_ossl.c')
-rw-r--r--src/lib/libcrypto/ecdh/ech_ossl.c136
1 files changed, 65 insertions, 71 deletions
diff --git a/src/lib/libcrypto/ecdh/ech_ossl.c b/src/lib/libcrypto/ecdh/ech_ossl.c
index 4fae7cacfd..f05db87f78 100644
--- a/src/lib/libcrypto/ecdh/ech_ossl.c
+++ b/src/lib/libcrypto/ecdh/ech_ossl.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ech_ossl.c,v 1.9 2015/02/09 15:49:22 jsing Exp $ */ 1/* $OpenBSD: ech_ossl.c,v 1.10 2015/09/13 10:46:20 jsing Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
4 * 4 *
@@ -21,7 +21,7 @@
21 * are met: 21 * are met:
22 * 22 *
23 * 1. Redistributions of source code must retain the above copyright 23 * 1. Redistributions of source code must retain the above copyright
24 * notice, this list of conditions and the following disclaimer. 24 * notice, this list of conditions and the following disclaimer.
25 * 25 *
26 * 2. Redistributions in binary form must reproduce the above copyright 26 * 2. Redistributions in binary form must reproduce the above copyright
27 * notice, this list of conditions and the following disclaimer in 27 * notice, this list of conditions and the following disclaimer in
@@ -80,18 +80,19 @@
80#include "ech_locl.h" 80#include "ech_locl.h"
81 81
82static int ecdh_compute_key(void *out, size_t len, const EC_POINT *pub_key, 82static int ecdh_compute_key(void *out, size_t len, const EC_POINT *pub_key,
83 EC_KEY *ecdh, 83 EC_KEY *ecdh,
84 void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen)); 84 void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen));
85 85
86static ECDH_METHOD openssl_ecdh_meth = { 86static ECDH_METHOD openssl_ecdh_meth = {
87 .name = "OpenSSL ECDH method", 87 .name = "OpenSSL ECDH method",
88 .compute_key = ecdh_compute_key 88 .compute_key = ecdh_compute_key
89}; 89};
90 90
91const ECDH_METHOD *ECDH_OpenSSL(void) 91const ECDH_METHOD *
92 { 92ECDH_OpenSSL(void)
93{
93 return &openssl_ecdh_meth; 94 return &openssl_ecdh_meth;
94 } 95}
95 96
96 97
97/* This implementation is based on the following primitives in the IEEE 1363 standard: 98/* This implementation is based on the following primitives in the IEEE 1363 standard:
@@ -99,114 +100,107 @@ const ECDH_METHOD *ECDH_OpenSSL(void)
99 * - ECSVDP-DH 100 * - ECSVDP-DH
100 * Finally an optional KDF is applied. 101 * Finally an optional KDF is applied.
101 */ 102 */
102static int ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, 103static int
103 EC_KEY *ecdh, 104ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key,
104 void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen)) 105 EC_KEY *ecdh,
105 { 106 void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen))
107{
106 BN_CTX *ctx; 108 BN_CTX *ctx;
107 EC_POINT *tmp=NULL; 109 EC_POINT *tmp = NULL;
108 BIGNUM *x=NULL, *y=NULL; 110 BIGNUM *x = NULL, *y = NULL;
109 const BIGNUM *priv_key; 111 const BIGNUM *priv_key;
110 const EC_GROUP* group; 112 const EC_GROUP* group;
111 int ret= -1; 113 int ret = -1;
112 size_t buflen, len; 114 size_t buflen, len;
113 unsigned char *buf=NULL; 115 unsigned char *buf = NULL;
114 116
115 if (outlen > INT_MAX) 117 if (outlen > INT_MAX) {
116 {
117 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_MALLOC_FAILURE); /* sort of, anyway */ 118 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_MALLOC_FAILURE); /* sort of, anyway */
118 return -1; 119 return -1;
119 } 120 }
120 121
121 if ((ctx = BN_CTX_new()) == NULL) goto err; 122 if ((ctx = BN_CTX_new()) == NULL)
123 goto err;
122 BN_CTX_start(ctx); 124 BN_CTX_start(ctx);
123 if ((x = BN_CTX_get(ctx)) == NULL) 125 if ((x = BN_CTX_get(ctx)) == NULL)
124 goto err; 126 goto err;
125 if ((y = BN_CTX_get(ctx)) == NULL) 127 if ((y = BN_CTX_get(ctx)) == NULL)
126 goto err; 128 goto err;
127 129
128 priv_key = EC_KEY_get0_private_key(ecdh); 130 priv_key = EC_KEY_get0_private_key(ecdh);
129 if (priv_key == NULL) 131 if (priv_key == NULL) {
130 { 132 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ECDH_R_NO_PRIVATE_VALUE);
131 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_NO_PRIVATE_VALUE);
132 goto err; 133 goto err;
133 } 134 }
134 135
135 group = EC_KEY_get0_group(ecdh); 136 group = EC_KEY_get0_group(ecdh);
136 if ((tmp=EC_POINT_new(group)) == NULL) 137 if ((tmp = EC_POINT_new(group)) == NULL) {
137 { 138 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_MALLOC_FAILURE);
138 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_MALLOC_FAILURE);
139 goto err; 139 goto err;
140 } 140 }
141 141
142 if (!EC_POINT_mul(group, tmp, NULL, pub_key, priv_key, ctx)) 142 if (!EC_POINT_mul(group, tmp, NULL, pub_key, priv_key, ctx)) {
143 { 143 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,
144 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE); 144 ECDH_R_POINT_ARITHMETIC_FAILURE);
145 goto err; 145 goto err;
146 } 146 }
147 147
148 if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) == NID_X9_62_prime_field) 148 if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) ==
149 { 149 NID_X9_62_prime_field) {
150 if (!EC_POINT_get_affine_coordinates_GFp(group, tmp, x, y, ctx)) 150 if (!EC_POINT_get_affine_coordinates_GFp(group, tmp, x, y,
151 { 151 ctx)) {
152 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE); 152 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,
153 ECDH_R_POINT_ARITHMETIC_FAILURE);
153 goto err; 154 goto err;
154 }
155 } 155 }
156 }
156#ifndef OPENSSL_NO_EC2M 157#ifndef OPENSSL_NO_EC2M
157 else 158 else {
158 { 159 if (!EC_POINT_get_affine_coordinates_GF2m(group, tmp, x, y,
159 if (!EC_POINT_get_affine_coordinates_GF2m(group, tmp, x, y, ctx)) 160 ctx)) {
160 { 161 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,
161 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_POINT_ARITHMETIC_FAILURE); 162 ECDH_R_POINT_ARITHMETIC_FAILURE);
162 goto err; 163 goto err;
163 }
164 } 164 }
165 }
165#endif 166#endif
166 167
167 buflen = (EC_GROUP_get_degree(group) + 7)/8; 168 buflen = (EC_GROUP_get_degree(group) + 7)/8;
168 len = BN_num_bytes(x); 169 len = BN_num_bytes(x);
169 if (len > buflen) 170 if (len > buflen) {
170 { 171 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_INTERNAL_ERROR);
171 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_INTERNAL_ERROR);
172 goto err; 172 goto err;
173 } 173 }
174 if ((buf = malloc(buflen)) == NULL) 174 if ((buf = malloc(buflen)) == NULL) {
175 { 175 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_MALLOC_FAILURE);
176 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_MALLOC_FAILURE);
177 goto err; 176 goto err;
178 } 177 }
179 178
180 memset(buf, 0, buflen - len); 179 memset(buf, 0, buflen - len);
181 if (len != (size_t)BN_bn2bin(x, buf + buflen - len)) 180 if (len != (size_t)BN_bn2bin(x, buf + buflen - len)) {
182 { 181 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_BN_LIB);
183 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_BN_LIB);
184 goto err; 182 goto err;
185 } 183 }
186 184
187 if (KDF != 0) 185 if (KDF != 0) {
188 { 186 if (KDF(buf, buflen, out, &outlen) == NULL) {
189 if (KDF(buf, buflen, out, &outlen) == NULL) 187 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ECDH_R_KDF_FAILED);
190 {
191 ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ECDH_R_KDF_FAILED);
192 goto err; 188 goto err;
193 }
194 ret = outlen;
195 } 189 }
196 else 190 ret = outlen;
197 { 191 } else {
198 /* no KDF, just copy as much as we can */ 192 /* no KDF, just copy as much as we can */
199 if (outlen > buflen) 193 if (outlen > buflen)
200 outlen = buflen; 194 outlen = buflen;
201 memcpy(out, buf, outlen); 195 memcpy(out, buf, outlen);
202 ret = outlen; 196 ret = outlen;
203 } 197 }
204 198
205err: 199err:
206 EC_POINT_free(tmp); 200 EC_POINT_free(tmp);
207 if (ctx) 201 if (ctx)
208 BN_CTX_end(ctx); 202 BN_CTX_end(ctx);
209 BN_CTX_free(ctx); 203 BN_CTX_free(ctx);
210 free(buf); 204 free(buf);
211 return(ret); 205 return (ret);
212 } 206}