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] -=-=-=-=-=-=-=-=-=-=-=-