Updated so that private keys are always the correct length.

Specifically, the private key for secp160r1 is now required to be
21 bytes. Added some comments about buffer sizes.
4 files changed
tree: e7c234d6119c8231544277f6fdcb9c19af8e4b0f
  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.