Post on 17-Jun-2020
transcript
Advanced Encryption Standard
Last updated 6/17/19
2 © tjEE 2920
AES
• MSP432 AES
3 © tjEE 2920
AES
• MSP432 AES
• AMBA Compliant
• 128 bit data
• 128, 192, 256 bit keys
4 © tjEE 2920
AES
• AES• Secret key (private key) – used for encryption and decryption
• Data stored in an array
• Several transformations are performed on the array• Substitution
• Row shifting
• Column mixing
• The number of rounds is determined by the key length• 10 rounds for 128-bit keys
• 12 rounds for 192-bit keys
• 14 rounds for 256-bit keys.
5 © tjEE 2920
AES
• MSP432 AES
6 © tjEE 2920
AES
• MSP432 AES
7 © tjEE 2920
AES
• MSP432 AES
8 © tjEE 2920
AES
• MSP432 AES
9 © tjEE 2920
AES
• MSP432 AES
10 © tjEE 2920
AES
• MSP432 AES
/** aes.c** Created on: Aug 13, 2019* Author: johnsontimoj*/
////////////////////////////////////// AES encryption example//// Using simple functions to create the key and original data//// encrypting then decrypting the data and printing the results/////////////////////////////////////#include <stdio.h>#include "msp.h"
void create_data(uint8_t array[], uint8_t length);void create_key(uint8_t array[]);void aes_mode_encrypt(void);void aes_mode_decrypt(void);void write_key(const uint8_t array[]);void encrypt(const uint8_t data_array[], uint8_t encrypted_data[], uint8_t length);void decrypt(const uint8_t data_array[], uint8_t decrypted_data[], uint8_t length);void print_array(uint8_t array[], uint8_t length);
#define len 16
11 © tjEE 2920
AES
• MSP432 AESint main(void){
// arraysuint8_t aes_key[32];uint8_t data_orig[len];uint8_t data_encrypted[len];uint8_t data_decrypted[len];
// generate keycreate_key(aes_key);
// generate original datacreate_data(data_orig, len);
// Set to encryption modeaes_mode_encrypt();
// write keywrite_key(aes_key);
// write original data and retrieve encrypted dataencrypt(data_orig, data_encrypted, len);
// Set to decryption modeaes_mode_decrypt();
// write keywrite_key(aes_key);
// write encrypted data and retrieve decrypted datadecrypt(data_encrypted, data_decrypted, len);
// print key, original data, encrypted data and decrypted dataprintf("\naes_key: ");print_array(aes_key, 32);printf("\nOriginal Data: \t\t");print_array(data_orig, len);printf("\nEncrypted Data: \t");print_array(data_encrypted, len);printf("\nDecrypted Data: \t");print_array(data_decrypted, len);
return 0;}
12 © tjEE 2920
AES
• MSP432 AESvoid create_data(uint8_t array[], uint8_t length){
uint8_t i;// simple data creator - 2xifor(i=0; i<length; i++)
array[i] = 2*i;}
void create_key(uint8_t array[]){// Create the key values and store in an arrayuint8_t i;
// 256 bit key --> 32 bytes// using 3xi for the bytesfor(i=0; i<32; i++){
array[i] = 3*i;}
return;} // end create_key
void aes_mode_encrypt(void){// setup CTL0 to set key// 256b encryption// 256b Encrypt// xxxx xxxx xxxx 10 00AES256->CTL0 = 0x0008;
} // end aes_mode_encrypt
void aes_mode_decrypt(void){// setup CTL0 to set key// 256b decryption// 256b decrypt// xxxx xxxx xxxx 10 01AES256->CTL0 = 0x0009;
} // end aes_mode_decrypt
void write_key(const uint8_t array[]){uint8_t keyval;uint8_t i;
// Load 256-bit cipher key// Key generated by loop index and loaded into KEY register// Note: 256b key needs 32 bytes// Note: 256b mode requires 16b key writes// accessing the array 2x each loopfor(i = 0; i < 32; i=i+2){
// lower byte upper bytekeyval = (uint16_t)(array[i]) | ((uint16_t)(array[i+1]) <<
8);// write 16b key each cycleAES256->KEY = keyval;
} // end for
// stay in fn until key write complete// checking for STAT bit 1 to become 1while(!(AES256->STAT & 0x02))
;
return;} // end write_key
13 © tjEE 2920
AES
• MSP432 AESvoid encrypt(const uint8_t data_array[], uint8_t encrypted_data[], uint8_t length){
// Load original data and save encrypted versionuint8_t i;uint16_t data_tmp;
// Note: 256b mode requires 16b data writes// accessing the array 2x each loopfor(i = 0; i < length; i=i+2){
// Access and concatentae data// lower byte upper bytedata_tmp = (uint16_t)(data_array[i]) | ((uint16_t)(data_array[i+1]) << 8);// Write data to DIN each cycleAES256->DIN = data_tmp;
} // end for
// stay in fn until key encrypt complete// checking for STAT bit 0 (busy) to become 0while(AES256->STAT & 0x01)
;
// Note: 256b mode requires 16b data reads// accessing the array 2x each loopfor(i = 0; i < length; i = i+2){
// read 16 bit worddata_tmp = AES256->DOUT;
//Split word and save in encrypted data arrayencrypted_data[i] = (uint8_t)data_tmp;encrypted_data[i+1] = (uint8_t)(data_tmp >> 8);
} // end for
return;}// end encrypt
14 © tjEE 2920
AES
• MSP432 AESvoid decrypt(const uint8_t data_array[], uint8_t decrypted_data[], uint8_t length){
// Load encrypted data and save decrypted versionuint8_t i;uint16_t data_tmp;
// Note: 256b mode requires 16b data writes// accessing the array 2x each loopfor(i = 0; i < length; i=i+2){
// Access and concatentae data// lower byte upper bytedata_tmp = (uint16_t)(data_array[i]) | ((uint16_t)(data_array[i+1]) << 8);// Write data to DIN each cycleAES256->DIN = data_tmp;
} // end for
// stay in fn until key decrypt complete// checking for STAT bit 0 (busy) to become 0while(AES256->STAT & 0x01)
;
// Note: 256b mode requires 16b data reads// accessing the array 2x each loopfor(i = 0; i < length; i = i+2){
// read 16 bit worddata_tmp = AES256->DOUT;
//Split word and save in encrypted data arraydecrypted_data[i] = (uint8_t)data_tmp;decrypted_data[i+1] = (uint8_t)(data_tmp >> 8);
} // end for
return;}// end decrypt
15 © tjEE 2920
AES
• MSP432 AES
void print_array(uint8_t array[], uint8_t length){uint8_t i;for(i=0; i<length; i++)
printf("%02x", array[i]);}