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