Annotation of embedaddon/strongswan/src/libtls/tls_crypto.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2010 Martin Willi
                      3:  * Copyright (C) 2010 revosec AG
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: /**
                     17:  * @defgroup tls_crypto tls_crypto
                     18:  * @{ @ingroup libtls
                     19:  */
                     20: 
                     21: #ifndef TLS_CRYPTO_H_
                     22: #define TLS_CRYPTO_H_
                     23: 
                     24: typedef struct tls_crypto_t tls_crypto_t;
                     25: typedef enum tls_cipher_suite_t tls_cipher_suite_t;
                     26: typedef enum tls_hash_algorithm_t tls_hash_algorithm_t;
                     27: typedef enum tls_signature_algorithm_t tls_signature_algorithm_t;
                     28: typedef enum tls_client_certificate_type_t tls_client_certificate_type_t;
                     29: typedef enum tls_ecc_curve_type_t tls_ecc_curve_type_t;
                     30: typedef enum tls_named_curve_t tls_named_curve_t;
                     31: typedef enum tls_ansi_point_format_t tls_ansi_point_format_t;
                     32: typedef enum tls_ec_point_format_t tls_ec_point_format_t;
                     33: 
                     34: #include "tls.h"
                     35: #include "tls_prf.h"
                     36: #include "tls_protection.h"
                     37: 
                     38: #include <library.h>
                     39: 
                     40: #include <credentials/keys/private_key.h>
                     41: 
                     42: /**
                     43:  * TLS cipher suites
                     44:  */
                     45: enum tls_cipher_suite_t {
                     46:        TLS_NULL_WITH_NULL_NULL =                                       0x0000,
                     47:        TLS_RSA_WITH_NULL_MD5 =                                         0x0001,
                     48:        TLS_RSA_WITH_NULL_SHA =                                         0x0002,
                     49:        TLS_RSA_EXPORT_WITH_RC4_40_MD5 =                        0x0003,
                     50:        TLS_RSA_WITH_RC4_128_MD5 =                                      0x0004,
                     51:        TLS_RSA_WITH_RC4_128_SHA =                                      0x0005,
                     52:        TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 =            0x0006,
                     53:        TLS_RSA_WITH_IDEA_CBC_SHA =                                     0x0007,
                     54:        TLS_RSA_EXPORT_WITH_DES40_CBC_SHA =                     0x0008,
                     55:        TLS_RSA_WITH_DES_CBC_SHA =                                      0x0009,
                     56:        TLS_RSA_WITH_3DES_EDE_CBC_SHA =                         0x000A,
                     57:        TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA =          0x000B,
                     58:        TLS_DH_DSS_WITH_DES_CBC_SHA =                           0x000C,
                     59:        TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA =                      0x000D,
                     60:        TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA =          0x000E,
                     61:        TLS_DH_RSA_WITH_DES_CBC_SHA =                           0x000F,
                     62:        TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA =                      0x0010,
                     63:        TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA =         0x0011,
                     64:        TLS_DHE_DSS_WITH_DES_CBC_SHA =                          0x0012,
                     65:        TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA =                     0x0013,
                     66:        TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA =         0x0014,
                     67:        TLS_DHE_RSA_WITH_DES_CBC_SHA =                          0x0015,
                     68:        TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA =                     0x0016,
                     69:        TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 =            0x0017,
                     70:        TLS_DH_anon_WITH_RC4_128_MD5 =                          0x0018,
                     71:        TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA =         0x0019,
                     72:        TLS_DH_anon_WITH_DES_CBC_SHA =                          0x001A,
                     73:        TLS_DH_anon_WITH_3DES_EDE_CBC_SHA =                     0x001B,
                     74: 
                     75:        TLS_KRB5_WITH_DES_CBC_SHA =                                     0x001E,
                     76:        TLS_KRB5_WITH_3DES_EDE_CBC_SHA =                        0x001F,
                     77:        TLS_KRB5_WITH_RC4_128_SHA =                                     0x0020,
                     78:        TLS_KRB5_WITH_IDEA_CBC_SHA =                            0x0021,
                     79:        TLS_KRB5_WITH_DES_CBC_MD5 =                                     0x0022,
                     80:        TLS_KRB5_WITH_3DES_EDE_CBC_MD5 =                        0x0023,
                     81:        TLS_KRB5_WITH_RC4_128_MD5 =                                     0x0024,
                     82:        TLS_KRB5_WITH_IDEA_CBC_MD5 =                            0x0025,
                     83:        TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA =           0x0026,
                     84:        TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA =           0x0027,
                     85:        TLS_KRB5_EXPORT_WITH_RC4_40_SHA =                       0x0028,
                     86:        TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 =           0x0029,
                     87:        TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 =           0x002A,
                     88:        TLS_KRB5_EXPORT_WITH_RC4_40_MD5 =                       0x002B,
                     89:        TLS_PSK_WITH_NULL_SHA =                                         0x002C,
                     90:        TLS_DHE_PSK_WITH_NULL_SHA =                                     0x002D,
                     91:        TLS_RSA_PSK_WITH_NULL_SHA =                                     0x002E,
                     92:        TLS_RSA_WITH_AES_128_CBC_SHA =                          0x002F,
                     93:        TLS_DH_DSS_WITH_AES_128_CBC_SHA =                       0x0030,
                     94:        TLS_DH_RSA_WITH_AES_128_CBC_SHA =                       0x0031,
                     95:        TLS_DHE_DSS_WITH_AES_128_CBC_SHA =                      0x0032,
                     96:        TLS_DHE_RSA_WITH_AES_128_CBC_SHA =                      0x0033,
                     97:        TLS_DH_anon_WITH_AES_128_CBC_SHA =                      0x0034,
                     98:        TLS_RSA_WITH_AES_256_CBC_SHA =                          0x0035,
                     99:        TLS_DH_DSS_WITH_AES_256_CBC_SHA =                       0x0036,
                    100:        TLS_DH_RSA_WITH_AES_256_CBC_SHA =                       0x0037,
                    101:        TLS_DHE_DSS_WITH_AES_256_CBC_SHA =                      0x0038,
                    102:        TLS_DHE_RSA_WITH_AES_256_CBC_SHA =                      0x0039,
                    103:        TLS_DH_anon_WITH_AES_256_CBC_SHA =                      0x003A,
                    104:        TLS_RSA_WITH_NULL_SHA256 =                                      0x003B,
                    105:        TLS_RSA_WITH_AES_128_CBC_SHA256 =                       0x003C,
                    106:        TLS_RSA_WITH_AES_256_CBC_SHA256 =                       0x003D,
                    107:        TLS_DH_DSS_WITH_AES_128_CBC_SHA256 =            0x003E,
                    108:        TLS_DH_RSA_WITH_AES_128_CBC_SHA256 =            0x003F,
                    109:        TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 =           0x0040,
                    110:        TLS_RSA_WITH_CAMELLIA_128_CBC_SHA =                     0x0041,
                    111:        TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA =          0x0042,
                    112:        TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA =          0x0043,
                    113:        TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA =         0x0044,
                    114:        TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA =         0x0045,
                    115:        TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA =         0x0046,
                    116: 
                    117:        TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 =           0x0067,
                    118:        TLS_DH_DSS_WITH_AES_256_CBC_SHA256 =            0x0068,
                    119:        TLS_DH_RSA_WITH_AES_256_CBC_SHA256 =            0x0069,
                    120:        TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 =           0x006A,
                    121:        TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 =           0x006B,
                    122:        TLS_DH_anon_WITH_AES_128_CBC_SHA256 =           0x006C,
                    123:        TLS_DH_anon_WITH_AES_256_CBC_SHA256 =           0x006D,
                    124: 
                    125:        TLS_RSA_WITH_CAMELLIA_256_CBC_SHA =                     0x0084,
                    126:        TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA =          0x0085,
                    127:        TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA =          0x0086,
                    128:        TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA =         0x0087,
                    129:        TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA =         0x0088,
                    130:        TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA =         0x0089,
                    131:        TLS_PSK_WITH_RC4_128_SHA =                                      0x008A,
                    132:        TLS_PSK_WITH_3DES_EDE_CBC_SHA =                         0x008B,
                    133:        TLS_PSK_WITH_AES_128_CBC_SHA =                          0x008C,
                    134:        TLS_PSK_WITH_AES_256_CBC_SHA =                          0x008D,
                    135:        TLS_DHE_PSK_WITH_RC4_128_SHA =                          0x008E,
                    136:        TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA =                     0x008F,
                    137:        TLS_DHE_PSK_WITH_AES_128_CBC_SHA =                      0x0090,
                    138:        TLS_DHE_PSK_WITH_AES_256_CBC_SHA =                      0x0091,
                    139:        TLS_RSA_PSK_WITH_RC4_128_SHA =                          0x0092,
                    140:        TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA =                     0x0093,
                    141:        TLS_RSA_PSK_WITH_AES_128_CBC_SHA =                      0x0094,
                    142:        TLS_RSA_PSK_WITH_AES_256_CBC_SHA =                      0x0095,
                    143:        TLS_RSA_WITH_SEED_CBC_SHA =                                     0x0096,
                    144:        TLS_DH_DSS_WITH_SEED_CBC_SHA =                          0x0097,
                    145:        TLS_DH_RSA_WITH_SEED_CBC_SHA =                          0x0098,
                    146:        TLS_DHE_DSS_WITH_SEED_CBC_SHA =                         0x0099,
                    147:        TLS_DHE_RSA_WITH_SEED_CBC_SHA =                         0x009A,
                    148:        TLS_DH_anon_WITH_SEED_CBC_SHA =                         0x009B,
                    149:        TLS_RSA_WITH_AES_128_GCM_SHA256 =                       0x009C,
                    150:        TLS_RSA_WITH_AES_256_GCM_SHA384 =                       0x009D,
                    151:        TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 =           0x009E,
                    152:        TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 =           0x009F,
                    153:        TLS_DH_RSA_WITH_AES_128_GCM_SHA256 =            0x00A0,
                    154:        TLS_DH_RSA_WITH_AES_256_GCM_SHA384 =            0x00A1,
                    155:        TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 =           0x00A2,
                    156:        TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 =           0x00A3,
                    157:        TLS_DH_DSS_WITH_AES_128_GCM_SHA256 =            0x00A4,
                    158:        TLS_DH_DSS_WITH_AES_256_GCM_SHA384 =            0x00A5,
                    159:        TLS_DH_anon_WITH_AES_128_GCM_SHA256 =           0x00A6,
                    160:        TLS_DH_anon_WITH_AES_256_GCM_SHA384 =           0x00A7,
                    161:        TLS_PSK_WITH_AES_128_GCM_SHA256 =                       0x00A8,
                    162:        TLS_PSK_WITH_AES_256_GCM_SHA384 =                       0x00A9,
                    163:        TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 =           0x00AA,
                    164:        TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 =           0x00AB,
                    165:        TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 =           0x00AC,
                    166:        TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 =           0x00AD,
                    167:        TLS_PSK_WITH_AES_128_CBC_SHA256 =                       0x00AE,
                    168:        TLS_PSK_WITH_AES_256_CBC_SHA384 =                       0x00AF,
                    169:        TLS_PSK_WITH_NULL_SHA256 =                                      0x00B0,
                    170:        TLS_PSK_WITH_NULL_SHA384 =                                      0x00B1,
                    171:        TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 =           0x00B2,
                    172:        TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 =           0x00B3,
                    173:        TLS_DHE_PSK_WITH_NULL_SHA256 =                          0x00B4,
                    174:        TLS_DHE_PSK_WITH_NULL_SHA384 =                          0x00B5,
                    175:        TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 =           0x00B6,
                    176:        TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 =           0x00B7,
                    177:        TLS_RSA_PSK_WITH_NULL_SHA256 =                          0x00B8,
                    178:        TLS_RSA_PSK_WITH_NULL_SHA384 =                          0x00B9,
                    179:        TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 =          0x00BA,
                    180:        TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 =       0x00BB,
                    181:        TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 =       0x00BC,
                    182:        TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 =      0x00BD,
                    183:        TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 =      0x00BE,
                    184:        TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 =      0x00BF,
                    185:        TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 =          0x00C0,
                    186:        TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 =       0x00C1,
                    187:        TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 =       0x00C2,
                    188:        TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 =      0x00C3,
                    189:        TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 =      0x00C4,
                    190:        TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 =      0x00C5,
                    191: 
                    192:        TLS_EMPTY_RENEGOTIATION_INFO_SCSV =                     0x00FF,
                    193: 
                    194:        TLS_ECDH_ECDSA_WITH_NULL_SHA =                          0xC001,
                    195:        TLS_ECDH_ECDSA_WITH_RC4_128_SHA =                       0xC002,
                    196:        TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA =          0xC003,
                    197:        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA =           0xC004,
                    198:        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA =           0xC005,
                    199:        TLS_ECDHE_ECDSA_WITH_NULL_SHA =                         0xC006,
                    200:        TLS_ECDHE_ECDSA_WITH_RC4_128_SHA =                      0xC007,
                    201:        TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA =         0xC008,
                    202:        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA =          0xC009,
                    203:        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA =          0xC00A,
                    204:        TLS_ECDH_RSA_WITH_NULL_SHA =                            0xC00B,
                    205:        TLS_ECDH_RSA_WITH_RC4_128_SHA =                         0xC00C,
                    206:        TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA =            0xC00D,
                    207:        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA =                     0xC00E,
                    208:        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA =                     0xC00F,
                    209:        TLS_ECDHE_RSA_WITH_NULL_SHA =                           0xC010,
                    210:        TLS_ECDHE_RSA_WITH_RC4_128_SHA =                        0xC011,
                    211:        TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA =           0xC012,
                    212:        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA =            0xC013,
                    213:        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA =            0xC014,
                    214:        TLS_ECDH_anon_WITH_NULL_SHA =                           0xC015,
                    215:        TLS_ECDH_anon_WITH_RC4_128_SHA =                        0xC016,
                    216:        TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA =           0xC017,
                    217:        TLS_ECDH_anon_WITH_AES_128_CBC_SHA =            0xC018,
                    218:        TLS_ECDH_anon_WITH_AES_256_CBC_SHA =            0xC019,
                    219:        TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA =                     0xC01A,
                    220:        TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA =         0xC01B,
                    221:        TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA =         0xC01C,
                    222:        TLS_SRP_SHA_WITH_AES_128_CBC_SHA =                      0xC01D,
                    223:        TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA =          0xC01E,
                    224:        TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA =          0xC01F,
                    225:        TLS_SRP_SHA_WITH_AES_256_CBC_SHA =                      0xC020,
                    226:        TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA =          0xC021,
                    227:        TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA =          0xC022,
                    228:        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 =       0xC023,
                    229:        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 =       0xC024,
                    230:        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 =        0xC025,
                    231:        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 =        0xC026,
                    232:        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 =         0xC027,
                    233:        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 =         0xC028,
                    234:        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 =          0xC029,
                    235:        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 =          0xC02A,
                    236:        TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 =       0xC02B,
                    237:        TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 =       0xC02C,
                    238:        TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 =        0xC02D,
                    239:        TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 =        0xC02E,
                    240:        TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 =         0xC02F,
                    241:        TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 =         0xC030,
                    242:        TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 =          0xC031,
                    243:        TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 =          0xC032,
                    244:        TLS_ECDHE_PSK_WITH_RC4_128_SHA =                        0xC033,
                    245:        TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA =           0xC034,
                    246:        TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA =            0xC035,
                    247:        TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA =            0xC036,
                    248:        TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 =         0xC037,
                    249:        TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 =         0xC038,
                    250:        TLS_ECDHE_PSK_WITH_NULL_SHA =                           0xC039,
                    251:        TLS_ECDHE_PSK_WITH_NULL_SHA256 =                        0xC03A,
                    252:        TLS_ECDHE_PSK_WITH_NULL_SHA384 =                        0xC03B
                    253: };
                    254: 
                    255: /**
                    256:  * Enum names for tls_cipher_suite_t
                    257:  */
                    258: extern enum_name_t *tls_cipher_suite_names;
                    259: 
                    260: /**
                    261:  * TLS HashAlgorithm identifiers
                    262:  */
                    263: enum tls_hash_algorithm_t {
                    264:        TLS_HASH_NONE =         0,
                    265:        TLS_HASH_MD5 =          1,
                    266:        TLS_HASH_SHA1 =         2,
                    267:        TLS_HASH_SHA224 =       3,
                    268:        TLS_HASH_SHA256 =       4,
                    269:        TLS_HASH_SHA384 =       5,
                    270:        TLS_HASH_SHA512 =       6,
                    271: };
                    272: 
                    273: /**
                    274:  * Enum names for tls_hash_algorithm_t
                    275:  */
                    276: extern enum_name_t *tls_hash_algorithm_names;
                    277: 
                    278: /**
                    279:  * TLS SignatureAlgorithm identifiers
                    280:  */
                    281: enum tls_signature_algorithm_t {
                    282:        TLS_SIG_RSA =           1,
                    283:        TLS_SIG_DSA =           2,
                    284:        TLS_SIG_ECDSA =         3,
                    285: };
                    286: 
                    287: /**
                    288:  * Enum names for tls_signature_algorithm_t
                    289:  */
                    290: extern enum_name_t *tls_signature_algorithm_names;
                    291: 
                    292: /**
                    293:  * TLS ClientCertificateType
                    294:  */
                    295: enum tls_client_certificate_type_t {
                    296:        TLS_RSA_SIGN =                  1,
                    297:        TLS_DSA_SIGN =                  2,
                    298:        TLS_RSA_FIXED_DH =              3,
                    299:        TLS_DSS_FIXED_DH =              4,
                    300:        TLS_RSA_EPHEMERAL_DH =  5,
                    301:        TLS_DSS_EPHEMERAL_DH =  6,
                    302:        TLS_FORTEZZA_DMS =              20,
                    303:        TLS_ECDSA_SIGN =                64,
                    304:        TLS_RSA_FIXED_ECDH =    65,
                    305:        TLS_ECDSA_FIXED_ECDH =  66,
                    306: };
                    307: 
                    308: /**
                    309:  * Enum names for tls_client_certificate_type_t
                    310:  */
                    311: extern enum_name_t *tls_client_certificate_type_names;
                    312: 
                    313: /**
                    314:  * TLS EccCurveType
                    315:  */
                    316: enum tls_ecc_curve_type_t {
                    317:        TLS_ECC_EXPLICIT_PRIME =        1,
                    318:        TLS_ECC_EXPLICIT_CHAR2 =        2,
                    319:        TLS_ECC_NAMED_CURVE =           3,
                    320: };
                    321: 
                    322: /**
                    323:  * Enum names for tls_ecc_curve_type_t
                    324:  */
                    325: extern enum_name_t *tls_ecc_curve_type_names;
                    326: 
                    327: /**
                    328:  * TLS Named Curve identifiers
                    329:  */
                    330: enum tls_named_curve_t {
                    331:        TLS_SECT163K1 =          1,
                    332:        TLS_SECT163R1 =          2,
                    333:        TLS_SECT163R2 =          3,
                    334:        TLS_SECT193R1 =          4,
                    335:        TLS_SECT193R2 =          5,
                    336:        TLS_SECT233K1 =          6,
                    337:        TLS_SECT233R1 =          7,
                    338:        TLS_SECT239K1 =          8,
                    339:        TLS_SECT283K1 =          9,
                    340:        TLS_SECT283R1 =         10,
                    341:        TLS_SECT409K1 =         11,
                    342:        TLS_SECT409R1 =         12,
                    343:        TLS_SECT571K1 =         13,
                    344:        TLS_SECT571R1 =         14,
                    345:        TLS_SECP160K1 =         15,
                    346:        TLS_SECP160R1 =         16,
                    347:        TLS_SECP160R2 =         17,
                    348:        TLS_SECP192K1 =         18,
                    349:        TLS_SECP192R1 =         19,
                    350:        TLS_SECP224K1 =         20,
                    351:        TLS_SECP224R1 =         21,
                    352:        TLS_SECP256K1 =         22,
                    353:        TLS_SECP256R1 =         23,
                    354:        TLS_SECP384R1 =         24,
                    355:        TLS_SECP521R1 =         25,
                    356: };
                    357: 
                    358: /**
                    359:  * Enum names for tls_named_curve_t
                    360:  */
                    361: extern enum_name_t *tls_named_curve_names;
                    362: 
                    363: /**
                    364:  * EC Point format, ANSI X9.62.
                    365:  */
                    366: enum tls_ansi_point_format_t {
                    367:        TLS_ANSI_COMPRESSED =   2,
                    368:        TLS_ANSI_COMPRESSED_Y = 3,
                    369:        TLS_ANSI_UNCOMPRESSED = 4,
                    370:        TLS_ANSI_HYBRID =               6,
                    371:        TLS_ANSI_HYBRID_Y =             7,
                    372: };
                    373: 
                    374: /**
                    375:  * Enum names for tls_ansi_point_format_t.
                    376:  */
                    377: extern enum_name_t *tls_ansi_point_format_names;
                    378: 
                    379: /**
                    380:  * EC Point format, TLS specific identifiers.
                    381:  */
                    382: enum tls_ec_point_format_t {
                    383:        TLS_EC_POINT_UNCOMPRESSED = 0,
                    384:        TLS_EC_POINT_ANSIX962_COMPRESSED_PRIME = 1,
                    385:        TLS_EC_POINT_ANSIX962_COMPRESSED_CHAR2 = 2,
                    386: };
                    387: 
                    388: /**
                    389:  * Enum names for tls_ec_point_format_t.
                    390:  */
                    391: extern enum_name_t *tls_ec_point_format_names;
                    392: 
                    393: /**
                    394:  * TLS crypto helper functions.
                    395:  */
                    396: struct tls_crypto_t {
                    397: 
                    398:        /**
                    399:         * Get a list of supported TLS cipher suites.
                    400:         *
                    401:         * @param suites                list of suites, points to internal data
                    402:         * @return                              number of suites returned
                    403:         */
                    404:        int (*get_cipher_suites)(tls_crypto_t *this, tls_cipher_suite_t **suites);
                    405: 
                    406:        /**
                    407:         * Select and store a cipher suite from a given list of candidates.
                    408:         *
                    409:         * @param suites                list of candidates to select from
                    410:         * @param count                 number of suites
                    411:         * @param key                   key type used, or KEY_ANY
                    412:         * @return                              selected suite, 0 if none acceptable
                    413:         */
                    414:        tls_cipher_suite_t (*select_cipher_suite)(tls_crypto_t *this,
                    415:                                                                                tls_cipher_suite_t *suites, int count,
                    416:                                                                                key_type_t key);
                    417: 
                    418:        /**
                    419:         * Get the Diffie-Hellman group to use, if any.
                    420:         *
                    421:         * @return                              Diffie Hellman group, ord MODP_NONE
                    422:         */
                    423:        diffie_hellman_group_t (*get_dh_group)(tls_crypto_t *this);
                    424: 
                    425:        /**
                    426:         * Write the list of supported hash/sig algorithms to writer.
                    427:         *
                    428:         * @param writer                writer to write supported hash/sig algorithms
                    429:         */
                    430:        void (*get_signature_algorithms)(tls_crypto_t *this, bio_writer_t *writer);
                    431: 
                    432:        /**
                    433:         * Create an enumerator over supported ECDH groups.
                    434:         *
                    435:         * Enumerates over (diffie_hellman_group_t, tls_named_curve_t)
                    436:         *
                    437:         * @return                              enumerator
                    438:         */
                    439:        enumerator_t* (*create_ec_enumerator)(tls_crypto_t *this);
                    440: 
                    441:        /**
                    442:         * Set the protection layer of the TLS stack to control it.
                    443:         *
                    444:         * @param protection            protection layer to work on
                    445:         */
                    446:        void (*set_protection)(tls_crypto_t *this, tls_protection_t *protection);
                    447: 
                    448:        /**
                    449:         * Store exchanged handshake data, used for cryptographic operations.
                    450:         *
                    451:         * @param type                  handshake sub type
                    452:         * @param data                  data to append to handshake buffer
                    453:         */
                    454:        void (*append_handshake)(tls_crypto_t *this,
                    455:                                                         tls_handshake_type_t type, chunk_t data);
                    456: 
                    457:        /**
                    458:         * Sign a blob of data, append signature to writer.
                    459:         *
                    460:         * @param key                   private key to use for signature
                    461:         * @param writer                TLS writer to write signature to
                    462:         * @param data                  data to sign
                    463:         * @param hashsig               list of TLS1.2 hash/sig algorithms to select from
                    464:         * @return                              TRUE if signature create successfully
                    465:         */
                    466:        bool (*sign)(tls_crypto_t *this, private_key_t *key,
                    467:                                 bio_writer_t *writer, chunk_t data, chunk_t hashsig);
                    468: 
                    469:        /**
                    470:         * Verify a blob of data, read signature from a reader.
                    471:         *
                    472:         * @param key                   public key to verify signature with
                    473:         * @param reader                TLS reader to read signature from
                    474:         * @param data                  data to verify signature
                    475:         * @return                              TRUE if signature valid
                    476:         */
                    477:        bool (*verify)(tls_crypto_t *this, public_key_t *key,
                    478:                                   bio_reader_t *reader, chunk_t data);
                    479: 
                    480:        /**
                    481:         * Create a signature of the handshake data using a given private key.
                    482:         *
                    483:         * @param key                   private key to use for signature
                    484:         * @param writer                TLS writer to write signature to
                    485:         * @param hashsig               list of TLS1.2 hash/sig algorithms to select from
                    486:         * @return                              TRUE if signature create successfully
                    487:         */
                    488:        bool (*sign_handshake)(tls_crypto_t *this, private_key_t *key,
                    489:                                                   bio_writer_t *writer, chunk_t hashsig);
                    490: 
                    491:        /**
                    492:         * Verify the signature over handshake data using a given public key.
                    493:         *
                    494:         * @param key                   public key to verify signature with
                    495:         * @param reader                TLS reader to read signature from
                    496:         * @return                              TRUE if signature valid
                    497:         */
                    498:        bool (*verify_handshake)(tls_crypto_t *this, public_key_t *key,
                    499:                                                         bio_reader_t *reader);
                    500: 
                    501:        /**
                    502:         * Calculate the data of a TLS finished message.
                    503:         *
                    504:         * @param label                 ASCII label to use for calculation
                    505:         * @param out                   buffer to write finished data to
                    506:         * @return                              TRUE if calculation successful
                    507:         */
                    508:        bool (*calculate_finished)(tls_crypto_t *this, char *label, char out[12]);
                    509: 
                    510:        /**
                    511:         * Derive the master secret, MAC and encryption keys.
                    512:         *
                    513:         * @param premaster             premaster secret
                    514:         * @param session               session identifier to cache master secret
                    515:         * @param id                    identity the session is bound to
                    516:         * @param client_random random data from client hello
                    517:         * @param server_random random data from server hello
                    518:         * @return                              TRUE if secrets derived successfully
                    519:         */
                    520:        bool (*derive_secrets)(tls_crypto_t *this, chunk_t premaster,
                    521:                                                   chunk_t session, identification_t *id,
                    522:                                                   chunk_t client_random, chunk_t server_random);
                    523: 
                    524:        /**
                    525:         * Try to resume a TLS session, derive key material.
                    526:         *
                    527:         * @param session               session identifier
                    528:         * @param id                    identity the session is bound to
                    529:         * @param client_random random data from client hello
                    530:         * @param server_random random data from server hello
                    531:         * @return                              selected suite
                    532:         */
                    533:        tls_cipher_suite_t (*resume_session)(tls_crypto_t *this, chunk_t session,
                    534:                                                                                 identification_t *id,
                    535:                                                                                 chunk_t client_random,
                    536:                                                                                 chunk_t server_random);
                    537: 
                    538:        /**
                    539:         * Check if we have a session to resume as a client.
                    540:         *
                    541:         * @param id                    server identity to get a session for
                    542:         * @return                              allocated session identifier, or chunk_empty
                    543:         */
                    544:        chunk_t (*get_session)(tls_crypto_t *this, identification_t *id);
                    545: 
                    546:        /**
                    547:         * Change the cipher used at protection layer.
                    548:         *
                    549:         * @param inbound               TRUE to change inbound cipher, FALSE for outbound
                    550:         */
                    551:        void (*change_cipher)(tls_crypto_t *this, bool inbound);
                    552: 
                    553:        /**
                    554:         * Get the MSK to use in EAP-TLS.
                    555:         *
                    556:         * @return                              MSK, points to internal data
                    557:         */
                    558:        chunk_t (*get_eap_msk)(tls_crypto_t *this);
                    559: 
                    560:        /**
                    561:         * Destroy a tls_crypto_t.
                    562:         */
                    563:        void (*destroy)(tls_crypto_t *this);
                    564: };
                    565: 
                    566: /**
                    567:  * Create a tls_crypto instance.
                    568:  *
                    569:  * @param tls                  TLS stack
                    570:  * @param cache                        TLS session cache
                    571:  * @return                             TLS crypto helper
                    572:  */
                    573: tls_crypto_t *tls_crypto_create(tls_t *tls, tls_cache_t *cache);
                    574: 
                    575: /**
                    576:  * Get a list of all supported TLS cipher suites.
                    577:  *
                    578:  * @param null                 include supported NULL encryption suites
                    579:  * @param suites               pointer to allocated suites array, to free(), or NULL
                    580:  * @return                             number of suites supported
                    581:  */
                    582: int tls_crypto_get_supported_suites(bool null, tls_cipher_suite_t **suites);
                    583: 
                    584: #endif /** TLS_CRYPTO_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>