micro-ECC for mbed, ported from GCC version from Github,
Dependents: mbed_microECC Wallet_v1
platform-specific.h@0:b6fdeddc0bc9, 2017-09-07 (annotated)
- 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?
User | Revision | Line number | New 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_ */ |