diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/src/ssl/ssl_asn1.c | 173 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_asn1.c | 173 |
2 files changed, 196 insertions, 150 deletions
diff --git a/src/lib/libssl/src/ssl/ssl_asn1.c b/src/lib/libssl/src/ssl/ssl_asn1.c index 0c9b4aa6fb..33a8edf20a 100644 --- a/src/lib/libssl/src/ssl/ssl_asn1.c +++ b/src/lib/libssl/src/ssl/ssl_asn1.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_asn1.c,v 1.30 2014/07/13 00:30:07 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_asn1.c,v 1.31 2014/07/13 16:30:50 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 | * |
| @@ -116,7 +116,8 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 116 | unsigned char ibuf3[LSIZE2], ibuf4[LSIZE2], ibuf5[LSIZE2]; | 116 | unsigned char ibuf3[LSIZE2], ibuf4[LSIZE2], ibuf5[LSIZE2]; |
| 117 | unsigned char ibuf6[LSIZE2]; | 117 | unsigned char ibuf6[LSIZE2]; |
| 118 | SSL_SESSION_ASN1 a; | 118 | SSL_SESSION_ASN1 a; |
| 119 | M_ASN1_I2D_vars(in); | 119 | unsigned char *p; |
| 120 | int len = 0, ret; | ||
| 120 | long l; | 121 | long l; |
| 121 | 122 | ||
| 122 | if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0))) | 123 | if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0))) |
| @@ -133,40 +134,39 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 133 | a.version.type = V_ASN1_INTEGER; | 134 | a.version.type = V_ASN1_INTEGER; |
| 134 | a.version.data = ibuf1; | 135 | a.version.data = ibuf1; |
| 135 | ASN1_INTEGER_set(&(a.version), SSL_SESSION_ASN1_VERSION); | 136 | ASN1_INTEGER_set(&(a.version), SSL_SESSION_ASN1_VERSION); |
| 137 | len += i2d_ASN1_INTEGER(&(a.version), NULL); | ||
| 136 | 138 | ||
| 137 | a.ssl_version.length = LSIZE2; | 139 | a.ssl_version.length = LSIZE2; |
| 138 | a.ssl_version.type = V_ASN1_INTEGER; | 140 | a.ssl_version.type = V_ASN1_INTEGER; |
| 139 | a.ssl_version.data = ibuf2; | 141 | a.ssl_version.data = ibuf2; |
| 140 | ASN1_INTEGER_set(&(a.ssl_version), in->ssl_version); | 142 | ASN1_INTEGER_set(&(a.ssl_version), in->ssl_version); |
| 143 | len += i2d_ASN1_INTEGER(&(a.ssl_version), NULL); | ||
| 141 | 144 | ||
| 145 | a.cipher.length = 2; | ||
| 142 | a.cipher.type = V_ASN1_OCTET_STRING; | 146 | a.cipher.type = V_ASN1_OCTET_STRING; |
| 147 | l = (in->cipher == NULL) ? in->cipher_id : in->cipher->id; | ||
| 148 | buf[0] = ((unsigned char)(l >> 8L)) & 0xff; | ||
| 149 | buf[1] = ((unsigned char)(l)) & 0xff; | ||
| 143 | a.cipher.data = buf; | 150 | a.cipher.data = buf; |
| 144 | 151 | len += i2d_ASN1_OCTET_STRING(&(a.cipher), NULL); | |
| 145 | if (in->cipher == NULL) | ||
| 146 | l = in->cipher_id; | ||
| 147 | else | ||
| 148 | l = in->cipher->id; | ||
| 149 | a.cipher.length = 2; | ||
| 150 | buf[0] = ((unsigned char)(l >> 8L))&0xff; | ||
| 151 | buf[1] = ((unsigned char)(l ))&0xff; | ||
| 152 | 152 | ||
| 153 | a.master_key.length = in->master_key_length; | 153 | a.master_key.length = in->master_key_length; |
| 154 | a.master_key.type = V_ASN1_OCTET_STRING; | 154 | a.master_key.type = V_ASN1_OCTET_STRING; |
| 155 | a.master_key.data = in->master_key; | 155 | a.master_key.data = in->master_key; |
| 156 | len += i2d_ASN1_OCTET_STRING(&(a.master_key), NULL); | ||
| 156 | 157 | ||
| 157 | a.session_id.length = in->session_id_length; | 158 | a.session_id.length = in->session_id_length; |
| 158 | a.session_id.type = V_ASN1_OCTET_STRING; | 159 | a.session_id.type = V_ASN1_OCTET_STRING; |
| 159 | a.session_id.data = in->session_id; | 160 | a.session_id.data = in->session_id; |
| 160 | 161 | len += i2d_ASN1_OCTET_STRING(&(a.session_id), NULL); | |
| 161 | a.session_id_context.length = in->sid_ctx_length; | ||
| 162 | a.session_id_context.type = V_ASN1_OCTET_STRING; | ||
| 163 | a.session_id_context.data = in->sid_ctx; | ||
| 164 | 162 | ||
| 165 | if (in->time != 0L) { | 163 | if (in->time != 0L) { |
| 166 | a.time.length = LSIZE2; | 164 | a.time.length = LSIZE2; |
| 167 | a.time.type = V_ASN1_INTEGER; | 165 | a.time.type = V_ASN1_INTEGER; |
| 168 | a.time.data = ibuf3; | 166 | a.time.data = ibuf3; |
| 169 | ASN1_INTEGER_set(&(a.time), in->time); /* XXX 2038 */ | 167 | ASN1_INTEGER_set(&(a.time), in->time); /* XXX 2038 */ |
| 168 | v1 = i2d_ASN1_INTEGER(&(a.time), NULL); | ||
| 169 | len += ASN1_object_size(1, v1, 1); | ||
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | if (in->timeout != 0L) { | 172 | if (in->timeout != 0L) { |
| @@ -174,89 +174,112 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 174 | a.timeout.type = V_ASN1_INTEGER; | 174 | a.timeout.type = V_ASN1_INTEGER; |
| 175 | a.timeout.data = ibuf4; | 175 | a.timeout.data = ibuf4; |
| 176 | ASN1_INTEGER_set(&(a.timeout), in->timeout); | 176 | ASN1_INTEGER_set(&(a.timeout), in->timeout); |
| 177 | v2 = i2d_ASN1_INTEGER(&(a.timeout), NULL); | ||
| 178 | len += ASN1_object_size(1, v2, 2); | ||
| 177 | } | 179 | } |
| 178 | 180 | ||
| 181 | if (in->peer != NULL) { | ||
| 182 | v3 = i2d_X509(in->peer, NULL); | ||
| 183 | len += ASN1_object_size(1, v3, 3); | ||
| 184 | } | ||
| 185 | |||
| 186 | a.session_id_context.length = in->sid_ctx_length; | ||
| 187 | a.session_id_context.type = V_ASN1_OCTET_STRING; | ||
| 188 | a.session_id_context.data = in->sid_ctx; | ||
| 189 | v4 = i2d_ASN1_OCTET_STRING(&(a.session_id_context), NULL); | ||
| 190 | len += ASN1_object_size(1, v4, 4); | ||
| 191 | |||
| 179 | if (in->verify_result != X509_V_OK) { | 192 | if (in->verify_result != X509_V_OK) { |
| 180 | a.verify_result.length = LSIZE2; | 193 | a.verify_result.length = LSIZE2; |
| 181 | a.verify_result.type = V_ASN1_INTEGER; | 194 | a.verify_result.type = V_ASN1_INTEGER; |
| 182 | a.verify_result.data = ibuf5; | 195 | a.verify_result.data = ibuf5; |
| 183 | ASN1_INTEGER_set(&a.verify_result, in->verify_result); | 196 | ASN1_INTEGER_set(&a.verify_result, in->verify_result); |
| 197 | v5 = i2d_ASN1_INTEGER(&(a.verify_result), NULL); | ||
| 198 | len += ASN1_object_size(1, v5, 5); | ||
| 184 | } | 199 | } |
| 185 | 200 | ||
| 186 | if (in->tlsext_hostname) { | 201 | if (in->tlsext_hostname) { |
| 187 | a.tlsext_hostname.length = strlen(in->tlsext_hostname); | 202 | a.tlsext_hostname.length = strlen(in->tlsext_hostname); |
| 188 | a.tlsext_hostname.type = V_ASN1_OCTET_STRING; | 203 | a.tlsext_hostname.type = V_ASN1_OCTET_STRING; |
| 189 | a.tlsext_hostname.data = (unsigned char *)in->tlsext_hostname; | 204 | a.tlsext_hostname.data = (unsigned char *)in->tlsext_hostname; |
| 205 | v6 = i2d_ASN1_OCTET_STRING(&(a.tlsext_hostname), NULL); | ||
| 206 | len += ASN1_object_size(1, v6, 6); | ||
| 190 | } | 207 | } |
| 191 | if (in->tlsext_tick) { | 208 | |
| 192 | a.tlsext_tick.length = in->tlsext_ticklen; | 209 | /* 7 - PSK identity hint. */ |
| 193 | a.tlsext_tick.type = V_ASN1_OCTET_STRING; | 210 | /* 8 - PSK identity. */ |
| 194 | a.tlsext_tick.data = (unsigned char *)in->tlsext_tick; | 211 | |
| 195 | } | ||
| 196 | if (in->tlsext_tick_lifetime_hint > 0) { | 212 | if (in->tlsext_tick_lifetime_hint > 0) { |
| 197 | a.tlsext_tick_lifetime.length = LSIZE2; | 213 | a.tlsext_tick_lifetime.length = LSIZE2; |
| 198 | a.tlsext_tick_lifetime.type = V_ASN1_INTEGER; | 214 | a.tlsext_tick_lifetime.type = V_ASN1_INTEGER; |
| 199 | a.tlsext_tick_lifetime.data = ibuf6; | 215 | a.tlsext_tick_lifetime.data = ibuf6; |
| 200 | ASN1_INTEGER_set(&a.tlsext_tick_lifetime, | 216 | ASN1_INTEGER_set(&a.tlsext_tick_lifetime, |
| 201 | in->tlsext_tick_lifetime_hint); | 217 | in->tlsext_tick_lifetime_hint); |
| 218 | v9 = i2d_ASN1_INTEGER(&(a.tlsext_tick_lifetime), NULL); | ||
| 219 | len += ASN1_object_size(1, v9, 9); | ||
| 220 | } | ||
| 221 | |||
| 222 | if (in->tlsext_tick) { | ||
| 223 | a.tlsext_tick.length = in->tlsext_ticklen; | ||
| 224 | a.tlsext_tick.type = V_ASN1_OCTET_STRING; | ||
| 225 | a.tlsext_tick.data = (unsigned char *)in->tlsext_tick; | ||
| 226 | v10 = i2d_ASN1_OCTET_STRING(&(a.tlsext_tick), NULL); | ||
| 227 | len += ASN1_object_size(1, v10, 10); | ||
| 228 | } | ||
| 229 | |||
| 230 | /* 11 - Compression method. */ | ||
| 231 | /* 12 - SRP username. */ | ||
| 232 | |||
| 233 | /* If given a NULL pointer, return the length only. */ | ||
| 234 | ret = (ASN1_object_size(1, len, V_ASN1_SEQUENCE)); | ||
| 235 | if (pp == NULL) | ||
| 236 | return (ret); | ||
| 237 | |||
| 238 | /* Burp out the ASN1. */ | ||
| 239 | p = *pp; | ||
| 240 | ASN1_put_object(&p, 1, len, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL); | ||
| 241 | i2d_ASN1_INTEGER(&(a.version), &p); | ||
| 242 | i2d_ASN1_INTEGER(&(a.ssl_version), &p); | ||
| 243 | i2d_ASN1_OCTET_STRING(&(a.cipher), &p); | ||
| 244 | i2d_ASN1_OCTET_STRING(&(a.session_id), &p); | ||
| 245 | i2d_ASN1_OCTET_STRING(&(a.master_key), &p); | ||
| 246 | if (in->time != 0L) { | ||
| 247 | ASN1_put_object(&p, 1, v1, 1, V_ASN1_CONTEXT_SPECIFIC); | ||
| 248 | i2d_ASN1_INTEGER(&(a.time), &p); | ||
| 249 | } | ||
| 250 | if (in->timeout != 0L) { | ||
| 251 | ASN1_put_object(&p, 1, v2, 2, V_ASN1_CONTEXT_SPECIFIC); | ||
| 252 | i2d_ASN1_INTEGER(&(a.timeout), &p); | ||
| 253 | } | ||
| 254 | if (in->peer != NULL) { | ||
| 255 | ASN1_put_object(&p, 1, v3, 3, V_ASN1_CONTEXT_SPECIFIC); | ||
| 256 | i2d_X509(in->peer, &p); | ||
| 257 | } | ||
| 258 | ASN1_put_object(&p, 1, v4, 4, V_ASN1_CONTEXT_SPECIFIC); | ||
| 259 | i2d_ASN1_OCTET_STRING(&(a.session_id_context), &p); | ||
| 260 | if (in->verify_result != X509_V_OK) { | ||
| 261 | ASN1_put_object(&p, 1, v5, 5, V_ASN1_CONTEXT_SPECIFIC); | ||
| 262 | i2d_ASN1_INTEGER(&(a.verify_result), &p); | ||
| 263 | } | ||
| 264 | if (in->tlsext_hostname) { | ||
| 265 | ASN1_put_object(&p, 1, v6, 6, V_ASN1_CONTEXT_SPECIFIC); | ||
| 266 | i2d_ASN1_OCTET_STRING(&(a.tlsext_hostname), &p); | ||
| 267 | } | ||
| 268 | /* 7 - PSK identity hint. */ | ||
| 269 | /* 8 - PSK identity. */ | ||
| 270 | if (in->tlsext_tick_lifetime_hint > 0) { | ||
| 271 | ASN1_put_object(&p, 1, v9, 9, V_ASN1_CONTEXT_SPECIFIC); | ||
| 272 | i2d_ASN1_INTEGER(&(a.tlsext_tick_lifetime), &p); | ||
| 273 | } | ||
| 274 | if (in->tlsext_tick) { | ||
| 275 | ASN1_put_object(&p, 1, v10, 10, V_ASN1_CONTEXT_SPECIFIC); | ||
| 276 | i2d_ASN1_OCTET_STRING(&(a.tlsext_tick), &p); | ||
| 202 | } | 277 | } |
| 278 | /* 11 - Compression method. */ | ||
| 279 | /* 12 - SRP username. */ | ||
| 203 | 280 | ||
| 204 | M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER); | 281 | *pp = p; |
| 205 | M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER); | 282 | return (ret); |
| 206 | M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING); | ||
| 207 | M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING); | ||
| 208 | M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING); | ||
| 209 | |||
| 210 | if (in->time != 0L) | ||
| 211 | M_ASN1_I2D_len_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); | ||
| 212 | if (in->timeout != 0L) | ||
| 213 | M_ASN1_I2D_len_EXP_opt(&(a.timeout), i2d_ASN1_INTEGER, 2, v2); | ||
| 214 | if (in->peer != NULL) | ||
| 215 | M_ASN1_I2D_len_EXP_opt(in->peer, i2d_X509, 3, v3); | ||
| 216 | M_ASN1_I2D_len_EXP_opt(&a.session_id_context, | ||
| 217 | i2d_ASN1_OCTET_STRING, 4, v4); | ||
| 218 | if (in->verify_result != X509_V_OK) | ||
| 219 | M_ASN1_I2D_len_EXP_opt(&(a.verify_result), | ||
| 220 | i2d_ASN1_INTEGER, 5, v5); | ||
| 221 | if (in->tlsext_tick_lifetime_hint > 0) | ||
| 222 | M_ASN1_I2D_len_EXP_opt(&a.tlsext_tick_lifetime, | ||
| 223 | i2d_ASN1_INTEGER, 9, v9); | ||
| 224 | if (in->tlsext_tick) | ||
| 225 | M_ASN1_I2D_len_EXP_opt(&(a.tlsext_tick), | ||
| 226 | i2d_ASN1_OCTET_STRING, 10, v10); | ||
| 227 | if (in->tlsext_hostname) | ||
| 228 | M_ASN1_I2D_len_EXP_opt(&(a.tlsext_hostname), | ||
| 229 | i2d_ASN1_OCTET_STRING, 6, v6); | ||
| 230 | |||
| 231 | M_ASN1_I2D_seq_total(); | ||
| 232 | |||
| 233 | M_ASN1_I2D_put(&(a.version), i2d_ASN1_INTEGER); | ||
| 234 | M_ASN1_I2D_put(&(a.ssl_version), i2d_ASN1_INTEGER); | ||
| 235 | M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING); | ||
| 236 | M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING); | ||
| 237 | M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING); | ||
| 238 | if (in->time != 0L) | ||
| 239 | M_ASN1_I2D_put_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); | ||
| 240 | if (in->timeout != 0L) | ||
| 241 | M_ASN1_I2D_put_EXP_opt(&(a.timeout), i2d_ASN1_INTEGER, 2, v2); | ||
| 242 | if (in->peer != NULL) | ||
| 243 | M_ASN1_I2D_put_EXP_opt(in->peer, i2d_X509, 3, v3); | ||
| 244 | M_ASN1_I2D_put_EXP_opt(&a.session_id_context, | ||
| 245 | i2d_ASN1_OCTET_STRING, 4, v4); | ||
| 246 | if (in->verify_result != X509_V_OK) | ||
| 247 | M_ASN1_I2D_put_EXP_opt(&a.verify_result, | ||
| 248 | i2d_ASN1_INTEGER, 5, v5); | ||
| 249 | if (in->tlsext_hostname) | ||
| 250 | M_ASN1_I2D_put_EXP_opt(&(a.tlsext_hostname), | ||
| 251 | i2d_ASN1_OCTET_STRING, 6, v6); | ||
| 252 | if (in->tlsext_tick_lifetime_hint > 0) | ||
| 253 | M_ASN1_I2D_put_EXP_opt(&a.tlsext_tick_lifetime, | ||
| 254 | i2d_ASN1_INTEGER, 9, v9); | ||
| 255 | if (in->tlsext_tick) | ||
| 256 | M_ASN1_I2D_put_EXP_opt(&(a.tlsext_tick), | ||
| 257 | i2d_ASN1_OCTET_STRING, 10, v10); | ||
| 258 | |||
| 259 | M_ASN1_I2D_finish(); | ||
| 260 | } | 283 | } |
| 261 | 284 | ||
| 262 | SSL_SESSION * | 285 | SSL_SESSION * |
diff --git a/src/lib/libssl/ssl_asn1.c b/src/lib/libssl/ssl_asn1.c index 0c9b4aa6fb..33a8edf20a 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.30 2014/07/13 00:30:07 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_asn1.c,v 1.31 2014/07/13 16:30:50 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 | * |
| @@ -116,7 +116,8 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 116 | unsigned char ibuf3[LSIZE2], ibuf4[LSIZE2], ibuf5[LSIZE2]; | 116 | unsigned char ibuf3[LSIZE2], ibuf4[LSIZE2], ibuf5[LSIZE2]; |
| 117 | unsigned char ibuf6[LSIZE2]; | 117 | unsigned char ibuf6[LSIZE2]; |
| 118 | SSL_SESSION_ASN1 a; | 118 | SSL_SESSION_ASN1 a; |
| 119 | M_ASN1_I2D_vars(in); | 119 | unsigned char *p; |
| 120 | int len = 0, ret; | ||
| 120 | long l; | 121 | long l; |
| 121 | 122 | ||
| 122 | if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0))) | 123 | if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0))) |
| @@ -133,40 +134,39 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 133 | a.version.type = V_ASN1_INTEGER; | 134 | a.version.type = V_ASN1_INTEGER; |
| 134 | a.version.data = ibuf1; | 135 | a.version.data = ibuf1; |
| 135 | ASN1_INTEGER_set(&(a.version), SSL_SESSION_ASN1_VERSION); | 136 | ASN1_INTEGER_set(&(a.version), SSL_SESSION_ASN1_VERSION); |
| 137 | len += i2d_ASN1_INTEGER(&(a.version), NULL); | ||
| 136 | 138 | ||
| 137 | a.ssl_version.length = LSIZE2; | 139 | a.ssl_version.length = LSIZE2; |
| 138 | a.ssl_version.type = V_ASN1_INTEGER; | 140 | a.ssl_version.type = V_ASN1_INTEGER; |
| 139 | a.ssl_version.data = ibuf2; | 141 | a.ssl_version.data = ibuf2; |
| 140 | ASN1_INTEGER_set(&(a.ssl_version), in->ssl_version); | 142 | ASN1_INTEGER_set(&(a.ssl_version), in->ssl_version); |
| 143 | len += i2d_ASN1_INTEGER(&(a.ssl_version), NULL); | ||
| 141 | 144 | ||
| 145 | a.cipher.length = 2; | ||
| 142 | a.cipher.type = V_ASN1_OCTET_STRING; | 146 | a.cipher.type = V_ASN1_OCTET_STRING; |
| 147 | l = (in->cipher == NULL) ? in->cipher_id : in->cipher->id; | ||
| 148 | buf[0] = ((unsigned char)(l >> 8L)) & 0xff; | ||
| 149 | buf[1] = ((unsigned char)(l)) & 0xff; | ||
| 143 | a.cipher.data = buf; | 150 | a.cipher.data = buf; |
| 144 | 151 | len += i2d_ASN1_OCTET_STRING(&(a.cipher), NULL); | |
| 145 | if (in->cipher == NULL) | ||
| 146 | l = in->cipher_id; | ||
| 147 | else | ||
| 148 | l = in->cipher->id; | ||
| 149 | a.cipher.length = 2; | ||
| 150 | buf[0] = ((unsigned char)(l >> 8L))&0xff; | ||
| 151 | buf[1] = ((unsigned char)(l ))&0xff; | ||
| 152 | 152 | ||
| 153 | a.master_key.length = in->master_key_length; | 153 | a.master_key.length = in->master_key_length; |
| 154 | a.master_key.type = V_ASN1_OCTET_STRING; | 154 | a.master_key.type = V_ASN1_OCTET_STRING; |
| 155 | a.master_key.data = in->master_key; | 155 | a.master_key.data = in->master_key; |
| 156 | len += i2d_ASN1_OCTET_STRING(&(a.master_key), NULL); | ||
| 156 | 157 | ||
| 157 | a.session_id.length = in->session_id_length; | 158 | a.session_id.length = in->session_id_length; |
| 158 | a.session_id.type = V_ASN1_OCTET_STRING; | 159 | a.session_id.type = V_ASN1_OCTET_STRING; |
| 159 | a.session_id.data = in->session_id; | 160 | a.session_id.data = in->session_id; |
| 160 | 161 | len += i2d_ASN1_OCTET_STRING(&(a.session_id), NULL); | |
| 161 | a.session_id_context.length = in->sid_ctx_length; | ||
| 162 | a.session_id_context.type = V_ASN1_OCTET_STRING; | ||
| 163 | a.session_id_context.data = in->sid_ctx; | ||
| 164 | 162 | ||
| 165 | if (in->time != 0L) { | 163 | if (in->time != 0L) { |
| 166 | a.time.length = LSIZE2; | 164 | a.time.length = LSIZE2; |
| 167 | a.time.type = V_ASN1_INTEGER; | 165 | a.time.type = V_ASN1_INTEGER; |
| 168 | a.time.data = ibuf3; | 166 | a.time.data = ibuf3; |
| 169 | ASN1_INTEGER_set(&(a.time), in->time); /* XXX 2038 */ | 167 | ASN1_INTEGER_set(&(a.time), in->time); /* XXX 2038 */ |
| 168 | v1 = i2d_ASN1_INTEGER(&(a.time), NULL); | ||
| 169 | len += ASN1_object_size(1, v1, 1); | ||
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | if (in->timeout != 0L) { | 172 | if (in->timeout != 0L) { |
| @@ -174,89 +174,112 @@ i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) | |||
| 174 | a.timeout.type = V_ASN1_INTEGER; | 174 | a.timeout.type = V_ASN1_INTEGER; |
| 175 | a.timeout.data = ibuf4; | 175 | a.timeout.data = ibuf4; |
| 176 | ASN1_INTEGER_set(&(a.timeout), in->timeout); | 176 | ASN1_INTEGER_set(&(a.timeout), in->timeout); |
| 177 | v2 = i2d_ASN1_INTEGER(&(a.timeout), NULL); | ||
| 178 | len += ASN1_object_size(1, v2, 2); | ||
| 177 | } | 179 | } |
| 178 | 180 | ||
| 181 | if (in->peer != NULL) { | ||
| 182 | v3 = i2d_X509(in->peer, NULL); | ||
| 183 | len += ASN1_object_size(1, v3, 3); | ||
| 184 | } | ||
| 185 | |||
| 186 | a.session_id_context.length = in->sid_ctx_length; | ||
| 187 | a.session_id_context.type = V_ASN1_OCTET_STRING; | ||
| 188 | a.session_id_context.data = in->sid_ctx; | ||
| 189 | v4 = i2d_ASN1_OCTET_STRING(&(a.session_id_context), NULL); | ||
| 190 | len += ASN1_object_size(1, v4, 4); | ||
| 191 | |||
| 179 | if (in->verify_result != X509_V_OK) { | 192 | if (in->verify_result != X509_V_OK) { |
| 180 | a.verify_result.length = LSIZE2; | 193 | a.verify_result.length = LSIZE2; |
| 181 | a.verify_result.type = V_ASN1_INTEGER; | 194 | a.verify_result.type = V_ASN1_INTEGER; |
| 182 | a.verify_result.data = ibuf5; | 195 | a.verify_result.data = ibuf5; |
| 183 | ASN1_INTEGER_set(&a.verify_result, in->verify_result); | 196 | ASN1_INTEGER_set(&a.verify_result, in->verify_result); |
| 197 | v5 = i2d_ASN1_INTEGER(&(a.verify_result), NULL); | ||
| 198 | len += ASN1_object_size(1, v5, 5); | ||
| 184 | } | 199 | } |
| 185 | 200 | ||
| 186 | if (in->tlsext_hostname) { | 201 | if (in->tlsext_hostname) { |
| 187 | a.tlsext_hostname.length = strlen(in->tlsext_hostname); | 202 | a.tlsext_hostname.length = strlen(in->tlsext_hostname); |
| 188 | a.tlsext_hostname.type = V_ASN1_OCTET_STRING; | 203 | a.tlsext_hostname.type = V_ASN1_OCTET_STRING; |
| 189 | a.tlsext_hostname.data = (unsigned char *)in->tlsext_hostname; | 204 | a.tlsext_hostname.data = (unsigned char *)in->tlsext_hostname; |
| 205 | v6 = i2d_ASN1_OCTET_STRING(&(a.tlsext_hostname), NULL); | ||
| 206 | len += ASN1_object_size(1, v6, 6); | ||
| 190 | } | 207 | } |
| 191 | if (in->tlsext_tick) { | 208 | |
| 192 | a.tlsext_tick.length = in->tlsext_ticklen; | 209 | /* 7 - PSK identity hint. */ |
| 193 | a.tlsext_tick.type = V_ASN1_OCTET_STRING; | 210 | /* 8 - PSK identity. */ |
| 194 | a.tlsext_tick.data = (unsigned char *)in->tlsext_tick; | 211 | |
| 195 | } | ||
| 196 | if (in->tlsext_tick_lifetime_hint > 0) { | 212 | if (in->tlsext_tick_lifetime_hint > 0) { |
| 197 | a.tlsext_tick_lifetime.length = LSIZE2; | 213 | a.tlsext_tick_lifetime.length = LSIZE2; |
| 198 | a.tlsext_tick_lifetime.type = V_ASN1_INTEGER; | 214 | a.tlsext_tick_lifetime.type = V_ASN1_INTEGER; |
| 199 | a.tlsext_tick_lifetime.data = ibuf6; | 215 | a.tlsext_tick_lifetime.data = ibuf6; |
| 200 | ASN1_INTEGER_set(&a.tlsext_tick_lifetime, | 216 | ASN1_INTEGER_set(&a.tlsext_tick_lifetime, |
| 201 | in->tlsext_tick_lifetime_hint); | 217 | in->tlsext_tick_lifetime_hint); |
| 218 | v9 = i2d_ASN1_INTEGER(&(a.tlsext_tick_lifetime), NULL); | ||
| 219 | len += ASN1_object_size(1, v9, 9); | ||
| 220 | } | ||
| 221 | |||
| 222 | if (in->tlsext_tick) { | ||
| 223 | a.tlsext_tick.length = in->tlsext_ticklen; | ||
| 224 | a.tlsext_tick.type = V_ASN1_OCTET_STRING; | ||
| 225 | a.tlsext_tick.data = (unsigned char *)in->tlsext_tick; | ||
| 226 | v10 = i2d_ASN1_OCTET_STRING(&(a.tlsext_tick), NULL); | ||
| 227 | len += ASN1_object_size(1, v10, 10); | ||
| 228 | } | ||
| 229 | |||
| 230 | /* 11 - Compression method. */ | ||
| 231 | /* 12 - SRP username. */ | ||
| 232 | |||
| 233 | /* If given a NULL pointer, return the length only. */ | ||
| 234 | ret = (ASN1_object_size(1, len, V_ASN1_SEQUENCE)); | ||
| 235 | if (pp == NULL) | ||
| 236 | return (ret); | ||
| 237 | |||
| 238 | /* Burp out the ASN1. */ | ||
| 239 | p = *pp; | ||
| 240 | ASN1_put_object(&p, 1, len, V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL); | ||
| 241 | i2d_ASN1_INTEGER(&(a.version), &p); | ||
| 242 | i2d_ASN1_INTEGER(&(a.ssl_version), &p); | ||
| 243 | i2d_ASN1_OCTET_STRING(&(a.cipher), &p); | ||
| 244 | i2d_ASN1_OCTET_STRING(&(a.session_id), &p); | ||
| 245 | i2d_ASN1_OCTET_STRING(&(a.master_key), &p); | ||
| 246 | if (in->time != 0L) { | ||
| 247 | ASN1_put_object(&p, 1, v1, 1, V_ASN1_CONTEXT_SPECIFIC); | ||
| 248 | i2d_ASN1_INTEGER(&(a.time), &p); | ||
| 249 | } | ||
| 250 | if (in->timeout != 0L) { | ||
| 251 | ASN1_put_object(&p, 1, v2, 2, V_ASN1_CONTEXT_SPECIFIC); | ||
| 252 | i2d_ASN1_INTEGER(&(a.timeout), &p); | ||
| 253 | } | ||
| 254 | if (in->peer != NULL) { | ||
| 255 | ASN1_put_object(&p, 1, v3, 3, V_ASN1_CONTEXT_SPECIFIC); | ||
| 256 | i2d_X509(in->peer, &p); | ||
| 257 | } | ||
| 258 | ASN1_put_object(&p, 1, v4, 4, V_ASN1_CONTEXT_SPECIFIC); | ||
| 259 | i2d_ASN1_OCTET_STRING(&(a.session_id_context), &p); | ||
| 260 | if (in->verify_result != X509_V_OK) { | ||
| 261 | ASN1_put_object(&p, 1, v5, 5, V_ASN1_CONTEXT_SPECIFIC); | ||
| 262 | i2d_ASN1_INTEGER(&(a.verify_result), &p); | ||
| 263 | } | ||
| 264 | if (in->tlsext_hostname) { | ||
| 265 | ASN1_put_object(&p, 1, v6, 6, V_ASN1_CONTEXT_SPECIFIC); | ||
| 266 | i2d_ASN1_OCTET_STRING(&(a.tlsext_hostname), &p); | ||
| 267 | } | ||
| 268 | /* 7 - PSK identity hint. */ | ||
| 269 | /* 8 - PSK identity. */ | ||
| 270 | if (in->tlsext_tick_lifetime_hint > 0) { | ||
| 271 | ASN1_put_object(&p, 1, v9, 9, V_ASN1_CONTEXT_SPECIFIC); | ||
| 272 | i2d_ASN1_INTEGER(&(a.tlsext_tick_lifetime), &p); | ||
| 273 | } | ||
| 274 | if (in->tlsext_tick) { | ||
| 275 | ASN1_put_object(&p, 1, v10, 10, V_ASN1_CONTEXT_SPECIFIC); | ||
| 276 | i2d_ASN1_OCTET_STRING(&(a.tlsext_tick), &p); | ||
| 202 | } | 277 | } |
| 278 | /* 11 - Compression method. */ | ||
| 279 | /* 12 - SRP username. */ | ||
| 203 | 280 | ||
| 204 | M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER); | 281 | *pp = p; |
| 205 | M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER); | 282 | return (ret); |
| 206 | M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING); | ||
| 207 | M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING); | ||
| 208 | M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING); | ||
| 209 | |||
| 210 | if (in->time != 0L) | ||
| 211 | M_ASN1_I2D_len_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); | ||
| 212 | if (in->timeout != 0L) | ||
| 213 | M_ASN1_I2D_len_EXP_opt(&(a.timeout), i2d_ASN1_INTEGER, 2, v2); | ||
| 214 | if (in->peer != NULL) | ||
| 215 | M_ASN1_I2D_len_EXP_opt(in->peer, i2d_X509, 3, v3); | ||
| 216 | M_ASN1_I2D_len_EXP_opt(&a.session_id_context, | ||
| 217 | i2d_ASN1_OCTET_STRING, 4, v4); | ||
| 218 | if (in->verify_result != X509_V_OK) | ||
| 219 | M_ASN1_I2D_len_EXP_opt(&(a.verify_result), | ||
| 220 | i2d_ASN1_INTEGER, 5, v5); | ||
| 221 | if (in->tlsext_tick_lifetime_hint > 0) | ||
| 222 | M_ASN1_I2D_len_EXP_opt(&a.tlsext_tick_lifetime, | ||
| 223 | i2d_ASN1_INTEGER, 9, v9); | ||
| 224 | if (in->tlsext_tick) | ||
| 225 | M_ASN1_I2D_len_EXP_opt(&(a.tlsext_tick), | ||
| 226 | i2d_ASN1_OCTET_STRING, 10, v10); | ||
| 227 | if (in->tlsext_hostname) | ||
| 228 | M_ASN1_I2D_len_EXP_opt(&(a.tlsext_hostname), | ||
| 229 | i2d_ASN1_OCTET_STRING, 6, v6); | ||
| 230 | |||
| 231 | M_ASN1_I2D_seq_total(); | ||
| 232 | |||
| 233 | M_ASN1_I2D_put(&(a.version), i2d_ASN1_INTEGER); | ||
| 234 | M_ASN1_I2D_put(&(a.ssl_version), i2d_ASN1_INTEGER); | ||
| 235 | M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING); | ||
| 236 | M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING); | ||
| 237 | M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING); | ||
| 238 | if (in->time != 0L) | ||
| 239 | M_ASN1_I2D_put_EXP_opt(&(a.time), i2d_ASN1_INTEGER, 1, v1); | ||
| 240 | if (in->timeout != 0L) | ||
| 241 | M_ASN1_I2D_put_EXP_opt(&(a.timeout), i2d_ASN1_INTEGER, 2, v2); | ||
| 242 | if (in->peer != NULL) | ||
| 243 | M_ASN1_I2D_put_EXP_opt(in->peer, i2d_X509, 3, v3); | ||
| 244 | M_ASN1_I2D_put_EXP_opt(&a.session_id_context, | ||
| 245 | i2d_ASN1_OCTET_STRING, 4, v4); | ||
| 246 | if (in->verify_result != X509_V_OK) | ||
| 247 | M_ASN1_I2D_put_EXP_opt(&a.verify_result, | ||
| 248 | i2d_ASN1_INTEGER, 5, v5); | ||
| 249 | if (in->tlsext_hostname) | ||
| 250 | M_ASN1_I2D_put_EXP_opt(&(a.tlsext_hostname), | ||
| 251 | i2d_ASN1_OCTET_STRING, 6, v6); | ||
| 252 | if (in->tlsext_tick_lifetime_hint > 0) | ||
| 253 | M_ASN1_I2D_put_EXP_opt(&a.tlsext_tick_lifetime, | ||
| 254 | i2d_ASN1_INTEGER, 9, v9); | ||
| 255 | if (in->tlsext_tick) | ||
| 256 | M_ASN1_I2D_put_EXP_opt(&(a.tlsext_tick), | ||
| 257 | i2d_ASN1_OCTET_STRING, 10, v10); | ||
| 258 | |||
| 259 | M_ASN1_I2D_finish(); | ||
| 260 | } | 283 | } |
| 261 | 284 | ||
| 262 | SSL_SESSION * | 285 | SSL_SESSION * |
