Path: blob/main/contrib/bearssl/src/symcipher/aes_x86ni_ctrcbc.c
39482 views
/*1* Copyright (c) 2017 Thomas Pornin <[email protected]>2*3* Permission is hereby granted, free of charge, to any person obtaining4* a copy of this software and associated documentation files (the5* "Software"), to deal in the Software without restriction, including6* without limitation the rights to use, copy, modify, merge, publish,7* distribute, sublicense, and/or sell copies of the Software, and to8* permit persons to whom the Software is furnished to do so, subject to9* the following conditions:10*11* The above copyright notice and this permission notice shall be12* included in all copies or substantial portions of the Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,15* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF16* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND17* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS18* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN19* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN20* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE21* SOFTWARE.22*/2324#define BR_ENABLE_INTRINSICS 125#include "inner.h"2627#if BR_AES_X86NI2829/* see bearssl_block.h */30const br_block_ctrcbc_class *31br_aes_x86ni_ctrcbc_get_vtable(void)32{33return br_aes_x86ni_supported() ? &br_aes_x86ni_ctrcbc_vtable : NULL;34}3536/* see bearssl_block.h */37void38br_aes_x86ni_ctrcbc_init(br_aes_x86ni_ctrcbc_keys *ctx,39const void *key, size_t len)40{41ctx->vtable = &br_aes_x86ni_ctrcbc_vtable;42ctx->num_rounds = br_aes_x86ni_keysched_enc(ctx->skey.skni, key, len);43}4445BR_TARGETS_X86_UP4647/* see bearssl_block.h */48BR_TARGET("sse2,sse4.1,aes")49void50br_aes_x86ni_ctrcbc_ctr(const br_aes_x86ni_ctrcbc_keys *ctx,51void *ctr, void *data, size_t len)52{53unsigned char *buf;54unsigned num_rounds;55__m128i sk[15];56__m128i ivx0, ivx1, ivx2, ivx3;57__m128i erev, zero, one, four, notthree;58unsigned u;5960buf = data;61num_rounds = ctx->num_rounds;62for (u = 0; u <= num_rounds; u ++) {63sk[u] = _mm_loadu_si128((void *)(ctx->skey.skni + (u << 4)));64}6566/*67* Some SSE2 constants.68*/69erev = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7,708, 9, 10, 11, 12, 13, 14, 15);71zero = _mm_setzero_si128();72one = _mm_set_epi64x(0, 1);73four = _mm_set_epi64x(0, 4);74notthree = _mm_sub_epi64(zero, four);7576/*77* Decode the counter in big-endian and pre-increment the other78* three counters.79*/80ivx0 = _mm_shuffle_epi8(_mm_loadu_si128((void *)ctr), erev);81ivx1 = _mm_add_epi64(ivx0, one);82ivx1 = _mm_sub_epi64(ivx1,83_mm_slli_si128(_mm_cmpeq_epi64(ivx1, zero), 8));84ivx2 = _mm_add_epi64(ivx1, one);85ivx2 = _mm_sub_epi64(ivx2,86_mm_slli_si128(_mm_cmpeq_epi64(ivx2, zero), 8));87ivx3 = _mm_add_epi64(ivx2, one);88ivx3 = _mm_sub_epi64(ivx3,89_mm_slli_si128(_mm_cmpeq_epi64(ivx3, zero), 8));90while (len > 0) {91__m128i x0, x1, x2, x3;9293/*94* Load counter values; we need to byteswap them because95* the specification says that they use big-endian.96*/97x0 = _mm_shuffle_epi8(ivx0, erev);98x1 = _mm_shuffle_epi8(ivx1, erev);99x2 = _mm_shuffle_epi8(ivx2, erev);100x3 = _mm_shuffle_epi8(ivx3, erev);101102x0 = _mm_xor_si128(x0, sk[0]);103x1 = _mm_xor_si128(x1, sk[0]);104x2 = _mm_xor_si128(x2, sk[0]);105x3 = _mm_xor_si128(x3, sk[0]);106x0 = _mm_aesenc_si128(x0, sk[1]);107x1 = _mm_aesenc_si128(x1, sk[1]);108x2 = _mm_aesenc_si128(x2, sk[1]);109x3 = _mm_aesenc_si128(x3, sk[1]);110x0 = _mm_aesenc_si128(x0, sk[2]);111x1 = _mm_aesenc_si128(x1, sk[2]);112x2 = _mm_aesenc_si128(x2, sk[2]);113x3 = _mm_aesenc_si128(x3, sk[2]);114x0 = _mm_aesenc_si128(x0, sk[3]);115x1 = _mm_aesenc_si128(x1, sk[3]);116x2 = _mm_aesenc_si128(x2, sk[3]);117x3 = _mm_aesenc_si128(x3, sk[3]);118x0 = _mm_aesenc_si128(x0, sk[4]);119x1 = _mm_aesenc_si128(x1, sk[4]);120x2 = _mm_aesenc_si128(x2, sk[4]);121x3 = _mm_aesenc_si128(x3, sk[4]);122x0 = _mm_aesenc_si128(x0, sk[5]);123x1 = _mm_aesenc_si128(x1, sk[5]);124x2 = _mm_aesenc_si128(x2, sk[5]);125x3 = _mm_aesenc_si128(x3, sk[5]);126x0 = _mm_aesenc_si128(x0, sk[6]);127x1 = _mm_aesenc_si128(x1, sk[6]);128x2 = _mm_aesenc_si128(x2, sk[6]);129x3 = _mm_aesenc_si128(x3, sk[6]);130x0 = _mm_aesenc_si128(x0, sk[7]);131x1 = _mm_aesenc_si128(x1, sk[7]);132x2 = _mm_aesenc_si128(x2, sk[7]);133x3 = _mm_aesenc_si128(x3, sk[7]);134x0 = _mm_aesenc_si128(x0, sk[8]);135x1 = _mm_aesenc_si128(x1, sk[8]);136x2 = _mm_aesenc_si128(x2, sk[8]);137x3 = _mm_aesenc_si128(x3, sk[8]);138x0 = _mm_aesenc_si128(x0, sk[9]);139x1 = _mm_aesenc_si128(x1, sk[9]);140x2 = _mm_aesenc_si128(x2, sk[9]);141x3 = _mm_aesenc_si128(x3, sk[9]);142if (num_rounds == 10) {143x0 = _mm_aesenclast_si128(x0, sk[10]);144x1 = _mm_aesenclast_si128(x1, sk[10]);145x2 = _mm_aesenclast_si128(x2, sk[10]);146x3 = _mm_aesenclast_si128(x3, sk[10]);147} else if (num_rounds == 12) {148x0 = _mm_aesenc_si128(x0, sk[10]);149x1 = _mm_aesenc_si128(x1, sk[10]);150x2 = _mm_aesenc_si128(x2, sk[10]);151x3 = _mm_aesenc_si128(x3, sk[10]);152x0 = _mm_aesenc_si128(x0, sk[11]);153x1 = _mm_aesenc_si128(x1, sk[11]);154x2 = _mm_aesenc_si128(x2, sk[11]);155x3 = _mm_aesenc_si128(x3, sk[11]);156x0 = _mm_aesenclast_si128(x0, sk[12]);157x1 = _mm_aesenclast_si128(x1, sk[12]);158x2 = _mm_aesenclast_si128(x2, sk[12]);159x3 = _mm_aesenclast_si128(x3, sk[12]);160} else {161x0 = _mm_aesenc_si128(x0, sk[10]);162x1 = _mm_aesenc_si128(x1, sk[10]);163x2 = _mm_aesenc_si128(x2, sk[10]);164x3 = _mm_aesenc_si128(x3, sk[10]);165x0 = _mm_aesenc_si128(x0, sk[11]);166x1 = _mm_aesenc_si128(x1, sk[11]);167x2 = _mm_aesenc_si128(x2, sk[11]);168x3 = _mm_aesenc_si128(x3, sk[11]);169x0 = _mm_aesenc_si128(x0, sk[12]);170x1 = _mm_aesenc_si128(x1, sk[12]);171x2 = _mm_aesenc_si128(x2, sk[12]);172x3 = _mm_aesenc_si128(x3, sk[12]);173x0 = _mm_aesenc_si128(x0, sk[13]);174x1 = _mm_aesenc_si128(x1, sk[13]);175x2 = _mm_aesenc_si128(x2, sk[13]);176x3 = _mm_aesenc_si128(x3, sk[13]);177x0 = _mm_aesenclast_si128(x0, sk[14]);178x1 = _mm_aesenclast_si128(x1, sk[14]);179x2 = _mm_aesenclast_si128(x2, sk[14]);180x3 = _mm_aesenclast_si128(x3, sk[14]);181}182if (len >= 64) {183x0 = _mm_xor_si128(x0,184_mm_loadu_si128((void *)(buf + 0)));185x1 = _mm_xor_si128(x1,186_mm_loadu_si128((void *)(buf + 16)));187x2 = _mm_xor_si128(x2,188_mm_loadu_si128((void *)(buf + 32)));189x3 = _mm_xor_si128(x3,190_mm_loadu_si128((void *)(buf + 48)));191_mm_storeu_si128((void *)(buf + 0), x0);192_mm_storeu_si128((void *)(buf + 16), x1);193_mm_storeu_si128((void *)(buf + 32), x2);194_mm_storeu_si128((void *)(buf + 48), x3);195buf += 64;196len -= 64;197} else {198unsigned char tmp[64];199200_mm_storeu_si128((void *)(tmp + 0), x0);201_mm_storeu_si128((void *)(tmp + 16), x1);202_mm_storeu_si128((void *)(tmp + 32), x2);203_mm_storeu_si128((void *)(tmp + 48), x3);204for (u = 0; u < len; u ++) {205buf[u] ^= tmp[u];206}207switch (len) {208case 16:209ivx0 = ivx1;210break;211case 32:212ivx0 = ivx2;213break;214case 48:215ivx0 = ivx3;216break;217}218break;219}220221/*222* Add 4 to each counter value. For carry propagation223* into the upper 64-bit words, we would need to compare224* the results with 4, but SSE2+ has only _signed_225* comparisons. Instead, we mask out the low two bits,226* and check whether the remaining bits are zero.227*/228ivx0 = _mm_add_epi64(ivx0, four);229ivx1 = _mm_add_epi64(ivx1, four);230ivx2 = _mm_add_epi64(ivx2, four);231ivx3 = _mm_add_epi64(ivx3, four);232ivx0 = _mm_sub_epi64(ivx0,233_mm_slli_si128(_mm_cmpeq_epi64(234_mm_and_si128(ivx0, notthree), zero), 8));235ivx1 = _mm_sub_epi64(ivx1,236_mm_slli_si128(_mm_cmpeq_epi64(237_mm_and_si128(ivx1, notthree), zero), 8));238ivx2 = _mm_sub_epi64(ivx2,239_mm_slli_si128(_mm_cmpeq_epi64(240_mm_and_si128(ivx2, notthree), zero), 8));241ivx3 = _mm_sub_epi64(ivx3,242_mm_slli_si128(_mm_cmpeq_epi64(243_mm_and_si128(ivx3, notthree), zero), 8));244}245246/*247* Write back new counter value. The loop took care to put the248* right counter value in ivx0.249*/250_mm_storeu_si128((void *)ctr, _mm_shuffle_epi8(ivx0, erev));251}252253/* see bearssl_block.h */254BR_TARGET("sse2,sse4.1,aes")255void256br_aes_x86ni_ctrcbc_mac(const br_aes_x86ni_ctrcbc_keys *ctx,257void *cbcmac, const void *data, size_t len)258{259const unsigned char *buf;260unsigned num_rounds;261__m128i sk[15], ivx;262unsigned u;263264buf = data;265ivx = _mm_loadu_si128(cbcmac);266num_rounds = ctx->num_rounds;267for (u = 0; u <= num_rounds; u ++) {268sk[u] = _mm_loadu_si128((void *)(ctx->skey.skni + (u << 4)));269}270while (len > 0) {271__m128i x;272273x = _mm_xor_si128(_mm_loadu_si128((void *)buf), ivx);274x = _mm_xor_si128(x, sk[0]);275x = _mm_aesenc_si128(x, sk[1]);276x = _mm_aesenc_si128(x, sk[2]);277x = _mm_aesenc_si128(x, sk[3]);278x = _mm_aesenc_si128(x, sk[4]);279x = _mm_aesenc_si128(x, sk[5]);280x = _mm_aesenc_si128(x, sk[6]);281x = _mm_aesenc_si128(x, sk[7]);282x = _mm_aesenc_si128(x, sk[8]);283x = _mm_aesenc_si128(x, sk[9]);284if (num_rounds == 10) {285x = _mm_aesenclast_si128(x, sk[10]);286} else if (num_rounds == 12) {287x = _mm_aesenc_si128(x, sk[10]);288x = _mm_aesenc_si128(x, sk[11]);289x = _mm_aesenclast_si128(x, sk[12]);290} else {291x = _mm_aesenc_si128(x, sk[10]);292x = _mm_aesenc_si128(x, sk[11]);293x = _mm_aesenc_si128(x, sk[12]);294x = _mm_aesenc_si128(x, sk[13]);295x = _mm_aesenclast_si128(x, sk[14]);296}297ivx = x;298buf += 16;299len -= 16;300}301_mm_storeu_si128(cbcmac, ivx);302}303304/* see bearssl_block.h */305BR_TARGET("sse2,sse4.1,aes")306void307br_aes_x86ni_ctrcbc_encrypt(const br_aes_x86ni_ctrcbc_keys *ctx,308void *ctr, void *cbcmac, void *data, size_t len)309{310unsigned char *buf;311unsigned num_rounds;312__m128i sk[15];313__m128i ivx, cmx;314__m128i erev, zero, one;315unsigned u;316int first_iter;317318num_rounds = ctx->num_rounds;319for (u = 0; u <= num_rounds; u ++) {320sk[u] = _mm_loadu_si128((void *)(ctx->skey.skni + (u << 4)));321}322323/*324* Some SSE2 constants.325*/326erev = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7,3278, 9, 10, 11, 12, 13, 14, 15);328zero = _mm_setzero_si128();329one = _mm_set_epi64x(0, 1);330331/*332* Decode the counter in big-endian.333*/334ivx = _mm_shuffle_epi8(_mm_loadu_si128(ctr), erev);335cmx = _mm_loadu_si128(cbcmac);336337buf = data;338first_iter = 1;339while (len > 0) {340__m128i dx, x0, x1;341342/*343* Load initial values:344* dx encrypted block of data345* x0 counter (for CTR encryption)346* x1 input for CBC-MAC347*/348dx = _mm_loadu_si128((void *)buf);349x0 = _mm_shuffle_epi8(ivx, erev);350x1 = cmx;351352x0 = _mm_xor_si128(x0, sk[0]);353x1 = _mm_xor_si128(x1, sk[0]);354x0 = _mm_aesenc_si128(x0, sk[1]);355x1 = _mm_aesenc_si128(x1, sk[1]);356x0 = _mm_aesenc_si128(x0, sk[2]);357x1 = _mm_aesenc_si128(x1, sk[2]);358x0 = _mm_aesenc_si128(x0, sk[3]);359x1 = _mm_aesenc_si128(x1, sk[3]);360x0 = _mm_aesenc_si128(x0, sk[4]);361x1 = _mm_aesenc_si128(x1, sk[4]);362x0 = _mm_aesenc_si128(x0, sk[5]);363x1 = _mm_aesenc_si128(x1, sk[5]);364x0 = _mm_aesenc_si128(x0, sk[6]);365x1 = _mm_aesenc_si128(x1, sk[6]);366x0 = _mm_aesenc_si128(x0, sk[7]);367x1 = _mm_aesenc_si128(x1, sk[7]);368x0 = _mm_aesenc_si128(x0, sk[8]);369x1 = _mm_aesenc_si128(x1, sk[8]);370x0 = _mm_aesenc_si128(x0, sk[9]);371x1 = _mm_aesenc_si128(x1, sk[9]);372if (num_rounds == 10) {373x0 = _mm_aesenclast_si128(x0, sk[10]);374x1 = _mm_aesenclast_si128(x1, sk[10]);375} else if (num_rounds == 12) {376x0 = _mm_aesenc_si128(x0, sk[10]);377x1 = _mm_aesenc_si128(x1, sk[10]);378x0 = _mm_aesenc_si128(x0, sk[11]);379x1 = _mm_aesenc_si128(x1, sk[11]);380x0 = _mm_aesenclast_si128(x0, sk[12]);381x1 = _mm_aesenclast_si128(x1, sk[12]);382} else {383x0 = _mm_aesenc_si128(x0, sk[10]);384x1 = _mm_aesenc_si128(x1, sk[10]);385x0 = _mm_aesenc_si128(x0, sk[11]);386x1 = _mm_aesenc_si128(x1, sk[11]);387x0 = _mm_aesenc_si128(x0, sk[12]);388x1 = _mm_aesenc_si128(x1, sk[12]);389x0 = _mm_aesenc_si128(x0, sk[13]);390x1 = _mm_aesenc_si128(x1, sk[13]);391x0 = _mm_aesenclast_si128(x0, sk[14]);392x1 = _mm_aesenclast_si128(x1, sk[14]);393}394395x0 = _mm_xor_si128(x0, dx);396if (first_iter) {397cmx = _mm_xor_si128(cmx, x0);398first_iter = 0;399} else {400cmx = _mm_xor_si128(x1, x0);401}402_mm_storeu_si128((void *)buf, x0);403404buf += 16;405len -= 16;406407/*408* Increment the counter value.409*/410ivx = _mm_add_epi64(ivx, one);411ivx = _mm_sub_epi64(ivx,412_mm_slli_si128(_mm_cmpeq_epi64(ivx, zero), 8));413414/*415* If this was the last iteration, then compute the416* extra block encryption to complete CBC-MAC.417*/418if (len == 0) {419cmx = _mm_xor_si128(cmx, sk[0]);420cmx = _mm_aesenc_si128(cmx, sk[1]);421cmx = _mm_aesenc_si128(cmx, sk[2]);422cmx = _mm_aesenc_si128(cmx, sk[3]);423cmx = _mm_aesenc_si128(cmx, sk[4]);424cmx = _mm_aesenc_si128(cmx, sk[5]);425cmx = _mm_aesenc_si128(cmx, sk[6]);426cmx = _mm_aesenc_si128(cmx, sk[7]);427cmx = _mm_aesenc_si128(cmx, sk[8]);428cmx = _mm_aesenc_si128(cmx, sk[9]);429if (num_rounds == 10) {430cmx = _mm_aesenclast_si128(cmx, sk[10]);431} else if (num_rounds == 12) {432cmx = _mm_aesenc_si128(cmx, sk[10]);433cmx = _mm_aesenc_si128(cmx, sk[11]);434cmx = _mm_aesenclast_si128(cmx, sk[12]);435} else {436cmx = _mm_aesenc_si128(cmx, sk[10]);437cmx = _mm_aesenc_si128(cmx, sk[11]);438cmx = _mm_aesenc_si128(cmx, sk[12]);439cmx = _mm_aesenc_si128(cmx, sk[13]);440cmx = _mm_aesenclast_si128(cmx, sk[14]);441}442break;443}444}445446/*447* Write back new counter value and CBC-MAC value.448*/449_mm_storeu_si128(ctr, _mm_shuffle_epi8(ivx, erev));450_mm_storeu_si128(cbcmac, cmx);451}452453/* see bearssl_block.h */454BR_TARGET("sse2,sse4.1,aes")455void456br_aes_x86ni_ctrcbc_decrypt(const br_aes_x86ni_ctrcbc_keys *ctx,457void *ctr, void *cbcmac, void *data, size_t len)458{459unsigned char *buf;460unsigned num_rounds;461__m128i sk[15];462__m128i ivx, cmx;463__m128i erev, zero, one;464unsigned u;465466num_rounds = ctx->num_rounds;467for (u = 0; u <= num_rounds; u ++) {468sk[u] = _mm_loadu_si128((void *)(ctx->skey.skni + (u << 4)));469}470471/*472* Some SSE2 constants.473*/474erev = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7,4758, 9, 10, 11, 12, 13, 14, 15);476zero = _mm_setzero_si128();477one = _mm_set_epi64x(0, 1);478479/*480* Decode the counter in big-endian.481*/482ivx = _mm_shuffle_epi8(_mm_loadu_si128(ctr), erev);483cmx = _mm_loadu_si128(cbcmac);484485buf = data;486while (len > 0) {487__m128i dx, x0, x1;488489/*490* Load initial values:491* dx encrypted block of data492* x0 counter (for CTR encryption)493* x1 input for CBC-MAC494*/495dx = _mm_loadu_si128((void *)buf);496x0 = _mm_shuffle_epi8(ivx, erev);497x1 = _mm_xor_si128(cmx, dx);498499x0 = _mm_xor_si128(x0, sk[0]);500x1 = _mm_xor_si128(x1, sk[0]);501x0 = _mm_aesenc_si128(x0, sk[1]);502x1 = _mm_aesenc_si128(x1, sk[1]);503x0 = _mm_aesenc_si128(x0, sk[2]);504x1 = _mm_aesenc_si128(x1, sk[2]);505x0 = _mm_aesenc_si128(x0, sk[3]);506x1 = _mm_aesenc_si128(x1, sk[3]);507x0 = _mm_aesenc_si128(x0, sk[4]);508x1 = _mm_aesenc_si128(x1, sk[4]);509x0 = _mm_aesenc_si128(x0, sk[5]);510x1 = _mm_aesenc_si128(x1, sk[5]);511x0 = _mm_aesenc_si128(x0, sk[6]);512x1 = _mm_aesenc_si128(x1, sk[6]);513x0 = _mm_aesenc_si128(x0, sk[7]);514x1 = _mm_aesenc_si128(x1, sk[7]);515x0 = _mm_aesenc_si128(x0, sk[8]);516x1 = _mm_aesenc_si128(x1, sk[8]);517x0 = _mm_aesenc_si128(x0, sk[9]);518x1 = _mm_aesenc_si128(x1, sk[9]);519if (num_rounds == 10) {520x0 = _mm_aesenclast_si128(x0, sk[10]);521x1 = _mm_aesenclast_si128(x1, sk[10]);522} else if (num_rounds == 12) {523x0 = _mm_aesenc_si128(x0, sk[10]);524x1 = _mm_aesenc_si128(x1, sk[10]);525x0 = _mm_aesenc_si128(x0, sk[11]);526x1 = _mm_aesenc_si128(x1, sk[11]);527x0 = _mm_aesenclast_si128(x0, sk[12]);528x1 = _mm_aesenclast_si128(x1, sk[12]);529} else {530x0 = _mm_aesenc_si128(x0, sk[10]);531x1 = _mm_aesenc_si128(x1, sk[10]);532x0 = _mm_aesenc_si128(x0, sk[11]);533x1 = _mm_aesenc_si128(x1, sk[11]);534x0 = _mm_aesenc_si128(x0, sk[12]);535x1 = _mm_aesenc_si128(x1, sk[12]);536x0 = _mm_aesenc_si128(x0, sk[13]);537x1 = _mm_aesenc_si128(x1, sk[13]);538x0 = _mm_aesenclast_si128(x0, sk[14]);539x1 = _mm_aesenclast_si128(x1, sk[14]);540}541x0 = _mm_xor_si128(x0, dx);542cmx = x1;543_mm_storeu_si128((void *)buf, x0);544545buf += 16;546len -= 16;547548/*549* Increment the counter value.550*/551ivx = _mm_add_epi64(ivx, one);552ivx = _mm_sub_epi64(ivx,553_mm_slli_si128(_mm_cmpeq_epi64(ivx, zero), 8));554}555556/*557* Write back new counter value and CBC-MAC value.558*/559_mm_storeu_si128(ctr, _mm_shuffle_epi8(ivx, erev));560_mm_storeu_si128(cbcmac, cmx);561}562563BR_TARGETS_X86_DOWN564565/* see bearssl_block.h */566const br_block_ctrcbc_class br_aes_x86ni_ctrcbc_vtable = {567sizeof(br_aes_x86ni_ctrcbc_keys),56816,5694,570(void (*)(const br_block_ctrcbc_class **, const void *, size_t))571&br_aes_x86ni_ctrcbc_init,572(void (*)(const br_block_ctrcbc_class *const *,573void *, void *, void *, size_t))574&br_aes_x86ni_ctrcbc_encrypt,575(void (*)(const br_block_ctrcbc_class *const *,576void *, void *, void *, size_t))577&br_aes_x86ni_ctrcbc_decrypt,578(void (*)(const br_block_ctrcbc_class *const *,579void *, void *, size_t))580&br_aes_x86ni_ctrcbc_ctr,581(void (*)(const br_block_ctrcbc_class *const *,582void *, const void *, size_t))583&br_aes_x86ni_ctrcbc_mac584};585586#else587588/* see bearssl_block.h */589const br_block_ctrcbc_class *590br_aes_x86ni_ctrcbc_get_vtable(void)591{592return NULL;593}594595#endif596597598