summaryrefslogtreecommitdiff
path: root/src/lib/libssl/t1_enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/t1_enc.c')
-rw-r--r--src/lib/libssl/t1_enc.c97
1 files changed, 2 insertions, 95 deletions
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
index 0179ac3061..e9a9713134 100644
--- a/src/lib/libssl/t1_enc.c
+++ b/src/lib/libssl/t1_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: t1_enc.c,v 1.101 2017/03/10 15:08:49 jsing Exp $ */ 1/* $OpenBSD: t1_enc.c,v 1.102 2017/03/10 16:03:27 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -165,7 +165,6 @@ int
165tls1_init_finished_mac(SSL *s) 165tls1_init_finished_mac(SSL *s)
166{ 166{
167 BIO_free(S3I(s)->handshake_buffer); 167 BIO_free(S3I(s)->handshake_buffer);
168 tls1_free_digest_list(s);
169 168
170 S3I(s)->handshake_buffer = BIO_new(BIO_s_mem()); 169 S3I(s)->handshake_buffer = BIO_new(BIO_s_mem());
171 if (S3I(s)->handshake_buffer == NULL) 170 if (S3I(s)->handshake_buffer == NULL)
@@ -176,29 +175,9 @@ tls1_init_finished_mac(SSL *s)
176 return (1); 175 return (1);
177} 176}
178 177
179void
180tls1_free_digest_list(SSL *s)
181{
182 int i;
183
184 if (s == NULL)
185 return;
186 if (S3I(s)->handshake_dgst == NULL)
187 return;
188
189 for (i = 0; i < SSL_MAX_DIGEST; i++) {
190 if (S3I(s)->handshake_dgst[i])
191 EVP_MD_CTX_destroy(S3I(s)->handshake_dgst[i]);
192 }
193 free(S3I(s)->handshake_dgst);
194 S3I(s)->handshake_dgst = NULL;
195}
196
197int 178int
198tls1_finish_mac(SSL *s, const unsigned char *buf, int len) 179tls1_finish_mac(SSL *s, const unsigned char *buf, int len)
199{ 180{
200 int i;
201
202 if (len < 0) 181 if (len < 0)
203 return 0; 182 return 0;
204 183
@@ -211,60 +190,21 @@ tls1_finish_mac(SSL *s, const unsigned char *buf, int len)
211 return 1; 190 return 1;
212 } 191 }
213 192
214 for (i = 0; i < SSL_MAX_DIGEST; i++) {
215 if (S3I(s)->handshake_dgst[i] == NULL)
216 continue;
217 if (!EVP_DigestUpdate(S3I(s)->handshake_dgst[i], buf, len)) {
218 SSLerror(s, ERR_R_EVP_LIB);
219 return 0;
220 }
221 }
222
223 return 1; 193 return 1;
224} 194}
225 195
226int 196int
227tls1_digest_cached_records(SSL *s) 197tls1_digest_cached_records(SSL *s)
228{ 198{
229 const EVP_MD *md; 199 long hdatalen;
230 long hdatalen, mask;
231 void *hdata; 200 void *hdata;
232 int i;
233
234 tls1_free_digest_list(s);
235 201
236 S3I(s)->handshake_dgst = calloc(SSL_MAX_DIGEST, sizeof(EVP_MD_CTX *));
237 if (S3I(s)->handshake_dgst == NULL) {
238 SSLerror(s, ERR_R_MALLOC_FAILURE);
239 goto err;
240 }
241 hdatalen = BIO_get_mem_data(S3I(s)->handshake_buffer, &hdata); 202 hdatalen = BIO_get_mem_data(S3I(s)->handshake_buffer, &hdata);
242 if (hdatalen <= 0) { 203 if (hdatalen <= 0) {
243 SSLerror(s, SSL_R_BAD_HANDSHAKE_LENGTH); 204 SSLerror(s, SSL_R_BAD_HANDSHAKE_LENGTH);
244 goto err; 205 goto err;
245 } 206 }
246 207
247 /* Loop through bits of the algorithm2 field and create MD contexts. */
248 for (i = 0; ssl_get_handshake_digest(i, &mask, &md); i++) {
249 if ((mask & ssl_get_algorithm2(s)) == 0 || md == NULL)
250 continue;
251
252 S3I(s)->handshake_dgst[i] = EVP_MD_CTX_create();
253 if (S3I(s)->handshake_dgst[i] == NULL) {
254 SSLerror(s, ERR_R_MALLOC_FAILURE);
255 goto err;
256 }
257 if (!EVP_DigestInit_ex(S3I(s)->handshake_dgst[i], md, NULL)) {
258 SSLerror(s, ERR_R_EVP_LIB);
259 goto err;
260 }
261 if (!EVP_DigestUpdate(S3I(s)->handshake_dgst[i], hdata,
262 hdatalen)) {
263 SSLerror(s, ERR_R_EVP_LIB);
264 goto err;
265 }
266 }
267
268 if (!(s->s3->flags & TLS1_FLAGS_KEEP_HANDSHAKE)) { 208 if (!(s->s3->flags & TLS1_FLAGS_KEEP_HANDSHAKE)) {
269 BIO_free(S3I(s)->handshake_buffer); 209 BIO_free(S3I(s)->handshake_buffer);
270 S3I(s)->handshake_buffer = NULL; 210 S3I(s)->handshake_buffer = NULL;
@@ -273,7 +213,6 @@ tls1_digest_cached_records(SSL *s)
273 return 1; 213 return 1;
274 214
275 err: 215 err:
276 tls1_free_digest_list(s);
277 return 0; 216 return 0;
278} 217}
279 218
@@ -1091,38 +1030,6 @@ tls1_enc(SSL *s, int send)
1091} 1030}
1092 1031
1093int 1032int
1094tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
1095{
1096 EVP_MD_CTX ctx, *d = NULL;
1097 unsigned int ret;
1098 int i;
1099
1100 if (S3I(s)->handshake_buffer)
1101 if (!tls1_digest_cached_records(s))
1102 return 0;
1103
1104 for (i = 0; i < SSL_MAX_DIGEST; i++) {
1105 if (S3I(s)->handshake_dgst[i] &&
1106 EVP_MD_CTX_type(S3I(s)->handshake_dgst[i]) == md_nid) {
1107 d = S3I(s)->handshake_dgst[i];
1108 break;
1109 }
1110 }
1111 if (d == NULL) {
1112 SSLerror(s, SSL_R_NO_REQUIRED_DIGEST);
1113 return 0;
1114 }
1115
1116 EVP_MD_CTX_init(&ctx);
1117 if (!EVP_MD_CTX_copy_ex(&ctx, d))
1118 return 0;
1119 EVP_DigestFinal_ex(&ctx, out, &ret);
1120 EVP_MD_CTX_cleanup(&ctx);
1121
1122 return ((int)ret);
1123}
1124
1125int
1126tls1_final_finish_mac(SSL *s, const char *str, int slen, unsigned char *out) 1033tls1_final_finish_mac(SSL *s, const char *str, int slen, unsigned char *out)
1127{ 1034{
1128 unsigned char buf1[EVP_MAX_MD_SIZE]; 1035 unsigned char buf1[EVP_MAX_MD_SIZE];