Annotation of embedaddon/strongswan/src/libtls/tls_crypto.h, revision 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>