IBM LoRa MAC in C (LMiC) mbed library port

Dependents:   lora-temperature LoRaWAN-lmic-app_HS LoRaWAN-lmic-app_huynh

LoRa WAN in C for sx1276 shield

Currently version 1.5


LoRaWAN network configuration for end-device

The following three pieces of information uniquely identifies end-device to network to allow over-the-air activation. These are stored in the end-device prior to join procedure.

AppEUI

Uniquely identifies application provider of end-device.

Least-significant byte first, 8 bytes, use reverse memcpy() to keep same order as shown on lora server.

example C code

static const u1_t APPEUI[8]  = { 0x01, 0x00, 0x01, 0x00, 0x00, 0x0C, 0x25, 0x00 };

This is copied into LMIC by os_getArtEui() callback function in application.

DevEUI

End-device ID, unique to each end-node.

Least-significant byte first, 8 bytes, use reverse memcpy() to keep same order as shown on lora server.

example C code

static const u1_t DEVEUI[8]  = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x25, 0x00 }; 

This is copied into LMIC by os_getDevEui() callback function in application.

AppKey (aka DevKey)

128-bit (16byte) AES key.

example C code

static const u1_t DEVKEY[16] = { 0xe4, 0x72, 0x71, 0xc5, 0xf5, 0x30, 0xa9, 0x9f, 0xcf, 0xc4, 0x0e, 0xab, 0xea, 0xd7, 0x19, 0x42 };

This is copied into LMIC by os_getDevKey() callback function in application.

Using over-the air activation, the end-device (LMIC) performs a join procedure every time it starts for first time, or has lost session context information. When join procedure has successfully completed, the end-device will have a network session key (NwkSKey) and an application session key (AppSKey), which are used for encryption and message integrity check.


US915 configuration with http://us01-iot.semtech.com/

  • log in to server
  • click on Applications
  • find your application and click it
  • go to configure motes
  • to create a mote, you may enter a new DevEUI
    • you may copy-paste the 16byte application key from an already existing mote, if you desire.
CHNL_HYBRID125KHz500KHz
defined valuechannelschannel
00 to 764
18 to 1565
216 to 2366
324 to 3167
432 to 3968
540 to 4769
648 to 5570
756 to 6371
undef0 to 6364 to 71
Committer:
mluis
Date:
Thu Nov 26 17:17:08 2015 +0000
Revision:
4:85b2b647cb64
Parent:
1:d3b7bde3995c
Merged branches

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