ssl_asn1.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. /* ssl/ssl_asn1.c */
  2. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  3. * All rights reserved.
  4. *
  5. * This package is an SSL implementation written
  6. * by Eric Young (eay@cryptsoft.com).
  7. * The implementation was written so as to conform with Netscapes SSL.
  8. *
  9. * This library is free for commercial and non-commercial use as long as
  10. * the following conditions are aheared to. The following conditions
  11. * apply to all code found in this distribution, be it the RC4, RSA,
  12. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  13. * included with this distribution is covered by the same copyright terms
  14. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  15. *
  16. * Copyright remains Eric Young's, and as such any Copyright notices in
  17. * the code are not to be removed.
  18. * If this package is used in a product, Eric Young should be given attribution
  19. * as the author of the parts of the library used.
  20. * This can be in the form of a textual message at program startup or
  21. * in documentation (online or textual) provided with the package.
  22. *
  23. * Redistribution and use in source and binary forms, with or without
  24. * modification, are permitted provided that the following conditions
  25. * are met:
  26. * 1. Redistributions of source code must retain the copyright
  27. * notice, this list of conditions and the following disclaimer.
  28. * 2. Redistributions in binary form must reproduce the above copyright
  29. * notice, this list of conditions and the following disclaimer in the
  30. * documentation and/or other materials provided with the distribution.
  31. * 3. All advertising materials mentioning features or use of this software
  32. * must display the following acknowledgement:
  33. * "This product includes cryptographic software written by
  34. * Eric Young (eay@cryptsoft.com)"
  35. * The word 'cryptographic' can be left out if the rouines from the library
  36. * being used are not cryptographic related :-).
  37. * 4. If you include any Windows specific code (or a derivative thereof) from
  38. * the apps directory (application code) you must include an acknowledgement:
  39. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  40. *
  41. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  42. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  43. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  44. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  45. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  46. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  47. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  49. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  50. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  51. * SUCH DAMAGE.
  52. *
  53. * The licence and distribution terms for any publically available version or
  54. * derivative of this code cannot be changed. i.e. this code cannot simply be
  55. * copied and put under another distribution licence
  56. * [including the GNU Public Licence.]
  57. */
  58. #include <stdio.h>
  59. #include <stdlib.h>
  60. #include "ssl_locl.h"
  61. #include <openssl/asn1_mac.h>
  62. #include <openssl/objects.h>
  63. #include <openssl/x509.h>
  64. typedef struct ssl_session_asn1_st
  65. {
  66. ASN1_INTEGER version;
  67. ASN1_INTEGER ssl_version;
  68. ASN1_OCTET_STRING cipher;
  69. ASN1_OCTET_STRING master_key;
  70. ASN1_OCTET_STRING session_id;
  71. ASN1_OCTET_STRING session_id_context;
  72. ASN1_OCTET_STRING key_arg;
  73. #ifndef OPENSSL_NO_KRB5
  74. ASN1_OCTET_STRING krb5_princ;
  75. #endif /* OPENSSL_NO_KRB5 */
  76. ASN1_INTEGER time;
  77. ASN1_INTEGER timeout;
  78. ASN1_INTEGER verify_result;
  79. #ifndef OPENSSL_NO_TLSEXT
  80. ASN1_OCTET_STRING tlsext_hostname;
  81. ASN1_INTEGER tlsext_tick_lifetime;
  82. ASN1_OCTET_STRING tlsext_tick;
  83. #endif /* OPENSSL_NO_TLSEXT */
  84. } SSL_SESSION_ASN1;
  85. int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
  86. {
  87. #define LSIZE2 (sizeof(long)*2)
  88. int v1=0,v2=0,v3=0,v4=0,v5=0;
  89. unsigned char buf[4],ibuf1[LSIZE2],ibuf2[LSIZE2];
  90. unsigned char ibuf3[LSIZE2],ibuf4[LSIZE2],ibuf5[LSIZE2];
  91. #ifndef OPENSSL_NO_TLSEXT
  92. int v6=0,v9=0,v10=0;
  93. unsigned char ibuf6[LSIZE2];
  94. #endif
  95. long l;
  96. SSL_SESSION_ASN1 a;
  97. M_ASN1_I2D_vars(in);
  98. if ((in == NULL) || ((in->cipher == NULL) && (in->cipher_id == 0)))
  99. return(0);
  100. /* Note that I cheat in the following 2 assignments. I know
  101. * that if the ASN1_INTEGER passed to ASN1_INTEGER_set
  102. * is > sizeof(long)+1, the buffer will not be re-OPENSSL_malloc()ed.
  103. * This is a bit evil but makes things simple, no dynamic allocation
  104. * to clean up :-) */
  105. a.version.length=LSIZE2;
  106. a.version.type=V_ASN1_INTEGER;
  107. a.version.data=ibuf1;
  108. ASN1_INTEGER_set(&(a.version),SSL_SESSION_ASN1_VERSION);
  109. a.ssl_version.length=LSIZE2;
  110. a.ssl_version.type=V_ASN1_INTEGER;
  111. a.ssl_version.data=ibuf2;
  112. ASN1_INTEGER_set(&(a.ssl_version),in->ssl_version);
  113. a.cipher.type=V_ASN1_OCTET_STRING;
  114. a.cipher.data=buf;
  115. if (in->cipher == NULL)
  116. l=in->cipher_id;
  117. else
  118. l=in->cipher->id;
  119. if (in->ssl_version == SSL2_VERSION)
  120. {
  121. a.cipher.length=3;
  122. buf[0]=((unsigned char)(l>>16L))&0xff;
  123. buf[1]=((unsigned char)(l>> 8L))&0xff;
  124. buf[2]=((unsigned char)(l ))&0xff;
  125. }
  126. else
  127. {
  128. a.cipher.length=2;
  129. buf[0]=((unsigned char)(l>>8L))&0xff;
  130. buf[1]=((unsigned char)(l ))&0xff;
  131. }
  132. a.master_key.length=in->master_key_length;
  133. a.master_key.type=V_ASN1_OCTET_STRING;
  134. a.master_key.data=in->master_key;
  135. a.session_id.length=in->session_id_length;
  136. a.session_id.type=V_ASN1_OCTET_STRING;
  137. a.session_id.data=in->session_id;
  138. a.session_id_context.length=in->sid_ctx_length;
  139. a.session_id_context.type=V_ASN1_OCTET_STRING;
  140. a.session_id_context.data=in->sid_ctx;
  141. a.key_arg.length=in->key_arg_length;
  142. a.key_arg.type=V_ASN1_OCTET_STRING;
  143. a.key_arg.data=in->key_arg;
  144. #ifndef OPENSSL_NO_KRB5
  145. if (in->krb5_client_princ_len)
  146. {
  147. a.krb5_princ.length=in->krb5_client_princ_len;
  148. a.krb5_princ.type=V_ASN1_OCTET_STRING;
  149. a.krb5_princ.data=in->krb5_client_princ;
  150. }
  151. #endif /* OPENSSL_NO_KRB5 */
  152. if (in->time != 0L)
  153. {
  154. a.time.length=LSIZE2;
  155. a.time.type=V_ASN1_INTEGER;
  156. a.time.data=ibuf3;
  157. ASN1_INTEGER_set(&(a.time),in->time);
  158. }
  159. if (in->timeout != 0L)
  160. {
  161. a.timeout.length=LSIZE2;
  162. a.timeout.type=V_ASN1_INTEGER;
  163. a.timeout.data=ibuf4;
  164. ASN1_INTEGER_set(&(a.timeout),in->timeout);
  165. }
  166. if (in->verify_result != X509_V_OK)
  167. {
  168. a.verify_result.length=LSIZE2;
  169. a.verify_result.type=V_ASN1_INTEGER;
  170. a.verify_result.data=ibuf5;
  171. ASN1_INTEGER_set(&a.verify_result,in->verify_result);
  172. }
  173. #ifndef OPENSSL_NO_TLSEXT
  174. if (in->tlsext_hostname)
  175. {
  176. a.tlsext_hostname.length=strlen(in->tlsext_hostname);
  177. a.tlsext_hostname.type=V_ASN1_OCTET_STRING;
  178. a.tlsext_hostname.data=(unsigned char *)in->tlsext_hostname;
  179. }
  180. if (in->tlsext_tick)
  181. {
  182. a.tlsext_tick.length= in->tlsext_ticklen;
  183. a.tlsext_tick.type=V_ASN1_OCTET_STRING;
  184. a.tlsext_tick.data=(unsigned char *)in->tlsext_tick;
  185. /* If we have a ticket set session ID to empty because
  186. * it will be bogus.
  187. */
  188. if (in->tlsext_ticklen)
  189. a.session_id.length=0;
  190. }
  191. if (in->tlsext_tick_lifetime_hint != 0)
  192. {
  193. a.tlsext_tick_lifetime.length=LSIZE2;
  194. a.tlsext_tick_lifetime.type=V_ASN1_INTEGER;
  195. a.tlsext_tick_lifetime.data=ibuf6;
  196. ASN1_INTEGER_set(&a.tlsext_tick_lifetime,in->tlsext_tick_lifetime_hint);
  197. }
  198. #endif /* OPENSSL_NO_TLSEXT */
  199. M_ASN1_I2D_len(&(a.version), i2d_ASN1_INTEGER);
  200. M_ASN1_I2D_len(&(a.ssl_version), i2d_ASN1_INTEGER);
  201. M_ASN1_I2D_len(&(a.cipher), i2d_ASN1_OCTET_STRING);
  202. M_ASN1_I2D_len(&(a.session_id), i2d_ASN1_OCTET_STRING);
  203. M_ASN1_I2D_len(&(a.master_key), i2d_ASN1_OCTET_STRING);
  204. #ifndef OPENSSL_NO_KRB5
  205. if (in->krb5_client_princ_len)
  206. M_ASN1_I2D_len(&(a.krb5_princ), i2d_ASN1_OCTET_STRING);
  207. #endif /* OPENSSL_NO_KRB5 */
  208. if (in->key_arg_length > 0)
  209. M_ASN1_I2D_len_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING);
  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,i2d_ASN1_OCTET_STRING,4,v4);
  217. if (in->verify_result != X509_V_OK)
  218. M_ASN1_I2D_len_EXP_opt(&(a.verify_result),i2d_ASN1_INTEGER,5,v5);
  219. #ifndef OPENSSL_NO_TLSEXT
  220. if (in->tlsext_tick_lifetime_hint)
  221. M_ASN1_I2D_len_EXP_opt(&a.tlsext_tick_lifetime, i2d_ASN1_INTEGER,9,v9);
  222. if (in->tlsext_tick)
  223. M_ASN1_I2D_len_EXP_opt(&(a.tlsext_tick), i2d_ASN1_OCTET_STRING,10,v10);
  224. if (in->tlsext_hostname)
  225. M_ASN1_I2D_len_EXP_opt(&(a.tlsext_hostname), i2d_ASN1_OCTET_STRING,6,v6);
  226. #endif /* OPENSSL_NO_TLSEXT */
  227. M_ASN1_I2D_seq_total();
  228. M_ASN1_I2D_put(&(a.version), i2d_ASN1_INTEGER);
  229. M_ASN1_I2D_put(&(a.ssl_version), i2d_ASN1_INTEGER);
  230. M_ASN1_I2D_put(&(a.cipher), i2d_ASN1_OCTET_STRING);
  231. M_ASN1_I2D_put(&(a.session_id), i2d_ASN1_OCTET_STRING);
  232. M_ASN1_I2D_put(&(a.master_key), i2d_ASN1_OCTET_STRING);
  233. #ifndef OPENSSL_NO_KRB5
  234. if (in->krb5_client_princ_len)
  235. M_ASN1_I2D_put(&(a.krb5_princ), i2d_ASN1_OCTET_STRING);
  236. #endif /* OPENSSL_NO_KRB5 */
  237. if (in->key_arg_length > 0)
  238. M_ASN1_I2D_put_IMP_opt(&(a.key_arg),i2d_ASN1_OCTET_STRING,0);
  239. if (in->time != 0L)
  240. M_ASN1_I2D_put_EXP_opt(&(a.time),i2d_ASN1_INTEGER,1,v1);
  241. if (in->timeout != 0L)
  242. M_ASN1_I2D_put_EXP_opt(&(a.timeout),i2d_ASN1_INTEGER,2,v2);
  243. if (in->peer != NULL)
  244. M_ASN1_I2D_put_EXP_opt(in->peer,i2d_X509,3,v3);
  245. M_ASN1_I2D_put_EXP_opt(&a.session_id_context,i2d_ASN1_OCTET_STRING,4,
  246. v4);
  247. if (in->verify_result != X509_V_OK)
  248. M_ASN1_I2D_put_EXP_opt(&a.verify_result,i2d_ASN1_INTEGER,5,v5);
  249. #ifndef OPENSSL_NO_TLSEXT
  250. if (in->tlsext_hostname)
  251. M_ASN1_I2D_put_EXP_opt(&(a.tlsext_hostname), i2d_ASN1_OCTET_STRING,6,v6);
  252. if (in->tlsext_tick_lifetime_hint)
  253. M_ASN1_I2D_put_EXP_opt(&a.tlsext_tick_lifetime, i2d_ASN1_INTEGER,9,v9);
  254. if (in->tlsext_tick)
  255. M_ASN1_I2D_put_EXP_opt(&(a.tlsext_tick), i2d_ASN1_OCTET_STRING,10,v10);
  256. #endif /* OPENSSL_NO_TLSEXT */
  257. M_ASN1_I2D_finish();
  258. }
  259. SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a, const unsigned char **pp,
  260. long length)
  261. {
  262. int version,ssl_version=0,i;
  263. long id;
  264. ASN1_INTEGER ai,*aip;
  265. ASN1_OCTET_STRING os,*osp;
  266. M_ASN1_D2I_vars(a,SSL_SESSION *,SSL_SESSION_new);
  267. aip= &ai;
  268. osp= &os;
  269. M_ASN1_D2I_Init();
  270. M_ASN1_D2I_start_sequence();
  271. ai.data=NULL; ai.length=0;
  272. M_ASN1_D2I_get_x(ASN1_INTEGER,aip,d2i_ASN1_INTEGER);
  273. version=(int)ASN1_INTEGER_get(aip);
  274. if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; }
  275. /* we don't care about the version right now :-) */
  276. M_ASN1_D2I_get_x(ASN1_INTEGER,aip,d2i_ASN1_INTEGER);
  277. ssl_version=(int)ASN1_INTEGER_get(aip);
  278. ret->ssl_version=ssl_version;
  279. if (ai.data != NULL) { OPENSSL_free(ai.data); ai.data=NULL; ai.length=0; }
  280. os.data=NULL; os.length=0;
  281. M_ASN1_D2I_get_x(ASN1_OCTET_STRING,osp,d2i_ASN1_OCTET_STRING);
  282. if (ssl_version == SSL2_VERSION)
  283. {
  284. if (os.length != 3)
  285. {
  286. c.error=SSL_R_CIPHER_CODE_WRONG_LENGTH;
  287. goto err;
  288. }
  289. id=0x02000000L|
  290. ((unsigned long)os.data[0]<<16L)|
  291. ((unsigned long)os.data[1]<< 8L)|
  292. (unsigned long)os.data[2];
  293. }
  294. else if ((ssl_version>>8) == SSL3_VERSION_MAJOR)
  295. {
  296. if (os.length != 2)
  297. {
  298. c.error=SSL_R_CIPHER_CODE_WRONG_LENGTH;
  299. goto err;
  300. }
  301. id=0x03000000L|
  302. ((unsigned long)os.data[0]<<8L)|
  303. (unsigned long)os.data[1];
  304. }
  305. else
  306. {
  307. SSLerr(SSL_F_D2I_SSL_SESSION,SSL_R_UNKNOWN_SSL_VERSION);
  308. return(NULL);
  309. }
  310. ret->cipher=NULL;
  311. ret->cipher_id=id;
  312. M_ASN1_D2I_get_x(ASN1_OCTET_STRING,osp,d2i_ASN1_OCTET_STRING);
  313. if ((ssl_version>>8) == SSL3_VERSION_MAJOR)
  314. i=SSL3_MAX_SSL_SESSION_ID_LENGTH;
  315. else /* if (ssl_version>>8 == SSL2_VERSION_MAJOR) */
  316. i=SSL2_MAX_SSL_SESSION_ID_LENGTH;
  317. if (os.length > i)
  318. os.length = i;
  319. if (os.length > (int)sizeof(ret->session_id)) /* can't happen */
  320. os.length = sizeof(ret->session_id);
  321. ret->session_id_length=os.length;
  322. OPENSSL_assert(os.length <= (int)sizeof(ret->session_id));
  323. memcpy(ret->session_id,os.data,os.length);
  324. M_ASN1_D2I_get_x(ASN1_OCTET_STRING,osp,d2i_ASN1_OCTET_STRING);
  325. if (ret->master_key_length > SSL_MAX_MASTER_KEY_LENGTH)
  326. ret->master_key_length=SSL_MAX_MASTER_KEY_LENGTH;
  327. else
  328. ret->master_key_length=os.length;
  329. memcpy(ret->master_key,os.data,ret->master_key_length);
  330. os.length=0;
  331. #ifndef OPENSSL_NO_KRB5
  332. os.length=0;
  333. M_ASN1_D2I_get_opt(osp,d2i_ASN1_OCTET_STRING,V_ASN1_OCTET_STRING);
  334. if (os.data)
  335. {
  336. if (os.length > SSL_MAX_KRB5_PRINCIPAL_LENGTH)
  337. ret->krb5_client_princ_len=0;
  338. else
  339. ret->krb5_client_princ_len=os.length;
  340. memcpy(ret->krb5_client_princ,os.data,ret->krb5_client_princ_len);
  341. OPENSSL_free(os.data);
  342. os.data = NULL;
  343. os.length = 0;
  344. }
  345. else
  346. ret->krb5_client_princ_len=0;
  347. #endif /* OPENSSL_NO_KRB5 */
  348. M_ASN1_D2I_get_IMP_opt(osp,d2i_ASN1_OCTET_STRING,0,V_ASN1_OCTET_STRING);
  349. if (os.length > SSL_MAX_KEY_ARG_LENGTH)
  350. ret->key_arg_length=SSL_MAX_KEY_ARG_LENGTH;
  351. else
  352. ret->key_arg_length=os.length;
  353. memcpy(ret->key_arg,os.data,ret->key_arg_length);
  354. if (os.data != NULL) OPENSSL_free(os.data);
  355. ai.length=0;
  356. M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,1);
  357. if (ai.data != NULL)
  358. {
  359. ret->time=ASN1_INTEGER_get(aip);
  360. OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
  361. }
  362. else
  363. ret->time=(unsigned long)time(NULL);
  364. ai.length=0;
  365. M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,2);
  366. if (ai.data != NULL)
  367. {
  368. ret->timeout=ASN1_INTEGER_get(aip);
  369. OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
  370. }
  371. else
  372. ret->timeout=3;
  373. if (ret->peer != NULL)
  374. {
  375. X509_free(ret->peer);
  376. ret->peer=NULL;
  377. }
  378. M_ASN1_D2I_get_EXP_opt(ret->peer,d2i_X509,3);
  379. os.length=0;
  380. os.data=NULL;
  381. M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,4);
  382. if(os.data != NULL)
  383. {
  384. if (os.length > SSL_MAX_SID_CTX_LENGTH)
  385. {
  386. ret->sid_ctx_length=os.length;
  387. SSLerr(SSL_F_D2I_SSL_SESSION,SSL_R_BAD_LENGTH);
  388. }
  389. else
  390. {
  391. ret->sid_ctx_length=os.length;
  392. memcpy(ret->sid_ctx,os.data,os.length);
  393. }
  394. OPENSSL_free(os.data); os.data=NULL; os.length=0;
  395. }
  396. else
  397. ret->sid_ctx_length=0;
  398. ai.length=0;
  399. M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,5);
  400. if (ai.data != NULL)
  401. {
  402. ret->verify_result=ASN1_INTEGER_get(aip);
  403. OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
  404. }
  405. else
  406. ret->verify_result=X509_V_OK;
  407. #ifndef OPENSSL_NO_TLSEXT
  408. os.length=0;
  409. os.data=NULL;
  410. M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,6);
  411. if (os.data)
  412. {
  413. ret->tlsext_hostname = BUF_strndup((char *)os.data, os.length);
  414. OPENSSL_free(os.data);
  415. os.data = NULL;
  416. os.length = 0;
  417. }
  418. else
  419. ret->tlsext_hostname=NULL;
  420. ai.length=0;
  421. M_ASN1_D2I_get_EXP_opt(aip,d2i_ASN1_INTEGER,9);
  422. if (ai.data != NULL)
  423. {
  424. ret->tlsext_tick_lifetime_hint=ASN1_INTEGER_get(aip);
  425. OPENSSL_free(ai.data); ai.data=NULL; ai.length=0;
  426. }
  427. else
  428. ret->tlsext_tick_lifetime_hint=0;
  429. os.length=0;
  430. os.data=NULL;
  431. M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,10);
  432. if (os.data)
  433. {
  434. ret->tlsext_tick = os.data;
  435. ret->tlsext_ticklen = os.length;
  436. os.data = NULL;
  437. os.length = 0;
  438. #if 0
  439. /* There are two ways to detect a resumed ticket sesion.
  440. * One is to set a random session ID and then the server
  441. * must return a match in ServerHello. This allows the normal
  442. * client session ID matching to work.
  443. */
  444. if (ret->session_id_length == 0)
  445. {
  446. ret->session_id_length=SSL3_MAX_SSL_SESSION_ID_LENGTH;
  447. RAND_pseudo_bytes(ret->session_id,
  448. ret->session_id_length);
  449. }
  450. #endif
  451. }
  452. else
  453. ret->tlsext_tick=NULL;
  454. #endif /* OPENSSL_NO_TLSEXT */
  455. M_ASN1_D2I_Finish(a,SSL_SESSION_free,SSL_F_D2I_SSL_SESSION);
  456. }