diff options
Diffstat (limited to 'src/lib/libssl/ssl_asn1.c')
| -rw-r--r-- | src/lib/libssl/ssl_asn1.c | 69 | 
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 | ||
| 47 | int | 47 | static int | 
| 48 | i2d_SSL_SESSION(SSL_SESSION *s, unsigned char **pp) | 48 | SSL_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 | |||
| 194 | int | ||
| 195 | SSL_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 | |||
| 206 | int | ||
| 207 | i2d_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 | } | 
