Airgapped hardware wallet based on STM32F469-Discovery board using SD card to pass transaction data

Dependencies:   mbed QSPI_DISCO_F469NI BSP_DISCO_F469NI

Committer:
stepansnigirev
Date:
Tue Jul 30 19:25:52 2019 +0000
Revision:
4:73e20d662d73
Parent:
0:f43431023689
comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
stepansnigirev 0:f43431023689 1 #include "helpers.h"
stepansnigirev 0:f43431023689 2 #include "QSPI_DISCO_F469NI.h" // internal storage
stepansnigirev 0:f43431023689 3
stepansnigirev 0:f43431023689 4 static RNG_HandleTypeDef rng;
stepansnigirev 0:f43431023689 5
stepansnigirev 0:f43431023689 6 // internal storage we will use to store mnemonic
stepansnigirev 0:f43431023689 7 QSPI_DISCO_F469NI qspi;
stepansnigirev 0:f43431023689 8 #define WRITE_READ_ADDR ((uint32_t)0x0050)
stepansnigirev 0:f43431023689 9 #define QSPI_BASE_ADDR ((uint32_t)0x90000000)
stepansnigirev 0:f43431023689 10
stepansnigirev 0:f43431023689 11 // magic constant to check if we saved the mnemonic already
stepansnigirev 0:f43431023689 12 static const char magic[] = "mnemonic";
stepansnigirev 0:f43431023689 13
stepansnigirev 0:f43431023689 14 GUI gui;
stepansnigirev 0:f43431023689 15
stepansnigirev 0:f43431023689 16 void init(){
stepansnigirev 0:f43431023689 17 initRNG();
stepansnigirev 0:f43431023689 18 qspi.Init();
stepansnigirev 0:f43431023689 19 gui.init();
stepansnigirev 0:f43431023689 20 }
stepansnigirev 0:f43431023689 21
stepansnigirev 0:f43431023689 22 string loadMnemonic(){
stepansnigirev 0:f43431023689 23 char buffer[300] = "";
stepansnigirev 0:f43431023689 24 qspi.Read((uint8_t *)buffer, WRITE_READ_ADDR, sizeof(buffer)-1);
stepansnigirev 0:f43431023689 25 if(memcmp(magic, buffer, strlen(magic))!=0){
stepansnigirev 0:f43431023689 26 return "";
stepansnigirev 0:f43431023689 27 }
stepansnigirev 0:f43431023689 28 return buffer+strlen(magic);
stepansnigirev 0:f43431023689 29 }
stepansnigirev 0:f43431023689 30
stepansnigirev 0:f43431023689 31 int saveMnemonic(string mnemonic){
stepansnigirev 0:f43431023689 32 qspi.Erase_Block(WRITE_READ_ADDR);
stepansnigirev 0:f43431023689 33 qspi.Write((uint8_t *)magic, WRITE_READ_ADDR, strlen(magic));
stepansnigirev 0:f43431023689 34 qspi.Write((uint8_t *)mnemonic.c_str(), WRITE_READ_ADDR+strlen(magic), mnemonic.length()+1);
stepansnigirev 0:f43431023689 35 return 1;
stepansnigirev 0:f43431023689 36 }
stepansnigirev 0:f43431023689 37
stepansnigirev 0:f43431023689 38 int wipe(){
stepansnigirev 0:f43431023689 39 qspi.Erase_Block(WRITE_READ_ADDR);
stepansnigirev 0:f43431023689 40 NVIC_SystemReset(); // reset the board
stepansnigirev 0:f43431023689 41 }
stepansnigirev 0:f43431023689 42
stepansnigirev 0:f43431023689 43 /*********** random number generator ***********/
stepansnigirev 0:f43431023689 44
stepansnigirev 0:f43431023689 45 int initRNG(){
stepansnigirev 0:f43431023689 46 __HAL_RCC_RNG_CLK_ENABLE();
stepansnigirev 0:f43431023689 47 rng.Instance = RNG;
stepansnigirev 0:f43431023689 48 if(HAL_RNG_Init(&rng) != HAL_OK){
stepansnigirev 0:f43431023689 49 return 0;
stepansnigirev 0:f43431023689 50 }
stepansnigirev 0:f43431023689 51 return 1;
stepansnigirev 0:f43431023689 52 }
stepansnigirev 0:f43431023689 53
stepansnigirev 0:f43431023689 54 uint32_t getRandomNumber(void){
stepansnigirev 0:f43431023689 55 uint32_t rnd = 0xff;
stepansnigirev 0:f43431023689 56 if(HAL_RNG_GenerateRandomNumber(&rng, &rnd) != HAL_OK){
stepansnigirev 0:f43431023689 57 return 0;
stepansnigirev 0:f43431023689 58 }
stepansnigirev 0:f43431023689 59 return rnd;
stepansnigirev 0:f43431023689 60 }
stepansnigirev 0:f43431023689 61
stepansnigirev 0:f43431023689 62 size_t getRandomBuffer(uint8_t * arr, size_t len){
stepansnigirev 0:f43431023689 63 for(unsigned int i=0; 4*i<len; i++){
stepansnigirev 0:f43431023689 64 uint32_t r = getRandomNumber();
stepansnigirev 0:f43431023689 65 if( i*4+1< len ){
stepansnigirev 0:f43431023689 66 memcpy(arr+i*4, &r, 4);
stepansnigirev 0:f43431023689 67 }else{
stepansnigirev 0:f43431023689 68 memcpy(arr+i*4, &r, len-i*4);
stepansnigirev 0:f43431023689 69 }
stepansnigirev 0:f43431023689 70 }
stepansnigirev 0:f43431023689 71 return len;
stepansnigirev 0:f43431023689 72 }
stepansnigirev 0:f43431023689 73