📄 pfkey_v2_parse.c
字号:
"pfkey_address_parse: successful.\n"); errlab: return error;}DEBUG_NO_STATIC intpfkey_key_parse(struct sadb_ext *pfkey_ext){ int error = 0; struct sadb_key *pfkey_key = (struct sadb_key *)pfkey_ext; /* sanity checks... */ if(!pfkey_key) { ERROR( "pfkey_key_parse: " "NULL pointer passed in.\n"); SENDERR(EINVAL); } if(pfkey_key->sadb_key_len < sizeof(struct sadb_key) / IPSEC_PFKEYv2_ALIGN) { ERROR( "pfkey_key_parse: " "size wrong ext_len=%d, key_ext_len=%d.\n", pfkey_key->sadb_key_len, (int)sizeof(struct sadb_key)); SENDERR(EINVAL); } if(!pfkey_key->sadb_key_bits) { ERROR( "pfkey_key_parse: " "key length set to zero, must be non-zero.\n"); SENDERR(EINVAL); } if(pfkey_key->sadb_key_len != DIVUP(sizeof(struct sadb_key) * OCTETBITS + pfkey_key->sadb_key_bits, PFKEYBITS)) { ERROR( "pfkey_key_parse: " "key length=%d does not agree with extension length=%d.\n", pfkey_key->sadb_key_bits, pfkey_key->sadb_key_len); SENDERR(EINVAL); } if(pfkey_key->sadb_key_reserved) { ERROR( "pfkey_key_parse: " "res=%d, must be zero.\n", pfkey_key->sadb_key_reserved); SENDERR(EINVAL); } if(! ( (pfkey_key->sadb_key_exttype == SADB_EXT_KEY_AUTH) || (pfkey_key->sadb_key_exttype == SADB_EXT_KEY_ENCRYPT))) { ERROR( "pfkey_key_parse: " "expecting extension type AUTH or ENCRYPT, got %d.\n", pfkey_key->sadb_key_exttype); SENDERR(EINVAL); } DEBUGGING(PF_KEY_DEBUG_PARSE_STRUCT, "pfkey_key_parse: " "success, found len=%d exttype=%d(%s) bits=%d reserved=%d.\n", pfkey_key->sadb_key_len, pfkey_key->sadb_key_exttype, pfkey_v2_sadb_ext_string(pfkey_key->sadb_key_exttype), pfkey_key->sadb_key_bits, pfkey_key->sadb_key_reserved);errlab: return error;}DEBUG_NO_STATIC intpfkey_ident_parse(struct sadb_ext *pfkey_ext){ int error = 0; struct sadb_ident *pfkey_ident = (struct sadb_ident *)pfkey_ext; /* sanity checks... */ if(pfkey_ident->sadb_ident_len < sizeof(struct sadb_ident) / IPSEC_PFKEYv2_ALIGN) { ERROR( "pfkey_ident_parse: " "size wrong ext_len=%d, key_ext_len=%d.\n", pfkey_ident->sadb_ident_len, (int)sizeof(struct sadb_ident)); SENDERR(EINVAL); } if(pfkey_ident->sadb_ident_type > SADB_IDENTTYPE_MAX) { ERROR( "pfkey_ident_parse: " "ident_type=%d out of range, must be less than %d.\n", pfkey_ident->sadb_ident_type, SADB_IDENTTYPE_MAX); SENDERR(EINVAL); } if(pfkey_ident->sadb_ident_reserved) { ERROR( "pfkey_ident_parse: " "res=%d, must be zero.\n", pfkey_ident->sadb_ident_reserved); SENDERR(EINVAL); } /* string terminator/padding must be zero */ if(pfkey_ident->sadb_ident_len > sizeof(struct sadb_ident) / IPSEC_PFKEYv2_ALIGN) { if(*((char*)pfkey_ident + pfkey_ident->sadb_ident_len * IPSEC_PFKEYv2_ALIGN - 1)) { ERROR( "pfkey_ident_parse: " "string padding must be zero, last is 0x%02x.\n", *((char*)pfkey_ident + pfkey_ident->sadb_ident_len * IPSEC_PFKEYv2_ALIGN - 1)); SENDERR(EINVAL); } } if( ! ((pfkey_ident->sadb_ident_exttype == SADB_EXT_IDENTITY_SRC) || (pfkey_ident->sadb_ident_exttype == SADB_EXT_IDENTITY_DST))) { ERROR( "pfkey_key_parse: " "expecting extension type IDENTITY_SRC or IDENTITY_DST, got %d.\n", pfkey_ident->sadb_ident_exttype); SENDERR(EINVAL); }errlab: return error;}DEBUG_NO_STATIC intpfkey_sens_parse(struct sadb_ext *pfkey_ext){ int error = 0; struct sadb_sens *pfkey_sens = (struct sadb_sens *)pfkey_ext; /* sanity checks... */ if(pfkey_sens->sadb_sens_len < sizeof(struct sadb_sens) / IPSEC_PFKEYv2_ALIGN) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_sens_parse: " "size wrong ext_len=%d, key_ext_len=%d.\n", pfkey_sens->sadb_sens_len, (int)sizeof(struct sadb_sens)); SENDERR(EINVAL); } DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_sens_parse: " "Sorry, I can't parse exttype=%d yet.\n", pfkey_ext->sadb_ext_type);#if 0 SENDERR(EINVAL); /* don't process these yet */#endiferrlab: return error;}DEBUG_NO_STATIC intpfkey_prop_parse(struct sadb_ext *pfkey_ext){ int error = 0; int i, num_comb; struct sadb_prop *pfkey_prop = (struct sadb_prop *)pfkey_ext; struct sadb_comb *pfkey_comb = (struct sadb_comb *)((char*)pfkey_ext + sizeof(struct sadb_prop)); /* sanity checks... */ if((pfkey_prop->sadb_prop_len < sizeof(struct sadb_prop) / IPSEC_PFKEYv2_ALIGN) || (((pfkey_prop->sadb_prop_len * IPSEC_PFKEYv2_ALIGN) - sizeof(struct sadb_prop)) % sizeof(struct sadb_comb))) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "size wrong ext_len=%d, prop_ext_len=%d comb_ext_len=%d.\n", pfkey_prop->sadb_prop_len, (int)sizeof(struct sadb_prop), (int)sizeof(struct sadb_comb)); SENDERR(EINVAL); } if(pfkey_prop->sadb_prop_replay > 64) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "replay window size: %d -- must be 0 <= size <= 64\n", pfkey_prop->sadb_prop_replay); SENDERR(EINVAL); } for(i=0; i<3; i++) { if(pfkey_prop->sadb_prop_reserved[i]) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "res[%d]=%d, must be zero.\n", i, pfkey_prop->sadb_prop_reserved[i]); SENDERR(EINVAL); } } num_comb = ((pfkey_prop->sadb_prop_len * IPSEC_PFKEYv2_ALIGN) - sizeof(struct sadb_prop)) / sizeof(struct sadb_comb); for(i = 0; i < num_comb; i++) { if(pfkey_comb->sadb_comb_auth > SADB_AALG_MAX) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_auth=%d > SADB_AALG_MAX=%d.\n", i, pfkey_comb->sadb_comb_auth, SADB_AALG_MAX); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_auth) { if(!pfkey_comb->sadb_comb_auth_minbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_auth_minbits=0, fatal.\n", i); SENDERR(EINVAL); } if(!pfkey_comb->sadb_comb_auth_maxbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_auth_maxbits=0, fatal.\n", i); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_auth_minbits > pfkey_comb->sadb_comb_auth_maxbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_auth_minbits=%d > maxbits=%d, fatal.\n", i, pfkey_comb->sadb_comb_auth_minbits, pfkey_comb->sadb_comb_auth_maxbits); SENDERR(EINVAL); } } else { if(pfkey_comb->sadb_comb_auth_minbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_auth_minbits=%d != 0, fatal.\n", i, pfkey_comb->sadb_comb_auth_minbits); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_auth_maxbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_auth_maxbits=%d != 0, fatal.\n", i, pfkey_comb->sadb_comb_auth_maxbits); SENDERR(EINVAL); } }#if SADB_EALG_MAX < 255 if(pfkey_comb->sadb_comb_encrypt > SADB_EALG_MAX) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_comb_parse: " "pfkey_comb[%d]->sadb_comb_encrypt=%d > SADB_EALG_MAX=%d.\n", i, pfkey_comb->sadb_comb_encrypt, SADB_EALG_MAX); SENDERR(EINVAL); }#endif if(pfkey_comb->sadb_comb_encrypt) { if(!pfkey_comb->sadb_comb_encrypt_minbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_encrypt_minbits=0, fatal.\n", i); SENDERR(EINVAL); } if(!pfkey_comb->sadb_comb_encrypt_maxbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_encrypt_maxbits=0, fatal.\n", i); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_encrypt_minbits > pfkey_comb->sadb_comb_encrypt_maxbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_encrypt_minbits=%d > maxbits=%d, fatal.\n", i, pfkey_comb->sadb_comb_encrypt_minbits, pfkey_comb->sadb_comb_encrypt_maxbits); SENDERR(EINVAL); } } else { if(pfkey_comb->sadb_comb_encrypt_minbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_encrypt_minbits=%d != 0, fatal.\n", i, pfkey_comb->sadb_comb_encrypt_minbits); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_encrypt_maxbits) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_encrypt_maxbits=%d != 0, fatal.\n", i, pfkey_comb->sadb_comb_encrypt_maxbits); SENDERR(EINVAL); } } /* XXX do sanity check on flags */ if(pfkey_comb->sadb_comb_hard_allocations && pfkey_comb->sadb_comb_soft_allocations > pfkey_comb->sadb_comb_hard_allocations) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_soft_allocations=%d > hard_allocations=%d, fatal.\n", i, pfkey_comb->sadb_comb_soft_allocations, pfkey_comb->sadb_comb_hard_allocations); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_hard_bytes && pfkey_comb->sadb_comb_soft_bytes > pfkey_comb->sadb_comb_hard_bytes) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_soft_bytes=%Ld > hard_bytes=%Ld, fatal.\n", i, (unsigned long long int)pfkey_comb->sadb_comb_soft_bytes, (unsigned long long int)pfkey_comb->sadb_comb_hard_bytes); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_hard_addtime && pfkey_comb->sadb_comb_soft_addtime > pfkey_comb->sadb_comb_hard_addtime) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_soft_addtime=%Ld > hard_addtime=%Ld, fatal.\n", i, (unsigned long long int)pfkey_comb->sadb_comb_soft_addtime, (unsigned long long int)pfkey_comb->sadb_comb_hard_addtime); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_hard_usetime && pfkey_comb->sadb_comb_soft_usetime > pfkey_comb->sadb_comb_hard_usetime) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_comb_soft_usetime=%Ld > hard_usetime=%Ld, fatal.\n", i, (unsigned long long int)pfkey_comb->sadb_comb_soft_usetime, (unsigned long long int)pfkey_comb->sadb_comb_hard_usetime); SENDERR(EINVAL); } if(pfkey_comb->sadb_x_comb_hard_packets && pfkey_comb->sadb_x_comb_soft_packets > pfkey_comb->sadb_x_comb_hard_packets) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "pfkey_comb[%d]->sadb_x_comb_soft_packets=%d > hard_packets=%d, fatal.\n", i, pfkey_comb->sadb_x_comb_soft_packets, pfkey_comb->sadb_x_comb_hard_packets); SENDERR(EINVAL); } if(pfkey_comb->sadb_comb_reserved) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_prop_parse: " "comb[%d].res=%d, must be zero.\n", i, pfkey_comb->sadb_comb_reserved); SENDERR(EINVAL); } pfkey_comb++; }errlab: return error;}DEBUG_NO_STATIC intpfkey_supported_parse(struct sadb_ext *pfkey_ext){ int error = 0; unsigned int i, num_alg; struct sadb_supported *pfkey_supported = (struct sadb_supported *)pfkey_ext; struct sadb_alg *pfkey_alg = (struct sadb_alg*)((char*)pfkey_ext + sizeof(struct sadb_supported)); /* sanity checks... */ if((pfkey_supported->sadb_supported_len < sizeof(struct sadb_supported) / IPSEC_PFKEYv2_ALIGN) || (((pfkey_supported->sadb_supported_len * IPSEC_PFKEYv2_ALIGN) - sizeof(struct sadb_supported)) % sizeof(struct sadb_alg))) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_supported_parse: " "size wrong ext_len=%d, supported_ext_len=%d alg_ext_len=%d.\n", pfkey_supported->sadb_supported_len, (int)sizeof(struct sadb_supported), (int)sizeof(struct sadb_alg)); SENDERR(EINVAL); } if(pfkey_supported->sadb_supported_reserved) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_supported_parse: " "res=%d, must be zero.\n", pfkey_supported->sadb_supported_reserved); SENDERR(EINVAL); } num_alg = ((pfkey_supported->sadb_supported_len * IPSEC_PFKEYv2_ALIGN) - sizeof(struct sadb_supported)) / sizeof(struct sadb_alg); for(i = 0; i < num_alg; i++) { /* process algo description */ if(pfkey_alg->sadb_alg_reserved) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_supported_parse: " "alg[%d], id=%d, ivlen=%d, minbits=%d, maxbits=%d, res=%d, must be zero.\n", i, pfkey_alg->sadb_alg_id, pfkey_alg->sadb_alg_ivlen, pfkey_alg->sadb_alg_minbits, pfkey_alg->sadb_alg_maxbits, pfkey_alg->sadb_alg_reserved); SENDERR(EINVAL); } /* XXX can alg_id auth/enc be determined from info given? Yes, but OpenBSD's method does not iteroperate with rfc2367. rgb, 2000-04-06 */ switch(pfkey_supported->sadb_supported_exttype) { case SADB_EXT_SUPPORTED_AUTH: if(pfkey_alg->sadb_alg_id > SADB_AALG_MAX) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_supported_parse: " "alg[%d], alg_id=%d > SADB_AALG_MAX=%d, fatal.\n", i, pfkey_alg->sadb_alg_id, SADB_AALG_MAX); SENDERR(EINVAL); } break; case SADB_EXT_SUPPORTED_ENCRYPT:#if SADB_EALG_MAX < 255 if(pfkey_alg->sadb_alg_id > SADB_EALG_MAX) { DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_supported_parse: " "alg[%d], alg_id=%d > SADB_EALG_MAX=%d, fatal.\n", i, pfkey_alg->sadb_alg_id, SADB_EALG_MAX); SENDERR(EINVAL); }#endif break; default: DEBUGGING(PF_KEY_DEBUG_PARSE_PROBLEM, "pfkey_supported_parse: " "alg[%d], alg_id=%d > SADB_EALG_MAX=%d, fatal.\n",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -