wtls_pdusupport.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:34k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /* 
  2.  * wtls_support.c: pack and unpack WTLS packets
  3.  *
  4.  * Support functions for packing and unpacking PDUs
  5.  * 
  6.  */
  7. #include "gwlib/gwlib.h"
  8. #if (HAVE_WTLS_OPENSSL)
  9. #include "wtls_pdu.h"
  10. #include "wtls_pdusupport.h"
  11. #include "wtls_statesupport.h"
  12. // Change this later !!!!
  13. extern PublicKeyAlgorithm public_key_algo;
  14. extern SignatureAlgorithm signature_algo;
  15. /*****************************************************************
  16.  * PACK functions
  17.  */
  18. int pack_int16(Octstr *data, long charpos, int i) {
  19. octstr_append_char(data, (i & 0xFF00) >> 8);
  20. charpos += 1;
  21. octstr_append_char(data, i & 0x00FF);
  22. charpos += 1;
  23. return charpos;
  24. }
  25. int pack_int32(Octstr *data, long charpos, long i) {
  26. charpos = pack_int16(data, charpos, (i & 0xFFFF0000) >> 16);
  27. charpos = pack_int16(data, charpos, i & 0xFFFF);
  28. return charpos;
  29. }
  30. int pack_octstr(Octstr *data, long charpos, Octstr *opaque) {
  31. octstr_append_char(data, octstr_len(opaque));
  32. charpos += 1;
  33. octstr_insert(data, opaque, octstr_len(data));
  34. charpos += octstr_len(opaque);
  35. return charpos;
  36. }
  37. int pack_octstr16(Octstr *data, long charpos, Octstr *opaque) {
  38. charpos += pack_int16(data, charpos, octstr_len(opaque));
  39. octstr_insert(data, opaque, octstr_len(data));
  40. charpos += octstr_len(opaque);
  41. return charpos;
  42. }
  43. int pack_octstr_fixed(Octstr *data, long charpos, Octstr *opaque) {
  44. octstr_insert(data, opaque, octstr_len(data));
  45. charpos += octstr_len(opaque);
  46. return charpos;
  47. }
  48. int pack_random(Octstr *data, long charpos, Random *random) {
  49. charpos = pack_int32(data, charpos, random->gmt_unix_time);
  50. charpos = pack_octstr_fixed(data, charpos, random->random_bytes);
  51. return charpos;
  52. }
  53. int pack_dhparams(Octstr *data, long charpos, DHParameters *dhparams) {
  54. octstr_append_char(data, dhparams->dh_e);
  55. charpos += 1;
  56. charpos = pack_octstr16(data, charpos, dhparams->dh_p);
  57. charpos = pack_octstr16(data, charpos, dhparams->dh_g);
  58. return charpos;
  59. }
  60. int pack_ecparams(Octstr *data, long charpos, ECParameters *ecparams) {
  61. /* field */
  62. octstr_append_char(data, ecparams->field);
  63. charpos += 1;
  64. switch (ecparams->field) {
  65. case ec_prime_p:
  66. charpos = pack_octstr(data, charpos, ecparams->prime_p);
  67. break;
  68. case ec_characteristic_two:
  69. /* m (16 bits) */
  70. charpos = pack_int16(data, charpos, ecparams->m);
  71. /* basis */
  72. octstr_append_char(data, ecparams->basis);
  73. charpos += 1;
  74. switch (ecparams->basis) {
  75. case ec_basis_onb:
  76. break;
  77. case ec_basis_trinomial:
  78. charpos = pack_int16(data, charpos, ecparams->k);
  79. break;
  80. case ec_basis_pentanomial:
  81. charpos = pack_int16(data, charpos, ecparams->k1);
  82. charpos = pack_int16(data, charpos, ecparams->k2);
  83. charpos = pack_int16(data, charpos, ecparams->k3);
  84. break;
  85. case ec_basis_polynomial:
  86. charpos = pack_octstr(data, charpos, ecparams->irreducible);
  87. break;
  88. }
  89. break;
  90. }
  91. /* pack the ECCurve */
  92. charpos = pack_octstr(data, charpos, ecparams->curve->a);
  93. charpos = pack_octstr(data, charpos, ecparams->curve->b);
  94. charpos = pack_octstr(data, charpos, ecparams->curve->seed);
  95. /* pack the ECPoint */
  96. charpos = pack_octstr(data, charpos, ecparams->base->point);
  97. /* order and cofactor */
  98. charpos = pack_octstr(data, charpos, ecparams->order);
  99. charpos = pack_octstr(data, charpos, ecparams->cofactor);
  100. return charpos;
  101. }
  102. int pack_param_spec(Octstr *data, long charpos, ParameterSpecifier *pspec) {
  103.         if (pspec == NULL)
  104.         {
  105. octstr_append_char(data, 0);
  106. charpos += 1;
  107.         return charpos;
  108.         }        
  109.         /* index */
  110. octstr_append_char(data, pspec->param_index);
  111. charpos += 1;
  112. /* ParameterSet struct */
  113. octstr_append_char(data, pspec->param_set->length);
  114. charpos += 1;
  115. switch (public_key_algo) {
  116. case diffie_hellman_pubkey:
  117. pack_dhparams(data, charpos, pspec->param_set->dhparams);
  118. break;
  119. case elliptic_curve_pubkey:
  120. pack_ecparams(data, charpos, pspec->param_set->ecparams);
  121. break;
  122. }
  123. return charpos;
  124. }
  125. int pack_public_key(Octstr *data, long charpos, PublicKey *key, PublicKeyType key_type) {
  126. switch (key_type) {
  127. case ecdh_key:
  128. charpos = pack_octstr(data, charpos, key->ecdh_pubkey->point);
  129. break;
  130. case ecdsa_key:
  131. charpos = pack_octstr(data, charpos, key->ecdsa_pubkey->point);
  132. break;
  133. case rsa_key:
  134. charpos = pack_rsa_pubkey(data, charpos, key->rsa_pubkey);
  135. break;
  136. }
  137. return charpos;
  138. }
  139. int pack_rsa_pubkey(Octstr *data, long charpos, RSAPublicKey *key) {
  140. charpos = pack_octstr16(data, charpos, key->rsa_exponent);
  141. charpos = pack_octstr16(data, charpos, key->rsa_modulus);
  142. return charpos;
  143. }
  144. int pack_ec_pubkey(Octstr *data, long charpos, ECPublicKey *key) {
  145. charpos = pack_octstr(data, charpos, key->point);
  146. return charpos;
  147. }
  148. int pack_dh_pubkey(Octstr *data, long charpos, DHPublicKey *key) {
  149. charpos = pack_octstr16(data, charpos, key->dh_Y);
  150. return charpos;
  151. }
  152. int pack_rsa_secret(Octstr *data, long charpos, RSASecret *secret) {
  153. octstr_append_char(data, secret->client_version);
  154. charpos += 1;
  155. charpos = pack_array(data, charpos, secret->random);
  156. return charpos;
  157. }
  158. int pack_rsa_encrypted_secret(Octstr *data, long charpos, RSAEncryptedSecret *secret) {
  159. charpos = pack_octstr16(data, charpos, secret->encrypted_secret);
  160. return charpos;
  161. }
  162. int pack_key_exchange_id(Octstr *data, long charpos, KeyExchangeId *keyexid) {
  163. octstr_set_char(data, charpos, keyexid->key_exchange_suite);
  164. charpos += 1;
  165. charpos = pack_param_spec(data, charpos, keyexid->param_specif);
  166. charpos = pack_identifier(data, charpos, keyexid->identifier);
  167. return charpos;
  168. }
  169. int pack_array(Octstr *data, long charpos, List *array) {
  170. int i;
  171. long pos = 0;
  172. Octstr *buffer;
  173. /* we need to know the length in bytes of the list
  174.    so we pack everything in a buffer for now. */
  175. buffer = octstr_create("");
  176. /* pack each entry in the buffer */
  177. for (i=0; i<list_len(array); i++)
  178. {
  179. pos = pack_octstr(buffer, pos, (Octstr *) list_get(array, i));
  180. }
  181. /* now we know the size of the list */
  182. charpos = pack_int16(data, charpos, pos);
  183. /* append the buffer */
  184. charpos = pack_octstr_fixed(data, charpos, buffer);
  185. return charpos;
  186. }
  187. int pack_key_list(Octstr *data, long charpos, List *key_list) {
  188. int i;
  189. long pos = 0;
  190. Octstr *buffer;
  191. KeyExchangeId *keyexid;
  192. /* we need to know the length in bytes of the list
  193.    so we pack everything in a buffer for now. */
  194. buffer = octstr_create("");
  195. /* pack the KeyExchangeIds */
  196. for (i=0; i<list_len(key_list); i++) {
  197. keyexid = (KeyExchangeId *) list_get(key_list, i);
  198. pos = pack_key_exchange_id(buffer, pos, keyexid);
  199. }
  200. /* now we know the size of the list */
  201. charpos = pack_int16(data, charpos, pos);
  202. /* append the buffer */
  203. charpos = pack_octstr_fixed(data, charpos, buffer);
  204. return charpos;
  205. }
  206. int pack_ciphersuite_list(Octstr *data, long charpos, List *ciphersuites) {
  207. int i;
  208. CipherSuite *cs;
  209. /* vector starts with its length 
  210.    Each element uses 2 bytes */
  211. octstr_set_char(data, charpos, list_len(ciphersuites)*2);
  212. charpos += 1;
  213. /* pack the CipherSuites */
  214. for (i=0; i<list_len(ciphersuites); i++) {
  215. cs = (CipherSuite *) list_get(ciphersuites, i);
  216. octstr_set_char(data, charpos, cs->bulk_cipher_algo);
  217. charpos += 1;
  218. octstr_set_char(data, charpos, cs->mac_algo);
  219. charpos += 1;
  220. }
  221. return charpos;
  222. }
  223. int pack_compression_method_list(Octstr *data, long charpos, List *compmethod_list) {
  224. int i;
  225. /* vector starts with its length */
  226. octstr_set_char(data, charpos, list_len(compmethod_list));
  227. charpos += 1;
  228. /* pack the CompressionMethods */
  229. for (i=0; i<list_len(compmethod_list); i++) {
  230. octstr_set_char(data, charpos, 
  231. (CompressionMethod) list_get(compmethod_list, i));
  232. charpos += 1;
  233. }
  234. return charpos;
  235. }
  236. int pack_identifier(Octstr *data, long charpos, Identifier *ident) {
  237. switch (ident->id_type) {
  238. case text:
  239. octstr_set_char(data, charpos, ident->charset);
  240. charpos += 1;
  241. charpos = pack_octstr(data, charpos, ident->name);
  242. break;
  243. case binary:
  244. charpos = pack_octstr(data, charpos, ident->identifier);
  245. break;
  246. case key_hash_sha:
  247. charpos = pack_octstr(data, charpos, ident->key_hash);
  248. break;
  249. case x509_name:
  250. charpos = pack_octstr(data, charpos, ident->distinguished_name);
  251. break;
  252. }
  253. return charpos;
  254. }
  255. int pack_signature(Octstr *data, long charpos, Signature *sig) {
  256. switch (signature_algo) {
  257. case ecdsa_sha:
  258. case rsa_sha:
  259. charpos = pack_array(data, charpos, sig->sha_hash);
  260. break;
  261. }
  262. return charpos;
  263. }
  264. int pack_wtls_certificate(Octstr *data, long charpos, WTLSCertificate *cert) {
  265. /* === pack ToBeSignedCertificate === */
  266. /* version */
  267. octstr_set_char(data, charpos, cert->tobesigned_cert->certificate_version);
  268. charpos += 1;
  269. /* sig algo */
  270. octstr_set_char(data, charpos, cert->tobesigned_cert->signature_algo);
  271. charpos += 1;
  272. /* identifier */
  273. octstr_set_char(data, charpos, cert->tobesigned_cert->issuer->id_type);
  274. charpos += 1;
  275. /* issuer Identifier */
  276. charpos = pack_identifier(data, charpos, cert->tobesigned_cert->issuer);
  277. /* validity periods */
  278. charpos = pack_int32(data, charpos, cert->tobesigned_cert->valid_not_before);
  279. charpos = pack_int32(data, charpos, cert->tobesigned_cert->valid_not_after);
  280. /* subject Identifier */
  281. charpos = pack_identifier(data, charpos, cert->tobesigned_cert->subject);
  282. /* public_key_type */
  283. octstr_set_char(data, charpos, cert->tobesigned_cert->pubkey_type);
  284. charpos += 1;
  285. /* parameter specifier */
  286. charpos = pack_param_spec(data, charpos, cert->tobesigned_cert->param_spec);
  287. /* public key */
  288. charpos = pack_public_key(data, charpos, cert->tobesigned_cert->pubkey,
  289. cert->tobesigned_cert->pubkey_type);
  290. /* === pack Signature === */
  291. charpos = pack_signature(data, charpos, cert->signature);
  292. return charpos;
  293. }
  294. /*****************************************************************
  295.  * UNPACK functions
  296.  */
  297.  
  298. int unpack_int16(Octstr *data, long *charpos) {
  299. int n;
  300. n =  octstr_get_char(data, *charpos) << 8;
  301. *charpos += 1;
  302. n += octstr_get_char(data, *charpos);
  303. *charpos += 1;
  304. return n;
  305. }
  306. long unpack_int32(Octstr *data, long *charpos) {
  307. int n;
  308. n =  octstr_get_char(data, *charpos);
  309. n = n << 8;
  310. *charpos += 1;
  311. n += octstr_get_char(data, *charpos);
  312. n = n << 8;
  313. *charpos += 1;
  314. n += octstr_get_char(data, *charpos);
  315. n = n << 8;
  316. *charpos += 1;
  317. n += octstr_get_char(data, *charpos);
  318. *charpos += 1;
  319. return n;
  320. }
  321. Octstr * unpack_octstr(Octstr *data, long *charpos) {
  322. int length;
  323. Octstr *opaque;
  324. length = octstr_get_char(data, *charpos);
  325. *charpos += 1;
  326. opaque = octstr_copy(data, *charpos, length);
  327. *charpos += length;
  328. return opaque;
  329. }
  330. Octstr * unpack_octstr16(Octstr *data, long *charpos) {
  331. long length;
  332. Octstr *opaque;
  333. length = unpack_int16(data, charpos);
  334. opaque = octstr_copy(data, *charpos, length);
  335. *charpos += length;
  336. return opaque;
  337. }
  338. Octstr * unpack_octstr_fixed(Octstr *data, long *charpos, long length) {
  339. Octstr *opaque;
  340. opaque = octstr_copy(data, *charpos, length);
  341. *charpos += length;
  342. return opaque;
  343. }
  344. Random * unpack_random(Octstr *data, long *charpos) {
  345. Random *random;
  346. /* create the Random structure */
  347. random = (Random *)gw_malloc(sizeof(Random));
  348. random->gmt_unix_time = unpack_int32(data, charpos);
  349. random->random_bytes = unpack_octstr_fixed(data, charpos, 12);
  350. return random;
  351. }
  352. DHParameters * unpack_dhparams(Octstr *data, long *charpos) {
  353. DHParameters *dhparams;
  354. /* create the DHParameters */
  355. dhparams = (DHParameters *)gw_malloc(sizeof(DHParameters));
  356. dhparams->dh_e = octstr_get_char(data, *charpos);
  357. *charpos += 1;
  358. dhparams->dh_p = unpack_octstr16(data, charpos);
  359. dhparams->dh_g = unpack_octstr16(data, charpos);
  360. return dhparams;
  361. }
  362. ECParameters * unpack_ecparams(Octstr *data, long *charpos) {
  363. ECParameters *ecparams;
  364. /* create the ECParameters */
  365. ecparams = (ECParameters *)gw_malloc(sizeof(ECParameters));
  366. /* field */
  367. ecparams->field = octstr_get_char(data, *charpos);
  368. *charpos += 1;
  369. switch (ecparams->field) {
  370. case ec_prime_p:
  371. ecparams->prime_p = unpack_octstr(data, charpos);
  372. break;
  373. case ec_characteristic_two:
  374. /* m (16 bits) */
  375. ecparams->m = unpack_int16(data, charpos);
  376. /* basis */
  377. ecparams->basis = octstr_get_char(data, *charpos);
  378. *charpos += 1;
  379. switch (ecparams->basis) {
  380. case ec_basis_onb:
  381. break;
  382. case ec_basis_trinomial:
  383. ecparams->k = unpack_int16(data, charpos);
  384. break;
  385. case ec_basis_pentanomial:
  386. ecparams->k1 = unpack_int16(data, charpos);
  387. ecparams->k2 = unpack_int16(data, charpos);
  388. ecparams->k3 = unpack_int16(data, charpos);
  389. break;
  390. case ec_basis_polynomial:
  391. ecparams->irreducible = unpack_octstr(data, charpos);
  392. break;
  393. }
  394. break;
  395. }
  396. /* pack the ECCurve */
  397. ecparams->curve->a = unpack_octstr(data, charpos);
  398. ecparams->curve->b = unpack_octstr(data, charpos);
  399. ecparams->curve->seed = unpack_octstr(data, charpos);
  400. /* pack the ECPoint */
  401. ecparams->base->point = unpack_octstr(data, charpos);
  402. /* order and cofactor */
  403. ecparams->order = unpack_octstr(data, charpos);
  404. ecparams->cofactor = unpack_octstr(data, charpos);
  405. return ecparams;
  406. }
  407. ParameterSpecifier * unpack_param_spec(Octstr *data, long *charpos) {
  408. ParameterSpecifier *pspec;
  409. /* create the ParameterSpecifier */
  410. pspec = (ParameterSpecifier *)gw_malloc(sizeof(ParameterSpecifier));
  411. /* index */
  412. pspec->param_index = octstr_get_char(data, *charpos);
  413. *charpos += 1;
  414. /* ParameterSet struct */
  415. if(pspec->param_index == 255) {
  416. pspec->param_set = (ParameterSet *)gw_malloc(sizeof(ParameterSet));
  417. pspec->param_set->length = octstr_get_char(data, *charpos);
  418. *charpos += 1;
  419. switch (public_key_algo) {
  420. case diffie_hellman_pubkey:
  421. pspec->param_set->dhparams = unpack_dhparams(data, charpos);
  422. break;
  423. case elliptic_curve_pubkey:
  424. pspec->param_set->ecparams = unpack_ecparams(data, charpos);
  425. break;
  426. }
  427. }
  428. return pspec;
  429. }
  430. RSAPublicKey * unpack_rsa_pubkey(Octstr *data, long *charpos) {
  431. RSAPublicKey *key;
  432. /* create the RSAPublicKey */
  433. key = (RSAPublicKey *)gw_malloc(sizeof(RSAPublicKey));
  434. key->rsa_exponent = unpack_octstr16( data, charpos);
  435. key->rsa_modulus = unpack_octstr16( data, charpos);
  436. return key;
  437. }
  438. DHPublicKey * unpack_dh_pubkey(Octstr *data, long *charpos) {
  439. DHPublicKey *key;
  440. /* create the DHPublicKey */
  441. key = (DHPublicKey *)gw_malloc(sizeof(DHPublicKey));
  442. key->dh_Y = unpack_octstr16( data, charpos);
  443. return key;
  444. }
  445. ECPublicKey * unpack_ec_pubkey(Octstr *data, long *charpos) {
  446. ECPublicKey *key;
  447. /* create the ECPublicKey */
  448. key = (ECPublicKey *)gw_malloc(sizeof(ECPublicKey));
  449. key->point = unpack_octstr( data, charpos);
  450. return key;
  451. }
  452. RSASecret * unpack_rsa_secret(Octstr *data, long *charpos) {
  453. RSASecret *secret;
  454. /* create the RSASecret */
  455. secret = (RSASecret *)gw_malloc(sizeof(RSASecret));
  456. secret->client_version = octstr_get_char(data, *charpos);
  457. *charpos += 1;
  458. secret->random = unpack_array(data, charpos);
  459. return secret;
  460. }
  461. RSAEncryptedSecret * unpack_rsa_encrypted_secret(Octstr *data, long *charpos) {
  462. RSAEncryptedSecret *secret;
  463. /* create the RSASecret */
  464. secret = (RSAEncryptedSecret *)gw_malloc(sizeof(RSAEncryptedSecret));
  465. //secret->encrypted_secret = unpack_octstr16(data, charpos);
  466. secret->encrypted_secret = unpack_octstr_fixed(data, charpos, octstr_len(data) - *charpos);
  467. return secret;
  468. }
  469. PublicKey * unpack_public_key(Octstr *data, long *charpos, PublicKeyType key_type) {
  470. PublicKey *key;
  471. /* create the PublicKey */
  472. key = (PublicKey *)gw_malloc(sizeof(PublicKey));
  473. switch (key_type) {
  474. case ecdh_key:
  475. key->ecdh_pubkey = unpack_ec_pubkey(data, charpos);
  476. break;
  477. case ecdsa_key:
  478. key->ecdsa_pubkey = unpack_ec_pubkey(data, charpos);
  479. break;
  480. case rsa_key:
  481. key->rsa_pubkey = unpack_rsa_pubkey(data, charpos);
  482. break;
  483. }
  484. return key;
  485. }
  486. KeyExchangeId * unpack_key_exchange_id(Octstr *data, long *charpos) {
  487. KeyExchangeId *keyexid;
  488. /* create the KeyExchangeID */
  489. keyexid = (KeyExchangeId *)gw_malloc(sizeof(KeyExchangeId));
  490. keyexid->key_exchange_suite = octstr_get_char(data, *charpos);
  491. *charpos += 1;
  492. keyexid->param_specif = unpack_param_spec(data, charpos);
  493. keyexid->identifier = unpack_identifier(data, charpos);
  494. return keyexid;
  495. }
  496. List * unpack_array(Octstr *data, long *charpos) {
  497. int i;
  498. int array_length;
  499. List *array;
  500. /* create the list */
  501. array = list_create();
  502. /* get the size of the array */
  503. array_length = octstr_get_char(data, *charpos);
  504. *charpos += 1;
  505. /* store each entry in the list */
  506. for (i=0; i<array_length; i++)  {
  507. list_append(array, (void *)unpack_octstr(data, charpos));
  508. }
  509. return array;
  510. }
  511. List * unpack_key_list(Octstr *data, long *charpos) {
  512. KeyExchangeId *keyexid;
  513. List *key_list;
  514. int list_length;
  515. long endpos;
  516. /* create the list */
  517. key_list = list_create();
  518. /* get the size of the array */
  519. list_length = unpack_int16(data, charpos);
  520. endpos = *charpos + list_length;
  521. /* unpack the KeyExchangeIds */
  522. while (*charpos < endpos)
  523. {
  524. keyexid = unpack_key_exchange_id(data, charpos);
  525. list_append(key_list, (void *)keyexid);
  526. }
  527. return key_list;
  528. }
  529. List * unpack_ciphersuite_list(Octstr *data, long *charpos)
  530. {
  531. List *ciphersuites;
  532. int list_length;
  533. int i;
  534. CipherSuite *cs;
  535. /* create the list */
  536. ciphersuites = list_create();
  537. /* get the size of the array (in bytes, not elements)*/
  538. list_length = octstr_get_char(data, *charpos);
  539. *charpos += 1;
  540. /* unpack the CipherSuites */
  541. for (i=0; i<list_length; i+=2)
  542. {
  543. cs = (CipherSuite *)gw_malloc(sizeof(CipherSuite));
  544. cs->bulk_cipher_algo = octstr_get_char(data, *charpos);
  545. *charpos += 1;
  546. cs->mac_algo = octstr_get_char(data, *charpos);
  547. *charpos += 1;
  548. list_append(ciphersuites, (void *)cs);
  549. }
  550. return ciphersuites;
  551. }
  552. List * unpack_compression_method_list(Octstr *data, long *charpos) {
  553. List *compmethod_list;
  554. int list_length;
  555. int i;
  556. CompressionMethod *cm;
  557. /* create the list */
  558. compmethod_list = list_create();
  559. /* get the size of the array */
  560. list_length = octstr_get_char(data, *charpos);
  561. *charpos += 1;
  562. /* unpack the CompressionMethods */
  563. for (i=0; i<list_length; i++)
  564. {
  565. cm = gw_malloc(sizeof(CompressionMethod));
  566. *cm = octstr_get_char(data, *charpos);
  567. list_append(compmethod_list, (void *)cm);
  568. }
  569. return compmethod_list;
  570. }
  571. Identifier * unpack_identifier(Octstr *data, long *charpos) {
  572. Identifier *ident;
  573. /* create Identifier */
  574. ident = (Identifier *)gw_malloc(sizeof(Identifier));
  575. ident->id_type = octstr_get_char(data, *charpos);
  576. *charpos += 1;
  577. switch (ident->id_type) {
  578. case text:
  579. ident->charset = octstr_get_char(data, *charpos);
  580. *charpos += 1;
  581. ident->name = unpack_octstr(data, charpos);
  582. break;
  583. case binary:
  584. ident->identifier = unpack_octstr(data, charpos);
  585. break;
  586. case key_hash_sha:
  587. ident->key_hash = unpack_octstr(data, charpos);
  588. break;
  589. case x509_name:
  590. ident->distinguished_name = unpack_octstr(data, charpos);
  591. break;
  592. }
  593. return ident;
  594. }
  595. Signature * unpack_signature(Octstr *data, long *charpos) {
  596. Signature *sig;
  597. /* create Signature */
  598. sig = (Signature *)gw_malloc(sizeof(Signature));
  599. switch (signature_algo) {
  600. case ecdsa_sha:
  601. case rsa_sha:
  602. sig->sha_hash = unpack_array(data, charpos);
  603. break;
  604. }
  605. return sig;
  606. }
  607. WTLSCertificate * unpack_wtls_certificate(Octstr *data, long *charpos) {
  608. WTLSCertificate *cert;
  609. /* create the Certificate */
  610. cert = (WTLSCertificate *)gw_malloc(sizeof(WTLSCertificate));
  611. /* === unpack ToBeSignedCertificate === */
  612. cert->tobesigned_cert = (ToBeSignedCertificate *)gw_malloc(sizeof(ToBeSignedCertificate));
  613. /* version */
  614. cert->tobesigned_cert->certificate_version = octstr_get_char(data, *charpos);
  615. *charpos += 1;
  616. /* sig algo */
  617. cert->tobesigned_cert->signature_algo = octstr_get_char(data, *charpos);
  618. *charpos += 1;
  619. /* identifier */
  620. cert->tobesigned_cert->issuer->id_type = octstr_get_char(data, *charpos);
  621. *charpos += 1;
  622. /* issuer Identifier */
  623. cert->tobesigned_cert->issuer = unpack_identifier(data, charpos);
  624. /* validity periods */
  625. cert->tobesigned_cert->valid_not_before = unpack_int32(data, charpos);
  626. cert->tobesigned_cert->valid_not_after = unpack_int32(data, charpos);
  627. /* subject Identifier */
  628. cert->tobesigned_cert->subject = unpack_identifier(data, charpos);
  629. /* public_key_type */
  630. cert->tobesigned_cert->pubkey_type = octstr_get_char(data, *charpos);
  631. *charpos += 1;
  632. /* parameter specifier */
  633. cert->tobesigned_cert->param_spec = unpack_param_spec(data, charpos);
  634. /* public key */
  635. cert->tobesigned_cert->pubkey = unpack_public_key(data, charpos,
  636. cert->tobesigned_cert->pubkey_type);
  637. /* === pack Signature === */
  638. cert->signature = unpack_signature(data, charpos);
  639. return cert;
  640. }
  641. /*****************************************************************
  642.  * DESTROY functions
  643.  */
  644.  
  645. void destroy_octstr(Octstr *data) {
  646. octstr_destroy(data);
  647. }
  648. void destroy_octstr16(Octstr *data) {
  649. octstr_destroy(data);
  650. }
  651. void destroy_octstr_fixed(Octstr *data) {
  652. octstr_destroy(data);
  653. }
  654. void destroy_random(Random *random) {
  655. octstr_destroy(random->random_bytes);
  656. gw_free(random);
  657. }
  658. void destroy_dhparams(DHParameters *dhparams) {
  659. destroy_octstr16(dhparams->dh_p);
  660. destroy_octstr16(dhparams->dh_g);
  661. gw_free(dhparams);
  662. }
  663. void destroy_ecparams(ECParameters *ecparams) {
  664. /* field */
  665. switch (ecparams->field) {
  666. case ec_prime_p:
  667. octstr_destroy(ecparams->prime_p);
  668. break;
  669. case ec_characteristic_two:
  670. switch (ecparams->basis) {
  671. case ec_basis_onb:
  672. break;
  673. case ec_basis_trinomial:
  674. break;
  675. case ec_basis_pentanomial:
  676. break;
  677. case ec_basis_polynomial:
  678. octstr_destroy(ecparams->irreducible);
  679. break;
  680. }
  681. break;
  682. }
  683. /* pack the ECCurve */
  684. octstr_destroy(ecparams->curve->a);
  685. octstr_destroy(ecparams->curve->b);
  686. octstr_destroy(ecparams->curve->seed);
  687. /* pack the ECPoint */
  688. octstr_destroy(ecparams->base->point);
  689. /* order and cofactor */
  690. octstr_destroy(ecparams->order);
  691. octstr_destroy(ecparams->cofactor);
  692. gw_free(ecparams);
  693. }
  694. void destroy_param_spec(ParameterSpecifier *pspec) {
  695.   switch (public_key_algo) {
  696. case diffie_hellman_pubkey:
  697. destroy_dhparams(pspec->param_set->dhparams);
  698. break;
  699. case elliptic_curve_pubkey:
  700. destroy_ecparams(pspec->param_set->ecparams);
  701. break;
  702. }
  703. gw_free(pspec);
  704. }
  705. void destroy_public_key(PublicKey *key) {
  706. if(key->ecdh_pubkey)
  707. {
  708. octstr_destroy(key->ecdh_pubkey->point);
  709. gw_free(key->ecdh_pubkey);
  710. }
  711. if(key->ecdsa_pubkey)
  712. {
  713. octstr_destroy(key->ecdsa_pubkey->point);
  714. gw_free(key->ecdsa_pubkey);
  715. }
  716. if(key->rsa_pubkey)
  717. {
  718. destroy_rsa_pubkey(key->rsa_pubkey);
  719. }
  720. gw_free(key);
  721. }
  722. void destroy_rsa_pubkey(RSAPublicKey *key) {
  723. octstr_destroy(key->rsa_exponent);
  724. octstr_destroy(key->rsa_modulus);
  725. gw_free(key);
  726. }
  727. void destroy_ec_pubkey(ECPublicKey *key) {
  728. octstr_destroy(key->point);
  729. gw_free(key);
  730. }
  731. void destroy_dh_pubkey(DHPublicKey *key) {
  732. octstr_destroy(key->dh_Y);
  733. gw_free(key);
  734. }
  735. void destroy_rsa_secret(RSASecret *secret) {
  736. destroy_array(secret->random);
  737. gw_free(secret);
  738. }
  739. void destroy_rsa_encrypted_secret(RSAEncryptedSecret *secret) {
  740. octstr_destroy(secret->encrypted_secret);
  741. gw_free(secret);
  742. }
  743. void destroy_key_exchange_id(KeyExchangeId *keyexid) {
  744. destroy_param_spec(keyexid->param_specif);
  745. destroy_identifier(keyexid->identifier);
  746. gw_free(keyexid);
  747. }
  748. void destroy_array(List *array) {
  749. int i;
  750. /* pack each entry in the array */
  751. for (i=0; i<list_len(array); i++)
  752. {
  753. octstr_destroy((Octstr *) list_get(array, i));
  754. }
  755. list_destroy(array, NULL);
  756. }
  757. void destroy_key_list(List *key_list) {
  758. int i;
  759. /* destroy the KeyExchangeIds */
  760. for (i=0; i<list_len(key_list); i++) {
  761. destroy_key_exchange_id((KeyExchangeId *) list_get(key_list, i));
  762. }
  763. list_destroy(key_list, NULL);
  764. }
  765. void destroy_ciphersuite_list(List *ciphersuites) {
  766. int i;
  767. CipherSuite *cs;
  768. /* destroy the CipherSuites */
  769. for (i=0; i<list_len(ciphersuites); i++) {
  770. gw_free( (CipherSuite *) list_get(ciphersuites, i) );
  771. }
  772. list_destroy(ciphersuites, NULL);
  773. }
  774. void destroy_compression_method_list(List *compmethod_list) {
  775. int i;
  776. CompressionMethod *cm;
  777. /* destroy the CompressionMethods */
  778. for (i=0; i<list_len(compmethod_list); i++) {
  779. cm = (CompressionMethod*) list_get(compmethod_list, i);
  780. gw_free(cm);
  781. }
  782. gw_free(compmethod_list);
  783. }
  784. void destroy_identifier(Identifier *ident) {
  785. switch (ident->id_type) {
  786. case text:
  787. octstr_destroy(ident->name);
  788. break;
  789. case binary:
  790. octstr_destroy(ident->identifier);
  791. break;
  792. case key_hash_sha:
  793. octstr_destroy(ident->key_hash);
  794. break;
  795. case x509_name:
  796. octstr_destroy(ident->distinguished_name);
  797. break;
  798. }
  799. gw_free(ident);
  800. }
  801. void destroy_signature(Signature *sig) {
  802. switch (signature_algo) {
  803. case ecdsa_sha:
  804. case rsa_sha:
  805. destroy_array(sig->sha_hash);
  806. break;
  807. }
  808. gw_free(sig);
  809. }
  810. void destroy_wtls_certificate(WTLSCertificate *cert) {
  811. /* === destroy ToBeSignedCertificate === */
  812. /* issuer Identifier */
  813. destroy_identifier(cert->tobesigned_cert->issuer);
  814. /* subject Identifier */
  815. destroy_identifier(cert->tobesigned_cert->subject);
  816. /* parameter specifier */
  817. destroy_param_spec(cert->tobesigned_cert->param_spec);
  818. /* public key */
  819. destroy_public_key(cert->tobesigned_cert->pubkey);
  820. /* === destroy Signature === */
  821. destroy_signature(cert->signature);
  822. gw_free(cert);
  823. }
  824. /*****************************************************************
  825.  * DUMP functions
  826.  */
  827.  
  828. void dump_void16(unsigned char *dbg, int level, int i) {
  829. debug(dbg, 0, "%*s16 bit Int: %p", level, "", i);
  830. }
  831. void dump_int32(unsigned char *dbg, int level, long i) {
  832. debug(dbg, 0, "%*s32 bit Int: %p", level, "", i);
  833. }
  834. void dump_octstr(unsigned char *dbg, int level, Octstr *opaque) {
  835. octstr_dump(opaque, 0);
  836. }
  837. void dump_octstr16(unsigned char *dbg, int level, Octstr *opaque) {
  838. octstr_dump(opaque, 0);
  839. }
  840. void dump_octstr_fixed(unsigned char *dbg, int level, Octstr *opaque) {
  841. octstr_dump(opaque, 0);
  842. }
  843. void dump_random(unsigned char *dbg, int level, Random *random) {
  844. debug(dbg, 0, "%*sRandom :", level, "");
  845. debug(dbg, 0, "%*sGMT Unix Time: %p", level+1, "", random->gmt_unix_time);
  846. debug(dbg, 0, "%*sRandom Bytes:", level+1, "");
  847. dump_octstr_fixed(dbg, level+2, random->random_bytes);
  848. }
  849. void dump_dhparams(unsigned char *dbg, int level, DHParameters *dhparams) {
  850. debug(dbg, 0, "%*sDH Parameters :", level, "");
  851. debug(dbg, 0, "%*sdh_e: %p", level+1, "", dhparams->dh_e);
  852. debug(dbg, 0, "%*sdh_p:", level+1, "");
  853. dump_octstr16(dbg, level+2, dhparams->dh_p);
  854. debug(dbg, 0, "%*sdh_g:", level+1, "");
  855. dump_octstr16(dbg, level+2, dhparams->dh_g);
  856. }
  857. void dump_ecparams(unsigned char *dbg, int level, ECParameters *ecparams) {
  858. debug(dbg, 0, "%*sEC Parameters :", level, "");
  859. /* field */
  860. debug(dbg, 0, "%*sField: %p", level+1, "", ecparams->field);
  861. switch (ecparams->field) {
  862. case ec_prime_p:
  863. debug(dbg, 0, "%*sprime_p :", level+1, "");
  864. dump_octstr(dbg, level+1, ecparams->prime_p);
  865. break;
  866. case ec_characteristic_two:
  867. /* m (16 bits) */
  868. debug(dbg, 0, "%*sM: %p", level+1, "", ecparams->m);
  869. /* basis */
  870. debug(dbg, 0, "%*sBasis: %p", level+1, "", ecparams->basis);
  871. switch (ecparams->basis) {
  872. case ec_basis_onb:
  873. break;
  874. case ec_basis_trinomial:
  875. debug(dbg, 0, "%*sK: %p", level+1, "", ecparams->k);
  876. break;
  877. case ec_basis_pentanomial:
  878. debug(dbg, 0, "%*sk1: %p", level+1, "", ecparams->k1);
  879. debug(dbg, 0, "%*sk2: %p", level+1, "", ecparams->k2);
  880. debug(dbg, 0, "%*sk3: %p", level+1, "", ecparams->k3);
  881. break;
  882. case ec_basis_polynomial:
  883. debug(dbg, 0, "%*sirreducible: %p", level+1, "");
  884. dump_octstr(dbg, level+1, ecparams->irreducible);
  885. break;
  886. }
  887. break;
  888. }
  889. /* pack the ECCurve */
  890. debug(dbg, 0, "%*sEC Curve: %p", level+1, "");
  891. debug(dbg, 0, "%*sa: %p", level+2, "");
  892. dump_octstr(dbg, level+2, ecparams->curve->a);
  893. debug(dbg, 0, "%*sb: %p", level+2, "");
  894. dump_octstr(dbg, level+2, ecparams->curve->b);
  895. debug(dbg, 0, "%*sseed: %p", level+2, "");
  896. dump_octstr(dbg, level+2, ecparams->curve->seed);
  897. /* pack the ECPoint */
  898. debug(dbg, 0, "%*spoint: %p", level+2, "");
  899. dump_octstr(dbg, level+2, ecparams->base->point);
  900. /* order and cofactor */
  901. debug(dbg, 0, "%*sorder: %p", level+2, "");
  902. dump_octstr(dbg, level+2, ecparams->order);
  903. debug(dbg, 0, "%*scofactor: %p", level+2, "");
  904. dump_octstr(dbg, level+2, ecparams->cofactor);
  905. }
  906. void dump_param_spec(unsigned char *dbg, int level, ParameterSpecifier *pspec) {
  907. debug(dbg, 0, "%*sParameterSpecifier:", level, "");
  908. /* index */
  909. debug(dbg, 0, "%*sParameter Index: %d", level+1, "", pspec->param_index);
  910. /* ParameterSet struct */
  911. if(pspec->param_index == 255) {
  912. debug(dbg, 0, "%*sLength: %p", level+1, "", pspec->param_set->length);
  913. switch (public_key_algo) {
  914. case diffie_hellman_pubkey:
  915. dump_dhparams(dbg, level+1, pspec->param_set->dhparams);
  916. break;
  917. case elliptic_curve_pubkey:
  918. dump_ecparams(dbg, level+1, pspec->param_set->ecparams);
  919. break;
  920. }
  921. }
  922. }
  923. void dump_public_key(unsigned char *dbg, int level, PublicKey *key, PublicKeyType key_type) {
  924. switch (key_type) {
  925. case ecdh_key:
  926. debug(dbg, 0, "%*sPublicKey: %p", level, "");
  927. debug(dbg, 0, "%*sECDH Point: %p", level+1, "");
  928. dump_octstr(dbg, level+1, key->ecdh_pubkey->point);
  929. break;
  930. case ecdsa_key:
  931. debug(dbg, 0, "%*sECDSA Point: %p", level+1, "");
  932. dump_octstr(dbg, level+1, key->ecdsa_pubkey->point);
  933. break;
  934. case rsa_key:
  935. dump_rsa_pubkey(dbg, level+1, key->rsa_pubkey);
  936. break;
  937. }
  938. }
  939. void dump_rsa_pubkey(unsigned char *dbg, int level, RSAPublicKey *key) {
  940. debug(dbg, 0, "%*sRSA Public Key: %p", level, "");
  941. debug(dbg, 0, "%*sRSA Exponent: %p", level+1, "");
  942. dump_octstr(dbg, level+2, key->rsa_exponent);
  943. debug(dbg, 0, "%*sRSA Modulus: %p", level+1, "");
  944. dump_octstr(dbg, level+2, key->rsa_modulus);
  945. }
  946. void dump_ec_pubkey(unsigned char *dbg, int level, ECPublicKey *key) {
  947. debug(dbg, 0, "%*sEC Public Key: %p", level, "");
  948. debug(dbg, 0, "%*sPoint: %p", level+1, "");
  949. dump_octstr(dbg, level+2, key->point);
  950. }
  951. void dump_dh_pubkey(unsigned char *dbg, int level, DHPublicKey *key) {
  952. debug(dbg, 0, "%*sDH Public Key: %p", level, "");
  953. dump_octstr(dbg, level+2, key->dh_Y);
  954. }
  955. void dump_rsa_secret(unsigned char *dbg, int level, RSASecret *secret) {
  956. debug(dbg, 0, "%*sRSA Secret: %p", level, "");
  957. debug(dbg, 0, "%*sClient Version: %p", level+1, "", secret->client_version);
  958. debug(dbg, 0, "%*sRandom: %p", level, "");
  959. dump_array(dbg, level+2, secret->random);
  960. }
  961. void dump_rsa_encrypted_secret(unsigned char *dbg, int level, RSAEncryptedSecret *secret) {
  962. debug(dbg, 0, "%*sRSA Encrypted Secret: %p", level, "");
  963. dump_octstr(dbg, level+1, secret->encrypted_secret);
  964. }
  965. void dump_key_exchange_id(unsigned char *dbg, int level, KeyExchangeId *keyexid) {
  966. debug(dbg, 0, "%*sKey Exchange Id:", level, "");
  967. debug(dbg, 0, "%*sKey Exch Suite: %d", level+1, "", keyexid->key_exchange_suite);
  968. dump_param_spec(dbg, level+1, keyexid->param_specif);
  969. dump_identifier(dbg, level+1, keyexid->identifier);
  970. }
  971. void dump_array(unsigned char *dbg, int level, List *array) {
  972. int i;
  973. /*debug(dbg, 0, "%*sOctstr Array: %p", level, "");*/
  974. /* dump each entry in the array */
  975. for (i=0; i<list_len(array); i++)
  976. {
  977. debug(dbg, 0, "%*sElement %d", level, "", i);
  978. dump_octstr(dbg, level+1, (Octstr *) list_get(array, i));
  979. }
  980. }
  981. void dump_key_list(unsigned char *dbg, int level, List *key_list) {
  982. int i;
  983. long pos = 0;
  984. Octstr *buffer;
  985. KeyExchangeId *keyexid;
  986. debug(dbg, 0, "%*sKey List: %p", level, "");
  987. /* pack the KeyExchangeIds */
  988. for (i=0; i<list_len(key_list); i++) {
  989. keyexid = (KeyExchangeId *) list_get(key_list, i);
  990. dump_key_exchange_id(dbg, level+1, keyexid);
  991. }
  992. }
  993. void dump_ciphersuite_list(unsigned char *dbg, int level, List *ciphersuites) {
  994. int i;
  995. CipherSuite *cs;
  996. debug(dbg, 0, "%*sCipherSuite List: %p", level, "");
  997. /* dump the CipherSuites */
  998. for (i=0; i<list_len(ciphersuites); i++) {
  999. cs = (CipherSuite *) list_get(ciphersuites, i);
  1000. debug(dbg, 0, "%*sBulk Cipher Algo: %p", level, "", cs->bulk_cipher_algo);
  1001. debug(dbg, 0, "%*sMAC Algo: %p", level, "", cs->mac_algo);
  1002. }
  1003. }
  1004. void dump_compression_method_list(unsigned char *dbg, int level, List *compmethod_list) {
  1005. int i;
  1006. debug(dbg, 0, "%*sCompression Method List: %p", level, "");
  1007. /* pack the CompressionMethods */
  1008. for (i=0; i<list_len(compmethod_list); i++) {
  1009. debug(dbg, 0, "%*sMethod %d: %p", level, "", i, 
  1010. (CompressionMethod) list_get(compmethod_list, i));
  1011. }
  1012. }
  1013. void dump_identifier(unsigned char *dbg, int level, Identifier *ident) {
  1014. debug(dbg, 0, "%*sIdentifier:", level, "");
  1015. debug(dbg, 0, "%*sIdent type: %d", level+1, "", ident->id_type);
  1016. switch (ident->id_type) {
  1017. case text:
  1018. debug(dbg, 0, "%*sCharset: %p", level+1, "", ident->charset);
  1019. debug(dbg, 0, "%*sNamet: %p", level+1, "", ident->name);
  1020. break;
  1021. case binary:
  1022. debug(dbg, 0, "%*sIdentifier: %p", level+1, "");
  1023. dump_octstr(dbg, level+2, ident->identifier);
  1024. break;
  1025. case key_hash_sha:
  1026. debug(dbg, 0, "%*sKey Hash: %p", level+1, "");
  1027. dump_octstr(dbg, level+2, ident->key_hash);
  1028. break;
  1029. case x509_name:
  1030. debug(dbg, 0, "%*sDistinguished Name: %p", level+1, "");
  1031. dump_octstr(dbg, level+2, ident->distinguished_name);
  1032. break;
  1033. }
  1034. }
  1035. void dump_signature(unsigned char *dbg, int level, Signature *sig) {
  1036. debug(dbg, 0, "%*sSignature: %p", level, "");
  1037. switch (signature_algo) {
  1038. case ecdsa_sha:
  1039. case rsa_sha:
  1040. dump_array(dbg, level+1, sig->sha_hash);
  1041. break;
  1042. }
  1043. }
  1044. void dump_wtls_certificate(unsigned char *dbg, int level, WTLSCertificate *cert) {
  1045. debug(dbg, 0, "%*sWTLS Certificate: %p", level, "");
  1046. /* === pack ToBeSignedCertificate === */
  1047. /* version */
  1048. debug(dbg, 0, "%*sCertificate Version: %p", level+1, "", cert->tobesigned_cert->certificate_version);
  1049. /* sig algo */
  1050. debug(dbg, 0, "%*sSignature Algo: %p", level+1, "", cert->tobesigned_cert->signature_algo);
  1051. /* identifier */
  1052. debug(dbg, 0, "%*sID Type: %p", level+1, "", cert->tobesigned_cert->issuer->id_type);
  1053. /* issuer Identifier */
  1054. dump_identifier(dbg, level+1, cert->tobesigned_cert->issuer);
  1055. /* validity periods */
  1056. debug(dbg, 0, "%*sValid not Before: %p", level+1, "", cert->tobesigned_cert->valid_not_before);
  1057. debug(dbg, 0, "%*sValid not After: %p", level+1, "", cert->tobesigned_cert->valid_not_after);
  1058. /* subject Identifier */
  1059. dump_identifier(dbg, level+1, cert->tobesigned_cert->subject);
  1060. /* public_key_type */
  1061. debug(dbg, 0, "%*sPublic Key Type: %p", level+1, "", cert->tobesigned_cert->pubkey_type);
  1062. /* parameter specifier */
  1063. dump_param_spec(dbg, level+1, cert->tobesigned_cert->param_spec);
  1064. /* public key */
  1065. dump_public_key(dbg, level+1, cert->tobesigned_cert->pubkey,
  1066. cert->tobesigned_cert->pubkey_type);
  1067. /* === pack Signature === */
  1068. dump_signature(dbg, level+1, cert->signature);
  1069. }
  1070. #endif