Index: openssl/ssl/ssl_asn1.c |
=================================================================== |
--- openssl/ssl/ssl_asn1.c (revision 105093) |
+++ openssl/ssl/ssl_asn1.c (working copy) |
@@ -55,6 +55,32 @@ |
* copied and put under another distribution licence |
* [including the GNU Public Licence.] |
*/ |
+/* ==================================================================== |
+ * Copyright 2005 Nokia. All rights reserved. |
+ * |
+ * The portions of the attached software ("Contribution") is developed by |
+ * Nokia Corporation and is licensed pursuant to the OpenSSL open source |
+ * license. |
+ * |
+ * The Contribution, originally written by Mika Kousa and Pasi Eronen of |
+ * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites |
+ * support (see RFC 4279) to OpenSSL. |
+ * |
+ * No patent licenses or other rights except those expressly stated in |
+ * the OpenSSL open source license shall be deemed granted or received |
+ * expressly, by implication, estoppel, or otherwise. |
+ * |
+ * No assurances are provided by Nokia that the Contribution does not |
+ * infringe the patent or other intellectual property rights of any third |
+ * party or that the license provides you with all the necessary rights |
+ * to make use of the Contribution. |
+ * |
+ * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN |
+ * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA |
+ * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY |
+ * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR |
+ * OTHERWISE. |
+ */ |
#include <stdio.h> |
#include <stdlib.h> |
@@ -84,12 +110,16 @@ |
ASN1_INTEGER tlsext_tick_lifetime; |
ASN1_OCTET_STRING tlsext_tick; |
#endif /* OPENSSL_NO_TLSEXT */ |
+#ifndef OPENSSL_NO_PSK |
+ ASN1_OCTET_STRING psk_identity_hint; |
+ ASN1_OCTET_STRING psk_identity; |
+#endif /* OPENSSL_NO_PSK */ |
} SSL_SESSION_ASN1; |
int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp) |
{ |
#define LSIZE2 (sizeof(long)*2) |
- int v1=0,v2=0,v3=0,v4=0,v5=0; |
+ int v1=0,v2=0,v3=0,v4=0,v5=0,v7=0,v8=0; |
unsigned char buf[4],ibuf1[LSIZE2],ibuf2[LSIZE2]; |
unsigned char ibuf3[LSIZE2],ibuf4[LSIZE2],ibuf5[LSIZE2]; |
#ifndef OPENSSL_NO_TLSEXT |
@@ -97,8 +127,8 @@ |
unsigned char ibuf6[LSIZE2]; |
#endif |
#ifndef OPENSSL_NO_COMP |
+ unsigned char cbuf; |
int v11=0; |
- unsigned char cbuf; |
#endif |
long l; |
SSL_SESSION_ASN1 a; |
@@ -177,7 +207,7 @@ |
a.krb5_princ.data=in->krb5_client_princ; |
} |
#endif /* OPENSSL_NO_KRB5 */ |
- |
+ |
if (in->time != 0L) |
{ |
a.time.length=LSIZE2; |
@@ -223,6 +253,21 @@ |
ASN1_INTEGER_set(&a.tlsext_tick_lifetime,in->tlsext_tick_lifetime_hint); |
} |
#endif /* OPENSSL_NO_TLSEXT */ |
+#ifndef OPENSSL_NO_PSK |
+ if (in->psk_identity_hint) |
+ { |
+ a.psk_identity_hint.length=strlen(in->psk_identity_hint); |
+ a.psk_identity_hint.type=V_ASN1_OCTET_STRING; |
+ a.psk_identity_hint.data=(unsigned char *)(in->psk_identity_hint); |
+ } |
+ if (in->psk_identity) |
+ { |
+ a.psk_identity.length=strlen(in->psk_identity); |
+ a.psk_identity.type=V_ASN1_OCTET_STRING; |
+ a.psk_identity.data=(unsigned char *)(in->psk_identity); |
+ } |
+#endif /* OPENSSL_NO_PSK */ |
+ |
M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER); |
M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER); |
M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING); |
@@ -256,6 +301,13 @@ |
M_ASN1_I2D_len_EXP_opt(&(a.comp_id), i2d_ASN1_OCTET_STRING,11,v11); |
#endif |
#endif /* OPENSSL_NO_TLSEXT */ |
+#ifndef OPENSSL_NO_PSK |
+ if (in->psk_identity_hint) |
+ M_ASN1_I2D_len_EXP_opt(&(a.psk_identity_hint), i2d_ASN1_OCTET_STRING,7,v7); |
+ if (in->psk_identity) |
+ M_ASN1_I2D_len_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING,8,v8); |
+#endif /* OPENSSL_NO_PSK */ |
+ |
M_ASN1_I2D_seq_total(); |
M_ASN1_I2D_put(&(a.version), i2d_ASN1_INTEGER); |
@@ -282,6 +334,14 @@ |
#ifndef OPENSSL_NO_TLSEXT |
if (in->tlsext_hostname) |
M_ASN1_I2D_put_EXP_opt(&(a.tlsext_hostname), i2d_ASN1_OCTET_STRING,6,v6); |
+#endif /* OPENSSL_NO_TLSEXT */ |
+#ifndef OPENSSL_NO_PSK |
+ if (in->psk_identity_hint) |
+ M_ASN1_I2D_put_EXP_opt(&(a.psk_identity_hint), i2d_ASN1_OCTET_STRING,7,v7); |
+ if (in->psk_identity) |
+ M_ASN1_I2D_put_EXP_opt(&(a.psk_identity), i2d_ASN1_OCTET_STRING,8,v8); |
+#endif /* OPENSSL_NO_PSK */ |
+#ifndef OPENSSL_NO_TLSEXT |
if (in->tlsext_tick_lifetime_hint > 0) |
M_ASN1_I2D_put_EXP_opt(&a.tlsext_tick_lifetime, i2d_ASN1_INTEGER,9,v9); |
if (in->tlsext_tick) |
@@ -295,9 +355,9 @@ |
} |
SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp, |
- long length) |
+ long length) |
{ |
- int version,ssl_version=0,i; |
+ int ssl_version=0,i; |
long id; |
ASN1_INTEGER ai,*aip; |
ASN1_OCTET_STRING os,*osp; |
@@ -311,7 +371,6 @@ |
ai.data=NULL; ai.length=0; |
M_ASN1_D2I_get_x(ASN1_INTEGER,aip,d2i_ASN1_INTEGER); |
- version=(int)ASN1_INTEGER_get(aip); |
if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; } |
/* we don't care about the version right now :-) */ |
@@ -475,6 +534,24 @@ |
} |
else |
ret->tlsext_hostname=NULL; |
+#endif /* OPENSSL_NO_TLSEXT */ |
+ |
+#ifndef OPENSSL_NO_PSK |
+ os.length=0; |
+ os.data=NULL; |
+ M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,7); |
+ if (os.data) |
+ { |
+ ret->psk_identity_hint = BUF_strndup((char *)os.data, os.length); |
+ OPENSSL_free(os.data); |
+ os.data = NULL; |
+ os.length = 0; |
+ } |
+ else |
+ ret->psk_identity_hint=NULL; |
+#endif /* OPENSSL_NO_PSK */ |
+ |
+#ifndef OPENSSL_NO_TLSEXT |
ai.length=0; |
M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,9); |
if (ai.data != NULL) |
@@ -485,17 +562,17 @@ |
else if (ret->tlsext_ticklen && ret->session_id_length) |
ret->tlsext_tick_lifetime_hint = -1; |
else |
- ret->tlsext_tick_lifetime_hint = 0; |
- os.length=0; |
- os.data=NULL; |
- M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,10); |
- if (os.data) |
- { |
+ ret->tlsext_tick_lifetime_hint=0; |
+ os.length=0; |
+ os.data=NULL; |
+ M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,10); |
+ if (os.data) |
+ { |
ret->tlsext_tick = os.data; |
ret->tlsext_ticklen = os.length; |
- os.data = NULL; |
- os.length = 0; |
- } |
+ os.data = NULL; |
+ os.length = 0; |
+ } |
else |
ret->tlsext_tick=NULL; |
#endif /* OPENSSL_NO_TLSEXT */ |