45#ifndef PROTOCORE_IKEV2_H
46#define PROTOCORE_IKEV2_H
50#if PROTOCORE_ENABLE_IKEV2
59#define PROTOCORE_IKEV2_PORT 500
61#define PROTOCORE_IKEV2_NAT_PORT 4500
63#define PROTOCORE_IKE_HDR_LEN 28
65#define PROTOCORE_IKE_SPI_LEN 8
67#define PROTOCORE_IKE_PAYLOAD_HDR_LEN 4
69#define PROTOCORE_IKE_VERSION 0x20
71#define PROTOCORE_IKE_CRITICAL 0x80
74#define PROTOCORE_IKE_FLAG_INITIATOR 0x08
75#define PROTOCORE_IKE_FLAG_VERSION 0x10
76#define PROTOCORE_IKE_FLAG_RESPONSE 0x20
79#define IKE_ATTR_KEY_LENGTH 14
82#define IKE_ENCR_AES_CBC 12
83#define IKE_ENCR_AES_GCM_16 20
84#define IKE_ENCR_CHACHA20_POLY1305 28
85#define IKE_PRF_HMAC_SHA2_256 5
86#define IKE_INTEG_HMAC_SHA2_256_128 12
87#define IKE_DH_MODP2048 14
88#define IKE_DH_ECP256 19
89#define IKE_DH_CURVE25519 31
92#define PROTOCORE_IKE_CFG_INTERNAL_IP4_ADDRESS 1
93#define PROTOCORE_IKE_CFG_INTERNAL_IP4_NETMASK 2
94#define PROTOCORE_IKE_CFG_INTERNAL_IP4_DNS 3
95#define PROTOCORE_IKE_CFG_INTERNAL_IP4_NBNS 4
96#define PROTOCORE_IKE_CFG_INTERNAL_IP4_DHCP 6
97#define PROTOCORE_IKE_CFG_APPLICATION_VERSION 7
98#define PROTOCORE_IKE_CFG_INTERNAL_IP6_ADDRESS 8
99#define PROTOCORE_IKE_CFG_INTERNAL_IP6_DNS 10
100#define PROTOCORE_IKE_CFG_INTERNAL_IP6_DHCP 12
101#define PROTOCORE_IKE_CFG_INTERNAL_IP4_SUBNET 13
102#define PROTOCORE_IKE_CFG_INTERNAL_IP6_SUBNET 15
105#define PROTOCORE_IKE_N_FRAGMENTATION_SUPPORTED 16430
107#define PROTOCORE_IKE_FRAG_MAX 32
110#define PROTOCORE_IKE_N_COOKIE 16390
112#define PROTOCORE_IKE_COOKIE_LEN 33
115#define PROTOCORE_IKE_PRF_LEN 32
117#define PROTOCORE_IKE_SK_MAX 40
119#define PROTOCORE_IKE_NONCE_MAX 256
122#define PROTOCORE_IKE_AEAD_KEY_LEN 32
124#define PROTOCORE_IKE_GCM_SALT_LEN 4
126#define PROTOCORE_IKE_GCM_IV_LEN 8
128#define PROTOCORE_IKE_AEAD_ICV_LEN 16
131#define PROTOCORE_IKE_SK_OVERHEAD \
132 (PROTOCORE_IKE_PAYLOAD_HDR_LEN + PROTOCORE_IKE_GCM_IV_LEN + 1 + PROTOCORE_IKE_AEAD_ICV_LEN)
135#define PROTOCORE_IKE_AUTH_LEN 32
137#define PROTOCORE_IKE_PSK_PAD "Key Pad for IKEv2"
140#define PROTOCORE_IKE_X25519_LEN 32
143#define PROTOCORE_IKE_ECDSA_P256_PUB_LEN 65
145#define PROTOCORE_IKE_ECDSA_P256_PRIV_LEN 32
147#define PROTOCORE_IKE_ECDSA_P256_SIG_LEN 64
150#define PROTOCORE_IKE_MSG_MAX 640
161 IKE_CREATE_CHILD_SA = 36,
162 IKE_INFORMATIONAL = 37,
191 IKE_TRANSFORM_ENCR = 1,
192 IKE_TRANSFORM_PRF = 2,
193 IKE_TRANSFORM_INTEG = 3,
194 IKE_TRANSFORM_DH = 4,
195 IKE_TRANSFORM_ESN = 5,
211 IKE_ID_IPV4_ADDR = 1,
213 IKE_ID_RFC822_ADDR = 3,
214 IKE_ID_IPV6_ADDR = 5,
221 IKE_AUTH_RESERVED = 0,
222 IKE_AUTH_RSA_SIG = 1,
224 IKE_AUTH_DSS_SIG = 3,
225 IKE_AUTH_DIGITAL_SIG = 14
231 IKE_TS_IPV4_ADDR_RANGE = 7,
232 IKE_TS_IPV6_ADDR_RANGE = 8,
258 uint8_t init_spi[PROTOCORE_IKE_SPI_LEN];
259 uint8_t resp_spi[PROTOCORE_IKE_SPI_LEN];
260 IkePayloadType next_payload;
262 IkeExchange exchange;
272 IkePayloadType next_payload;
284 IkePayloadType next_type;
290 IkeTransformType type;
298 IkeTransformType type;
307 uint8_t proposal_num;
308 IkeProtocol protocol_id;
310 uint8_t num_transforms;
312 const uint8_t *transforms;
313 size_t transforms_len;
332 const uint8_t *start_addr;
333 const uint8_t *end_addr;
341 const uint8_t *value;
364 size_t off[PROTOCORE_IKE_FRAG_MAX];
365 size_t len[PROTOCORE_IKE_FRAG_MAX];
383 uint8_t sk_d[PROTOCORE_IKE_SK_MAX];
384 uint8_t sk_ai[PROTOCORE_IKE_SK_MAX];
385 uint8_t sk_ar[PROTOCORE_IKE_SK_MAX];
386 uint8_t sk_ei[PROTOCORE_IKE_SK_MAX];
387 uint8_t sk_er[PROTOCORE_IKE_SK_MAX];
388 uint8_t sk_pi[PROTOCORE_IKE_SK_MAX];
389 uint8_t sk_pr[PROTOCORE_IKE_SK_MAX];
409 uint8_t init_spi[PROTOCORE_IKE_SPI_LEN];
410 uint8_t resp_spi[PROTOCORE_IKE_SPI_LEN];
422 uint8_t init_spi[PROTOCORE_IKE_SPI_LEN];
423 uint8_t resp_spi[PROTOCORE_IKE_SPI_LEN];
425 IkeProposalRef proposal;
427 const uint8_t *ke_data;
429 const uint8_t *nonce;
438 uint8_t our_dh_priv[PROTOCORE_IKE_X25519_LEN];
439 uint8_t our_nonce[PROTOCORE_IKE_NONCE_MAX];
440 uint16_t our_nonce_len;
441 uint8_t peer_nonce[PROTOCORE_IKE_NONCE_MAX];
442 uint16_t peer_nonce_len;
443 uint8_t init_msg[PROTOCORE_IKE_MSG_MAX];
444 uint16_t init_msg_len;
445 uint8_t resp_msg[PROTOCORE_IKE_MSG_MAX];
446 uint16_t resp_msg_len;
453 const uint8_t *ke_data;
461 const uint8_t *id_data;
468 IkeAuthMethod auth_method;
469 const uint8_t *auth_data;
476 IkeProtocol protocol_id;
478 uint16_t notify_type;
487 IkeProtocol protocol_id;
508 const uint8_t *attrs;
515 IkePayloadType first_inner_type;
516 const uint8_t *inner;
537 IkePayloadType next_payload;
546 uint8_t proposal_num;
547 IkeProtocol protocol_id;
551 const IkeTransform *transforms;
552 uint8_t num_transforms;
559 const uint8_t *our_priv;
561 const uint8_t *our_pub;
563 const uint8_t *peer_pub;
571 const uint8_t *id_body;
573 uint8_t cert_encoding;
579 IkeAuthMethod auth_method;
582 const uint8_t *real_msg;
584 const uint8_t *peer_nonce;
585 size_t peer_nonce_len;
594 const uint8_t *rsa_n;
595 const uint8_t *rsa_e;
601 uint16_t notify_type;
603 const uint8_t *secret;
610 const uint8_t *cookie;
617 const IkeTrafficSelector *sels;
626 const IkeCfgAttr *attrs;
655 const uint8_t *chunk;
662 const IkeSuite *suite;
664 IkeKeyMaterial *keys;
665 const uint8_t *prf_key;
669 const uint8_t *dh_secret;
675 const uint8_t *spi_i;
676 const uint8_t *spi_r;
684 const uint8_t *init_spi;
685 const uint8_t *resp_spi;
689 IkePayloadType first_inner_type;
690 const uint8_t *inner;
697 IkePayloadIter *chain;
698 IkeTransformIter *transforms;
699 IkeCfgAttrIter *attrs;
700 const IkeProposalRef *proposal;
701 IkePayloadType first_type;
709 const uint8_t *our_spi;
710 const uint8_t *our_nonce;
711 size_t our_nonce_len;
836 IkeProposalArgs prop;
840 IkeNotifyArgs notify;
853 IkeProposalRef proposal;
854 IkeTransformRef transform;
855 IkeTrafficSelector sel;
860 IkeNotifyRef notify_ref;
861 IkeDeleteRef delete_ref;
865 IkeSaInitMsg sa_init;
874 void (*
const hdr_build)(uint8_t *work);
875 void (*
const hdr_parse)(uint8_t *work);
876 void (*
const set_length)(uint8_t *work);
877 void (*
const payload_iter_init)(uint8_t *work);
878 void (*
const payload_next)(uint8_t *work);
879 void (*
const payload_build)(uint8_t *work);
880 void (*
const sa_build)(uint8_t *work);
881 void (*
const ke_build)(uint8_t *work);
882 void (*
const nonce_build)(uint8_t *work);
883 void (*
const id_build)(uint8_t *work);
884 void (*
const auth_build)(uint8_t *work);
885 void (*
const cert_build)(uint8_t *work);
886 void (*
const notify_build)(uint8_t *work);
887 void (*
const delete_build)(uint8_t *work);
888 void (*
const ts_build)(uint8_t *work);
889 void (*
const cp_build)(uint8_t *work);
890 void (*
const sk_build)(uint8_t *work);
891 void (*
const skf_build)(uint8_t *work);
892 void (*
const skf_parse)(uint8_t *work);
893 void (*
const frag_reasm_init)(uint8_t *work);
894 void (*
const frag_reasm_add)(uint8_t *work);
895 void (*
const frag_reasm_complete)(uint8_t *work);
896 void (*
const frag_reasm_assemble)(uint8_t *work);
897 void (*
const cookie_compute)(uint8_t *work);
898 void (*
const cookie_verify)(uint8_t *work);
899 void (*
const cookie_notify_build)(uint8_t *work);
900 void (*
const ke_parse)(uint8_t *work);
901 void (*
const id_parse)(uint8_t *work);
902 void (*
const auth_parse)(uint8_t *work);
903 void (*
const notify_parse)(uint8_t *work);
904 void (*
const delete_parse)(uint8_t *work);
905 void (*
const sk_parse)(uint8_t *work);
906 void (*
const sa_first_proposal)(uint8_t *work);
907 void (*
const transform_iter_init)(uint8_t *work);
908 void (*
const transform_next)(uint8_t *work);
909 void (*
const ts_count)(uint8_t *work);
910 void (*
const ts_get)(uint8_t *work);
911 void (*
const cp_parse)(uint8_t *work);
912 void (*
const cp_attr_iter_init)(uint8_t *work);
913 void (*
const cp_attr_next)(uint8_t *work);
914 void (*
const prf_plus)(uint8_t *work);
915 void (*
const derive_keys)(uint8_t *work);
916 void (*
const rekey_derive_keys)(uint8_t *work);
917 void (*
const child_keymat)(uint8_t *work);
918 void (*
const suite_keylengths)(uint8_t *work);
919 void (*
const sa_keys_from_init)(uint8_t *work);
920 void (*
const sk_aead_seal)(uint8_t *work);
921 void (*
const sk_aead_open)(uint8_t *work);
922 void (*
const dh_public)(uint8_t *work);
923 void (*
const dh_compute)(uint8_t *work);
924 void (*
const auth_psk)(uint8_t *work);
925 void (*
const signed_octets)(uint8_t *work);
926 void (*
const auth_sign_ecdsa_p256)(uint8_t *work);
927 void (*
const auth_verify_ecdsa_p256)(uint8_t *work);
928 void (*
const auth_verify_rsa_sha256)(uint8_t *work);
929 void (*
const sa_init_build)(uint8_t *work);
930 void (*
const sa_init_parse)(uint8_t *work);
931 void (*
const auth_msg_build)(uint8_t *work);
932 void (*
const auth_msg_open)(uint8_t *work);
933 void (*
const initiator_start)(uint8_t *work);
934 void (*
const initiator_on_sa_init)(uint8_t *work);
935 void (*
const initiator_build_auth_psk)(uint8_t *work);
936 void (*
const initiator_on_auth_psk)(uint8_t *work);
937 void (*
const responder_on_sa_init)(uint8_t *work);
938 void (*
const responder_on_auth_psk)(uint8_t *work);
939 void (*
const informational_build)(uint8_t *work);
940 void (*
const informational_open)(uint8_t *work);
941 void (*
const create_child_sa_build)(uint8_t *work);
946void protocore_ike_hdr_build(uint8_t *work);
947void protocore_ike_hdr_parse(uint8_t *work);
948void protocore_ike_set_length(uint8_t *work);
949void protocore_ike_payload_iter_init(uint8_t *work);
950void protocore_ike_payload_next(uint8_t *work);
951void protocore_ike_payload_build(uint8_t *work);
952void protocore_ike_sa_build(uint8_t *work);
953void protocore_ike_ke_build(uint8_t *work);
954void protocore_ike_nonce_build(uint8_t *work);
955void protocore_ike_id_build(uint8_t *work);
956void protocore_ike_auth_build(uint8_t *work);
957void protocore_ike_cert_build(uint8_t *work);
958void protocore_ike_notify_build(uint8_t *work);
959void protocore_ike_delete_build(uint8_t *work);
960void protocore_ike_ts_build(uint8_t *work);
961void protocore_ike_cp_build(uint8_t *work);
962void protocore_ike_sk_build(uint8_t *work);
963void protocore_ike_skf_build(uint8_t *work);
964void protocore_ike_skf_parse(uint8_t *work);
965void protocore_ike_frag_reasm_init(uint8_t *work);
966void protocore_ike_frag_reasm_add(uint8_t *work);
967void protocore_ike_frag_reasm_complete(uint8_t *work);
968void protocore_ike_frag_reasm_assemble(uint8_t *work);
969void protocore_ike_cookie_compute(uint8_t *work);
970void protocore_ike_cookie_verify(uint8_t *work);
971void protocore_ike_cookie_notify_build(uint8_t *work);
972void protocore_ike_ke_parse(uint8_t *work);
973void protocore_ike_id_parse(uint8_t *work);
974void protocore_ike_auth_parse(uint8_t *work);
975void protocore_ike_notify_parse(uint8_t *work);
976void protocore_ike_delete_parse(uint8_t *work);
977void protocore_ike_sk_parse(uint8_t *work);
978void protocore_ike_sa_first_proposal(uint8_t *work);
979void protocore_ike_transform_iter_init(uint8_t *work);
980void protocore_ike_transform_next(uint8_t *work);
981void protocore_ike_ts_count(uint8_t *work);
982void protocore_ike_ts_get(uint8_t *work);
983void protocore_ike_cp_parse(uint8_t *work);
984void protocore_ike_cp_attr_iter_init(uint8_t *work);
985void protocore_ike_cp_attr_next(uint8_t *work);
986void protocore_ike_prf_plus(uint8_t *work);
987void protocore_ike_derive_keys(uint8_t *work);
988void protocore_ike_rekey_derive_keys(uint8_t *work);
989void protocore_ike_child_keymat(uint8_t *work);
990void protocore_ike_suite_keylengths(uint8_t *work);
991void protocore_ike_sa_keys_from_init(uint8_t *work);
992void protocore_ike_sk_aead_seal(uint8_t *work);
993void protocore_ike_sk_aead_open(uint8_t *work);
994void protocore_ike_dh_public(uint8_t *work);
995void protocore_ike_dh_compute(uint8_t *work);
996void protocore_ike_auth_psk(uint8_t *work);
997void protocore_ike_signed_octets(uint8_t *work);
998void protocore_ike_auth_sign_ecdsa_p256(uint8_t *work);
999void protocore_ike_auth_verify_ecdsa_p256(uint8_t *work);
1000void protocore_ike_auth_verify_rsa_sha256(uint8_t *work);
1001void protocore_ike_sa_init_build(uint8_t *work);
1002void protocore_ike_sa_init_parse(uint8_t *work);
1003void protocore_ike_auth_msg_build(uint8_t *work);
1004void protocore_ike_auth_msg_open(uint8_t *work);
1005void protocore_ike_initiator_start(uint8_t *work);
1006void protocore_ike_initiator_on_sa_init(uint8_t *work);
1007void protocore_ike_initiator_build_auth_psk(uint8_t *work);
1008void protocore_ike_initiator_on_auth_psk(uint8_t *work);
1009void protocore_ike_responder_on_sa_init(uint8_t *work);
1010void protocore_ike_responder_on_auth_psk(uint8_t *work);
1011void protocore_ike_informational_build(uint8_t *work);
1012void protocore_ike_informational_open(uint8_t *work);
1013void protocore_ike_create_child_sa_build(uint8_t *work);
1019static const IkeNs Ike __attribute__((unused)) = {
1020 .hdr_build = protocore_ike_hdr_build,
1021 .hdr_parse = protocore_ike_hdr_parse,
1022 .set_length = protocore_ike_set_length,
1023 .payload_iter_init = protocore_ike_payload_iter_init,
1024 .payload_next = protocore_ike_payload_next,
1025 .payload_build = protocore_ike_payload_build,
1026 .sa_build = protocore_ike_sa_build,
1027 .ke_build = protocore_ike_ke_build,
1028 .nonce_build = protocore_ike_nonce_build,
1029 .id_build = protocore_ike_id_build,
1030 .auth_build = protocore_ike_auth_build,
1031 .cert_build = protocore_ike_cert_build,
1032 .notify_build = protocore_ike_notify_build,
1033 .delete_build = protocore_ike_delete_build,
1034 .ts_build = protocore_ike_ts_build,
1035 .cp_build = protocore_ike_cp_build,
1036 .sk_build = protocore_ike_sk_build,
1037 .skf_build = protocore_ike_skf_build,
1038 .skf_parse = protocore_ike_skf_parse,
1039 .frag_reasm_init = protocore_ike_frag_reasm_init,
1040 .frag_reasm_add = protocore_ike_frag_reasm_add,
1041 .frag_reasm_complete = protocore_ike_frag_reasm_complete,
1042 .frag_reasm_assemble = protocore_ike_frag_reasm_assemble,
1043 .cookie_compute = protocore_ike_cookie_compute,
1044 .cookie_verify = protocore_ike_cookie_verify,
1045 .cookie_notify_build = protocore_ike_cookie_notify_build,
1046 .ke_parse = protocore_ike_ke_parse,
1047 .id_parse = protocore_ike_id_parse,
1048 .auth_parse = protocore_ike_auth_parse,
1049 .notify_parse = protocore_ike_notify_parse,
1050 .delete_parse = protocore_ike_delete_parse,
1051 .sk_parse = protocore_ike_sk_parse,
1052 .sa_first_proposal = protocore_ike_sa_first_proposal,
1053 .transform_iter_init = protocore_ike_transform_iter_init,
1054 .transform_next = protocore_ike_transform_next,
1055 .ts_count = protocore_ike_ts_count,
1056 .ts_get = protocore_ike_ts_get,
1057 .cp_parse = protocore_ike_cp_parse,
1058 .cp_attr_iter_init = protocore_ike_cp_attr_iter_init,
1059 .cp_attr_next = protocore_ike_cp_attr_next,
1060 .prf_plus = protocore_ike_prf_plus,
1061 .derive_keys = protocore_ike_derive_keys,
1062 .rekey_derive_keys = protocore_ike_rekey_derive_keys,
1063 .child_keymat = protocore_ike_child_keymat,
1064 .suite_keylengths = protocore_ike_suite_keylengths,
1065 .sa_keys_from_init = protocore_ike_sa_keys_from_init,
1066 .sk_aead_seal = protocore_ike_sk_aead_seal,
1067 .sk_aead_open = protocore_ike_sk_aead_open,
1068 .dh_public = protocore_ike_dh_public,
1069 .dh_compute = protocore_ike_dh_compute,
1070 .auth_psk = protocore_ike_auth_psk,
1071 .signed_octets = protocore_ike_signed_octets,
1072 .auth_sign_ecdsa_p256 = protocore_ike_auth_sign_ecdsa_p256,
1073 .auth_verify_ecdsa_p256 = protocore_ike_auth_verify_ecdsa_p256,
1074 .auth_verify_rsa_sha256 = protocore_ike_auth_verify_rsa_sha256,
1075 .sa_init_build = protocore_ike_sa_init_build,
1076 .sa_init_parse = protocore_ike_sa_init_parse,
1077 .auth_msg_build = protocore_ike_auth_msg_build,
1078 .auth_msg_open = protocore_ike_auth_msg_open,
1079 .initiator_start = protocore_ike_initiator_start,
1080 .initiator_on_sa_init = protocore_ike_initiator_on_sa_init,
1081 .initiator_build_auth_psk = protocore_ike_initiator_build_auth_psk,
1082 .initiator_on_auth_psk = protocore_ike_initiator_on_auth_psk,
1083 .responder_on_sa_init = protocore_ike_responder_on_sa_init,
1084 .responder_on_auth_psk = protocore_ike_responder_on_auth_psk,
1085 .informational_build = protocore_ike_informational_build,
1086 .informational_open = protocore_ike_informational_open,
1087 .create_child_sa_build = protocore_ike_create_child_sa_build,
#define PROTOCORE_IKE_BORROW
PROTO_ENUM_PACKED
Application protocol spoken on a listener port or connection slot.
#define PROTOCORE_BEGIN_DECLS
Give a header's declarations C linkage, so their symbol names carry no parameter types.
_Bool proto_bool
The truth value.
#define PROTOCORE_END_DECLS