diff options
Diffstat (limited to 'src/lib/libssl/ssl_asn1.c')
-rw-r--r-- | src/lib/libssl/ssl_asn1.c | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/src/lib/libssl/ssl_asn1.c b/src/lib/libssl/ssl_asn1.c index 116a83de64..0f6a0884e4 100644 --- a/src/lib/libssl/ssl_asn1.c +++ b/src/lib/libssl/ssl_asn1.c | |||
@@ -58,8 +58,8 @@ | |||
58 | 58 | ||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include <stdlib.h> | 60 | #include <stdlib.h> |
61 | #include "asn1_mac.h" | 61 | #include <openssl/asn1_mac.h> |
62 | #include "objects.h" | 62 | #include <openssl/objects.h> |
63 | #include "ssl_locl.h" | 63 | #include "ssl_locl.h" |
64 | 64 | ||
65 | typedef struct ssl_session_asn1_st | 65 | typedef struct ssl_session_asn1_st |
@@ -69,22 +69,16 @@ typedef struct ssl_session_asn1_st | |||
69 | ASN1_OCTET_STRING cipher; | 69 | ASN1_OCTET_STRING cipher; |
70 | ASN1_OCTET_STRING master_key; | 70 | ASN1_OCTET_STRING master_key; |
71 | ASN1_OCTET_STRING session_id; | 71 | ASN1_OCTET_STRING session_id; |
72 | ASN1_OCTET_STRING session_id_context; | ||
72 | ASN1_OCTET_STRING key_arg; | 73 | ASN1_OCTET_STRING key_arg; |
73 | ASN1_INTEGER time; | 74 | ASN1_INTEGER time; |
74 | ASN1_INTEGER timeout; | 75 | ASN1_INTEGER timeout; |
75 | } SSL_SESSION_ASN1; | 76 | } SSL_SESSION_ASN1; |
76 | 77 | ||
77 | /* | 78 | int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) |
78 | * SSLerr(SSL_F_I2D_SSL_SESSION,SSL_R_CIPHER_CODE_WRONG_LENGTH); | ||
79 | * SSLerr(SSL_F_D2I_SSL_SESSION,SSL_R_UNSUPPORTED_CIPHER); | ||
80 | */ | ||
81 | |||
82 | int i2d_SSL_SESSION(in,pp) | ||
83 | SSL_SESSION *in; | ||
84 | unsigned char **pp; | ||
85 | { | 79 | { |
86 | #define LSIZE2 (sizeof(long)*2) | 80 | #define LSIZE2 (sizeof(long)*2) |
87 | int v1=0,v2=0,v3=0; | 81 | int v1=0,v2=0,v3=0,v4=0; |
88 | unsigned char buf[4],ibuf1[LSIZE2],ibuf2[LSIZE2]; | 82 | unsigned char buf[4],ibuf1[LSIZE2],ibuf2[LSIZE2]; |
89 | unsigned char ibuf3[LSIZE2],ibuf4[LSIZE2]; | 83 | unsigned char ibuf3[LSIZE2],ibuf4[LSIZE2]; |
90 | long l; | 84 | long l; |
@@ -138,6 +132,10 @@ unsigned char **pp; | |||
138 | a.session_id.type=V_ASN1_OCTET_STRING; | 132 | a.session_id.type=V_ASN1_OCTET_STRING; |
139 | a.session_id.data=in->session_id; | 133 | a.session_id.data=in->session_id; |
140 | 134 | ||
135 | a.session_id_context.length=in->sid_ctx_length; | ||
136 | a.session_id_context.type=V_ASN1_OCTET_STRING; | ||
137 | a.session_id_context.data=in->sid_ctx; | ||
138 | |||
141 | a.key_arg.length=in->key_arg_length; | 139 | a.key_arg.length=in->key_arg_length; |
142 | a.key_arg.type=V_ASN1_OCTET_STRING; | 140 | a.key_arg.type=V_ASN1_OCTET_STRING; |
143 | a.key_arg.data=in->key_arg; | 141 | a.key_arg.data=in->key_arg; |
@@ -171,6 +169,7 @@ unsigned char **pp; | |||
171 | M_ASN1_I2D_len_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2); | 169 | M_ASN1_I2D_len_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2); |
172 | if (in->peer != NULL) | 170 | if (in->peer != NULL) |
173 | M_ASN1_I2D_len_EXP_opt(in->peer,i2d_X509,3,v3); | 171 | M_ASN1_I2D_len_EXP_opt(in->peer,i2d_X509,3,v3); |
172 | M_ASN1_I2D_len_EXP_opt(&a.session_id_context,i2d_ASN1_OCTET_STRING,4,v4); | ||
174 | 173 | ||
175 | M_ASN1_I2D_seq_total(); | 174 | M_ASN1_I2D_seq_total(); |
176 | 175 | ||
@@ -187,14 +186,14 @@ unsigned char **pp; | |||
187 | M_ASN1_I2D_put_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2); | 186 | M_ASN1_I2D_put_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2); |
188 | if (in->peer != NULL) | 187 | if (in->peer != NULL) |
189 | M_ASN1_I2D_put_EXP_opt(in->peer,i2d_X509,3,v3); | 188 | M_ASN1_I2D_put_EXP_opt(in->peer,i2d_X509,3,v3); |
189 | M_ASN1_I2D_put_EXP_opt(&a.session_id_context,i2d_ASN1_OCTET_STRING,4, | ||
190 | v4); | ||
190 | 191 | ||
191 | M_ASN1_I2D_finish(); | 192 | M_ASN1_I2D_finish(); |
192 | } | 193 | } |
193 | 194 | ||
194 | SSL_SESSION *d2i_SSL_SESSION(a,pp,length) | 195 | SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, unsigned char **pp, |
195 | SSL_SESSION **a; | 196 | long length) |
196 | unsigned char **pp; | ||
197 | long length; | ||
198 | { | 197 | { |
199 | int version,ssl_version=0,i; | 198 | int version,ssl_version=0,i; |
200 | long id; | 199 | long id; |
@@ -308,6 +307,21 @@ long length; | |||
308 | } | 307 | } |
309 | M_ASN1_D2I_get_EXP_opt(ret->peer,d2i_X509,3); | 308 | M_ASN1_D2I_get_EXP_opt(ret->peer,d2i_X509,3); |
310 | 309 | ||
310 | os.length=0; | ||
311 | os.data=NULL; | ||
312 | M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,4); | ||
313 | |||
314 | if(os.data != NULL) | ||
315 | { | ||
316 | if (os.length > SSL_MAX_SID_CTX_LENGTH) | ||
317 | SSLerr(SSL_F_D2I_SSL_SESSION,SSL_R_BAD_LENGTH); | ||
318 | ret->sid_ctx_length=os.length; | ||
319 | memcpy(ret->sid_ctx,os.data,os.length); | ||
320 | Free(os.data); os.data=NULL; os.length=0; | ||
321 | } | ||
322 | else | ||
323 | ret->sid_ctx_length=0; | ||
324 | |||
311 | M_ASN1_D2I_Finish(a,SSL_SESSION_free,SSL_F_D2I_SSL_SESSION); | 325 | M_ASN1_D2I_Finish(a,SSL_SESSION_free,SSL_F_D2I_SSL_SESSION); |
312 | } | 326 | } |
313 | 327 | ||