* SADB_ADD processing * add an entry to SA database, when received * * from the ikmpd, * and send * * to the ikmpd. * * IGNORE identity and sensitivity messages. * * m will
| 5520 | * m will always be freed. |
| 5521 | */ |
| 5522 | static int |
| 5523 | key_add(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp) |
| 5524 | { |
| 5525 | struct secasindex saidx; |
| 5526 | struct sadb_address *src0, *dst0; |
| 5527 | struct sadb_sa *sa0; |
| 5528 | struct secasvar *sav; |
| 5529 | uint32_t reqid, spi; |
| 5530 | uint8_t mode, proto; |
| 5531 | int error; |
| 5532 | |
| 5533 | IPSEC_ASSERT(so != NULL, ("null socket")); |
| 5534 | IPSEC_ASSERT(m != NULL, ("null mbuf")); |
| 5535 | IPSEC_ASSERT(mhp != NULL, ("null msghdr")); |
| 5536 | IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); |
| 5537 | |
| 5538 | /* map satype to proto */ |
| 5539 | if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { |
| 5540 | ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", |
| 5541 | __func__)); |
| 5542 | return key_senderror(so, m, EINVAL); |
| 5543 | } |
| 5544 | |
| 5545 | if (SADB_CHECKHDR(mhp, SADB_EXT_SA) || |
| 5546 | SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_SRC) || |
| 5547 | SADB_CHECKHDR(mhp, SADB_EXT_ADDRESS_DST) || |
| 5548 | (mhp->msg->sadb_msg_satype == SADB_SATYPE_ESP && ( |
| 5549 | SADB_CHECKHDR(mhp, SADB_EXT_KEY_ENCRYPT) || |
| 5550 | SADB_CHECKLEN(mhp, SADB_EXT_KEY_ENCRYPT))) || |
| 5551 | (mhp->msg->sadb_msg_satype == SADB_SATYPE_AH && ( |
| 5552 | SADB_CHECKHDR(mhp, SADB_EXT_KEY_AUTH) || |
| 5553 | SADB_CHECKLEN(mhp, SADB_EXT_KEY_AUTH))) || |
| 5554 | (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD) && |
| 5555 | !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT)) || |
| 5556 | (SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_SOFT) && |
| 5557 | !SADB_CHECKHDR(mhp, SADB_EXT_LIFETIME_HARD))) { |
| 5558 | ipseclog((LOG_DEBUG, |
| 5559 | "%s: invalid message: missing required header.\n", |
| 5560 | __func__)); |
| 5561 | return key_senderror(so, m, EINVAL); |
| 5562 | } |
| 5563 | if (SADB_CHECKLEN(mhp, SADB_EXT_SA) || |
| 5564 | SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_SRC) || |
| 5565 | SADB_CHECKLEN(mhp, SADB_EXT_ADDRESS_DST)) { |
| 5566 | ipseclog((LOG_DEBUG, |
| 5567 | "%s: invalid message: wrong header size.\n", __func__)); |
| 5568 | return key_senderror(so, m, EINVAL); |
| 5569 | } |
| 5570 | if (SADB_CHECKHDR(mhp, SADB_X_EXT_SA2)) { |
| 5571 | mode = IPSEC_MODE_ANY; |
| 5572 | reqid = 0; |
| 5573 | } else { |
| 5574 | if (SADB_CHECKLEN(mhp, SADB_X_EXT_SA2)) { |
| 5575 | ipseclog((LOG_DEBUG, |
| 5576 | "%s: invalid message: wrong header size.\n", |
| 5577 | __func__)); |
| 5578 | return key_senderror(so, m, EINVAL); |
| 5579 | } |
nothing calls this directly
no test coverage detected