Hi, Thanks for digging into this issue! Could you propose a patch and associated unit tests in gerrit?
Best ben > -----Original Message----- > From: vpp-dev@lists.fd.io <vpp-dev@lists.fd.io> On Behalf Of ??? > Sent: lundi 10 août 2020 10:11 > To: Damjan Marion (damarion) <damar...@cisco.com> > Cc: vpp-dev@lists.fd.io > Subject: Re: [vpp-dev] vpp19.08.2 crypto_ia32 do not support aes-gcm > icv_size 8/12 crypto > > 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 (#17180): https://lists.fd.io/g/vpp-dev/message/17180 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] -=-=-=-=-=-=-=-=-=-=-=-