
Project template for hardware wallet workshop
Dependencies: mbed QSPI_DISCO_F469NI BSP_DISCO_F469NI
helpers.cpp@3:f9462bf83c56, 2019-07-31 (annotated)
- 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?
User | Revision | Line number | New 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 |