summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_asn1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_asn1.c')
-rw-r--r--src/lib/libssl/ssl_asn1.c69
1 files changed, 49 insertions, 20 deletions
diff --git a/src/lib/libssl/ssl_asn1.c b/src/lib/libssl/ssl_asn1.c
index 0ca442faa0..94fc8685fc 100644
--- a/src/lib/libssl/ssl_asn1.c
+++ b/src/lib/libssl/ssl_asn1.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_asn1.c,v 1.56 2018/03/20 16:10:57 jsing Exp $ */ 1/* $OpenBSD: ssl_asn1.c,v 1.57 2018/08/27 16:42:48 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -44,23 +44,16 @@ time_max(void)
44 return 0; 44 return 0;
45} 45}
46 46
47int 47static int
48i2d_SSL_SESSION(SSL_SESSION *s, unsigned char **pp) 48SSL_SESSION_encode(SSL_SESSION *s, unsigned char **out, size_t *out_len,
49 int ticket_encoding)
49{ 50{
50 CBB cbb, session, cipher_suite, session_id, master_key, time, timeout; 51 CBB cbb, session, cipher_suite, session_id, master_key, time, timeout;
51 CBB peer_cert, sidctx, verify_result, hostname, lifetime, ticket; 52 CBB peer_cert, sidctx, verify_result, hostname, lifetime, ticket, value;
52 CBB value; 53 unsigned char *peer_cert_bytes = NULL;
53 unsigned char *data = NULL, *peer_cert_bytes = NULL; 54 int len, rv = 0;
54 size_t data_len = 0;
55 int len, rv = -1;
56 uint16_t cid; 55 uint16_t cid;
57 56
58 if (s == NULL)
59 return (0);
60
61 if (s->cipher == NULL && s->cipher_id == 0)
62 return (0);
63
64 if (!CBB_init(&cbb, 0)) 57 if (!CBB_init(&cbb, 0))
65 goto err; 58 goto err;
66 59
@@ -87,10 +80,11 @@ i2d_SSL_SESSION(SSL_SESSION *s, unsigned char **pp)
87 if (!CBB_add_u16(&cipher_suite, cid)) 80 if (!CBB_add_u16(&cipher_suite, cid))
88 goto err; 81 goto err;
89 82
90 /* Session ID. */ 83 /* Session ID - zero length for a ticket. */
91 if (!CBB_add_asn1(&session, &session_id, CBS_ASN1_OCTETSTRING)) 84 if (!CBB_add_asn1(&session, &session_id, CBS_ASN1_OCTETSTRING))
92 goto err; 85 goto err;
93 if (!CBB_add_bytes(&session_id, s->session_id, s->session_id_length)) 86 if (!CBB_add_bytes(&session_id, s->session_id,
87 ticket_encoding ? 0 : s->session_id_length))
94 goto err; 88 goto err;
95 89
96 /* Master key. */ 90 /* Master key. */
@@ -173,7 +167,7 @@ i2d_SSL_SESSION(SSL_SESSION *s, unsigned char **pp)
173 } 167 }
174 168
175 /* Ticket [10]. */ 169 /* Ticket [10]. */
176 if (s->tlsext_tick) { 170 if (s->tlsext_tick != NULL) {
177 if (!CBB_add_asn1(&session, &ticket, SSLASN1_TICKET_TAG)) 171 if (!CBB_add_asn1(&session, &ticket, SSLASN1_TICKET_TAG))
178 goto err; 172 goto err;
179 if (!CBB_add_asn1(&ticket, &value, CBS_ASN1_OCTETSTRING)) 173 if (!CBB_add_asn1(&ticket, &value, CBS_ASN1_OCTETSTRING))
@@ -185,7 +179,44 @@ i2d_SSL_SESSION(SSL_SESSION *s, unsigned char **pp)
185 /* Compression method [11]. */ 179 /* Compression method [11]. */
186 /* SRP username [12]. */ 180 /* SRP username [12]. */
187 181
188 if (!CBB_finish(&cbb, &data, &data_len)) 182 if (!CBB_finish(&cbb, out, out_len))
183 goto err;
184
185 rv = 1;
186
187 err:
188 CBB_cleanup(&cbb);
189 free(peer_cert_bytes);
190
191 return rv;
192}
193
194int
195SSL_SESSION_ticket(SSL_SESSION *ss, unsigned char **out, size_t *out_len)
196{
197 if (ss == NULL)
198 return 0;
199
200 if (ss->cipher == NULL && ss->cipher_id == 0)
201 return 0;
202
203 return SSL_SESSION_encode(ss, out, out_len, 1);
204}
205
206int
207i2d_SSL_SESSION(SSL_SESSION *ss, unsigned char **pp)
208{
209 unsigned char *data = NULL;
210 size_t data_len = 0;
211 int rv = -1;
212
213 if (ss == NULL)
214 return 0;
215
216 if (ss->cipher == NULL && ss->cipher_id == 0)
217 return 0;
218
219 if (!SSL_SESSION_encode(ss, &data, &data_len, 0))
189 goto err; 220 goto err;
190 221
191 if (data_len > INT_MAX) 222 if (data_len > INT_MAX)
@@ -204,9 +235,7 @@ i2d_SSL_SESSION(SSL_SESSION *s, unsigned char **pp)
204 rv = (int)data_len; 235 rv = (int)data_len;
205 236
206 err: 237 err:
207 CBB_cleanup(&cbb);
208 freezero(data, data_len); 238 freezero(data, data_len);
209 free(peer_cert_bytes);
210 239
211 return rv; 240 return rv;
212} 241}