A simple library to support serving https.
Dependents: oldheating gps motorhome heating
rsa/rsa-slow.c@24:cb43290fc439, 2020-04-01 (annotated)
- Committer:
- andrewboyson
- Date:
- Wed Apr 01 12:48:52 2020 +0000
- Revision:
- 24:cb43290fc439
- Parent:
- 12:2c342345b3db
Added check so that if the client closes the TCP connection before the TLS connection is established then respond that we have finished and the TCP connection is to be closed.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 0:be515c9019e3 | 1 | #include <stdint.h> |
andrewboyson | 0:be515c9019e3 | 2 | #include <stdbool.h> |
andrewboyson | 10:e269fd7b9500 | 3 | #include "rsa.h" |
andrewboyson | 0:be515c9019e3 | 4 | #include "bignum.h" |
andrewboyson | 0:be515c9019e3 | 5 | #include "hrtimer.h" |
andrewboyson | 2:82268409e83f | 6 | #include "log.h" |
andrewboyson | 0:be515c9019e3 | 7 | |
andrewboyson | 10:e269fd7b9500 | 8 | #define STATUS_NONE 0 |
andrewboyson | 10:e269fd7b9500 | 9 | #define STATUS_STARTED 1 |
andrewboyson | 10:e269fd7b9500 | 10 | #define STATUS_FINISHED 2 |
andrewboyson | 10:e269fd7b9500 | 11 | |
andrewboyson | 2:82268409e83f | 12 | #define MAX_COUNT 4 |
andrewboyson | 2:82268409e83f | 13 | |
andrewboyson | 2:82268409e83f | 14 | static uint32_t m[MAX_COUNT][32]; |
andrewboyson | 2:82268409e83f | 15 | static uint32_t e[MAX_COUNT][32]; |
andrewboyson | 2:82268409e83f | 16 | static uint32_t n[MAX_COUNT][32]; |
andrewboyson | 2:82268409e83f | 17 | static uint32_t r[MAX_COUNT][32]; |
andrewboyson | 2:82268409e83f | 18 | |
andrewboyson | 10:e269fd7b9500 | 19 | static int status[MAX_COUNT]; |
andrewboyson | 0:be515c9019e3 | 20 | |
andrewboyson | 10:e269fd7b9500 | 21 | bool RsaSlowFinished(int slot) |
andrewboyson | 10:e269fd7b9500 | 22 | { |
andrewboyson | 10:e269fd7b9500 | 23 | return status[slot] == STATUS_FINISHED; |
andrewboyson | 10:e269fd7b9500 | 24 | } |
andrewboyson | 10:e269fd7b9500 | 25 | |
andrewboyson | 10:e269fd7b9500 | 26 | uint32_t* RsaSlowResult(int slot) |
andrewboyson | 2:82268409e83f | 27 | { |
andrewboyson | 2:82268409e83f | 28 | return r[slot]; |
andrewboyson | 2:82268409e83f | 29 | } |
andrewboyson | 10:e269fd7b9500 | 30 | void RsaSlowClear(int slot) //This is for security - call it as soon as you no longer need the result. |
andrewboyson | 2:82268409e83f | 31 | { |
andrewboyson | 10:e269fd7b9500 | 32 | status[slot] = STATUS_NONE; |
andrewboyson | 2:82268409e83f | 33 | BnZer1024(m[slot]); |
andrewboyson | 2:82268409e83f | 34 | BnZer1024(e[slot]); |
andrewboyson | 2:82268409e83f | 35 | BnZer1024(n[slot]); |
andrewboyson | 2:82268409e83f | 36 | BnZer1024(r[slot]); |
andrewboyson | 2:82268409e83f | 37 | } |
andrewboyson | 10:e269fd7b9500 | 38 | int RsaSlowStart(uint32_t* message, uint32_t* exponent, uint32_t* modulus) //Returns the slot or -1 on failure - you must check! |
andrewboyson | 0:be515c9019e3 | 39 | { |
andrewboyson | 2:82268409e83f | 40 | //If the exponent is empty then bomb out |
andrewboyson | 2:82268409e83f | 41 | if (BnIse1024(exponent)) |
andrewboyson | 2:82268409e83f | 42 | { |
andrewboyson | 10:e269fd7b9500 | 43 | LogTime("RsaSlowStart - empty exponent\r\n"); |
andrewboyson | 2:82268409e83f | 44 | return -1; |
andrewboyson | 2:82268409e83f | 45 | } |
andrewboyson | 2:82268409e83f | 46 | |
andrewboyson | 2:82268409e83f | 47 | //Look for an empty slot |
andrewboyson | 2:82268409e83f | 48 | int slot = 0; |
andrewboyson | 2:82268409e83f | 49 | while (slot < MAX_COUNT) |
andrewboyson | 2:82268409e83f | 50 | { |
andrewboyson | 10:e269fd7b9500 | 51 | if (status[slot] == STATUS_NONE) goto found; |
andrewboyson | 2:82268409e83f | 52 | slot++; |
andrewboyson | 2:82268409e83f | 53 | } |
andrewboyson | 0:be515c9019e3 | 54 | |
andrewboyson | 2:82268409e83f | 55 | //Look for a slot whch has been used and not cleared |
andrewboyson | 2:82268409e83f | 56 | slot = 0; |
andrewboyson | 2:82268409e83f | 57 | while (slot < MAX_COUNT) |
andrewboyson | 2:82268409e83f | 58 | { |
andrewboyson | 10:e269fd7b9500 | 59 | if (status[slot] == STATUS_FINISHED) goto found; |
andrewboyson | 2:82268409e83f | 60 | slot++; |
andrewboyson | 2:82268409e83f | 61 | } |
andrewboyson | 2:82268409e83f | 62 | |
andrewboyson | 2:82268409e83f | 63 | //No available slot so bomb out |
andrewboyson | 10:e269fd7b9500 | 64 | LogTimeF("RsaSlowStart - no available slots out of %d\r\n", MAX_COUNT); |
andrewboyson | 2:82268409e83f | 65 | return -1; |
andrewboyson | 2:82268409e83f | 66 | |
andrewboyson | 2:82268409e83f | 67 | //Start the calculation |
andrewboyson | 2:82268409e83f | 68 | found: |
andrewboyson | 12:2c342345b3db | 69 | BnModExpStart1024(m[slot], e[slot], n[slot], r[slot], 1024, message, exponent, modulus); |
andrewboyson | 10:e269fd7b9500 | 70 | status[slot] = STATUS_STARTED; |
andrewboyson | 2:82268409e83f | 71 | return slot; |
andrewboyson | 0:be515c9019e3 | 72 | } |
andrewboyson | 10:e269fd7b9500 | 73 | void RsaSlowMain() |
andrewboyson | 0:be515c9019e3 | 74 | { |
andrewboyson | 2:82268409e83f | 75 | int slot = 0; |
andrewboyson | 2:82268409e83f | 76 | while (slot < MAX_COUNT) |
andrewboyson | 2:82268409e83f | 77 | { |
andrewboyson | 10:e269fd7b9500 | 78 | if (status[slot] == STATUS_STARTED) goto found; |
andrewboyson | 2:82268409e83f | 79 | slot++; |
andrewboyson | 2:82268409e83f | 80 | } |
andrewboyson | 2:82268409e83f | 81 | return; |
andrewboyson | 2:82268409e83f | 82 | |
andrewboyson | 2:82268409e83f | 83 | found: |
andrewboyson | 10:e269fd7b9500 | 84 | ; |
andrewboyson | 10:e269fd7b9500 | 85 | bool finished = BnModExpIterate1024(m[slot], e[slot], n[slot], r[slot]); |
andrewboyson | 10:e269fd7b9500 | 86 | |
andrewboyson | 10:e269fd7b9500 | 87 | if (finished) status[slot] = STATUS_FINISHED; |
andrewboyson | 2:82268409e83f | 88 | } |
andrewboyson | 2:82268409e83f | 89 | |
andrewboyson | 10:e269fd7b9500 | 90 | void RsaSlowInit(void) |
andrewboyson | 2:82268409e83f | 91 | { |
andrewboyson | 10:e269fd7b9500 | 92 | for (int i = 0; i < MAX_COUNT; i++) status[i] = STATUS_NONE; |
andrewboyson | 0:be515c9019e3 | 93 | } |