Path: blob/main/sys/contrib/openzfs/module/icp/asm-x86_64/aes/aeskey.c
48775 views
// SPDX-License-Identifier: Brian-Gladman-3-Clause1/*2* ---------------------------------------------------------------------------3* Copyright (c) 1998-2007, Brian Gladman, Worcester, UK. All rights reserved.4*5* LICENSE TERMS6*7* The free distribution and use of this software is allowed (with or without8* changes) provided that:9*10* 1. source code distributions include the above copyright notice, this11* list of conditions and the following disclaimer;12*13* 2. binary distributions include the above copyright notice, this list14* of conditions and the following disclaimer in their documentation;15*16* 3. the name of the copyright holder is not used to endorse products17* built using this software without specific written permission.18*19* DISCLAIMER20*21* This software is provided 'as is' with no explicit or implied warranties22* in respect of its properties, including, but not limited to, correctness23* and/or fitness for purpose.24* ---------------------------------------------------------------------------25* Issue Date: 20/12/200726*/2728#include <aes/aes_impl.h>29#include "aesopt.h"30#include "aestab.h"31#include "aestab2.h"3233/*34* Initialise the key schedule from the user supplied key. The key35* length can be specified in bytes, with legal values of 16, 2436* and 32, or in bits, with legal values of 128, 192 and 256. These37* values correspond with Nk values of 4, 6 and 8 respectively.38*39* The following macros implement a single cycle in the key40* schedule generation process. The number of cycles needed41* for each cx->n_col and nk value is:42*43* nk = 4 5 6 7 844* ------------------------------45* cx->n_col = 4 10 9 8 7 746* cx->n_col = 5 14 11 10 9 947* cx->n_col = 6 19 15 12 11 1148* cx->n_col = 7 21 19 16 13 1449* cx->n_col = 8 29 23 19 17 1450*/5152/*53* OpenSolaris changes54* 1. Added header files aes_impl.h and aestab2.h55* 2. Changed uint_8t and uint_32t to uint8_t and uint32_t56* 3. Remove code under ifdef USE_VIA_ACE_IF_PRESENT (always undefined)57* 4. Removed always-defined ifdefs FUNCS_IN_C, ENC_KEYING_IN_C,58* AES_128, AES_192, AES_256, AES_VAR defines59* 5. Changed aes_encrypt_key* aes_decrypt_key* functions to "static void"60* 6. Changed N_COLS to MAX_AES_NB61* 7. Replaced functions aes_encrypt_key and aes_decrypt_key with62* OpenSolaris-compatible functions rijndael_key_setup_enc_amd64 and63* rijndael_key_setup_dec_amd6464* 8. cstyled code and removed lint warnings65*/6667#if defined(REDUCE_CODE_SIZE)68#define ls_box ls_sub69uint32_t ls_sub(const uint32_t t, const uint32_t n);70#define inv_mcol im_sub71uint32_t im_sub(const uint32_t x);72#ifdef ENC_KS_UNROLL73#undef ENC_KS_UNROLL74#endif75#ifdef DEC_KS_UNROLL76#undef DEC_KS_UNROLL77#endif78#endif /* REDUCE_CODE_SIZE */798081#define ke4(k, i) \82{ k[4 * (i) + 4] = ss[0] ^= ls_box(ss[3], 3) ^ t_use(r, c)[i]; \83k[4 * (i) + 5] = ss[1] ^= ss[0]; \84k[4 * (i) + 6] = ss[2] ^= ss[1]; \85k[4 * (i) + 7] = ss[3] ^= ss[2]; \86}8788static void89aes_encrypt_key128(const unsigned char *key, uint32_t rk[])90{91uint32_t ss[4];9293rk[0] = ss[0] = word_in(key, 0);94rk[1] = ss[1] = word_in(key, 1);95rk[2] = ss[2] = word_in(key, 2);96rk[3] = ss[3] = word_in(key, 3);9798#ifdef ENC_KS_UNROLL99ke4(rk, 0); ke4(rk, 1);100ke4(rk, 2); ke4(rk, 3);101ke4(rk, 4); ke4(rk, 5);102ke4(rk, 6); ke4(rk, 7);103ke4(rk, 8);104#else105{106uint32_t i;107for (i = 0; i < 9; ++i)108ke4(rk, i);109}110#endif /* ENC_KS_UNROLL */111ke4(rk, 9);112}113114115#define kef6(k, i) \116{ k[6 * (i) + 6] = ss[0] ^= ls_box(ss[5], 3) ^ t_use(r, c)[i]; \117k[6 * (i) + 7] = ss[1] ^= ss[0]; \118k[6 * (i) + 8] = ss[2] ^= ss[1]; \119k[6 * (i) + 9] = ss[3] ^= ss[2]; \120}121122#define ke6(k, i) \123{ kef6(k, i); \124k[6 * (i) + 10] = ss[4] ^= ss[3]; \125k[6 * (i) + 11] = ss[5] ^= ss[4]; \126}127128static void129aes_encrypt_key192(const unsigned char *key, uint32_t rk[])130{131uint32_t ss[6];132133rk[0] = ss[0] = word_in(key, 0);134rk[1] = ss[1] = word_in(key, 1);135rk[2] = ss[2] = word_in(key, 2);136rk[3] = ss[3] = word_in(key, 3);137rk[4] = ss[4] = word_in(key, 4);138rk[5] = ss[5] = word_in(key, 5);139140#ifdef ENC_KS_UNROLL141ke6(rk, 0); ke6(rk, 1);142ke6(rk, 2); ke6(rk, 3);143ke6(rk, 4); ke6(rk, 5);144ke6(rk, 6);145#else146{147uint32_t i;148for (i = 0; i < 7; ++i)149ke6(rk, i);150}151#endif /* ENC_KS_UNROLL */152kef6(rk, 7);153}154155156157#define kef8(k, i) \158{ k[8 * (i) + 8] = ss[0] ^= ls_box(ss[7], 3) ^ t_use(r, c)[i]; \159k[8 * (i) + 9] = ss[1] ^= ss[0]; \160k[8 * (i) + 10] = ss[2] ^= ss[1]; \161k[8 * (i) + 11] = ss[3] ^= ss[2]; \162}163164#define ke8(k, i) \165{ kef8(k, i); \166k[8 * (i) + 12] = ss[4] ^= ls_box(ss[3], 0); \167k[8 * (i) + 13] = ss[5] ^= ss[4]; \168k[8 * (i) + 14] = ss[6] ^= ss[5]; \169k[8 * (i) + 15] = ss[7] ^= ss[6]; \170}171172static void173aes_encrypt_key256(const unsigned char *key, uint32_t rk[])174{175uint32_t ss[8];176177rk[0] = ss[0] = word_in(key, 0);178rk[1] = ss[1] = word_in(key, 1);179rk[2] = ss[2] = word_in(key, 2);180rk[3] = ss[3] = word_in(key, 3);181rk[4] = ss[4] = word_in(key, 4);182rk[5] = ss[5] = word_in(key, 5);183rk[6] = ss[6] = word_in(key, 6);184rk[7] = ss[7] = word_in(key, 7);185186#ifdef ENC_KS_UNROLL187ke8(rk, 0); ke8(rk, 1);188ke8(rk, 2); ke8(rk, 3);189ke8(rk, 4); ke8(rk, 5);190#else191{192uint32_t i;193for (i = 0; i < 6; ++i)194ke8(rk, i);195}196#endif /* ENC_KS_UNROLL */197kef8(rk, 6);198}199200201/*202* Expand the cipher key into the encryption key schedule.203*204* Return the number of rounds for the given cipher key size.205* The size of the key schedule depends on the number of rounds206* (which can be computed from the size of the key), i.e. 4 * (Nr + 1).207*208* Parameters:209* rk AES key schedule 32-bit array to be initialized210* cipherKey User key211* keyBits AES key size (128, 192, or 256 bits)212*/213int214rijndael_key_setup_enc_amd64(uint32_t rk[], const uint32_t cipherKey[],215int keyBits)216{217switch (keyBits) {218case 128:219aes_encrypt_key128((unsigned char *)&cipherKey[0], rk);220return (10);221case 192:222aes_encrypt_key192((unsigned char *)&cipherKey[0], rk);223return (12);224case 256:225aes_encrypt_key256((unsigned char *)&cipherKey[0], rk);226return (14);227default: /* should never get here */228break;229}230231return (0);232}233234235/* this is used to store the decryption round keys */236/* in forward or reverse order */237238#ifdef AES_REV_DKS239#define v(n, i) ((n) - (i) + 2 * ((i) & 3))240#else241#define v(n, i) (i)242#endif243244#if DEC_ROUND == NO_TABLES245#define ff(x) (x)246#else247#define ff(x) inv_mcol(x)248#if defined(dec_imvars)249#define d_vars dec_imvars250#endif251#endif /* FUNCS_IN_C & DEC_KEYING_IN_C */252253254#define k4e(k, i) \255{ k[v(40, (4 * (i)) + 4)] = ss[0] ^= ls_box(ss[3], 3) ^ t_use(r, c)[i]; \256k[v(40, (4 * (i)) + 5)] = ss[1] ^= ss[0]; \257k[v(40, (4 * (i)) + 6)] = ss[2] ^= ss[1]; \258k[v(40, (4 * (i)) + 7)] = ss[3] ^= ss[2]; \259}260261#if 1262263#define kdf4(k, i) \264{ ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \265ss[1] = ss[1] ^ ss[3]; \266ss[2] = ss[2] ^ ss[3]; \267ss[4] = ls_box(ss[(i + 3) % 4], 3) ^ t_use(r, c)[i]; \268ss[i % 4] ^= ss[4]; \269ss[4] ^= k[v(40, (4 * (i)))]; k[v(40, (4 * (i)) + 4)] = ff(ss[4]); \270ss[4] ^= k[v(40, (4 * (i)) + 1)]; k[v(40, (4 * (i)) + 5)] = ff(ss[4]); \271ss[4] ^= k[v(40, (4 * (i)) + 2)]; k[v(40, (4 * (i)) + 6)] = ff(ss[4]); \272ss[4] ^= k[v(40, (4 * (i)) + 3)]; k[v(40, (4 * (i)) + 7)] = ff(ss[4]); \273}274275#define kd4(k, i) \276{ ss[4] = ls_box(ss[(i + 3) % 4], 3) ^ t_use(r, c)[i]; \277ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \278k[v(40, (4 * (i)) + 4)] = ss[4] ^= k[v(40, (4 * (i)))]; \279k[v(40, (4 * (i)) + 5)] = ss[4] ^= k[v(40, (4 * (i)) + 1)]; \280k[v(40, (4 * (i)) + 6)] = ss[4] ^= k[v(40, (4 * (i)) + 2)]; \281k[v(40, (4 * (i)) + 7)] = ss[4] ^= k[v(40, (4 * (i)) + 3)]; \282}283284#define kdl4(k, i) \285{ ss[4] = ls_box(ss[(i + 3) % 4], 3) ^ t_use(r, c)[i]; \286ss[i % 4] ^= ss[4]; \287k[v(40, (4 * (i)) + 4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \288k[v(40, (4 * (i)) + 5)] = ss[1] ^ ss[3]; \289k[v(40, (4 * (i)) + 6)] = ss[0]; \290k[v(40, (4 * (i)) + 7)] = ss[1]; \291}292293#else294295#define kdf4(k, i) \296{ ss[0] ^= ls_box(ss[3], 3) ^ t_use(r, c)[i]; \297k[v(40, (4 * (i)) + 4)] = ff(ss[0]); \298ss[1] ^= ss[0]; k[v(40, (4 * (i)) + 5)] = ff(ss[1]); \299ss[2] ^= ss[1]; k[v(40, (4 * (i)) + 6)] = ff(ss[2]); \300ss[3] ^= ss[2]; k[v(40, (4 * (i)) + 7)] = ff(ss[3]); \301}302303#define kd4(k, i) \304{ ss[4] = ls_box(ss[3], 3) ^ t_use(r, c)[i]; \305ss[0] ^= ss[4]; \306ss[4] = ff(ss[4]); \307k[v(40, (4 * (i)) + 4)] = ss[4] ^= k[v(40, (4 * (i)))]; \308ss[1] ^= ss[0]; \309k[v(40, (4 * (i)) + 5)] = ss[4] ^= k[v(40, (4 * (i)) + 1)]; \310ss[2] ^= ss[1]; \311k[v(40, (4 * (i)) + 6)] = ss[4] ^= k[v(40, (4 * (i)) + 2)]; \312ss[3] ^= ss[2]; \313k[v(40, (4 * (i)) + 7)] = ss[4] ^= k[v(40, (4 * (i)) + 3)]; \314}315316#define kdl4(k, i) \317{ ss[0] ^= ls_box(ss[3], 3) ^ t_use(r, c)[i]; \318k[v(40, (4 * (i)) + 4)] = ss[0]; \319ss[1] ^= ss[0]; k[v(40, (4 * (i)) + 5)] = ss[1]; \320ss[2] ^= ss[1]; k[v(40, (4 * (i)) + 6)] = ss[2]; \321ss[3] ^= ss[2]; k[v(40, (4 * (i)) + 7)] = ss[3]; \322}323324#endif325326static void327aes_decrypt_key128(const unsigned char *key, uint32_t rk[])328{329uint32_t ss[5];330#if defined(d_vars)331d_vars;332#endif333rk[v(40, (0))] = ss[0] = word_in(key, 0);334rk[v(40, (1))] = ss[1] = word_in(key, 1);335rk[v(40, (2))] = ss[2] = word_in(key, 2);336rk[v(40, (3))] = ss[3] = word_in(key, 3);337338#ifdef DEC_KS_UNROLL339kdf4(rk, 0); kd4(rk, 1);340kd4(rk, 2); kd4(rk, 3);341kd4(rk, 4); kd4(rk, 5);342kd4(rk, 6); kd4(rk, 7);343kd4(rk, 8); kdl4(rk, 9);344#else345{346uint32_t i;347for (i = 0; i < 10; ++i)348k4e(rk, i);349#if !(DEC_ROUND == NO_TABLES)350for (i = MAX_AES_NB; i < 10 * MAX_AES_NB; ++i)351rk[i] = inv_mcol(rk[i]);352#endif353}354#endif /* DEC_KS_UNROLL */355}356357358359#define k6ef(k, i) \360{ k[v(48, (6 * (i)) + 6)] = ss[0] ^= ls_box(ss[5], 3) ^ t_use(r, c)[i]; \361k[v(48, (6 * (i)) + 7)] = ss[1] ^= ss[0]; \362k[v(48, (6 * (i)) + 8)] = ss[2] ^= ss[1]; \363k[v(48, (6 * (i)) + 9)] = ss[3] ^= ss[2]; \364}365366#define k6e(k, i) \367{ k6ef(k, i); \368k[v(48, (6 * (i)) + 10)] = ss[4] ^= ss[3]; \369k[v(48, (6 * (i)) + 11)] = ss[5] ^= ss[4]; \370}371372#define kdf6(k, i) \373{ ss[0] ^= ls_box(ss[5], 3) ^ t_use(r, c)[i]; \374k[v(48, (6 * (i)) + 6)] = ff(ss[0]); \375ss[1] ^= ss[0]; k[v(48, (6 * (i)) + 7)] = ff(ss[1]); \376ss[2] ^= ss[1]; k[v(48, (6 * (i)) + 8)] = ff(ss[2]); \377ss[3] ^= ss[2]; k[v(48, (6 * (i)) + 9)] = ff(ss[3]); \378ss[4] ^= ss[3]; k[v(48, (6 * (i)) + 10)] = ff(ss[4]); \379ss[5] ^= ss[4]; k[v(48, (6 * (i)) + 11)] = ff(ss[5]); \380}381382#define kd6(k, i) \383{ ss[6] = ls_box(ss[5], 3) ^ t_use(r, c)[i]; \384ss[0] ^= ss[6]; ss[6] = ff(ss[6]); \385k[v(48, (6 * (i)) + 6)] = ss[6] ^= k[v(48, (6 * (i)))]; \386ss[1] ^= ss[0]; \387k[v(48, (6 * (i)) + 7)] = ss[6] ^= k[v(48, (6 * (i)) + 1)]; \388ss[2] ^= ss[1]; \389k[v(48, (6 * (i)) + 8)] = ss[6] ^= k[v(48, (6 * (i)) + 2)]; \390ss[3] ^= ss[2]; \391k[v(48, (6 * (i)) + 9)] = ss[6] ^= k[v(48, (6 * (i)) + 3)]; \392ss[4] ^= ss[3]; \393k[v(48, (6 * (i)) + 10)] = ss[6] ^= k[v(48, (6 * (i)) + 4)]; \394ss[5] ^= ss[4]; \395k[v(48, (6 * (i)) + 11)] = ss[6] ^= k[v(48, (6 * (i)) + 5)]; \396}397398#define kdl6(k, i) \399{ ss[0] ^= ls_box(ss[5], 3) ^ t_use(r, c)[i]; \400k[v(48, (6 * (i)) + 6)] = ss[0]; \401ss[1] ^= ss[0]; k[v(48, (6 * (i)) + 7)] = ss[1]; \402ss[2] ^= ss[1]; k[v(48, (6 * (i)) + 8)] = ss[2]; \403ss[3] ^= ss[2]; k[v(48, (6 * (i)) + 9)] = ss[3]; \404}405406static void407aes_decrypt_key192(const unsigned char *key, uint32_t rk[])408{409uint32_t ss[7];410#if defined(d_vars)411d_vars;412#endif413rk[v(48, (0))] = ss[0] = word_in(key, 0);414rk[v(48, (1))] = ss[1] = word_in(key, 1);415rk[v(48, (2))] = ss[2] = word_in(key, 2);416rk[v(48, (3))] = ss[3] = word_in(key, 3);417418#ifdef DEC_KS_UNROLL419ss[4] = word_in(key, 4);420rk[v(48, (4))] = ff(ss[4]);421ss[5] = word_in(key, 5);422rk[v(48, (5))] = ff(ss[5]);423kdf6(rk, 0); kd6(rk, 1);424kd6(rk, 2); kd6(rk, 3);425kd6(rk, 4); kd6(rk, 5);426kd6(rk, 6); kdl6(rk, 7);427#else428rk[v(48, (4))] = ss[4] = word_in(key, 4);429rk[v(48, (5))] = ss[5] = word_in(key, 5);430{431uint32_t i;432433for (i = 0; i < 7; ++i)434k6e(rk, i);435k6ef(rk, 7);436#if !(DEC_ROUND == NO_TABLES)437for (i = MAX_AES_NB; i < 12 * MAX_AES_NB; ++i)438rk[i] = inv_mcol(rk[i]);439#endif440}441#endif442}443444445446#define k8ef(k, i) \447{ k[v(56, (8 * (i)) + 8)] = ss[0] ^= ls_box(ss[7], 3) ^ t_use(r, c)[i]; \448k[v(56, (8 * (i)) + 9)] = ss[1] ^= ss[0]; \449k[v(56, (8 * (i)) + 10)] = ss[2] ^= ss[1]; \450k[v(56, (8 * (i)) + 11)] = ss[3] ^= ss[2]; \451}452453#define k8e(k, i) \454{ k8ef(k, i); \455k[v(56, (8 * (i)) + 12)] = ss[4] ^= ls_box(ss[3], 0); \456k[v(56, (8 * (i)) + 13)] = ss[5] ^= ss[4]; \457k[v(56, (8 * (i)) + 14)] = ss[6] ^= ss[5]; \458k[v(56, (8 * (i)) + 15)] = ss[7] ^= ss[6]; \459}460461#define kdf8(k, i) \462{ ss[0] ^= ls_box(ss[7], 3) ^ t_use(r, c)[i]; \463k[v(56, (8 * (i)) + 8)] = ff(ss[0]); \464ss[1] ^= ss[0]; k[v(56, (8 * (i)) + 9)] = ff(ss[1]); \465ss[2] ^= ss[1]; k[v(56, (8 * (i)) + 10)] = ff(ss[2]); \466ss[3] ^= ss[2]; k[v(56, (8 * (i)) + 11)] = ff(ss[3]); \467ss[4] ^= ls_box(ss[3], 0); k[v(56, (8 * (i)) + 12)] = ff(ss[4]); \468ss[5] ^= ss[4]; k[v(56, (8 * (i)) + 13)] = ff(ss[5]); \469ss[6] ^= ss[5]; k[v(56, (8 * (i)) + 14)] = ff(ss[6]); \470ss[7] ^= ss[6]; k[v(56, (8 * (i)) + 15)] = ff(ss[7]); \471}472473#define kd8(k, i) \474{ ss[8] = ls_box(ss[7], 3) ^ t_use(r, c)[i]; \475ss[0] ^= ss[8]; \476ss[8] = ff(ss[8]); \477k[v(56, (8 * (i)) + 8)] = ss[8] ^= k[v(56, (8 * (i)))]; \478ss[1] ^= ss[0]; \479k[v(56, (8 * (i)) + 9)] = ss[8] ^= k[v(56, (8 * (i)) + 1)]; \480ss[2] ^= ss[1]; \481k[v(56, (8 * (i)) + 10)] = ss[8] ^= k[v(56, (8 * (i)) + 2)]; \482ss[3] ^= ss[2]; \483k[v(56, (8 * (i)) + 11)] = ss[8] ^= k[v(56, (8 * (i)) + 3)]; \484ss[8] = ls_box(ss[3], 0); \485ss[4] ^= ss[8]; \486ss[8] = ff(ss[8]); \487k[v(56, (8 * (i)) + 12)] = ss[8] ^= k[v(56, (8 * (i)) + 4)]; \488ss[5] ^= ss[4]; \489k[v(56, (8 * (i)) + 13)] = ss[8] ^= k[v(56, (8 * (i)) + 5)]; \490ss[6] ^= ss[5]; \491k[v(56, (8 * (i)) + 14)] = ss[8] ^= k[v(56, (8 * (i)) + 6)]; \492ss[7] ^= ss[6]; \493k[v(56, (8 * (i)) + 15)] = ss[8] ^= k[v(56, (8 * (i)) + 7)]; \494}495496#define kdl8(k, i) \497{ ss[0] ^= ls_box(ss[7], 3) ^ t_use(r, c)[i]; \498k[v(56, (8 * (i)) + 8)] = ss[0]; \499ss[1] ^= ss[0]; k[v(56, (8 * (i)) + 9)] = ss[1]; \500ss[2] ^= ss[1]; k[v(56, (8 * (i)) + 10)] = ss[2]; \501ss[3] ^= ss[2]; k[v(56, (8 * (i)) + 11)] = ss[3]; \502}503504static void505aes_decrypt_key256(const unsigned char *key, uint32_t rk[])506{507uint32_t ss[9];508#if defined(d_vars)509d_vars;510#endif511rk[v(56, (0))] = ss[0] = word_in(key, 0);512rk[v(56, (1))] = ss[1] = word_in(key, 1);513rk[v(56, (2))] = ss[2] = word_in(key, 2);514rk[v(56, (3))] = ss[3] = word_in(key, 3);515516#ifdef DEC_KS_UNROLL517ss[4] = word_in(key, 4);518rk[v(56, (4))] = ff(ss[4]);519ss[5] = word_in(key, 5);520rk[v(56, (5))] = ff(ss[5]);521ss[6] = word_in(key, 6);522rk[v(56, (6))] = ff(ss[6]);523ss[7] = word_in(key, 7);524rk[v(56, (7))] = ff(ss[7]);525kdf8(rk, 0); kd8(rk, 1);526kd8(rk, 2); kd8(rk, 3);527kd8(rk, 4); kd8(rk, 5);528kdl8(rk, 6);529#else530rk[v(56, (4))] = ss[4] = word_in(key, 4);531rk[v(56, (5))] = ss[5] = word_in(key, 5);532rk[v(56, (6))] = ss[6] = word_in(key, 6);533rk[v(56, (7))] = ss[7] = word_in(key, 7);534{535uint32_t i;536537for (i = 0; i < 6; ++i)538k8e(rk, i);539k8ef(rk, 6);540#if !(DEC_ROUND == NO_TABLES)541for (i = MAX_AES_NB; i < 14 * MAX_AES_NB; ++i)542rk[i] = inv_mcol(rk[i]);543#endif544}545#endif /* DEC_KS_UNROLL */546}547548549/*550* Expand the cipher key into the decryption key schedule.551*552* Return the number of rounds for the given cipher key size.553* The size of the key schedule depends on the number of rounds554* (which can be computed from the size of the key), i.e. 4 * (Nr + 1).555*556* Parameters:557* rk AES key schedule 32-bit array to be initialized558* cipherKey User key559* keyBits AES key size (128, 192, or 256 bits)560*/561int562rijndael_key_setup_dec_amd64(uint32_t rk[], const uint32_t cipherKey[],563int keyBits)564{565switch (keyBits) {566case 128:567aes_decrypt_key128((unsigned char *)&cipherKey[0], rk);568return (10);569case 192:570aes_decrypt_key192((unsigned char *)&cipherKey[0], rk);571return (12);572case 256:573aes_decrypt_key256((unsigned char *)&cipherKey[0], rk);574return (14);575default: /* should never get here */576break;577}578579return (0);580}581582583