Updated and generalized random number generation function
(uECC_generate_random_int). This function is also used internally.
In the new implementation when the random number is outside of the
requested range it is corrected by subtraction instead of requesting
new random number.
2 files changed
tree: cfe461718b8fd3680fbdb1cc2c15e08888550613
  1. scripts/
  2. test/
  3. .gitignore
  4. asm_arm.inc
  5. asm_arm_mult_square.inc
  6. asm_avr.inc
  7. curve-specific.inc
  8. emk_project.py
  9. emk_rules.py
  10. LICENSE.txt
  11. platform-specific.inc
  12. README.md
  13. types.h
  14. uECC.c
  15. uECC.h
  16. uECC_vli.h
README.md

micro-ecc

A small and fast ECDH and ECDSA implementation for 8-bit, 32-bit, and 64-bit processors.

The old version of micro-ecc can be found in the “old” branch.

Features

  • Resistant to known side-channel attacks.
  • Written in C, with optional GCC inline assembly for AVR, ARM and Thumb platforms.
  • Supports 8, 32, and 64-bit architectures.
  • Small code size.
  • No dynamic memory allocation.
  • Support for 4 standard curves: secp160r1, secp192r1, secp256r1, and secp256k1.
  • BSD 2-clause license.

Usage Notes

Point Representation

Compressed points are represented in the standard format as defined in http://www.secg.org/collateral/sec1_final.pdf; uncompressed points are represented in standard format, but without the 0x04 prefix. uECC_make_key(), uECC_shared_secret(), uECC_sign(), and uECC_verify() only handle uncompressed points; you can use uECC_compress() and uECC_decompress() to convert between compressed and uncompressed point representations.

Private keys are represented in the standard format.

Using the Code

I recommend just copying (or symlink) uECC.h, uECC.c, and the appropriate asm_<arch>_.inc (if any) into your project. Then just #include "uECC.h" to use the micro-ecc functions.

For use with Arduino, you can just create a symlink to the uECC directory in your Arduino libraries directory. You can then use uECC just like any other Arduino library (uECC should show up in the Sketch=>Import Library submenu).

See uECC.h for documentation for each function.

Compilation Notes

  • Should compile with any C/C++ compiler that supports stdint.h (this includes Visual Studio 2013).
  • If you want to change the defaults for uECC_CURVE and uECC_ASM, you must change them in your Makefile or similar so that uECC.c is compiled with the desired values (ie, compile uECC.c with -DuECC_CURVE=uECC_secp256r1 or whatever).
  • When compiling for a Thumb-1 platform with inline assembly enabled (ie, uECC_ASM is defined to uECC_asm_small or uECC_asm_fast), you must use the -fomit-frame-pointer GCC option (this is enabled by default when compiling with -O1 or higher).
  • When compiling for an ARM/Thumb-2 platform with fast inline assembly enabled (ie, uECC_ASM is defined to uECC_asm_fast), you must use the -fomit-frame-pointer GCC option (this is enabled by default when compiling with -O1 or higher).
  • When compiling for AVR with inline assembly enabled, you must have optimizations enabled (compile with -O1 or higher).
  • When building for Windows, you will need to link in the advapi32.lib system library.

ARM Performance

All tests were built using gcc 4.8.2 with -O3, and were run on a Raspberry Pi B+. uECC_ASM was defined to uECC_asm_fast and ECC_SQUARE_FUNC was defined to 1 in all cases. All times are in milliseconds.

AVR Performance

All tests were built using avr-gcc 4.8.1 with -Os, and were run on a 16 MHz ATmega256RFR2. Code size refers to the space used by micro-ecc code and data.

ECDH (fast)

In these tests, uECC_ASM was defined to uECC_asm_fast and ECC_SQUARE_FUNC was defined to 1 in all cases.

ECDH (small)

In these tests, uECC_ASM was defined to uECC_asm_small and ECC_SQUARE_FUNC was defined to 0 in all cases.

ECDSA (fast)

In these tests, uECC_ASM was defined to uECC_asm_fast and ECC_SQUARE_FUNC was defined to 1 in all cases.

ECDSA (small)

In these tests, uECC_ASM was defined to uECC_asm_small and ECC_SQUARE_FUNC was defined to 0 in all cases.