1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#undef MBEDTLS_ECDSA_DETERMINISTIC
#define MBEDTLS_ALLOW_PRIVATE_ACCESS
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>
#include <mbedtls/sha256.h>
#include <mbedtls/ecdsa.h>
#include <mbedtls/ctr_drbg.h>
#include <mbedtls/entropy.h>
#include <mbedtls/pk.h>
#include <mbedtls/ecp.h>
#include <mbedtls/aes.h>
#include <mbedtls/version.h>
/*
* Use XOR of counter with IV0 to generate the IV for each encrypted block
*
* ie IV = IV0 ^ block_number, rather than the default IV = IV0 + block_number
*
* The power signature for this calculation is easier to mask on RP2350 than
* adding the block number to the IV0
*/
#define IV0_XOR 1
#ifdef __cplusplus
#define _Static_assert static_assert
#endif
typedef struct signature {
/** An array 64 bytes making up 2 256-bit values. */
uint8_t bytes[64];
uint8_t der[MBEDTLS_ECDSA_MAX_LEN];
size_t der_len;
} signature_t; /**< Convenience typedef */
typedef struct message_digest {
/** An array 32 bytes making up the 256-bit value. */
uint8_t bytes[32];
} message_digest_t; /**< Convenience typedef */
typedef struct iv {
/** An array 16 bytes random data. */
uint8_t bytes[16];
} iv_t; /**< Convenience typedef */
typedef struct aes_key {
/** An array 32 bytes key data. */
union {
uint8_t bytes[32];
uint32_t words[8];
};
} aes_key_t; /**< Convenience typedef */
typedef struct aes_key_share {
/** An array 128 bytes key data, 1 word from each share at a time. */
union {
uint8_t bytes[128];
uint32_t words[32];
};
} aes_key_share_t; /**< Convenience typedef */
typedef signature_t public_t;
typedef message_digest_t private_t;
void mb_sha256_buffer(const uint8_t *data, size_t len, message_digest_t *digest_out);
void mb_aes256_buffer(const uint8_t *data, size_t len, uint8_t *data_out, const aes_key_t *key, iv_t *iv);
void mb_sign_sha256(const uint8_t *entropy, size_t entropy_size, const message_digest_t *m, const public_t *p, const private_t *d, signature_t *out);
uint32_t mb_verify_signature_secp256k1(
signature_t signature[1],
const public_t public_key[1],
const message_digest_t digest[1]);
#define sha256_buffer mb_sha256_buffer
#define aes256_buffer mb_aes256_buffer
#define sign_sha256 mb_sign_sha256
#define verify_signature_secp256k1 mb_verify_signature_secp256k1
#ifdef __cplusplus
};
#endif
|