Print this page
8927 sadb_x_kmc_t's KM cookie should be 64-bits
Reviewed by: Jason King <jason.king@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Yuri Pankov <yuripv@gmx.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/inet/ip/sadb.c
          +++ new/usr/src/uts/common/inet/ip/sadb.c
↓ open down ↓ 1035 lines elided ↑ open up ↑
1036 1036                  cur = NULL;
1037 1037  
1038 1038          return (cur);
1039 1039  }
1040 1040  
1041 1041  /*
1042 1042   * Construct a key management cookie extension.
1043 1043   */
1044 1044  
1045 1045  static uint8_t *
1046      -sadb_make_kmc_ext(uint8_t *cur, uint8_t *end, uint32_t kmp, uint32_t kmc)
     1046 +sadb_make_kmc_ext(uint8_t *cur, uint8_t *end, uint32_t kmp, uint64_t kmc)
1047 1047  {
1048 1048          sadb_x_kmc_t *kmcext = (sadb_x_kmc_t *)cur;
1049 1049  
1050 1050          if (cur == NULL)
1051 1051                  return (NULL);
1052 1052  
1053 1053          cur += sizeof (*kmcext);
1054 1054  
1055 1055          if (cur > end)
1056 1056                  return (NULL);
1057 1057  
1058 1058          kmcext->sadb_x_kmc_len = SADB_8TO64(sizeof (*kmcext));
1059 1059          kmcext->sadb_x_kmc_exttype = SADB_X_EXT_KM_COOKIE;
1060 1060          kmcext->sadb_x_kmc_proto = kmp;
1061      -        kmcext->sadb_x_kmc_cookie = kmc;
1062      -        kmcext->sadb_x_kmc_reserved = 0;
     1061 +        kmcext->sadb_x_kmc_cookie64 = kmc;
1063 1062  
1064 1063          return (cur);
1065 1064  }
1066 1065  
1067 1066  /*
1068 1067   * Given an original message header with sufficient space following it, and an
1069 1068   * SA, construct a full PF_KEY message with all of the relevant extensions.
1070 1069   * This is mostly used for SADB_GET, and SADB_DUMP.
1071 1070   */
1072 1071  static mblk_t *
↓ open down ↓ 1250 lines elided ↑ open up ↑
2323 2322                  sq->sidstr = (char *)(sq->srcid + 1);
2324 2323                  sq->sidtype = sq->srcid->sadb_ident_type;
2325 2324                  *mfpp++ = sadb_match_srcid;
2326 2325          }
2327 2326  
2328 2327          sq->kmcext = (sadb_x_kmc_t *)ksi->ks_in_extv[SADB_X_EXT_KM_COOKIE];
2329 2328          sq->kmc = 0;
2330 2329          sq->kmp = 0;
2331 2330  
2332 2331          if ((match & IPSA_Q_KMC) && (sq->kmcext)) {
2333      -                sq->kmc = sq->kmcext->sadb_x_kmc_cookie;
2334 2332                  sq->kmp = sq->kmcext->sadb_x_kmc_proto;
     2333 +                /* Be liberal in what we receive.  Special-case IKEv1. */
     2334 +                if (sq->kmp == SADB_X_KMP_IKE) {
     2335 +                        /* Just in case in.iked is misbehaving... */
     2336 +                        sq->kmcext->sadb_x_kmc_reserved = 0;
     2337 +                }
     2338 +                sq->kmc = sq->kmcext->sadb_x_kmc_cookie64;
2335 2339                  *mfpp++ = sadb_match_kmc;
2336 2340          }
2337 2341  
2338 2342          if (match & (IPSA_Q_INBOUND|IPSA_Q_OUTBOUND)) {
2339 2343                  if (sq->af == AF_INET6)
2340 2344                          sq->sp = &sq->spp->s_v6;
2341 2345                  else
2342 2346                          sq->sp = &sq->spp->s_v4;
2343 2347          } else {
2344 2348                  sq->sp = NULL;
↓ open down ↓ 781 lines elided ↑ open up ↑
3126 3130           */
3127 3131          if (ksi->ks_in_srctype != KS_IN_ADDR_UNSPEC)
3128 3132                  newbie->ipsa_replay_wsize = assoc->sadb_sa_replay;
3129 3133          else
3130 3134                  newbie->ipsa_replay_wsize = 0;
3131 3135  
3132 3136          newbie->ipsa_addtime = gethrestime_sec();
3133 3137  
3134 3138          if (kmcext != NULL) {
3135 3139                  newbie->ipsa_kmp = kmcext->sadb_x_kmc_proto;
3136      -                newbie->ipsa_kmc = kmcext->sadb_x_kmc_cookie;
     3140 +                /* Be liberal in what we receive.  Special-case IKEv1. */
     3141 +                if (newbie->ipsa_kmp == SADB_X_KMP_IKE) {
     3142 +                        /* Just in case in.iked is misbehaving... */
     3143 +                        kmcext->sadb_x_kmc_reserved = 0;
     3144 +                }
     3145 +                newbie->ipsa_kmc = kmcext->sadb_x_kmc_cookie64;
3137 3146          }
3138 3147  
3139 3148          /*
3140 3149           * XXX CURRENT lifetime checks MAY BE needed for an UPDATE.
3141 3150           * The spec says that one can update current lifetimes, but
3142 3151           * that seems impractical, especially in the larval-to-mature
3143 3152           * update that this function performs.
3144 3153           */
3145 3154          if (soft != NULL) {
3146 3155                  newbie->ipsa_softaddlt = soft->sadb_lifetime_addtime;
↓ open down ↓ 1282 lines elided ↑ open up ↑
4429 4438          return (rcode);
4430 4439  }
4431 4440  
4432 4441  /*
4433 4442   * Check a proposed KMC update for sanity.
4434 4443   */
4435 4444  static int
4436 4445  sadb_check_kmc(ipsa_query_t *sq, ipsa_t *sa, int *diagnostic)
4437 4446  {
4438 4447          uint32_t kmp = sq->kmp;
4439      -        uint32_t kmc = sq->kmc;
     4448 +        uint64_t kmc = sq->kmc;
4440 4449  
4441 4450          if (sa == NULL)
4442 4451                  return (0);
4443 4452  
4444 4453          if (sa->ipsa_state == IPSA_STATE_DEAD)
4445 4454                  return (ESRCH); /* DEAD == Not there, in this case. */
4446 4455  
4447      -        if ((kmp != 0) && ((sa->ipsa_kmp != 0) || (sa->ipsa_kmp != kmp))) {
     4456 +        if ((kmp != 0) && (sa->ipsa_kmp != 0) && (sa->ipsa_kmp != kmp)) {
4448 4457                  *diagnostic = SADB_X_DIAGNOSTIC_DUPLICATE_KMP;
4449 4458                  return (EINVAL);
4450 4459          }
4451 4460  
4452      -        if ((kmc != 0) && ((sa->ipsa_kmc != 0) || (sa->ipsa_kmc != kmc))) {
     4461 +        if ((kmc != 0) && (sa->ipsa_kmc != 0) && (sa->ipsa_kmc != kmc)) {
4453 4462                  *diagnostic = SADB_X_DIAGNOSTIC_DUPLICATE_KMC;
4454 4463                  return (EINVAL);
4455 4464          }
4456 4465  
4457 4466          return (0);
4458 4467  }
4459 4468  
4460 4469  /*
4461 4470   * Actually update the KMC info.
4462 4471   */
4463 4472  static void
4464 4473  sadb_update_kmc(ipsa_query_t *sq, ipsa_t *sa)
4465 4474  {
4466 4475          uint32_t kmp = sq->kmp;
4467      -        uint32_t kmc = sq->kmc;
     4476 +        uint64_t kmc = sq->kmc;
4468 4477  
4469 4478          if (kmp != 0)
4470 4479                  sa->ipsa_kmp = kmp;
4471 4480          if (kmc != 0)
4472 4481                  sa->ipsa_kmc = kmc;
4473 4482  }
4474 4483  
4475 4484  /*
4476 4485   * Common code to update an SA.
4477 4486   */
↓ open down ↓ 16 lines elided ↑ open up ↑
4494 4503              (sadb_lifetime_t *)ksi->ks_in_extv[SADB_X_EXT_LIFETIME_IDLE];
4495 4504          sadb_x_pair_t *pair_ext =
4496 4505              (sadb_x_pair_t *)ksi->ks_in_extv[SADB_X_EXT_PAIR];
4497 4506          ipsa_t *echo_target = NULL;
4498 4507          ipsap_t ipsapp;
4499 4508          ipsa_query_t sq;
4500 4509          time_t current = gethrestime_sec();
4501 4510  
4502 4511          sq.spp = spp;           /* XXX param */
4503 4512          int error = sadb_form_query(ksi, IPSA_Q_SRC|IPSA_Q_DST|IPSA_Q_SA,
4504      -            IPSA_Q_SRC|IPSA_Q_DST|IPSA_Q_SA|IPSA_Q_INBOUND|IPSA_Q_OUTBOUND,
     4513 +            IPSA_Q_SRC|IPSA_Q_DST|IPSA_Q_SA|IPSA_Q_INBOUND|IPSA_Q_OUTBOUND|
     4514 +            IPSA_Q_KMC,
4505 4515              &sq, diagnostic);
4506 4516  
4507 4517          if (error != 0)
4508 4518                  return (error);
4509 4519  
4510 4520          error = get_ipsa_pair(&sq, &ipsapp, diagnostic);
4511 4521          if (error != 0)
4512 4522                  return (error);
4513 4523  
4514 4524          if (ipsapp.ipsap_psa_ptr == NULL && ipsapp.ipsap_sa_ptr != NULL) {
↓ open down ↓ 585 lines elided ↑ open up ↑
5100 5110          ipsecesp_stack_t *espstack = ns->netstack_ipsecesp;
5101 5111          ipsecah_stack_t *ahstack = ns->netstack_ipsecah;
5102 5112          mblk_t *mp = NULL;
5103 5113          sadb_prop_t *prop;
5104 5114          sadb_comb_t *comb;
5105 5115          ipsec_action_t *walker;
5106 5116          int ncombs, allocsize, ealgid, aalgid, aminbits, amaxbits, eminbits,
5107 5117              emaxbits, replay;
5108 5118          uint64_t softbytes, hardbytes, softaddtime, hardaddtime, softusetime,
5109 5119              hardusetime;
5110      -        uint32_t kmc = 0, kmp = 0;
     5120 +        uint64_t kmc = 0;
     5121 +        uint32_t kmp = 0;
5111 5122  
5112 5123          /*
5113 5124           * Since it's an rwlock read, AND writing to the IPsec algorithms is
5114 5125           * rare, just acquire it once up top, and drop it upon return.
5115 5126           */
5116 5127          rw_enter(&ipss->ipsec_alg_lock, RW_READER);
5117 5128          if (do_esp) {
5118 5129                  uint64_t num_aalgs, num_ealgs;
5119 5130  
5120 5131                  if (espstack->esp_kstats == NULL)
↓ open down ↓ 169 lines elided ↑ open up ↑
5290 5301          }
5291 5302  
5292 5303  bail:
5293 5304          rw_exit(&ipss->ipsec_alg_lock);
5294 5305          return (mp);
5295 5306  }
5296 5307  
5297 5308  /*
5298 5309   * Generate an extended ACQUIRE's extended-proposal extension.
5299 5310   */
5300      -/* ARGSUSED */
5301 5311  static mblk_t *
5302 5312  sadb_acquire_extended_prop(ipsec_action_t *ap, netstack_t *ns)
5303 5313  {
5304 5314          sadb_prop_t *eprop;
5305 5315          uint8_t *cur, *end;
5306 5316          mblk_t *mp;
5307 5317          int allocsize, numecombs = 0, numalgdescs = 0;
5308      -        uint32_t kmc = 0, kmp = 0, replay = 0;
     5318 +        uint32_t kmp = 0, replay = 0;
     5319 +        uint64_t kmc = 0;
5309 5320          ipsec_action_t *walker;
5310 5321  
5311 5322          allocsize = sizeof (*eprop);
5312 5323  
5313 5324          /*
5314 5325           * Going to walk through the action list twice.  Once for allocation
5315 5326           * measurement, and once for actual construction.
5316 5327           */
5317 5328          for (walker = ap; walker != NULL; walker = walker->ipa_next) {
5318 5329                  ipsec_prot_t *ipp;
↓ open down ↓ 2772 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX