Project template for hardware wallet workshop

Dependencies:   mbed QSPI_DISCO_F469NI BSP_DISCO_F469NI

Committer:
stepansnigirev
Date:
Wed Jul 31 13:15:45 2019 +0000
Revision:
3:f9462bf83c56
Parent:
0:176af1483f18
more comments and assignments

Who changed what in which revision?

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