I get it, in _mm_movemask_epi8, (r == T) should be replaced with _mm_cmpeq_epi8 
(r, T)


      /* check tag */

      u16 tag_mask = tag_len ? (1 << tag_len) - 1 : 0xffff;
      r = _mm_loadu_si128 ((__m128i *) tag);
      if (_mm_movemask_epi8 (r == T) != tag_mask) {                // what is 
this?  it will return 0, when tag_len equals 12
return 0;
     }


-----原始邮件-----
发件人:"叶东岗" <y...@wangsu.com>
发送时间:2020-08-07 10:37:24 (星期五)
收件人: damar...@cisco.com
抄送: vpp-dev@lists.fd.io
主题: [vpp-dev] vpp19.08.2 crypto_ia32 do not support aes-gcm icv_size 8/12 crypto






VPP19.08.2 crypto_ia32 do not support aes-gcm icv_size 8/12 crypto,  any ideas?







static_always_inline int

aes_gcm (const u8 * in, u8 * out, const u8 * addt, const u8 * iv, u8 * tag,
u32 data_bytes, u32 aad_bytes, u8 tag_len, aes_gcm_key_data_t * kd,
int aes_rounds, int is_encrypt)
{
  int i;
  __m128i r, Y0, T = { };
  ghash_data_t _gd, *gd = &_gd;

  _mm_prefetch (iv, _MM_HINT_T0);
  _mm_prefetch (in, _MM_HINT_T0);
  _mm_prefetch (in + CLIB_CACHE_LINE_BYTES, _MM_HINT_T0);

  /* calculate ghash for AAD - optimized for ipsec common cases */
  if (aad_bytes == 8)
    T = aesni_gcm_ghash (T, kd, (__m128i *) addt, 8);
  else if (aad_bytes == 12)
    T = aesni_gcm_ghash (T, kd, (__m128i *) addt, 12);
  else
    T = aesni_gcm_ghash (T, kd, (__m128i *) addt, aad_bytes);

  /* initalize counter */
  Y0 = _mm_loadu_si128 ((__m128i *) iv);
  Y0 = _mm_insert_epi32 (Y0, clib_host_to_net_u32 (1), 3);

  /* ghash and encrypt/edcrypt  */
  if (is_encrypt)
    T = aesni_gcm_enc (T, kd, Y0, in, out, data_bytes, aes_rounds);
  else
    T = aesni_gcm_dec (T, kd, Y0, in, out, data_bytes, aes_rounds);

  _mm_prefetch (tag, _MM_HINT_T0);

  /* Finalize ghash */
  r[0] = data_bytes;
  r[1] = aad_bytes;

  /* bytes to bits */
  r <<= 3;

  /* interleaved computation of final ghash and E(Y0, k) */
  ghash_mul_first (gd, r ^ T, kd->Hi[0]);
  r = kd->Ke[0] ^ Y0;
  for (i = 1; i < 5; i += 1)
    r = _mm_aesenc_si128 (r, kd->Ke[i]);
  ghash_reduce (gd);
  ghash_reduce2 (gd);
  for (; i < 9; i += 1)
    r = _mm_aesenc_si128 (r, kd->Ke[i]);
  T = ghash_final (gd);
  for (; i < aes_rounds; i += 1)
    r = _mm_aesenc_si128 (r, kd->Ke[i]);
  r = _mm_aesenclast_si128 (r, kd->Ke[aes_rounds]);
  T = aesni_gcm_bswap (T) ^ r;

  /* tag_len 16 -> 0 */
  tag_len &= 0xf;

  if (is_encrypt)
    {
      /* store tag */
      if (tag_len)
aesni_gcm_store_partial ((__m128i *) tag, T,   (1 << tag_len) - 1);     // must 
be tag_en
      else
_mm_storeu_si128 ((__m128i *) tag, T);
    }
  else
    {
      /* check tag */
      u16 tag_mask = tag_len ? (1 << tag_len) - 1 : 0xffff;
      r = _mm_loadu_si128 ((__m128i *) tag);
      if (_mm_movemask_epi8 (r == T) != tag_mask) {                // what is 
this?  it will return 0, when tag_len equals 12
return 0;
      }
    }
  return 1;
}

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#17179): https://lists.fd.io/g/vpp-dev/message/17179
Mute This Topic: https://lists.fd.io/mt/76100481/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to