mirror of
https://github.com/kmackay/micro-ecc.git
synced 2026-06-06 05:24:53 +00:00
170 lines
5.7 KiB
C
170 lines
5.7 KiB
C
#ifndef _AVR_ECC_H_
|
|
#define _AVR_ECC_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
/* Platform selection options.
|
|
If ECC_PLATFORM is not defined, the code will try to guess it based on compiler macros.
|
|
Possible values for ECC_PLATFORM are defined below: */
|
|
#define ecc_arch_other 0
|
|
#define ecc_x86 1
|
|
#define ecc_x86_64 2
|
|
#define ecc_arm 3
|
|
#define ecc_arm_thumb 4
|
|
#define ecc_avr 5
|
|
|
|
/* If desired, you can define ECC_WORD_SIZE as appropriate for your platform (1, 4, or 8 bytes).
|
|
If ECC_WORD_SIZE is not explicitly defined then it will be automatically set based on your platform. */
|
|
|
|
/* Inline assembly options.
|
|
ecc_asm_none - Use standard C99 only.
|
|
ecc_asm_small - Use GCC inline assembly for the target platform (if available), optimized for minimum size.
|
|
ecc_asm_fast - Use GCC inline assembly optimized for maximum speed. */
|
|
#define ecc_asm_none 0
|
|
#define ecc_asm_small 1
|
|
#define ecc_asm_fast 2
|
|
#ifndef ECC_ASM
|
|
#define ECC_ASM ecc_asm_fast
|
|
#endif
|
|
|
|
/* Curve selection options. */
|
|
#define secp160r1 1
|
|
#define secp192r1 2
|
|
#define secp256r1 3
|
|
#ifndef ECC_CURVE
|
|
#define ECC_CURVE secp160r1
|
|
#endif
|
|
|
|
/* Optimization settings. Define as 1 to enable an optimization, 0 to disable it.
|
|
ECC_SQUARE_FUNC - If enabled, this will cause a specific function to be used for (scalar) squaring instead of the generic
|
|
multiplication function. This will make things faster by about 8% but increases the code size. */
|
|
#define ECC_SQUARE_FUNC 1
|
|
|
|
|
|
#define ECC_CONCAT1(a, b) a##b
|
|
#define ECC_CONCAT(a, b) ECC_CONCAT1(a, b)
|
|
|
|
#define ecc_size_1 20 /* secp160r1 */
|
|
#define ecc_size_2 24 /* secp192r1 */
|
|
#define ecc_size_3 32 /* secp256r1 */
|
|
|
|
#define ECC_BYTES ECC_CONCAT(ecc_size_, ECC_CURVE)
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
/* RNG_Function type
|
|
The RNG function should fill p_size random bytes into p_dest. It should return 1 if
|
|
p_dest was filled with random data, or 0 if the random data could not be generated.
|
|
The filled-in values should be either truly random, or from a cryptographically-secure PRNG.
|
|
|
|
A correctly functioning RNG function must be set (using ecc_set_rng()) before calling
|
|
ecc_make_key() or ecdsa_sign().
|
|
|
|
A correct RNG function is set by default when building for Windows, Linux, or OS X.
|
|
If you are building on another POSIX-compliant system that supports /dev/random or /dev/urandom,
|
|
you can define ECC_POSIX to use the predefined RNG. For embedded platforms there is no predefined
|
|
RNG function; you must provide your own.
|
|
*/
|
|
typedef int (*RNG_Function)(uint8_t *p_dest, unsigned p_size);
|
|
|
|
/* ecc_set_rng() function.
|
|
Set the function that will be used to generate random bytes. The RNG function should
|
|
return 1 if the random data was generated, or 0 if the random data could not be generated.
|
|
|
|
On platforms where there is no predefined RNG function (eg embedded platforms), this must
|
|
be called before ecc_make_key() or ecdsa_sign() are used.
|
|
|
|
Inputs:
|
|
p_rng - The function that will be used to generate random bytes.
|
|
*/
|
|
void ecc_set_rng(RNG_Function p_rng);
|
|
|
|
/* ecc_make_key() function.
|
|
Create a public/private key pair.
|
|
|
|
Outputs:
|
|
p_publicKey - Will be filled in with the public key.
|
|
p_privateKey - Will be filled in with the private key.
|
|
|
|
Returns 1 if the key pair was generated successfully, 0 if an error occurred.
|
|
*/
|
|
int ecc_make_key(uint8_t p_publicKey[ECC_BYTES*2], uint8_t p_privateKey[ECC_BYTES]);
|
|
|
|
/* ecdh_shared_secret() function.
|
|
Compute a shared secret given your secret key and someone else's public key.
|
|
Note: It is recommended that you hash the result of ecdh_shared_secret before using it for symmetric encryption or HMAC.
|
|
|
|
Inputs:
|
|
p_publicKey - The public key of the remote party.
|
|
p_privateKey - Your private key.
|
|
|
|
Outputs:
|
|
p_secret - Will be filled in with the shared secret value.
|
|
|
|
Returns 1 if the shared secret was generated successfully, 0 if an error occurred.
|
|
*/
|
|
int ecdh_shared_secret(const uint8_t p_publicKey[ECC_BYTES*2], const uint8_t p_privateKey[ECC_BYTES], uint8_t p_secret[ECC_BYTES]);
|
|
|
|
/* ecc_compress() function.
|
|
Compress a public key.
|
|
|
|
Inputs:
|
|
p_publicKey - The public key to compress.
|
|
|
|
Outputs:
|
|
p_compressed - Will be filled in with the compressed public key.
|
|
*/
|
|
void ecc_compress(uint8_t p_publicKey[ECC_BYTES*2], uint8_t p_compressed[ECC_BYTES+1]);
|
|
|
|
/* ecc_decompress() function.
|
|
Decompress a compressed public key.
|
|
|
|
Inputs:
|
|
p_compressed - The compressed public key.
|
|
|
|
Outputs:
|
|
p_publicKey - Will be filled in with the decompressed public key.
|
|
*/
|
|
void ecc_decompress(uint8_t p_compressed[ECC_BYTES+1], uint8_t p_publicKey[ECC_BYTES*2]);
|
|
|
|
/* ecdsa_sign() function.
|
|
Generate an ECDSA signature for a given hash value.
|
|
|
|
Usage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and pass it in to
|
|
this function along with your private key.
|
|
|
|
Inputs:
|
|
p_privateKey - Your private key.
|
|
p_hash - The message hash to sign.
|
|
|
|
Outputs:
|
|
p_signature - Will be filled in with the signature value.
|
|
|
|
Returns 1 if the signature generated successfully, 0 if an error occurred.
|
|
*/
|
|
int ecdsa_sign(const uint8_t p_privateKey[ECC_BYTES], const uint8_t p_hash[ECC_BYTES], uint8_t p_signature[ECC_BYTES*2]);
|
|
|
|
/* ecdsa_verify() function.
|
|
Verify an ECDSA signature.
|
|
|
|
Usage: Compute the hash of the signed data using the same hash as the signer and
|
|
pass it to this function along with the signer's public key and the signature values (r and s).
|
|
|
|
Inputs:
|
|
p_publicKey - The signer's public key
|
|
p_hash - The hash of the signed data.
|
|
p_signature - The signature value.
|
|
|
|
Returns 1 if the signature is valid, 0 if it is invalid.
|
|
*/
|
|
int ecdsa_verify(const uint8_t p_publicKey[ECC_BYTES*2], const uint8_t p_hash[ECC_BYTES], const uint8_t p_signature[ECC_BYTES*2]);
|
|
|
|
#ifdef __cplusplus
|
|
} /* end of extern "C" */
|
|
#endif
|
|
|
|
#endif /* _AVR_ECC_H_ */
|