Home | History | Annotate | Download | only in Ikev2
      1 /** @file
      2   The Definitions related to IKEv2 payload.
      3 
      4   Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
      5 
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php.
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 #ifndef _IKE_V2_PAYLOAD_H_
     16 #define _IKE_V2_PAYLOAD_H_
     17 
     18 //
     19 // Payload Type for IKEv2
     20 //
     21 #define IKEV2_PAYLOAD_TYPE_NONE     0
     22 #define IKEV2_PAYLOAD_TYPE_SA       33
     23 #define IKEV2_PAYLOAD_TYPE_KE       34
     24 #define IKEV2_PAYLOAD_TYPE_ID_INIT  35
     25 #define IKEV2_PAYLOAD_TYPE_ID_RSP   36
     26 #define IKEV2_PAYLOAD_TYPE_CERT     37
     27 #define IKEV2_PAYLOAD_TYPE_CERTREQ  38
     28 #define IKEV2_PAYLOAD_TYPE_AUTH     39
     29 #define IKEV2_PAYLOAD_TYPE_NONCE    40
     30 #define IKEV2_PAYLOAD_TYPE_NOTIFY   41
     31 #define IKEV2_PAYLOAD_TYPE_DELETE   42
     32 #define IKEV2_PAYLOAD_TYPE_VENDOR   43
     33 #define IKEV2_PAYLOAD_TYPE_TS_INIT  44
     34 #define IKEV2_PAYLOAD_TYPE_TS_RSP   45
     35 #define IKEV2_PAYLOAD_TYPE_ENCRYPT  46
     36 #define IKEV2_PAYLOAD_TYPE_CP       47
     37 #define IKEV2_PAYLOAD_TYPE_EAP      48
     38 
     39 //
     40 // IKE header Flag (1 octet) for IKEv2, defined in RFC 4306 section 3.1
     41 //
     42 // I(nitiator) (bit 3 of Flags, 0x08) - This bit MUST be set in messages sent by the
     43 //                                      original initiator of the IKE_SA
     44 //
     45 // R(esponse) (bit 5 of Flags, 0x20)  - This bit indicates that this message is a response to
     46 //                                      a message containing the same message ID.
     47 //
     48 #define IKE_HEADER_FLAGS_INIT       0x08
     49 #define IKE_HEADER_FLAGS_RESPOND    0x20
     50 
     51 //
     52 // IKE Header Exchange Type for IKEv2
     53 //
     54 #define IKEV2_EXCHANGE_TYPE_INIT         34
     55 #define IKEV2_EXCHANGE_TYPE_AUTH         35
     56 #define IKEV2_EXCHANGE_TYPE_CREATE_CHILD 36
     57 #define IKEV2_EXCHANGE_TYPE_INFO         37
     58 
     59 #pragma pack(1)
     60 typedef struct {
     61   UINT8   NextPayload;
     62   UINT8   Reserved;
     63   UINT16  PayloadLength;
     64 } IKEV2_COMMON_PAYLOAD_HEADER;
     65 #pragma pack()
     66 
     67 #pragma pack(1)
     68 typedef struct {
     69   IKEV2_COMMON_PAYLOAD_HEADER Header;
     70   //
     71   // Proposals
     72   //
     73 } IKEV2_SA;
     74 #pragma pack()
     75 
     76 #pragma pack(1)
     77 typedef struct {
     78   IKEV2_COMMON_PAYLOAD_HEADER Header;
     79   UINT8                       ProposalIndex;
     80   UINT8                       ProtocolId;
     81   UINT8                       SpiSize;
     82   UINT8                       NumTransforms;
     83 } IKEV2_PROPOSAL;
     84 #pragma pack()
     85 
     86 //
     87 // IKEv2 Transform Type Values presented within Transform Payload
     88 //
     89 #define IKEV2_TRANSFORM_TYPE_ENCR      1  // Encryption Algorithm
     90 #define IKEV2_TRANSFORM_TYPE_PRF       2  // Pseduo-Random Func
     91 #define IKEV2_TRANSFORM_TYPE_INTEG     3  // Integrity Algorithm
     92 #define IKEV2_TRANSFORM_TYPE_DH        4  // DH Group
     93 #define IKEV2_TRANSFORM_TYPE_ESN       5  // Extended Sequence Number
     94 
     95 //
     96 // IKEv2 Transform ID for Encrypt Algorithm (ENCR)
     97 //
     98 #define IKEV2_TRANSFORM_ID_ENCR_DES_IV64 1
     99 #define IKEV2_TRANSFORM_ID_ENCR_DES      2
    100 #define IKEV2_TRANSFORM_ID_ENCR_3DES     3
    101 #define IKEV2_TRANSFORM_ID_ENCR_RC5      4
    102 #define IKEV2_TRANSFORM_ID_ENCR_IDEA     5
    103 #define IKEV2_TRANSFORM_ID_ENCR_CAST     6
    104 #define IKEV2_TRANSFORM_ID_ENCR_BLOWFISH 7
    105 #define IKEV2_TRANSFORM_ID_ENCR_3IDEA    8
    106 #define IKEV2_TRANSFORM_ID_ENCR_DES_IV32 9
    107 #define IKEV2_TRANSFORM_ID_ENCR_NULL     11
    108 #define IKEV2_TRANSFORM_ID_ENCR_AES_CBC  12
    109 #define IKEV2_TRANSFORM_ID_ENCR_AES_CTR  13
    110 
    111 //
    112 // IKEv2 Transform ID for Pseudo-Random Function (PRF)
    113 //
    114 #define IKEV2_TRANSFORM_ID_PRF_HMAC_MD5     1
    115 #define IKEV2_TRANSFORM_ID_PRF_HMAC_SHA1    2
    116 #define IKEV2_TRANSFORM_ID_PRF_HMAC_TIGER   3
    117 #define IKEV2_TRANSFORM_ID_PRF_AES128_XCBC  4
    118 
    119 //
    120 // IKEv2 Transform ID for Integrity Algorithm (INTEG)
    121 //
    122 #define IKEV2_TRANSFORM_ID_AUTH_NONE              0
    123 #define IKEV2_TRANSFORM_ID_AUTH_HMAC_MD5_96       1
    124 #define IKEV2_TRANSFORM_ID_AUTH_HMAC_SHA1_96      2
    125 #define IKEV2_TRANSFORM_ID_AUTH_HMAC_DES_MAC      3
    126 #define IKEV2_TRANSFORM_ID_AUTH_HMAC_KPDK_MD5     4
    127 #define IKEV2_TRANSFORM_ID_AUTH_HMAC_AES_XCBC_96  5
    128 
    129 //
    130 // IKEv2 Transform ID for Diffie-Hellman Group (DH)
    131 //
    132 #define IKEV2_TRANSFORM_ID_DH_768MODP             1
    133 #define IKEV2_TRANSFORM_ID_DH_1024MODP            2
    134 #define IKEV2_TRANSFORM_ID_DH_2048MODP            14
    135 
    136 //
    137 // IKEv2 Attribute Type Values
    138 //
    139 #define IKEV2_ATTRIBUTE_TYPE_KEYLEN               14
    140 
    141 //
    142 // Transform Payload
    143 //
    144 #pragma pack(1)
    145 typedef struct {
    146   IKEV2_COMMON_PAYLOAD_HEADER Header;
    147   UINT8                       TransformType;
    148   UINT8                       Reserved;
    149   UINT16                      TransformId;
    150   //
    151   // SA Attributes
    152   //
    153 } IKEV2_TRANSFORM;
    154 #pragma pack()
    155 
    156 #pragma pack(1)
    157 typedef struct {
    158   IKEV2_COMMON_PAYLOAD_HEADER Header;
    159   UINT16                      DhGroup;
    160   UINT16                      Reserved;
    161   //
    162   // Remaining part contains the key exchanged
    163   //
    164 } IKEV2_KEY_EXCHANGE;
    165 #pragma pack()
    166 
    167 //
    168 // Identification Type Values presented within Ikev2 ID payload
    169 //
    170 #define IKEV2_ID_TYPE_IPV4_ADDR        1
    171 #define IKEV2_ID_TYPE_FQDN             2
    172 #define IKEV2_ID_TYPE_RFC822_ADDR      3
    173 #define IKEV2_ID_TYPE_IPV6_ADDR        5
    174 #define IKEV2_ID_TYPE_DER_ASN1_DN      9
    175 #define IKEV2_ID_TYPE_DER_ASN1_GN      10
    176 #define IKEV2_ID_TYPE_KEY_ID           11
    177 
    178 //
    179 // Identification Payload
    180 //
    181 #pragma pack(1)
    182 typedef struct {
    183   IKEV2_COMMON_PAYLOAD_HEADER Header;
    184   UINT8                       IdType;
    185   UINT8                       Reserver1;
    186   UINT16                      Reserver2;
    187   //
    188   // Identification Data
    189   //
    190 } IKEV2_ID;
    191 #pragma pack()
    192 
    193 //
    194 // Encoding Type presented in IKEV2 Cert Payload
    195 //
    196 #define IKEV2_CERT_ENCODEING_RESERVED                  0
    197 #define IKEV2_CERT_ENCODEING_X509_CERT_WRAP            1
    198 #define IKEV2_CERT_ENCODEING_PGP_CERT                  2
    199 #define IKEV2_CERT_ENCODEING_DNS_SIGN_KEY              3
    200 #define IKEV2_CERT_ENCODEING_X509_CERT_SIGN            4
    201 #define IKEV2_CERT_ENCODEING_KERBEROS_TOKEN            6
    202 #define IKEV2_CERT_ENCODEING_REVOCATION_LIST_CERT      7
    203 #define IKEV2_CERT_ENCODEING_AUTH_REVOCATION_LIST      8
    204 #define IKEV2_CERT_ENCODEING_SPKI_CERT                 9
    205 #define IKEV2_CERT_ENCODEING_X509_CERT_ATTRIBUTE       10
    206 #define IKEV2_CERT_ENCODEING_RAW_RSA_KEY               11
    207 #define IKEV2_CERT_ENCODEING_HASH_AND_URL_OF_X509_CERT 12
    208 
    209 //
    210 // IKEV2 Certificate Payload
    211 //
    212 #pragma pack(1)
    213 typedef struct {
    214   IKEV2_COMMON_PAYLOAD_HEADER Header;
    215   UINT8                       CertEncoding;
    216   //
    217   // Cert Data
    218   //
    219 } IKEV2_CERT;
    220 #pragma pack()
    221 
    222 //
    223 // IKEV2 Certificate Request Payload
    224 //
    225 #pragma pack(1)
    226 typedef struct {
    227   IKEV2_COMMON_PAYLOAD_HEADER Header;
    228   UINT8                       CertEncoding;
    229   //
    230   // Cert Authority
    231   //
    232 } IKEV2_CERT_REQ;
    233 #pragma pack()
    234 
    235 //
    236 // Authentication Payload
    237 //
    238 #pragma pack(1)
    239 typedef struct {
    240   IKEV2_COMMON_PAYLOAD_HEADER Header;
    241   UINT8                       AuthMethod;
    242   UINT8                       Reserved1;
    243   UINT16                      Reserved2;
    244   //
    245   // Auth Data
    246   //
    247 } IKEV2_AUTH;
    248 #pragma pack()
    249 
    250 //
    251 // Authmethod in Authentication Payload
    252 //
    253 #define IKEV2_AUTH_METHOD_RSA        1; // RSA Digital Signature
    254 #define IKEV2_AUTH_METHOD_SKMI       2; // Shared Key Message Integrity
    255 #define IKEV2_AUTH_METHOD_DSS        3; // DSS Digital Signature
    256 
    257 //
    258 // IKEv2 Nonce Payload
    259 //
    260 #pragma pack(1)
    261 typedef struct {
    262   IKEV2_COMMON_PAYLOAD_HEADER Header;
    263   //
    264   // Nonce Data
    265   //
    266 } IKEV2_NONCE;
    267 #pragma pack()
    268 
    269 //
    270 // Notification Payload
    271 //
    272 #pragma pack(1)
    273 typedef struct {
    274   IKEV2_COMMON_PAYLOAD_HEADER Header;
    275   UINT8                       ProtocolId;
    276   UINT8                       SpiSize;
    277   UINT16                      MessageType;
    278   //
    279   // SPI and Notification Data
    280   //
    281 } IKEV2_NOTIFY;
    282 #pragma pack()
    283 
    284 //
    285 //  Notify Message Types presented within IKEv2 Notify Payload
    286 //
    287 #define IKEV2_NOTIFICATION_UNSUPPORT_CRITICAL_PAYLOAD       1
    288 #define IKEV2_NOTIFICATION_INVALID_IKE_SPI                  4
    289 #define IKEV2_NOTIFICATION_INVALID_MAJOR_VERSION            5
    290 #define IKEV2_NOTIFICATION_INVALID_SYNTAX                   7
    291 #define IKEV2_NOTIFICATION_INVALID_MESSAGE_ID               9
    292 #define IKEV2_NOTIFICATION_INVALID_SPI                     11
    293 #define IKEV2_NOTIFICATION_NO_PROPOSAL_CHOSEN              14
    294 #define IKEV2_NOTIFICATION_INVALID_KEY_PAYLOAD             17
    295 #define IKEV2_NOTIFICATION_AUTHENTICATION_FAILED           24
    296 #define IKEV2_NOTIFICATION_SINGLE_PAIR_REQUIRED            34
    297 #define IKEV2_NOTIFICATION_NO_ADDITIONAL_SAS               35
    298 #define IKEV2_NOTIFICATION_INTERNAL_ADDRESS_FAILURE        36
    299 #define IKEV2_NOTIFICATION_FAILED_CP_REQUIRED              37
    300 #define IKEV2_NOTIFICATION_TS_UNCCEPTABLE                  38
    301 #define IKEV2_NOTIFICATION_INVALID_SELECTORS               39
    302 #define IKEV2_NOTIFICATION_COOKIE                          16390
    303 #define IKEV2_NOTIFICATION_USE_TRANSPORT_MODE              16391
    304 #define IKEV2_NOTIFICATION_REKEY_SA                        16393
    305 
    306 //
    307 // IKEv2 Protocol ID
    308 //
    309 //
    310 // IKEv2 Delete Payload
    311 //
    312 #pragma pack(1)
    313 typedef struct {
    314   IKEV2_COMMON_PAYLOAD_HEADER Header;
    315   UINT8                       ProtocolId;
    316   UINT8                       SpiSize;
    317   UINT16                      NumSpis;
    318   //
    319   // SPIs
    320   //
    321 } IKEV2_DELETE;
    322 #pragma pack()
    323 
    324 //
    325 // Traffic Selector Payload
    326 //
    327 #pragma pack(1)
    328 typedef struct {
    329   IKEV2_COMMON_PAYLOAD_HEADER Header;
    330   UINT8                       TSNumbers;
    331   UINT8                       Reserved1;
    332   UINT16                      Reserved2;
    333   //
    334   // Traffic Selector
    335   //
    336 } IKEV2_TS;
    337 #pragma pack()
    338 
    339 //
    340 // Traffic Selector
    341 //
    342 #pragma pack(1)
    343 typedef struct {
    344   UINT8                       TSType;
    345   UINT8                       IpProtocolId;
    346   UINT16                      SelecorLen;
    347   UINT16                      StartPort;
    348   UINT16                      EndPort;
    349   //
    350   // Starting Address && Ending Address
    351   //
    352 } TRAFFIC_SELECTOR;
    353 #pragma pack()
    354 
    355 //
    356 // Ts Type in Traffic Selector
    357 //
    358 #define IKEV2_TS_TYPE_IPV4_ADDR_RANGE     7
    359 #define IKEV2_TS_TYPS_IPV6_ADDR_RANGE     8
    360 
    361 //
    362 // Vendor Payload
    363 //
    364 #pragma pack(1)
    365 typedef struct {
    366   IKEV2_COMMON_PAYLOAD_HEADER Header;
    367   //
    368   // Vendor ID
    369   //
    370 } IKEV2_VENDOR;
    371 #pragma pack()
    372 
    373 //
    374 // Encrypted Payload
    375 //
    376 #pragma pack(1)
    377 typedef struct {
    378   IKEV2_COMMON_PAYLOAD_HEADER Header;
    379   //
    380   // IV, Encrypted IKE Payloads, Padding, PAD length, Integrity CheckSum
    381   //
    382 } IKEV2_ENCRYPTED;
    383 #pragma pack()
    384 
    385 #pragma pack(1)
    386 typedef struct {
    387   UINT8 PadLength;
    388 } IKEV2_PAD_LEN;
    389 #pragma pack()
    390 
    391 //
    392 // Configuration Payload
    393 //
    394 #pragma pack(1)
    395 typedef struct {
    396   IKEV2_COMMON_PAYLOAD_HEADER Header;
    397   UINT8                       CfgType;
    398   UINT8                       Reserve1;
    399   UINT16                      Reserve2;
    400   //
    401   // Configuration Attributes
    402   //
    403 } IKEV2_CFG;
    404 #pragma pack()
    405 
    406 //
    407 // Configuration Payload CPG type
    408 //
    409 #define IKEV2_CFG_TYPE_REQUEST    1
    410 #define IKEV2_CFG_TYPE_REPLY      2
    411 #define IKEV2_CFG_TYPE_SET        3
    412 #define IKEV2_CFG_TYPE_ACK        4
    413 
    414 //
    415 // Configuration Attributes
    416 //
    417 #pragma pack(1)
    418 typedef struct {
    419   UINT16    AttritType;
    420   UINT16    ValueLength;
    421 } IKEV2_CFG_ATTRIBUTES;
    422 #pragma pack()
    423 
    424 //
    425 // Configuration Attributes
    426 //
    427 #define IKEV2_CFG_ATTR_INTERNAL_IP4_ADDRESS      1
    428 #define IKEV2_CFG_ATTR_INTERNAL_IP4_NBTMASK      2
    429 #define IKEV2_CFG_ATTR_INTERNAL_IP4_DNS          3
    430 #define IKEV2_CFG_ATTR_INTERNAL_IP4_NBNS         4
    431 #define IKEV2_CFG_ATTR_INTERNA_ADDRESS_BXPIRY    5
    432 #define IKEV2_CFG_ATTR_INTERNAL_IP4_DHCP         6
    433 #define IKEV2_CFG_ATTR_APPLICATION_VERSION       7
    434 #define IKEV2_CFG_ATTR_INTERNAL_IP6_ADDRESS      8
    435 #define IKEV2_CFG_ATTR_INTERNAL_IP6_DNS          10
    436 #define IKEV2_CFG_ATTR_INTERNAL_IP6_NBNS         11
    437 #define IKEV2_CFG_ATTR_INTERNAL_IP6_DHCP         12
    438 #define IKEV2_CFG_ATTR_INTERNAL_IP4_SUBNET       13
    439 #define IKEV2_CFG_ATTR_SUPPORTED_ATTRIBUTES      14
    440 #define IKEV2_CFG_ATTR_IP6_SUBNET                15
    441 
    442 #endif
    443 
    444