micro-ECC for mbed, ported from GCC version from Github,

Dependents:   mbed_microECC Wallet_v1

Committer:
allankliu
Date:
Thu Sep 07 12:10:11 2017 +0000
Revision:
0:b6fdeddc0bc9
Init version, ported from GCC version of uECC of Github. Assembly optimization for thumb2 is disabled.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
allankliu 0:b6fdeddc0bc9 1 /* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */
allankliu 0:b6fdeddc0bc9 2
allankliu 0:b6fdeddc0bc9 3 #ifndef _UECC_PLATFORM_SPECIFIC_H_
allankliu 0:b6fdeddc0bc9 4 #define _UECC_PLATFORM_SPECIFIC_H_
allankliu 0:b6fdeddc0bc9 5
allankliu 0:b6fdeddc0bc9 6 #include "types.h"
allankliu 0:b6fdeddc0bc9 7
allankliu 0:b6fdeddc0bc9 8 #if (defined(_WIN32) || defined(_WIN64))
allankliu 0:b6fdeddc0bc9 9 /* Windows */
allankliu 0:b6fdeddc0bc9 10
allankliu 0:b6fdeddc0bc9 11 // use pragma syntax to prevent tweaking the linker script for getting CryptXYZ function
allankliu 0:b6fdeddc0bc9 12 #pragma comment(lib, "crypt32.lib")
allankliu 0:b6fdeddc0bc9 13 #pragma comment(lib, "advapi32.lib")
allankliu 0:b6fdeddc0bc9 14
allankliu 0:b6fdeddc0bc9 15 #define WIN32_LEAN_AND_MEAN
allankliu 0:b6fdeddc0bc9 16 #include <windows.h>
allankliu 0:b6fdeddc0bc9 17 #include <wincrypt.h>
allankliu 0:b6fdeddc0bc9 18
allankliu 0:b6fdeddc0bc9 19 static int default_RNG(uint8_t *dest, unsigned size) {
allankliu 0:b6fdeddc0bc9 20 HCRYPTPROV prov;
allankliu 0:b6fdeddc0bc9 21 if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
allankliu 0:b6fdeddc0bc9 22 return 0;
allankliu 0:b6fdeddc0bc9 23 }
allankliu 0:b6fdeddc0bc9 24
allankliu 0:b6fdeddc0bc9 25 CryptGenRandom(prov, size, (BYTE *)dest);
allankliu 0:b6fdeddc0bc9 26 CryptReleaseContext(prov, 0);
allankliu 0:b6fdeddc0bc9 27 return 1;
allankliu 0:b6fdeddc0bc9 28 }
allankliu 0:b6fdeddc0bc9 29 #define default_RNG_defined 1
allankliu 0:b6fdeddc0bc9 30
allankliu 0:b6fdeddc0bc9 31 #elif defined(unix) || defined(__linux__) || defined(__unix__) || defined(__unix) || \
allankliu 0:b6fdeddc0bc9 32 (defined(__APPLE__) && defined(__MACH__)) || defined(uECC_POSIX)
allankliu 0:b6fdeddc0bc9 33
allankliu 0:b6fdeddc0bc9 34 /* Some POSIX-like system with /dev/urandom or /dev/random. */
allankliu 0:b6fdeddc0bc9 35 #include <sys/types.h>
allankliu 0:b6fdeddc0bc9 36 #include <fcntl.h>
allankliu 0:b6fdeddc0bc9 37 #include <unistd.h>
allankliu 0:b6fdeddc0bc9 38
allankliu 0:b6fdeddc0bc9 39 #ifndef O_CLOEXEC
allankliu 0:b6fdeddc0bc9 40 #define O_CLOEXEC 0
allankliu 0:b6fdeddc0bc9 41 #endif
allankliu 0:b6fdeddc0bc9 42
allankliu 0:b6fdeddc0bc9 43 static int default_RNG(uint8_t *dest, unsigned size) {
allankliu 0:b6fdeddc0bc9 44 int fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
allankliu 0:b6fdeddc0bc9 45 if (fd == -1) {
allankliu 0:b6fdeddc0bc9 46 fd = open("/dev/random", O_RDONLY | O_CLOEXEC);
allankliu 0:b6fdeddc0bc9 47 if (fd == -1) {
allankliu 0:b6fdeddc0bc9 48 return 0;
allankliu 0:b6fdeddc0bc9 49 }
allankliu 0:b6fdeddc0bc9 50 }
allankliu 0:b6fdeddc0bc9 51
allankliu 0:b6fdeddc0bc9 52 char *ptr = (char *)dest;
allankliu 0:b6fdeddc0bc9 53 size_t left = size;
allankliu 0:b6fdeddc0bc9 54 while (left > 0) {
allankliu 0:b6fdeddc0bc9 55 ssize_t bytes_read = read(fd, ptr, left);
allankliu 0:b6fdeddc0bc9 56 if (bytes_read <= 0) { // read failed
allankliu 0:b6fdeddc0bc9 57 close(fd);
allankliu 0:b6fdeddc0bc9 58 return 0;
allankliu 0:b6fdeddc0bc9 59 }
allankliu 0:b6fdeddc0bc9 60 left -= bytes_read;
allankliu 0:b6fdeddc0bc9 61 ptr += bytes_read;
allankliu 0:b6fdeddc0bc9 62 }
allankliu 0:b6fdeddc0bc9 63
allankliu 0:b6fdeddc0bc9 64 close(fd);
allankliu 0:b6fdeddc0bc9 65 return 1;
allankliu 0:b6fdeddc0bc9 66 }
allankliu 0:b6fdeddc0bc9 67 #define default_RNG_defined 1
allankliu 0:b6fdeddc0bc9 68
allankliu 0:b6fdeddc0bc9 69 #endif /* platform */
allankliu 0:b6fdeddc0bc9 70
allankliu 0:b6fdeddc0bc9 71 #endif /* _UECC_PLATFORM_SPECIFIC_H_ */