/*
* Copyright ( C ) 2016 The Android Open Source Project
*
* Licensed under the Apache License , Version 2 . 0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
#include <string.h>
#include <stdint.h>
#include <nanohub/aes.h>
#define AES_NUM_ROUNDS 14
static const uint8_t FwdSbox[] = {
0 x63, 0 x7C, 0 x77, 0 x7B, 0 xF2, 0 x6B, 0 x6F, 0 xC5, 0 x30, 0 x01, 0 x67, 0 x2B, 0 xFE, 0 xD7, 0 xAB, 0 x76,
0 xCA, 0 x82, 0 xC9, 0 x7D, 0 xFA, 0 x59, 0 x47, 0 xF0, 0 xAD, 0 xD4, 0 xA2, 0 xAF, 0 x9C, 0 xA4, 0 x72, 0 xC0,
0 xB7, 0 xFD, 0 x93, 0 x26, 0 x36, 0 x3F, 0 xF7, 0 xCC, 0 x34, 0 xA5, 0 xE5, 0 xF1, 0 x71, 0 xD8, 0 x31, 0 x15,
0 x04, 0 xC7, 0 x23, 0 xC3, 0 x18, 0 x96, 0 x05, 0 x9A, 0 x07, 0 x12, 0 x80, 0 xE2, 0 xEB, 0 x27, 0 xB2, 0 x75,
0 x09, 0 x83, 0 x2C, 0 x1A, 0 x1B, 0 x6E, 0 x5A, 0 xA0, 0 x52, 0 x3B, 0 xD6, 0 xB3, 0 x29, 0 xE3, 0 x2F, 0 x84,
0 x53, 0 xD1, 0 x00, 0 xED, 0 x20, 0 xFC, 0 xB1, 0 x5B, 0 x6A, 0 xCB, 0 xBE, 0 x39, 0 x4A, 0 x4C, 0 x58, 0 xCF,
0 xD0, 0 xEF, 0 xAA, 0 xFB, 0 x43, 0 x4D, 0 x33, 0 x85, 0 x45, 0 xF9, 0 x02, 0 x7F, 0 x50, 0 x3C, 0 x9F, 0 xA8,
0 x51, 0 xA3, 0 x40, 0 x8F, 0 x92, 0 x9D, 0 x38, 0 xF5, 0 xBC, 0 xB6, 0 xDA, 0 x21, 0 x10, 0 xFF, 0 xF3, 0 xD2,
0 xCD, 0 x0C, 0 x13, 0 xEC, 0 x5F, 0 x97, 0 x44, 0 x17, 0 xC4, 0 xA7, 0 x7E, 0 x3D, 0 x64, 0 x5D, 0 x19, 0 x73,
0 x60, 0 x81, 0 x4F, 0 xDC, 0 x22, 0 x2A, 0 x90, 0 x88, 0 x46, 0 xEE, 0 xB8, 0 x14, 0 xDE, 0 x5E, 0 x0B, 0 xDB,
0 xE0, 0 x32, 0 x3A, 0 x0A, 0 x49, 0 x06, 0 x24, 0 x5C, 0 xC2, 0 xD3, 0 xAC, 0 x62, 0 x91, 0 x95, 0 xE4, 0 x79,
0 xE7, 0 xC8, 0 x37, 0 x6D, 0 x8D, 0 xD5, 0 x4E, 0 xA9, 0 x6C, 0 x56, 0 xF4, 0 xEA, 0 x65, 0 x7A, 0 xAE, 0 x08,
0 xBA, 0 x78, 0 x25, 0 x2E, 0 x1C, 0 xA6, 0 xB4, 0 xC6, 0 xE8, 0 xDD, 0 x74, 0 x1F, 0 x4B, 0 xBD, 0 x8B, 0 x8A,
0 x70, 0 x3E, 0 xB5, 0 x66, 0 x48, 0 x03, 0 xF6, 0 x0E, 0 x61, 0 x35, 0 x57, 0 xB9, 0 x86, 0 xC1, 0 x1D, 0 x9E,
0 xE1, 0 xF8, 0 x98, 0 x11, 0 x69, 0 xD9, 0 x8E, 0 x94, 0 x9B, 0 x1E, 0 x87, 0 xE9, 0 xCE, 0 x55, 0 x28, 0 xDF,
0 x8C, 0 xA1, 0 x89, 0 x0D, 0 xBF, 0 xE6, 0 x42, 0 x68, 0 x41, 0 x99, 0 x2D, 0 x0F, 0 xB0, 0 x54, 0 xBB, 0 x16,
};
static const uint8_t RevSbox[] = {
0 x52, 0 x09, 0 x6A, 0 xD5, 0 x30, 0 x36, 0 xA5, 0 x38, 0 xBF, 0 x40, 0 xA3, 0 x9E, 0 x81, 0 xF3, 0 xD7, 0 xFB,
0 x7C, 0 xE3, 0 x39, 0 x82, 0 x9B, 0 x2F, 0 xFF, 0 x87, 0 x34, 0 x8E, 0 x43, 0 x44, 0 xC4, 0 xDE, 0 xE9, 0 xCB,
0 x54, 0 x7B, 0 x94, 0 x32, 0 xA6, 0 xC2, 0 x23, 0 x3D, 0 xEE, 0 x4C, 0 x95, 0 x0B, 0 x42, 0 xFA, 0 xC3, 0 x4E,
0 x08, 0 x2E, 0 xA1, 0 x66, 0 x28, 0 xD9, 0 x24, 0 xB2, 0 x76, 0 x5B, 0 xA2, 0 x49, 0 x6D, 0 x8B, 0 xD1, 0 x25,
0 x72, 0 xF8, 0 xF6, 0 x64, 0 x86, 0 x68, 0 x98, 0 x16, 0 xD4, 0 xA4, 0 x5C, 0 xCC, 0 x5D, 0 x65, 0 xB6, 0 x92,
0 x6C, 0 x70, 0 x48, 0 x50, 0 xFD, 0 xED, 0 xB9, 0 xDA, 0 x5E, 0 x15, 0 x46, 0 x57, 0 xA7, 0 x8D, 0 x9D, 0 x84,
0 x90, 0 xD8, 0 xAB, 0 x00, 0 x8C, 0 xBC, 0 xD3, 0 x0A, 0 xF7, 0 xE4, 0 x58, 0 x05, 0 xB8, 0 xB3, 0 x45, 0 x06,
0 xD0, 0 x2C, 0 x1E, 0 x8F, 0 xCA, 0 x3F, 0 x0F, 0 x02, 0 xC1, 0 xAF, 0 xBD, 0 x03, 0 x01, 0 x13, 0 x8A, 0 x6B,
0 x3A, 0 x91, 0 x11, 0 x41, 0 x4F, 0 x67, 0 xDC, 0 xEA, 0 x97, 0 xF2, 0 xCF, 0 xCE, 0 xF0, 0 xB4, 0 xE6, 0 x73,
0 x96, 0 xAC, 0 x74, 0 x22, 0 xE7, 0 xAD, 0 x35, 0 x85, 0 xE2, 0 xF9, 0 x37, 0 xE8, 0 x1C, 0 x75, 0 xDF, 0 x6E,
0 x47, 0 xF1, 0 x1A, 0 x71, 0 x1D, 0 x29, 0 xC5, 0 x89, 0 x6F, 0 xB7, 0 x62, 0 x0E, 0 xAA, 0 x18, 0 xBE, 0 x1B,
0 xFC, 0 x56, 0 x3E, 0 x4B, 0 xC6, 0 xD2, 0 x79, 0 x20, 0 x9A, 0 xDB, 0 xC0, 0 xFE, 0 x78, 0 xCD, 0 x5A, 0 xF4,
0 x1F, 0 xDD, 0 xA8, 0 x33, 0 x88, 0 x07, 0 xC7, 0 x31, 0 xB1, 0 x12, 0 x10, 0 x59, 0 x27, 0 x80, 0 xEC, 0 x5F,
0 x60, 0 x51, 0 x7F, 0 xA9, 0 x19, 0 xB5, 0 x4A, 0 x0D, 0 x2D, 0 xE5, 0 x7A, 0 x9F, 0 x93, 0 xC9, 0 x9C, 0 xEF,
0 xA0, 0 xE0, 0 x3B, 0 x4D, 0 xAE, 0 x2A, 0 xF5, 0 xB0, 0 xC8, 0 xEB, 0 xBB, 0 x3C, 0 x83, 0 x53, 0 x99, 0 x61,
0 x17, 0 x2B, 0 x04, 0 x7E, 0 xBA, 0 x77, 0 xD6, 0 x26, 0 xE1, 0 x69, 0 x14, 0 x63, 0 x55, 0 x21, 0 x0C, 0 x7D,
};
static const uint32_t FwdTab0[] = { //other 3 tables are this same table, RORed 8, 16, and 24 bits respectively.
0 xC66363A5, 0 xF87C7C84, 0 xEE777799, 0 xF67B7B8D, 0 xFFF2F20D, 0 xD66B6BBD, 0 xDE6F6FB1, 0 x91C5C554,
0 x60303050, 0 x02010103, 0 xCE6767A9, 0 x562B2B7D, 0 xE7FEFE19, 0 xB5D7D762, 0 x4DABABE6, 0 xEC76769A,
0 x8FCACA45, 0 x1F82829D, 0 x89C9C940, 0 xFA7D7D87, 0 xEFFAFA15, 0 xB25959EB, 0 x8E4747C9, 0 xFBF0F00B,
0 x41ADADEC, 0 xB3D4D467, 0 x5FA2A2FD, 0 x45AFAFEA, 0 x239C9CBF, 0 x53A4A4F7, 0 xE4727296, 0 x9BC0C05B,
0 x75B7B7C2, 0 xE1FDFD1C, 0 x3D9393AE, 0 x4C26266A, 0 x6C36365A, 0 x7E3F3F41, 0 xF5F7F702, 0 x83CCCC4F,
0 x6834345C, 0 x51A5A5F4, 0 xD1E5E534, 0 xF9F1F108, 0 xE2717193, 0 xABD8D873, 0 x62313153, 0 x2A15153F,
0 x0804040C, 0 x95C7C752, 0 x46232365, 0 x9DC3C35E, 0 x30181828, 0 x379696A1, 0 x0A05050F, 0 x2F9A9AB5,
0 x0E070709, 0 x24121236, 0 x1B80809B, 0 xDFE2E23D, 0 xCDEBEB26, 0 x4E272769, 0 x7FB2B2CD, 0 xEA75759F,
0 x1209091B, 0 x1D83839E, 0 x582C2C74, 0 x341A1A2E, 0 x361B1B2D, 0 xDC6E6EB2, 0 xB45A5AEE, 0 x5BA0A0FB,
0 xA45252F6, 0 x763B3B4D, 0 xB7D6D661, 0 x7DB3B3CE, 0 x5229297B, 0 xDDE3E33E, 0 x5E2F2F71, 0 x13848497,
0 xA65353F5, 0 xB9D1D168, 0 x00000000, 0 xC1EDED2C, 0 x40202060, 0 xE3FCFC1F, 0 x79B1B1C8, 0 xB65B5BED,
0 xD46A6ABE, 0 x8DCBCB46, 0 x67BEBED9, 0 x7239394B, 0 x944A4ADE, 0 x984C4CD4, 0 xB05858E8, 0 x85CFCF4A,
0 xBBD0D06B, 0 xC5EFEF2A, 0 x4FAAAAE5, 0 xEDFBFB16, 0 x864343C5, 0 x9A4D4DD7, 0 x66333355, 0 x11858594,
0 x8A4545CF, 0 xE9F9F910, 0 x04020206, 0 xFE7F7F81, 0 xA05050F0, 0 x783C3C44, 0 x259F9FBA, 0 x4BA8A8E3,
0 xA25151F3, 0 x5DA3A3FE, 0 x804040C0, 0 x058F8F8A, 0 x3F9292AD, 0 x219D9DBC, 0 x70383848, 0 xF1F5F504,
0 x63BCBCDF, 0 x77B6B6C1, 0 xAFDADA75, 0 x42212163, 0 x20101030, 0 xE5FFFF1A, 0 xFDF3F30E, 0 xBFD2D26D,
0 x81CDCD4C, 0 x180C0C14, 0 x26131335, 0 xC3ECEC2F, 0 xBE5F5FE1, 0 x359797A2, 0 x884444CC, 0 x2E171739,
0 x93C4C457, 0 x55A7A7F2, 0 xFC7E7E82, 0 x7A3D3D47, 0 xC86464AC, 0 xBA5D5DE7, 0 x3219192B, 0 xE6737395,
0 xC06060A0, 0 x19818198, 0 x9E4F4FD1, 0 xA3DCDC7F, 0 x44222266, 0 x542A2A7E, 0 x3B9090AB, 0 x0B888883,
0 x8C4646CA, 0 xC7EEEE29, 0 x6BB8B8D3, 0 x2814143C, 0 xA7DEDE79, 0 xBC5E5EE2, 0 x160B0B1D, 0 xADDBDB76,
0 xDBE0E03B, 0 x64323256, 0 x743A3A4E, 0 x140A0A1E, 0 x924949DB, 0 x0C06060A, 0 x4824246C, 0 xB85C5CE4,
0 x9FC2C25D, 0 xBDD3D36E, 0 x43ACACEF, 0 xC46262A6, 0 x399191A8, 0 x319595A4, 0 xD3E4E437, 0 xF279798B,
0 xD5E7E732, 0 x8BC8C843, 0 x6E373759, 0 xDA6D6DB7, 0 x018D8D8C, 0 xB1D5D564, 0 x9C4E4ED2, 0 x49A9A9E0,
0 xD86C6CB4, 0 xAC5656FA, 0 xF3F4F407, 0 xCFEAEA25, 0 xCA6565AF, 0 xF47A7A8E, 0 x47AEAEE9, 0 x10080818,
0 x6FBABAD5, 0 xF0787888, 0 x4A25256F, 0 x5C2E2E72, 0 x381C1C24, 0 x57A6A6F1, 0 x73B4B4C7, 0 x97C6C651,
0 xCBE8E823, 0 xA1DDDD7C, 0 xE874749C, 0 x3E1F1F21, 0 x964B4BDD, 0 x61BDBDDC, 0 x0D8B8B86, 0 x0F8A8A85,
0 xE0707090, 0 x7C3E3E42, 0 x71B5B5C4, 0 xCC6666AA, 0 x904848D8, 0 x06030305, 0 xF7F6F601, 0 x1C0E0E12,
0 xC26161A3, 0 x6A35355F, 0 xAE5757F9, 0 x69B9B9D0, 0 x17868691, 0 x99C1C158, 0 x3A1D1D27, 0 x279E9EB9,
0 xD9E1E138, 0 xEBF8F813, 0 x2B9898B3, 0 x22111133, 0 xD26969BB, 0 xA9D9D970, 0 x078E8E89, 0 x339494A7,
0 x2D9B9BB6, 0 x3C1E1E22, 0 x15878792, 0 xC9E9E920, 0 x87CECE49, 0 xAA5555FF, 0 x50282878, 0 xA5DFDF7A,
0 x038C8C8F, 0 x59A1A1F8, 0 x09898980, 0 x1A0D0D17, 0 x65BFBFDA, 0 xD7E6E631, 0 x844242C6, 0 xD06868B8,
0 x824141C3, 0 x299999B0, 0 x5A2D2D77, 0 x1E0F0F11, 0 x7BB0B0CB, 0 xA85454FC, 0 x6DBBBBD6, 0 x2C16163A,
};
static const uint32_t RevTab0[] = { //other 3 tables are this same table, RORed 8, 16, and 24 bits respectively.
0 x51F4A750, 0 x7E416553, 0 x1A17A4C3, 0 x3A275E96, 0 x3BAB6BCB, 0 x1F9D45F1, 0 xACFA58AB, 0 x4BE30393,
0 x2030FA55, 0 xAD766DF6, 0 x88CC7691, 0 xF5024C25, 0 x4FE5D7FC, 0 xC52ACBD7, 0 x26354480, 0 xB562A38F,
0 xDEB15A49, 0 x25BA1B67, 0 x45EA0E98, 0 x5DFEC0E1, 0 xC32F7502, 0 x814CF012, 0 x8D4697A3, 0 x6BD3F9C6,
0 x038F5FE7, 0 x15929C95, 0 xBF6D7AEB, 0 x955259DA, 0 xD4BE832D, 0 x587421D3, 0 x49E06929, 0 x8EC9C844,
0 x75C2896A, 0 xF48E7978, 0 x99583E6B, 0 x27B971DD, 0 xBEE14FB6, 0 xF088AD17, 0 xC920AC66, 0 x7DCE3AB4,
0 x63DF4A18, 0 xE51A3182, 0 x97513360, 0 x62537F45, 0 xB16477E0, 0 xBB6BAE84, 0 xFE81A01C, 0 xF9082B94,
0 x70486858, 0 x8F45FD19, 0 x94DE6C87, 0 x527BF8B7, 0 xAB73D323, 0 x724B02E2, 0 xE31F8F57, 0 x6655AB2A,
0 xB2EB2807, 0 x2FB5C203, 0 x86C57B9A, 0 xD33708A5, 0 x302887F2, 0 x23BFA5B2, 0 x02036ABA, 0 xED16825C,
0 x8ACF1C2B, 0 xA779B492, 0 xF307F2F0, 0 x4E69E2A1, 0 x65DAF4CD, 0 x0605BED5, 0 xD134621F, 0 xC4A6FE8A,
0 x342E539D, 0 xA2F355A0, 0 x058AE132, 0 xA4F6EB75, 0 x0B83EC39, 0 x4060EFAA, 0 x5E719F06, 0 xBD6E1051,
0 x3E218AF9, 0 x96DD063D, 0 xDD3E05AE, 0 x4DE6BD46, 0 x91548DB5, 0 x71C45D05, 0 x0406D46F, 0 x605015FF,
0 x1998FB24, 0 xD6BDE997, 0 x894043CC, 0 x67D99E77, 0 xB0E842BD, 0 x07898B88, 0 xE7195B38, 0 x79C8EEDB,
0 xA17C0A47, 0 x7C420FE9, 0 xF8841EC9, 0 x00000000, 0 x09808683, 0 x322BED48, 0 x1E1170AC, 0 x6C5A724E,
0 xFD0EFFFB, 0 x0F853856, 0 x3DAED51E, 0 x362D3927, 0 x0A0FD964, 0 x685CA621, 0 x9B5B54D1, 0 x24362E3A,
0 x0C0A67B1, 0 x9357E70F, 0 xB4EE96D2, 0 x1B9B919E, 0 x80C0C54F, 0 x61DC20A2, 0 x5A774B69, 0 x1C121A16,
0 xE293BA0A, 0 xC0A02AE5, 0 x3C22E043, 0 x121B171D, 0 x0E090D0B, 0 xF28BC7AD, 0 x2DB6A8B9, 0 x141EA9C8,
0 x57F11985, 0 xAF75074C, 0 xEE99DDBB, 0 xA37F60FD, 0 xF701269F, 0 x5C72F5BC, 0 x44663BC5, 0 x5BFB7E34,
0 x8B432976, 0 xCB23C6DC, 0 xB6EDFC68, 0 xB8E4F163, 0 xD731DCCA, 0 x42638510, 0 x13972240, 0 x84C61120,
0 x854A247D, 0 xD2BB3DF8, 0 xAEF93211, 0 xC729A16D, 0 x1D9E2F4B, 0 xDCB230F3, 0 x0D8652EC, 0 x77C1E3D0,
0 x2BB3166C, 0 xA970B999, 0 x119448FA, 0 x47E96422, 0 xA8FC8CC4, 0 xA0F03F1A, 0 x567D2CD8, 0 x223390EF,
0 x87494EC7, 0 xD938D1C1, 0 x8CCAA2FE, 0 x98D40B36, 0 xA6F581CF, 0 xA57ADE28, 0 xDAB78E26, 0 x3FADBFA4,
0 x2C3A9DE4, 0 x5078920D, 0 x6A5FCC9B, 0 x547E4662, 0 xF68D13C2, 0 x90D8B8E8, 0 x2E39F75E, 0 x82C3AFF5,
0 x9F5D80BE, 0 x69D0937C, 0 x6FD52DA9, 0 xCF2512B3, 0 xC8AC993B, 0 x10187DA7, 0 xE89C636E, 0 xDB3BBB7B,
0 xCD267809, 0 x6E5918F4, 0 xEC9AB701, 0 x834F9AA8, 0 xE6956E65, 0 xAAFFE67E, 0 x21BCCF08, 0 xEF15E8E6,
0 xBAE79BD9, 0 x4A6F36CE, 0 xEA9F09D4, 0 x29B07CD6, 0 x31A4B2AF, 0 x2A3F2331, 0 xC6A59430, 0 x35A266C0,
0 x744EBC37, 0 xFC82CAA6, 0 xE090D0B0, 0 x33A7D815, 0 xF104984A, 0 x41ECDAF7, 0 x7FCD500E, 0 x1791F62F,
0 x764DD68D, 0 x43EFB04D, 0 xCCAA4D54, 0 xE49604DF, 0 x9ED1B5E3, 0 x4C6A881B, 0 xC12C1FB8, 0 x4665517F,
0 x9D5EEA04, 0 x018C355D, 0 xFA877473, 0 xFB0B412E, 0 xB3671D5A, 0 x92DBD252, 0 xE9105633, 0 x6DD64713,
0 x9AD7618C, 0 x37A10C7A, 0 x59F8148E, 0 xEB133C89, 0 xCEA927EE, 0 xB761C935, 0 xE11CE5ED, 0 x7A47B13C,
0 x9CD2DF59, 0 x55F2733F, 0 x1814CE79, 0 x73C737BF, 0 x53F7CDEA, 0 x5FFDAA5B, 0 xDF3D6F14, 0 x7844DB86,
0 xCAAFF381, 0 xB968C43E, 0 x3824342C, 0 xC2A3405F, 0 x161DC372, 0 xBCE2250C, 0 x283C498B, 0 xFF0D9541,
0 x39A80171, 0 x080CB3DE, 0 xD8B4E49C, 0 x6456C190, 0 x7BCB8461, 0 xD532B670, 0 x486C5C74, 0 xD0B85742,
};
#ifdef ARM
#define STRINFIGY2(b) #b
#define STRINGIFY(b) STRINFIGY2(b)
#define ror(v, b) ({uint32_t ret; if (b) asm ("ror %0, #" STRINGIFY(b) :"=r" (ret):"0" (v)); else ret = v; ret;})
#else
inline static uint32_t ror(uint32_t val, uint32_t by)
{
if (!by)
return val;
val = (val >> by) | (val << (32 - by));
return val;
}
#endif
void aesInitForEncr(struct AesContext *ctx, const uint32_t *k)
{
uint32_t i, *ks = ctx->K, roundConstant = 0 x01000000;
//first 8 words are just the key itself
memcpy(ctx->K, k, sizeof (uint32_t[AES_KEY_WORDS]));
//create round keys for encryption
for (i = 0 ; i < 7 ; i++, ks += 8 , roundConstant <<= 1 ) {
ks[8 ] = ks[0 ] ^ roundConstant
^ (((uint32_t)FwdSbox[(ks[ 7 ] >> 16 ) & 0 xff]) << 24 )
^ (((uint32_t)FwdSbox[(ks[ 7 ] >> 8 ) & 0 xff]) << 16 )
^ (((uint32_t)FwdSbox[(ks[ 7 ] >> 0 ) & 0 xff]) << 8 )
^ (((uint32_t)FwdSbox[(ks[ 7 ] >> 24 ) & 0 xff]) << 0 );
ks[9 ] = ks[1 ] ^ ks[8 ];
ks[10 ] = ks[2 ] ^ ks[9 ];
ks[11 ] = ks[3 ] ^ ks[10 ];
ks[12 ] = ks[4 ]
^ (((uint32_t)FwdSbox[(ks[11 ] >> 24 ) & 0 xff]) << 24 )
^ (((uint32_t)FwdSbox[(ks[11 ] >> 16 ) & 0 xff]) << 16 )
^ (((uint32_t)FwdSbox[(ks[11 ] >> 8 ) & 0 xff]) << 8 )
^ (((uint32_t)FwdSbox[(ks[11 ] >> 0 ) & 0 xff]) << 0 );
ks[13 ] = ks[5 ] ^ ks[12 ];
ks[14 ] = ks[6 ] ^ ks[13 ];
ks[15 ] = ks[7 ] ^ ks[14 ];
}
}
void aesInitForDecr(struct AesContext *ctx, struct AesSetupTempWorksSpace *tmpSpace, const uint32_t *k)
{
uint32_t i, j, *ks = ctx->K + 4 , *encrK = tmpSpace->tmpCtx.K + 52 ;
//we need encryption keys to calculate decryption keys
aesInitForEncr(&tmpSpace->tmpCtx, k);
//now we can calculate round keys for decryption
memcpy(ctx->K, tmpSpace->tmpCtx.K + 56 , sizeof (uint32_t[4 ]));
for (i = 0 ; i < AES_NUM_ROUNDS - 1 ; i++, encrK -= 4 , ks += 4 ) { //num_rounds-1 seems to be concensus, but num_rounds make more sense...
for (j = 0 ; j < 4 ; j++) {
ks[j] =
ror(RevTab0[FwdSbox[(encrK[j] >> 24 ) & 0 xff]], 0 ) ^
ror(RevTab0[FwdSbox[(encrK[j] >> 16 ) & 0 xff]], 8 ) ^
ror(RevTab0[FwdSbox[(encrK[j] >> 8 ) & 0 xff]], 16 ) ^
ror(RevTab0[FwdSbox[(encrK[j] >> 0 ) & 0 xff]], 24 );
}
}
memcpy(ks, encrK, sizeof (uint32_t[4 ]));
}
void aesEncr(struct AesContext *ctx, const uint32_t *src, uint32_t *dst)
{
uint32_t x0, x1, x2, x3; //we CAN use an array, but then GCC will not use registers. so we use separate vars. sigh...
uint32_t *k = ctx->K, i;
//setup
x0 = *src++ ^ *k++;
x1 = *src++ ^ *k++;
x2 = *src++ ^ *k++;
x3 = *src++ ^ *k++;
//all-but-last round
for (i = 0 ; i < AES_NUM_ROUNDS - 1 ; i++) {
uint32_t t0, t1, t2;
t0 = *k++ ^
ror(FwdTab0[(x0 >> 24 ) & 0 xff], 0 ) ^
ror(FwdTab0[(x1 >> 16 ) & 0 xff], 8 ) ^
ror(FwdTab0[(x2 >> 8 ) & 0 xff], 16 ) ^
ror(FwdTab0[(x3 >> 0 ) & 0 xff], 24 );
t1 = *k++ ^
ror(FwdTab0[(x1 >> 24 ) & 0 xff], 0 ) ^
ror(FwdTab0[(x2 >> 16 ) & 0 xff], 8 ) ^
ror(FwdTab0[(x3 >> 8 ) & 0 xff], 16 ) ^
ror(FwdTab0[(x0 >> 0 ) & 0 xff], 24 );
t2 = *k++ ^
ror(FwdTab0[(x2 >> 24 ) & 0 xff], 0 ) ^
ror(FwdTab0[(x3 >> 16 ) & 0 xff], 8 ) ^
ror(FwdTab0[(x0 >> 8 ) & 0 xff], 16 ) ^
ror(FwdTab0[(x1 >> 0 ) & 0 xff], 24 );
x3 = *k++ ^
ror(FwdTab0[(x3 >> 24 ) & 0 xff], 0 ) ^
ror(FwdTab0[(x0 >> 16 ) & 0 xff], 8 ) ^
ror(FwdTab0[(x1 >> 8 ) & 0 xff], 16 ) ^
ror(FwdTab0[(x2 >> 0 ) & 0 xff], 24 );
x0 = t0;
x1 = t1;
x2 = t2;
}
//last round
*dst++ = *k++ ^
(((uint32_t)(FwdSbox[(x0 >> 24 ) & 0 xff])) << 24 ) ^
(((uint32_t)(FwdSbox[(x1 >> 16 ) & 0 xff])) << 16 ) ^
(((uint32_t)(FwdSbox[(x2 >> 8 ) & 0 xff])) << 8 ) ^
(((uint32_t)(FwdSbox[(x3 >> 0 ) & 0 xff])) << 0 );
*dst++ = *k++ ^
(((uint32_t)(FwdSbox[(x1 >> 24 ) & 0 xff])) << 24 ) ^
(((uint32_t)(FwdSbox[(x2 >> 16 ) & 0 xff])) << 16 ) ^
(((uint32_t)(FwdSbox[(x3 >> 8 ) & 0 xff])) << 8 ) ^
(((uint32_t)(FwdSbox[(x0 >> 0 ) & 0 xff])) << 0 );
*dst++ = *k++ ^
(((uint32_t)(FwdSbox[(x2 >> 24 ) & 0 xff])) << 24 ) ^
(((uint32_t)(FwdSbox[(x3 >> 16 ) & 0 xff])) << 16 ) ^
(((uint32_t)(FwdSbox[(x0 >> 8 ) & 0 xff])) << 8 ) ^
(((uint32_t)(FwdSbox[(x1 >> 0 ) & 0 xff])) << 0 );
*dst++ = *k++ ^
(((uint32_t)(FwdSbox[(x3 >> 24 ) & 0 xff])) << 24 ) ^
(((uint32_t)(FwdSbox[(x0 >> 16 ) & 0 xff])) << 16 ) ^
(((uint32_t)(FwdSbox[(x1 >> 8 ) & 0 xff])) << 8 ) ^
(((uint32_t)(FwdSbox[(x2 >> 0 ) & 0 xff])) << 0 );
}
void aesDecr(struct AesContext *ctx, const uint32_t *src, uint32_t *dst)
{
uint32_t x0, x1, x2, x3;
uint32_t *k = ctx->K, i;
//setup
x0 = *src++ ^ *k++;
x1 = *src++ ^ *k++;
x2 = *src++ ^ *k++;
x3 = *src++ ^ *k++;
//all-but-last round
for (i = 0 ; i < AES_NUM_ROUNDS - 1 ; i++) {
uint32_t t0, t1, t2;
t0 = *k++ ^
ror(RevTab0[(x0 >> 24 ) & 0 xff], 0 ) ^
ror(RevTab0[(x3 >> 16 ) & 0 xff], 8 ) ^
ror(RevTab0[(x2 >> 8 ) & 0 xff], 16 ) ^
ror(RevTab0[(x1 >> 0 ) & 0 xff], 24 );
t1 = *k++ ^
ror(RevTab0[(x1 >> 24 ) & 0 xff], 0 ) ^
ror(RevTab0[(x0 >> 16 ) & 0 xff], 8 ) ^
ror(RevTab0[(x3 >> 8 ) & 0 xff], 16 ) ^
ror(RevTab0[(x2 >> 0 ) & 0 xff], 24 );
t2 = *k++ ^
ror(RevTab0[(x2 >> 24 ) & 0 xff], 0 ) ^
ror(RevTab0[(x1 >> 16 ) & 0 xff], 8 ) ^
ror(RevTab0[(x0 >> 8 ) & 0 xff], 16 ) ^
ror(RevTab0[(x3 >> 0 ) & 0 xff], 24 );
x3 = *k++ ^
ror(RevTab0[(x3 >> 24 ) & 0 xff], 0 ) ^
ror(RevTab0[(x2 >> 16 ) & 0 xff], 8 ) ^
ror(RevTab0[(x1 >> 8 ) & 0 xff], 16 ) ^
ror(RevTab0[(x0 >> 0 ) & 0 xff], 24 );
x0 = t0;
x1 = t1;
x2 = t2;
}
//last round
*dst++ = *k++ ^
(((uint32_t)(RevSbox[(x0 >> 24 ) & 0 xff])) << 24 ) ^
(((uint32_t)(RevSbox[(x3 >> 16 ) & 0 xff])) << 16 ) ^
(((uint32_t)(RevSbox[(x2 >> 8 ) & 0 xff])) << 8 ) ^
(((uint32_t)(RevSbox[(x1 >> 0 ) & 0 xff])) << 0 );
*dst++ = *k++ ^
(((uint32_t)(RevSbox[(x1 >> 24 ) & 0 xff])) << 24 ) ^
(((uint32_t)(RevSbox[(x0 >> 16 ) & 0 xff])) << 16 ) ^
(((uint32_t)(RevSbox[(x3 >> 8 ) & 0 xff])) << 8 ) ^
(((uint32_t)(RevSbox[(x2 >> 0 ) & 0 xff])) << 0 );
*dst++ = *k++ ^
(((uint32_t)(RevSbox[(x2 >> 24 ) & 0 xff])) << 24 ) ^
(((uint32_t)(RevSbox[(x1 >> 16 ) & 0 xff])) << 16 ) ^
(((uint32_t)(RevSbox[(x0 >> 8 ) & 0 xff])) << 8 ) ^
(((uint32_t)(RevSbox[(x3 >> 0 ) & 0 xff])) << 0 );
*dst++ = *k++ ^
(((uint32_t)(RevSbox[(x3 >> 24 ) & 0 xff])) << 24 ) ^
(((uint32_t)(RevSbox[(x2 >> 16 ) & 0 xff])) << 16 ) ^
(((uint32_t)(RevSbox[(x1 >> 8 ) & 0 xff])) << 8 ) ^
(((uint32_t)(RevSbox[(x0 >> 0 ) & 0 xff])) << 0 );
}
void aesCbcInitForEncr(struct AesCbcContext *ctx, const uint32_t *k, const uint32_t *iv)
{
aesInitForEncr(&ctx->aes, k);
memcpy(ctx->iv, iv, sizeof (uint32_t[AES_BLOCK_WORDS]));
}
void aesCbcInitForDecr(struct AesCbcContext *ctx, const uint32_t *k, const uint32_t *iv)
{
struct AesSetupTempWorksSpace tmp;
aesInitForDecr(&ctx->aes, &tmp, k);
memcpy(ctx->iv, iv, sizeof (uint32_t[AES_BLOCK_WORDS]));
}
void aesCbcEncr(struct AesCbcContext *ctx, const uint32_t *src, uint32_t *dst)
{
uint32_t i;
for (i = 0 ; i < AES_BLOCK_WORDS; i++)
ctx->iv[i] ^= *src++;
aesEncr(&ctx->aes, ctx->iv, dst);
memcpy(ctx->iv, dst, sizeof (uint32_t[AES_BLOCK_WORDS]));
}
void aesCbcDecr(struct AesCbcContext *ctx, const uint32_t *src, uint32_t *dst)
{
uint32_t i, tmp[AES_BLOCK_WORDS];
aesDecr(&ctx->aes, src, tmp);
for (i = 0 ; i < AES_BLOCK_WORDS; i++)
tmp[i] ^= ctx->iv[i];
memcpy(ctx->iv, src, sizeof (uint32_t[AES_BLOCK_WORDS]));
memcpy(dst, tmp, sizeof (uint32_t[AES_BLOCK_WORDS]));
}
Messung V0.5 in Prozent C=91 H=95 G=92
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-06-27)
¤
*© Formatika GbR, Deutschland