LMiC adapted to work with SX1272MB2xAS LoRa shield.

Fork of LMiC by Timothy Mulrooney

Committer:
mluis
Date:
Tue Mar 31 13:36:56 2015 +0000
Revision:
1:d3b7bde3995c
Parent:
0:62d1edcc13d1
Child:
8:5879e83f632a
Updated LMiC to release v1.4 (http://www.zurich.ibm.com/pdf/lrsc/lmic-release-v1.4.zip)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mluis 0:62d1edcc13d1 1 /*******************************************************************************
mluis 1:d3b7bde3995c 2 * Copyright (c) 2014-2015 IBM Corporation.
mluis 0:62d1edcc13d1 3 * All rights reserved. This program and the accompanying materials
mluis 0:62d1edcc13d1 4 * are made available under the terms of the Eclipse Public License v1.0
mluis 0:62d1edcc13d1 5 * which accompanies this distribution, and is available at
mluis 0:62d1edcc13d1 6 * http://www.eclipse.org/legal/epl-v10.html
mluis 0:62d1edcc13d1 7 *
mluis 0:62d1edcc13d1 8 * Contributors:
mluis 0:62d1edcc13d1 9 * IBM Zurich Research Lab - initial API, implementation and documentation
mluis 0:62d1edcc13d1 10 *******************************************************************************/
mluis 0:62d1edcc13d1 11
mluis 0:62d1edcc13d1 12 #include "oslmic.h"
mluis 0:62d1edcc13d1 13
mluis 0:62d1edcc13d1 14 #define AES_MICSUB 0x30 // internal use only
mluis 0:62d1edcc13d1 15
mluis 0:62d1edcc13d1 16 static const u4_t AES_RCON[10] = {
mluis 0:62d1edcc13d1 17 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
mluis 0:62d1edcc13d1 18 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000
mluis 0:62d1edcc13d1 19 };
mluis 0:62d1edcc13d1 20
mluis 0:62d1edcc13d1 21 static const u1_t AES_S[256] = {
mluis 0:62d1edcc13d1 22 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
mluis 0:62d1edcc13d1 23 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
mluis 0:62d1edcc13d1 24 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
mluis 0:62d1edcc13d1 25 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
mluis 0:62d1edcc13d1 26 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
mluis 0:62d1edcc13d1 27 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
mluis 0:62d1edcc13d1 28 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
mluis 0:62d1edcc13d1 29 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
mluis 0:62d1edcc13d1 30 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
mluis 0:62d1edcc13d1 31 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
mluis 0:62d1edcc13d1 32 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
mluis 0:62d1edcc13d1 33 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
mluis 0:62d1edcc13d1 34 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
mluis 0:62d1edcc13d1 35 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
mluis 0:62d1edcc13d1 36 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
mluis 0:62d1edcc13d1 37 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16,
mluis 0:62d1edcc13d1 38 };
mluis 0:62d1edcc13d1 39
mluis 0:62d1edcc13d1 40 static const u4_t AES_E1[256] = {
mluis 0:62d1edcc13d1 41 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554,
mluis 0:62d1edcc13d1 42 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A,
mluis 0:62d1edcc13d1 43 0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B,
mluis 0:62d1edcc13d1 44 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, 0xE4727296, 0x9BC0C05B,
mluis 0:62d1edcc13d1 45 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F,
mluis 0:62d1edcc13d1 46 0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F,
mluis 0:62d1edcc13d1 47 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, 0x0A05050F, 0x2F9A9AB5,
mluis 0:62d1edcc13d1 48 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F,
mluis 0:62d1edcc13d1 49 0x1209091B, 0x1D83839E, 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB,
mluis 0:62d1edcc13d1 50 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497,
mluis 0:62d1edcc13d1 51 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED,
mluis 0:62d1edcc13d1 52 0xD46A6ABE, 0x8DCBCB46, 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A,
mluis 0:62d1edcc13d1 53 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594,
mluis 0:62d1edcc13d1 54 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3,
mluis 0:62d1edcc13d1 55 0xA25151F3, 0x5DA3A3FE, 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504,
mluis 0:62d1edcc13d1 56 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D,
mluis 0:62d1edcc13d1 57 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739,
mluis 0:62d1edcc13d1 58 0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395,
mluis 0:62d1edcc13d1 59 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, 0x3B9090AB, 0x0B888883,
mluis 0:62d1edcc13d1 60 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76,
mluis 0:62d1edcc13d1 61 0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4,
mluis 0:62d1edcc13d1 62 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, 0xD3E4E437, 0xF279798B,
mluis 0:62d1edcc13d1 63 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0,
mluis 0:62d1edcc13d1 64 0xD86C6CB4, 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818,
mluis 0:62d1edcc13d1 65 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651,
mluis 0:62d1edcc13d1 66 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85,
mluis 0:62d1edcc13d1 67 0xE0707090, 0x7C3E3E42, 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12,
mluis 0:62d1edcc13d1 68 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9,
mluis 0:62d1edcc13d1 69 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7,
mluis 0:62d1edcc13d1 70 0x2D9B9BB6, 0x3C1E1E22, 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A,
mluis 0:62d1edcc13d1 71 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, 0x844242C6, 0xD06868B8,
mluis 0:62d1edcc13d1 72 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A,
mluis 0:62d1edcc13d1 73 };
mluis 0:62d1edcc13d1 74
mluis 0:62d1edcc13d1 75 static const u4_t AES_E2[256] = {
mluis 0:62d1edcc13d1 76 0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5,
mluis 0:62d1edcc13d1 77 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, 0x9AEC7676,
mluis 0:62d1edcc13d1 78 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0,
mluis 0:62d1edcc13d1 79 0xEC41ADAD, 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0,
mluis 0:62d1edcc13d1 80 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC,
mluis 0:62d1edcc13d1 81 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515,
mluis 0:62d1edcc13d1 82 0x0C080404, 0x5295C7C7, 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A,
mluis 0:62d1edcc13d1 83 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575,
mluis 0:62d1edcc13d1 84 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0,
mluis 0:62d1edcc13d1 85 0xF6A45252, 0x4D763B3B, 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484,
mluis 0:62d1edcc13d1 86 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B,
mluis 0:62d1edcc13d1 87 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF,
mluis 0:62d1edcc13d1 88 0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585,
mluis 0:62d1edcc13d1 89 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, 0xBA259F9F, 0xE34BA8A8,
mluis 0:62d1edcc13d1 90 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5,
mluis 0:62d1edcc13d1 91 0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2,
mluis 0:62d1edcc13d1 92 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, 0xCC884444, 0x392E1717,
mluis 0:62d1edcc13d1 93 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373,
mluis 0:62d1edcc13d1 94 0xA0C06060, 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888,
mluis 0:62d1edcc13d1 95 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB,
mluis 0:62d1edcc13d1 96 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C,
mluis 0:62d1edcc13d1 97 0x5D9FC2C2, 0x6EBDD3D3, 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979,
mluis 0:62d1edcc13d1 98 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9,
mluis 0:62d1edcc13d1 99 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808,
mluis 0:62d1edcc13d1 100 0xD56FBABA, 0x88F07878, 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6,
mluis 0:62d1edcc13d1 101 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A,
mluis 0:62d1edcc13d1 102 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E,
mluis 0:62d1edcc13d1 103 0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E,
mluis 0:62d1edcc13d1 104 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, 0x89078E8E, 0xA7339494,
mluis 0:62d1edcc13d1 105 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF,
mluis 0:62d1edcc13d1 106 0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868,
mluis 0:62d1edcc13d1 107 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, 0x3A2C1616,
mluis 0:62d1edcc13d1 108 };
mluis 0:62d1edcc13d1 109
mluis 0:62d1edcc13d1 110 static const u4_t AES_E3[256] = {
mluis 0:62d1edcc13d1 111 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5,
mluis 0:62d1edcc13d1 112 0x30506030, 0x01030201, 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76,
mluis 0:62d1edcc13d1 113 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0,
mluis 0:62d1edcc13d1 114 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0,
mluis 0:62d1edcc13d1 115 0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC,
mluis 0:62d1edcc13d1 116 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, 0x31536231, 0x153F2A15,
mluis 0:62d1edcc13d1 117 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A,
mluis 0:62d1edcc13d1 118 0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75,
mluis 0:62d1edcc13d1 119 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, 0x5AEEB45A, 0xA0FB5BA0,
mluis 0:62d1edcc13d1 120 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384,
mluis 0:62d1edcc13d1 121 0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B,
mluis 0:62d1edcc13d1 122 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, 0x58E8B058, 0xCF4A85CF,
mluis 0:62d1edcc13d1 123 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185,
mluis 0:62d1edcc13d1 124 0x45CF8A45, 0xF910E9F9, 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8,
mluis 0:62d1edcc13d1 125 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5,
mluis 0:62d1edcc13d1 126 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2,
mluis 0:62d1edcc13d1 127 0xCD4C81CD, 0x0C14180C, 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17,
mluis 0:62d1edcc13d1 128 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673,
mluis 0:62d1edcc13d1 129 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88,
mluis 0:62d1edcc13d1 130 0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB,
mluis 0:62d1edcc13d1 131 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, 0x246C4824, 0x5CE4B85C,
mluis 0:62d1edcc13d1 132 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279,
mluis 0:62d1edcc13d1 133 0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9,
mluis 0:62d1edcc13d1 134 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, 0xAEE947AE, 0x08181008,
mluis 0:62d1edcc13d1 135 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6,
mluis 0:62d1edcc13d1 136 0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A,
mluis 0:62d1edcc13d1 137 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, 0xF601F7F6, 0x0E121C0E,
mluis 0:62d1edcc13d1 138 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E,
mluis 0:62d1edcc13d1 139 0xE138D9E1, 0xF813EBF8, 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394,
mluis 0:62d1edcc13d1 140 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF,
mluis 0:62d1edcc13d1 141 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068,
mluis 0:62d1edcc13d1 142 0x41C38241, 0x99B02999, 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16,
mluis 0:62d1edcc13d1 143 };
mluis 0:62d1edcc13d1 144
mluis 0:62d1edcc13d1 145 static const u4_t AES_E4[256] = {
mluis 0:62d1edcc13d1 146 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491,
mluis 0:62d1edcc13d1 147 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC,
mluis 0:62d1edcc13d1 148 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB,
mluis 0:62d1edcc13d1 149 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B,
mluis 0:62d1edcc13d1 150 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83,
mluis 0:62d1edcc13d1 151 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A,
mluis 0:62d1edcc13d1 152 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F,
mluis 0:62d1edcc13d1 153 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA,
mluis 0:62d1edcc13d1 154 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B,
mluis 0:62d1edcc13d1 155 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713,
mluis 0:62d1edcc13d1 156 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6,
mluis 0:62d1edcc13d1 157 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85,
mluis 0:62d1edcc13d1 158 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411,
mluis 0:62d1edcc13d1 159 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B,
mluis 0:62d1edcc13d1 160 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1,
mluis 0:62d1edcc13d1 161 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF,
mluis 0:62d1edcc13d1 162 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E,
mluis 0:62d1edcc13d1 163 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6,
mluis 0:62d1edcc13d1 164 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B,
mluis 0:62d1edcc13d1 165 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD,
mluis 0:62d1edcc13d1 166 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8,
mluis 0:62d1edcc13d1 167 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2,
mluis 0:62d1edcc13d1 168 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049,
mluis 0:62d1edcc13d1 169 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810,
mluis 0:62d1edcc13d1 170 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197,
mluis 0:62d1edcc13d1 171 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F,
mluis 0:62d1edcc13d1 172 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C,
mluis 0:62d1edcc13d1 173 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927,
mluis 0:62d1edcc13d1 174 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733,
mluis 0:62d1edcc13d1 175 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5,
mluis 0:62d1edcc13d1 176 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0,
mluis 0:62d1edcc13d1 177 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C,
mluis 0:62d1edcc13d1 178 };
mluis 0:62d1edcc13d1 179
mluis 0:62d1edcc13d1 180 #define msbf4_read(p) ((p)[0]<<24 | (p)[1]<<16 | (p)[2]<<8 | (p)[3])
mluis 0:62d1edcc13d1 181 #define msbf4_write(p,v) (p)[0]=(v)>>24,(p)[1]=(v)>>16,(p)[2]=(v)>>8,(p)[3]=(v)
mluis 0:62d1edcc13d1 182 #define swapmsbf(x) ( (x&0xFF)<<24 | (x&0xFF00)<<8 | (x&0xFF0000)>>8 | (x>>24) )
mluis 0:62d1edcc13d1 183
mluis 1:d3b7bde3995c 184 #define u1(v) ((u1_t)(v))
mluis 0:62d1edcc13d1 185
mluis 0:62d1edcc13d1 186 #define AES_key4(r1,r2,r3,r0,i) r1 = ki[i+1]; \
mluis 0:62d1edcc13d1 187 r2 = ki[i+2]; \
mluis 0:62d1edcc13d1 188 r3 = ki[i+3]; \
mluis 0:62d1edcc13d1 189 r0 = ki[i]
mluis 0:62d1edcc13d1 190
mluis 1:d3b7bde3995c 191 #define AES_expr4(r1,r2,r3,r0,i) r1 ^= AES_E4[u1(i)]; \
mluis 1:d3b7bde3995c 192 r2 ^= AES_E3[u1(i>>8)]; \
mluis 1:d3b7bde3995c 193 r3 ^= AES_E2[u1(i>>16)]; \
mluis 1:d3b7bde3995c 194 r0 ^= AES_E1[ (i>>24)]
mluis 0:62d1edcc13d1 195
mluis 0:62d1edcc13d1 196 #define AES_expr(a,r0,r1,r2,r3,i) a = ki[i]; \
mluis 1:d3b7bde3995c 197 a ^= (AES_S[ r0>>24 ]<<24); \
mluis 1:d3b7bde3995c 198 a ^= (AES_S[u1(r1>>16)]<<16); \
mluis 1:d3b7bde3995c 199 a ^= (AES_S[u1(r2>> 8)]<< 8); \
mluis 1:d3b7bde3995c 200 a ^= AES_S[u1(r3) ]
mluis 0:62d1edcc13d1 201
mluis 0:62d1edcc13d1 202 // global area for passing parameters (aux, key) and for storing round keys
mluis 0:62d1edcc13d1 203 u4_t AESAUX[16/sizeof(u4_t)];
mluis 0:62d1edcc13d1 204 u4_t AESKEY[11*16/sizeof(u4_t)];
mluis 0:62d1edcc13d1 205
mluis 0:62d1edcc13d1 206 // generate 1+10 roundkeys for encryption with 128-bit key
mluis 0:62d1edcc13d1 207 // read 128-bit key from AESKEY in MSBF, generate roundkey words in place
mluis 1:d3b7bde3995c 208 static void aesroundkeys () {
mluis 0:62d1edcc13d1 209 int i;
mluis 0:62d1edcc13d1 210 u4_t b;
mluis 0:62d1edcc13d1 211
mluis 0:62d1edcc13d1 212 for( i=0; i<4; i++) {
mluis 1:d3b7bde3995c 213 AESKEY[i] = swapmsbf(AESKEY[i]);
mluis 0:62d1edcc13d1 214 }
mluis 0:62d1edcc13d1 215
mluis 0:62d1edcc13d1 216 b = AESKEY[3];
mluis 0:62d1edcc13d1 217 for( ; i<44; i++ ) {
mluis 1:d3b7bde3995c 218 if( i%4==0 ) {
mluis 0:62d1edcc13d1 219 // b = SubWord(RotWord(b)) xor Rcon[i/4]
mluis 1:d3b7bde3995c 220 b = (AES_S[u1(b >> 16)] << 24) ^
mluis 1:d3b7bde3995c 221 (AES_S[u1(b >> 8)] << 16) ^
mluis 1:d3b7bde3995c 222 (AES_S[u1(b) ] << 8) ^
mluis 1:d3b7bde3995c 223 (AES_S[ b >> 24 ] ) ^
mluis 0:62d1edcc13d1 224 AES_RCON[(i-4)/4];
mluis 1:d3b7bde3995c 225 }
mluis 1:d3b7bde3995c 226 AESKEY[i] = b ^= AESKEY[i-4];
mluis 0:62d1edcc13d1 227 }
mluis 0:62d1edcc13d1 228 }
mluis 0:62d1edcc13d1 229
mluis 0:62d1edcc13d1 230 u4_t os_aes (u1_t mode, xref2u1_t buf, u2_t len) {
mluis 0:62d1edcc13d1 231
mluis 1:d3b7bde3995c 232 aesroundkeys();
mluis 0:62d1edcc13d1 233
mluis 1:d3b7bde3995c 234 if( mode & AES_MICNOAUX ) {
mluis 1:d3b7bde3995c 235 AESAUX[0] = AESAUX[1] = AESAUX[2] = AESAUX[3] = 0;
mluis 1:d3b7bde3995c 236 } else {
mluis 1:d3b7bde3995c 237 AESAUX[0] = swapmsbf(AESAUX[0]);
mluis 1:d3b7bde3995c 238 AESAUX[1] = swapmsbf(AESAUX[1]);
mluis 1:d3b7bde3995c 239 AESAUX[2] = swapmsbf(AESAUX[2]);
mluis 1:d3b7bde3995c 240 AESAUX[3] = swapmsbf(AESAUX[3]);
mluis 1:d3b7bde3995c 241 }
mluis 0:62d1edcc13d1 242
mluis 1:d3b7bde3995c 243 while( (signed char)len > 0 ) {
mluis 1:d3b7bde3995c 244 u4_t a0, a1, a2, a3;
mluis 1:d3b7bde3995c 245 u4_t t0, t1, t2, t3;
mluis 1:d3b7bde3995c 246 u4_t *ki, *ke;
mluis 0:62d1edcc13d1 247
mluis 1:d3b7bde3995c 248 // load input block
mluis 1:d3b7bde3995c 249 if( (mode & AES_CTR) || ((mode & AES_MIC) && (mode & AES_MICNOAUX)==0) ) { // load CTR block or first MIC block
mluis 1:d3b7bde3995c 250 a0 = AESAUX[0];
mluis 1:d3b7bde3995c 251 a1 = AESAUX[1];
mluis 1:d3b7bde3995c 252 a2 = AESAUX[2];
mluis 1:d3b7bde3995c 253 a3 = AESAUX[3];
mluis 0:62d1edcc13d1 254 }
mluis 0:62d1edcc13d1 255 else if( (mode & AES_MIC) && len <= 16 ) { // last MIC block
mluis 0:62d1edcc13d1 256 a0 = a1 = a2 = a3 = 0; // load null block
mluis 0:62d1edcc13d1 257 mode |= ((len == 16) ? 1 : 2) << 4; // set MICSUB: CMAC subkey K1 or K2
mluis 0:62d1edcc13d1 258 } else
mluis 0:62d1edcc13d1 259 LOADDATA: { // load data block (partially)
mluis 1:d3b7bde3995c 260 for(t0=0; t0<16; t0++) {
mluis 0:62d1edcc13d1 261 t1 = (t1<<8) | ((t0<len) ? buf[t0] : (t0==len) ? 0x80 : 0x00);
mluis 0:62d1edcc13d1 262 if((t0&3)==3) {
mluis 0:62d1edcc13d1 263 a0 = a1;
mluis 0:62d1edcc13d1 264 a1 = a2;
mluis 0:62d1edcc13d1 265 a2 = a3;
mluis 0:62d1edcc13d1 266 a3 = t1;
mluis 0:62d1edcc13d1 267 }
mluis 0:62d1edcc13d1 268 }
mluis 1:d3b7bde3995c 269 if( mode & AES_MIC ) {
mluis 1:d3b7bde3995c 270 a0 ^= AESAUX[0];
mluis 1:d3b7bde3995c 271 a1 ^= AESAUX[1];
mluis 1:d3b7bde3995c 272 a2 ^= AESAUX[2];
mluis 1:d3b7bde3995c 273 a3 ^= AESAUX[3];
mluis 1:d3b7bde3995c 274 }
mluis 0:62d1edcc13d1 275 }
mluis 0:62d1edcc13d1 276
mluis 1:d3b7bde3995c 277 // perform AES encryption on block in a0-a3
mluis 1:d3b7bde3995c 278 ki = AESKEY;
mluis 1:d3b7bde3995c 279 ke = ki + 8*4;
mluis 1:d3b7bde3995c 280 a0 ^= ki[0];
mluis 1:d3b7bde3995c 281 a1 ^= ki[1];
mluis 1:d3b7bde3995c 282 a2 ^= ki[2];
mluis 1:d3b7bde3995c 283 a3 ^= ki[3];
mluis 1:d3b7bde3995c 284 do {
mluis 1:d3b7bde3995c 285 AES_key4 (t1,t2,t3,t0,4);
mluis 1:d3b7bde3995c 286 AES_expr4(t1,t2,t3,t0,a0);
mluis 1:d3b7bde3995c 287 AES_expr4(t2,t3,t0,t1,a1);
mluis 1:d3b7bde3995c 288 AES_expr4(t3,t0,t1,t2,a2);
mluis 1:d3b7bde3995c 289 AES_expr4(t0,t1,t2,t3,a3);
mluis 0:62d1edcc13d1 290
mluis 1:d3b7bde3995c 291 AES_key4 (a1,a2,a3,a0,8);
mluis 1:d3b7bde3995c 292 AES_expr4(a1,a2,a3,a0,t0);
mluis 1:d3b7bde3995c 293 AES_expr4(a2,a3,a0,a1,t1);
mluis 1:d3b7bde3995c 294 AES_expr4(a3,a0,a1,a2,t2);
mluis 1:d3b7bde3995c 295 AES_expr4(a0,a1,a2,a3,t3);
mluis 1:d3b7bde3995c 296 } while( (ki+=8) < ke );
mluis 0:62d1edcc13d1 297
mluis 1:d3b7bde3995c 298 AES_key4 (t1,t2,t3,t0,4);
mluis 1:d3b7bde3995c 299 AES_expr4(t1,t2,t3,t0,a0);
mluis 1:d3b7bde3995c 300 AES_expr4(t2,t3,t0,t1,a1);
mluis 1:d3b7bde3995c 301 AES_expr4(t3,t0,t1,t2,a2);
mluis 1:d3b7bde3995c 302 AES_expr4(t0,t1,t2,t3,a3);
mluis 0:62d1edcc13d1 303
mluis 1:d3b7bde3995c 304 AES_expr(a0,t0,t1,t2,t3,8);
mluis 1:d3b7bde3995c 305 AES_expr(a1,t1,t2,t3,t0,9);
mluis 1:d3b7bde3995c 306 AES_expr(a2,t2,t3,t0,t1,10);
mluis 1:d3b7bde3995c 307 AES_expr(a3,t3,t0,t1,t2,11);
mluis 1:d3b7bde3995c 308 // result of AES encryption in a0-a3
mluis 0:62d1edcc13d1 309
mluis 1:d3b7bde3995c 310 if( mode & AES_MIC ) {
mluis 1:d3b7bde3995c 311 if( (t1 = (mode & AES_MICSUB) >> 4) != 0 ) { // last block
mluis 1:d3b7bde3995c 312 do {
mluis 1:d3b7bde3995c 313 // compute CMAC subkey K1 and K2
mluis 1:d3b7bde3995c 314 t0 = a0 >> 31; // save MSB
mluis 1:d3b7bde3995c 315 a0 = (a0 << 1) | (a1 >> 31);
mluis 1:d3b7bde3995c 316 a1 = (a1 << 1) | (a2 >> 31);
mluis 1:d3b7bde3995c 317 a2 = (a2 << 1) | (a3 >> 31);
mluis 1:d3b7bde3995c 318 a3 = (a3 << 1);
mluis 1:d3b7bde3995c 319 if( t0 ) a3 ^= 0x87;
mluis 1:d3b7bde3995c 320 } while( --t1 );
mluis 0:62d1edcc13d1 321
mluis 1:d3b7bde3995c 322 AESAUX[0] ^= a0;
mluis 1:d3b7bde3995c 323 AESAUX[1] ^= a1;
mluis 1:d3b7bde3995c 324 AESAUX[2] ^= a2;
mluis 1:d3b7bde3995c 325 AESAUX[3] ^= a3;
mluis 0:62d1edcc13d1 326 mode &= ~AES_MICSUB;
mluis 1:d3b7bde3995c 327 goto LOADDATA;
mluis 1:d3b7bde3995c 328 } else {
mluis 0:62d1edcc13d1 329 // save cipher block as new iv
mluis 0:62d1edcc13d1 330 AESAUX[0] = a0;
mluis 0:62d1edcc13d1 331 AESAUX[1] = a1;
mluis 0:62d1edcc13d1 332 AESAUX[2] = a2;
mluis 0:62d1edcc13d1 333 AESAUX[3] = a3;
mluis 0:62d1edcc13d1 334 }
mluis 1:d3b7bde3995c 335 } else { // CIPHER
mluis 1:d3b7bde3995c 336 if( mode & AES_CTR ) { // xor block (partially)
mluis 0:62d1edcc13d1 337 t0 = (len > 16) ? 16: len;
mluis 0:62d1edcc13d1 338 for(t1=0; t1<t0; t1++) {
mluis 0:62d1edcc13d1 339 buf[t1] ^= (a0>>24);
mluis 0:62d1edcc13d1 340 a0 <<= 8;
mluis 0:62d1edcc13d1 341 if((t1&3)==3) {
mluis 0:62d1edcc13d1 342 a0 = a1;
mluis 0:62d1edcc13d1 343 a1 = a2;
mluis 0:62d1edcc13d1 344 a2 = a3;
mluis 0:62d1edcc13d1 345 }
mluis 0:62d1edcc13d1 346 }
mluis 1:d3b7bde3995c 347 // update counter
mluis 1:d3b7bde3995c 348 AESAUX[3]++;
mluis 1:d3b7bde3995c 349 } else { // ECB
mluis 0:62d1edcc13d1 350 // store block
mluis 0:62d1edcc13d1 351 msbf4_write(buf+0, a0);
mluis 1:d3b7bde3995c 352 msbf4_write(buf+4, a1);
mluis 1:d3b7bde3995c 353 msbf4_write(buf+8, a2);
mluis 1:d3b7bde3995c 354 msbf4_write(buf+12, a3);
mluis 1:d3b7bde3995c 355 }
mluis 1:d3b7bde3995c 356 }
mluis 0:62d1edcc13d1 357
mluis 0:62d1edcc13d1 358 // update block state
mluis 0:62d1edcc13d1 359 if( (mode & AES_MIC)==0 || (mode & AES_MICNOAUX) ) {
mluis 0:62d1edcc13d1 360 buf += 16;
mluis 0:62d1edcc13d1 361 len -= 16;
mluis 0:62d1edcc13d1 362 }
mluis 0:62d1edcc13d1 363 mode |= AES_MICNOAUX;
mluis 1:d3b7bde3995c 364 }
mluis 1:d3b7bde3995c 365 return AESAUX[0];
mluis 0:62d1edcc13d1 366 }
mluis 0:62d1edcc13d1 367