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

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

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