なぜか暗号化機能(AES)があることをを失念していたので今更ながらライブラリを作ってみた。(笑)
1 2 3 4 5 6 7 8 9 |
typedef enum { AESMODE_CCM_0 = 0, AESMODE_CCM_8 = 2, AESMODE_CCM_16 = 4, AESMODE_CCM_32 = 8, AESMODE_CCM_64 = 16, AESMODE_CCM_128 = 32, } AESMODE; |
AESMODE_CCM_32なら8バイトというように暗号化モードによりチェックサムの長さが決まる。チェックサムは受側で認証のために利用される。復号化のさいチェックサムを省略すると復号化のみ行い認証はしないのでfalseが返される。
リプレイ攻撃などを防ぐためにnonceにはランダム値やカウンター値など毎回違う値を指定するのが良いらしい。暗号化キーは何らかの方法で共有する必要があるが受側はnonce値も知らないと復号化できないのでnonceに加えて認証データやチェックサムも何らかの方法で受側と共有できるようにする必要がある。
なお、認証データや暗号化データ及びチェックサムについてはワードアライン(4バイト境界)されたアドレスが必要なことに注意を要する。普通に変数宣言した場合は問題はないがパッキングされた構造体のメンバーアドレスを指定する場合には注意が必要だ。
必要ないとは思うが、もし、構造体以外でアライン問題が発生した場合にはその変数宣言の最後にWORD_ALIGN属性を追加すればOKだ。
#define WORD_ALIGN __attribute__((aligned(4)))
なお、認証が必要なく暗号化のみ利用したい場合は、次のように第二引数までを指定すれば良い。
AES::begin(AES::AESMODE_CCM_0, key, keylen);
AES::encryption(data, datalen);
AES::decryption(data, datalen);
【サンプル】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
static uint8 key[] = "0123456789"; static uint8 auth[] = "45678"; static uint8 csum[32]; static uint8 data[129]; /* 暗号化モードとキーデータを設定する。*/ AES::begin(AES::AESMODE_CCM_32, key, sizeof(key)); /* 認証データと暗号化するデータを指定して暗号化する。*/ strcpy((char *)data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); Debug::printf("-----------------------------\n"); Debug::mdump(data, sizeof(data)); AES::encryption(data, 26, 1, auth, sizeof(auth), csum); Debug::printf("-----------------------------\n"); Debug::mdump(data, sizeof(data)); Debug::printf("-----------------------------\n"); Debug::mdump(csum, sizeof(csum)); /* 暗号化されたデータを指定して復号化する。*/ Debug::printf("decryption = %d\n", AES::decryption(data, 26, 1, auth, sizeof(auth), csum)); Debug::printf("-----------------------------\n"); Debug::mdump(data, sizeof(data)); |
【ライブラリ】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/* aes.h _ AES Library for NXP_JN516x Copyright (c) 2022 Sasapea's Lab. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111_1307 USA */ #pragma once #include <string.h> #include <jendefs.h> #include <AHI_AES.h> #define WORD_ALIGN __attribute__((aligned(4))) class AES { public: typedef enum { AESMODE_CCM_0 = 0, AESMODE_CCM_8 = 2, AESMODE_CCM_16 = 4, AESMODE_CCM_32 = 8, AESMODE_CCM_64 = 16, AESMODE_CCM_128 = 32, } AESMODE; static void begin(AESMODE mode, uint8 *pu8KeyData, uint8 u8KeyLen); static bool encryption(uint8 *pau8Data, uint8 u8DataLen, uint32 u32Nonce = 0, uint8 *pu8AuthData = 0, uint8 u8AuthLen = 0, uint8 *pau8Chksum = 0); static bool decryption(uint8 *pau8Data, uint8 u8DataLen, uint32 u32Nonce = 0, uint8 *pu8AuthData = 0, uint8 u8AuthLen = 0, uint8 *pau8Chksum = 0); static AESMODE mode(void); private: static AESMODE _mode; static tuAES_Block _nonce; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/* aes.cpp - AES Library for NXP-JN516x Copyright (c) 2022 Sasapea's Lab. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "aes.h" AES::AESMODE AES::_mode; tuAES_Block AES::_nonce; void AES::begin(AESMODE mode, uint8 *pu8KeyData, uint8 u8KeyLen) { tsReg128 sReg128; _mode = mode; memset(&sReg128, 0, sizeof(sReg128)); memcpy(&sReg128, pu8KeyData, u8KeyLen < sizeof(sReg128) ? u8KeyLen : sizeof(sReg128)); bACI_WriteKey(&sReg128); } bool AES::encryption(uint8 *pau8Data, uint8 u8DataLen, uint32 u32Nonce, uint8 *pu8AuthData, uint8 u8AuthLen, uint8 *pau8Chksum) { uint8 csum[32]; if (!pau8Chksum) pau8Chksum = csum; _nonce.au32[0] = u32Nonce; vACI_OptimisedCcmStar(true, _mode, u8AuthLen, u8DataLen, &_nonce, pu8AuthData, pau8Data, pau8Chksum, 0); return true; } bool AES::decryption(uint8 *pau8Data, uint8 u8DataLen, uint32 u32Nonce, uint8 *pu8AuthData, uint8 u8AuthLen, uint8 *pau8Chksum) { bool_t bVerify = false; _nonce.au32[0] = u32Nonce; vACI_OptimisedCcmStar(false, _mode, u8AuthLen, u8DataLen, &_nonce, pu8AuthData, pau8Data, pau8Chksum, &bVerify); return bVerify; } AES::AESMODE AES::mode(void) { return _mode; } |
【関連投稿】
NXP JN516X (TWELITE) をプログラミングする(開発環境の構築)
NXP JN516X (TWELITE) をプログラミングする(メイン・ルーチン)
NXP JN516X (TWELITE) をプログラミングする(TICKTIMER)
NXP JN516X (TWELITE) をプログラミングする(UART)
NXP JN516X (TWELITE) をプログラミングする(SYSTEM)
NXP JN516X (TWELITE) をプログラミングする(GPIO)
NXP JN516X (TWELITE) をプログラミングする(TIMER)
NXP JN516X (TWELITE) をプログラミングする(ALARM)
NXP JN516X (TWELITE) をプログラミングする(WAKETIMER)
NXP JN516X (TWELITE) をプログラミングする(WATCHDOG)
NXP JN516X (TWELITE) をプログラミングする(I2C)
NXP JN516X (TWELITE) をプログラミングする(SPI)
NXP JN516X (TWELITE) をプログラミングする(ADC)
NXP JN516X (TWELITE) をプログラミングする(COMPARATOR)
NXP JN516X (TWELITE) をプログラミングする(CLOCK)
NXP JN516X (TWELITE) をプログラミングする(BROWNOUT)
NXP JN516X (TWELITE) をプログラミングする(PULSCOUNTER)
NXP JN516X (TWELITE) をプログラミングする(INFRARED)
NXP JN516X (TWELITE) をプログラミングする(RANDOM-GENERATOR)
NXP JN516X (TWELITE) をプログラミングする(FLASH)
NXP JN516X (TWELITE) をプログラミングする(EEPROM)
NXP JN516X (TWELITE) をプログラミングする(WPAN)
NXP JN516X (TWELITE) をプログラミングする(Eclipse-CDT+MWSTAGE)
NXP JN516X (TWELITE) をプログラミングする(乗算と除算)
NXP JN516X (TWELITE) をプログラミングする(マルチタスク)
NXP JN516X (TWELITE) をプログラミングする(フラッシュ・プログラマー)
NXP JN516X (TWELITE) をプログラミングする(OTA UPDATE)
NXP JN516X (TWELITE) をプログラミングする(TWELITE CUE/MC3630)
NXP JN516X (TWELITE) をプログラミングする(LED)
NXP JN516X (TWELITE) をプログラミングする(AES)
NXP JN516X (TWELITE) をプログラミングする(Downloads)