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

手机WAP编程

开发平台:

WINDOWS

  1. /* wtls_statesupport.h
  2.  *
  3.  */
  4. #ifndef WTLS_STATESUPPORT_H
  5. #define WTLS_STATESUPPORT_H
  6. #include "gwlib/gwlib.h"
  7. #include "wtls_pdu.h"
  8. #include "wtls.h"
  9. #define KEYSIZE_MAX 2048
  10. #define NOT_EXPORTABLE 0
  11. #define EXPORTABLE 1
  12. #define BLOCK 0
  13. #define STREAM 1
  14. /* These enums and tables are pulled straight from the WTLS appendicies.
  15.    Go and have a look at them if these aren't particularly clear. Obviously, since NULL
  16.    is a builtin, and since RSA/MD5/SHA are all macros referenced by the openssl
  17.    libraries, the names have had to be slightly altered to protect the innocent :->
  18. */
  19. enum key_exchange_suites{
  20.         NULL_keyxchg,
  21.         SHARED_SECRET,
  22.         DH_anon,
  23.         DH_anon_512,
  24.         RSA_anon,
  25.         RSA_anon_512,
  26.         RSA_anon_768,
  27.         RSA_NOLIMIT,
  28.         RSA_512,
  29.         RSA_768,
  30.         ECDH_anon,
  31.         ECDH_anon_113,
  32.         ECDH_anon_131,
  33.         ECDH_ECDSA_NOLIMIT
  34. };
  35. enum bulk_algorithms {
  36.         NULL_bulk,
  37.         RC5_CBC_40,
  38.         RC5_CBC_56,
  39.         RC5_CBC,
  40.         DES_CBC_40,
  41.         DES_CBC,
  42.         TRIPLE_DES_CBC_EDE,
  43.         IDEA_CBC_40,
  44.         IDEA_CBC_56,
  45.         IDEA_CBC
  46. };
  47. enum keyed_macs{
  48.         SHA_0,
  49.         SHA_40,
  50.         SHA_80,
  51.         SHA_NOLIMIT,
  52.         SHA_XOR_40,
  53.         MD5_40,
  54.         MD5_80,
  55.         MD5_NOLIMIT
  56. };
  57. typedef struct 
  58. {
  59.         const char* title;
  60.         int key_size_limit;
  61. } keyxchg_table_t;
  62. static keyxchg_table_t keyxchg_table[] = {
  63.         {"NULL",0},
  64.         {"Shared Secret", KEYSIZE_MAX},
  65.         {"DH-anon",KEYSIZE_MAX},
  66.         {"DH-anon-512",512},
  67.         {"DH-anon-768",768},
  68.         {"RSA-anon", KEYSIZE_MAX},
  69.         {"RSA-anon-512",512},
  70.         {"RSA-anon-768",768},
  71.         {"RSA",KEYSIZE_MAX},
  72.         {"RSA-512", 512},
  73.         {"RSA-768",768},
  74.         {"ECDH-anon",KEYSIZE_MAX},
  75.         {"ECDH-anon-113",113},
  76.         {"ECDH-anon-131",131},
  77.         {"ECDH-ECDSA",KEYSIZE_MAX}
  78. };
  79. typedef struct 
  80. {
  81.         const char* title;
  82.         int is_exportable;
  83.         int block_or_stream;
  84.         int key_material;
  85.         int expanded_key_material;
  86.         int effective_key_bits;
  87.         int iv_size;
  88.         int block_size;
  89. } bulk_table_t;
  90. static bulk_table_t bulk_table[] = {
  91.         {"NULL Encryption",EXPORTABLE,STREAM,0,0,0,0,0},
  92.         {"RC5-CBC-40",EXPORTABLE,BLOCK,5,16,40,8,8},
  93.         {"RC5-CBC-56",EXPORTABLE,BLOCK,7,16,56,8,8},
  94.         {"RC5-CBC",NOT_EXPORTABLE,BLOCK,16,16,128,8,8},
  95.         {"DES-CBC-40",EXPORTABLE,BLOCK,5,8,40,8,8},
  96.         {"DES-CBC",NOT_EXPORTABLE,BLOCK,8,8,56,8,8},
  97.         {"3DES-CBC-EDE",NOT_EXPORTABLE,BLOCK,24,24,168,8,8},
  98.         {"IDEA-CBC-40",EXPORTABLE,BLOCK,5,16,40,8,8},
  99.         {"IDEA-CBC-56",EXPORTABLE,BLOCK,7,16,56,8,8},
  100.         {"IDEA-CBC",NOT_EXPORTABLE,BLOCK,16,16,128,8,8}
  101. };
  102. typedef struct 
  103. {
  104.         const char* title;
  105.         int key_size;
  106.         int mac_size;
  107. } hash_table_t;
  108. static hash_table_t hash_table[] = {
  109.         {"SHA-0",0,0},
  110.         {"SHA1-40",20,5},
  111.         {"SHA1-80",20,10},
  112.         {"SHA1",20,20},
  113.         {"SHA-XOR-40",0,5},
  114.         {"MD5-40",16,5},
  115.         {"MD5-80",16,10},
  116.         {"MD5",16,16}        
  117. };
  118. Octstr* wtls_calculate_prf(Octstr* secret, Octstr* label,
  119.                            Octstr* seed, int byteLength, WTLSMachine* wtls_machine);
  120. RSAPublicKey* wtls_get_rsapublickey(void);
  121. Random* wtls_get_random(void);
  122. Octstr* wtls_decrypt(Octstr* buffer, WTLSMachine* wtls_machine);
  123. Octstr* wtls_encrypt(Octstr* buffer, WTLSMachine* wtls_machine, int recordType);
  124. Octstr* wtls_decrypt_rsa(Octstr* encryptedData);
  125. /* The wtls_choose* functions implement the decision making process behind the
  126.    protocol negotiations in wtls. */
  127. CipherSuite* wtls_choose_ciphersuite(List* ciphersuites);
  128. int wtls_choose_clientkeyid(List* clientKeyIDs);
  129. int wtls_choose_snmode(int snmode);
  130. int wtls_choose_krefresh(int krefresh);
  131. /* The *_are_identical functions all return 1 if the packets match the condition as
  132.  * expressed in the function name. As each packet can contain a "list" of pdus, we
  133.  * need to search that list and return whether or not they contain identical pdus as listed.
  134.  * On failure, they will return non-zero
  135.  */
  136. int clienthellos_are_identical (List* pdu_list, List* last_received_packet);
  137. int certifcateverifys_are_identical (List* pdu_list, List* last_received_packet);
  138. int certificates_are_identical (List* pdu_list, List* last_received_packet);
  139. int clientkeyexchanges_are_identical (List* pdu_list, List* last_received_packet);
  140. int changecipherspecs_are_identical (List* pdu_list, List* last_received_packet);
  141. int finisheds_are_indentical (List* pdu_list, List* last_received_packet);
  142. /* the packet_contains_* functions all return 1 if the packet contains a pdu of the type
  143.  * expressed in the function name.
  144.  */
  145. int packet_contains_changecipherspec (List* pdu_list);
  146. int packet_contains_finished (List* pdu_list);
  147. int packet_contains_optional_stuff (List* pdu_list);
  148. int packet_contains_userdata (List* pdu_list);
  149. int packet_contains_clienthello (List* pdu_list);
  150. /* the is_*_alert functions return 1 if the packet is a pdu of the type expressed in the
  151.  * function name.
  152.  */
  153. int is_critical_alert (List* pdu_list);
  154. int is_warning_alert (List* pdu_list);
  155. void calculate_client_key_block(WTLSMachine *wtls_machine);
  156. void calculate_server_key_block(WTLSMachine *wtls_machine);
  157. #endif