summaryrefslogtreecommitdiff
path: root/src/lib/libssl/t1_hash.c
diff options
context:
space:
mode:
authorjsing <>2019-02-09 15:30:52 +0000
committerjsing <>2019-02-09 15:30:52 +0000
commit05df66360f354ae86e98a98f38534d041726f923 (patch)
tree430dc56d0228cd0293c2192e8b9b092cb537e8c6 /src/lib/libssl/t1_hash.c
parent6535bd837c4df935c9b8881180e8dd93a83530dc (diff)
downloadopenbsd-05df66360f354ae86e98a98f38534d041726f923.tar.gz
openbsd-05df66360f354ae86e98a98f38534d041726f923.tar.bz2
openbsd-05df66360f354ae86e98a98f38534d041726f923.zip
Rename the file that contains the transcript handling code.
ok inoguchi@ tb@
Diffstat (limited to 'src/lib/libssl/t1_hash.c')
-rw-r--r--src/lib/libssl/t1_hash.c201
1 files changed, 0 insertions, 201 deletions
diff --git a/src/lib/libssl/t1_hash.c b/src/lib/libssl/t1_hash.c
deleted file mode 100644
index 12d66d4def..0000000000
--- a/src/lib/libssl/t1_hash.c
+++ /dev/null
@@ -1,201 +0,0 @@
1/* $OpenBSD: t1_hash.c,v 1.6 2019/02/09 15:26:15 jsing Exp $ */
2/*
3 * Copyright (c) 2017 Joel Sing <jsing@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include "ssl_locl.h"
19
20#include <openssl/ssl.h>
21
22int
23tls1_transcript_hash_init(SSL *s)
24{
25 const unsigned char *data;
26 const EVP_MD *md;
27 size_t len;
28
29 tls1_transcript_hash_free(s);
30
31 if (!ssl_get_handshake_evp_md(s, &md)) {
32 SSLerrorx(ERR_R_INTERNAL_ERROR);
33 goto err;
34 }
35
36 if ((S3I(s)->handshake_hash = EVP_MD_CTX_new()) == NULL) {
37 SSLerror(s, ERR_R_MALLOC_FAILURE);
38 goto err;
39 }
40 if (!EVP_DigestInit_ex(S3I(s)->handshake_hash, md, NULL)) {
41 SSLerror(s, ERR_R_EVP_LIB);
42 goto err;
43 }
44
45 if (!tls1_transcript_data(s, &data, &len)) {
46 SSLerror(s, SSL_R_BAD_HANDSHAKE_LENGTH);
47 goto err;
48 }
49 if (!tls1_transcript_hash_update(s, data, len)) {
50 SSLerror(s, ERR_R_EVP_LIB);
51 goto err;
52 }
53
54 return 1;
55
56 err:
57 tls1_transcript_hash_free(s);
58
59 return 0;
60}
61
62int
63tls1_transcript_hash_update(SSL *s, const unsigned char *buf, size_t len)
64{
65 if (S3I(s)->handshake_hash == NULL)
66 return 1;
67
68 return EVP_DigestUpdate(S3I(s)->handshake_hash, buf, len);
69}
70
71int
72tls1_transcript_hash_value(SSL *s, const unsigned char *out, size_t len,
73 size_t *outlen)
74{
75 EVP_MD_CTX *mdctx = NULL;
76 unsigned int mdlen;
77 int ret = 0;
78
79 if (EVP_MD_CTX_size(S3I(s)->handshake_hash) > len)
80 goto err;
81
82 if ((mdctx = EVP_MD_CTX_new()) == NULL) {
83 SSLerror(s, ERR_R_MALLOC_FAILURE);
84 goto err;
85 }
86 if (!EVP_MD_CTX_copy_ex(mdctx, S3I(s)->handshake_hash)) {
87 SSLerror(s, ERR_R_EVP_LIB);
88 goto err;
89 }
90 if (!EVP_DigestFinal_ex(mdctx, (unsigned char *)out, &mdlen)) {
91 SSLerror(s, ERR_R_EVP_LIB);
92 goto err;
93 }
94 if (outlen != NULL)
95 *outlen = mdlen;
96
97 ret = 1;
98
99 err:
100 EVP_MD_CTX_free(mdctx);
101
102 return (ret);
103}
104
105void
106tls1_transcript_hash_free(SSL *s)
107{
108 EVP_MD_CTX_free(S3I(s)->handshake_hash);
109 S3I(s)->handshake_hash = NULL;
110}
111
112int
113tls1_transcript_init(SSL *s)
114{
115 if (S3I(s)->handshake_transcript != NULL)
116 return 0;
117
118 if ((S3I(s)->handshake_transcript = BUF_MEM_new()) == NULL)
119 return 0;
120
121 tls1_transcript_reset(s);
122
123 return 1;
124}
125
126void
127tls1_transcript_free(SSL *s)
128{
129 BUF_MEM_free(S3I(s)->handshake_transcript);
130 S3I(s)->handshake_transcript = NULL;
131}
132
133void
134tls1_transcript_reset(SSL *s)
135{
136 /*
137 * We should check the return value of BUF_MEM_grow_clean(), however
138 * due to yet another bad API design, when called with a length of zero
139 * it is impossible to tell if it succeeded (returning a length of zero)
140 * or if it failed (and returned zero)... our implementation never
141 * fails with a length of zero, so we trust all is okay...
142 */
143 (void)BUF_MEM_grow_clean(S3I(s)->handshake_transcript, 0);
144
145 s->s3->flags &= ~TLS1_FLAGS_FREEZE_TRANSCRIPT;
146}
147
148int
149tls1_transcript_append(SSL *s, const unsigned char *buf, size_t len)
150{
151 size_t olen, nlen;
152
153 if (S3I(s)->handshake_transcript == NULL)
154 return 1;
155
156 if (s->s3->flags & TLS1_FLAGS_FREEZE_TRANSCRIPT)
157 return 1;
158
159 olen = S3I(s)->handshake_transcript->length;
160 nlen = olen + len;
161
162 if (nlen < olen)
163 return 0;
164
165 if (BUF_MEM_grow(S3I(s)->handshake_transcript, nlen) == 0)
166 return 0;
167
168 memcpy(S3I(s)->handshake_transcript->data + olen, buf, len);
169
170 return 1;
171}
172
173int
174tls1_transcript_data(SSL *s, const unsigned char **data, size_t *len)
175{
176 if (S3I(s)->handshake_transcript == NULL)
177 return 0;
178
179 *data = S3I(s)->handshake_transcript->data;
180 *len = S3I(s)->handshake_transcript->length;
181
182 return 1;
183}
184
185void
186tls1_transcript_freeze(SSL *s)
187{
188 s->s3->flags |= TLS1_FLAGS_FREEZE_TRANSCRIPT;
189}
190
191int
192tls1_transcript_record(SSL *s, const unsigned char *buf, size_t len)
193{
194 if (!tls1_transcript_hash_update(s, buf, len))
195 return 0;
196
197 if (!tls1_transcript_append(s, buf, len))
198 return 0;
199
200 return 1;
201}