Quantcast
Channel: 懒得折腾
Viewing all articles
Browse latest Browse all 764

ArduinoLibs Cryptographic Library

$
0
0
Cryptographic Library

Supported Algorithms

All cryptographic algorithms have been optimized for 8-bit Arduino platforms like the Uno. Memory usage is also reduced, particularly for SHA1, SHA256, and SHA512 which save 256, 192, and 512 bytes respectively over traditional implementations. For all algorithms, static sbox tables and the like are placed into program memory to further reduce data memory usage.

ChaCha with 20 rounds and 256-bit keys is the recommended symmetric encryption algorithm because it is twice as fast as AES128, constant-time, and much more secure. AES128, AES192, and AES256 are provided for use in applications where compatibility with other systems is desirable.

If code size is an issue for your application (for example on very low end Arduino variants), then Speck on AVR is less than half the code size of ChaCha, at the cost of more data memory for the state and longer key setup times. The SpeckLowMemory class is even smaller at the cost of some performance when encrypting.

BLAKE2s and BLAKE2b are variations on the ChaCha stream cipher, designed for hashing, with 256-bit and 512-bit hash outputs respectively. They are intended as high performance replacements for SHA256 and SHA512 for when speed is critical but exact bit-compatibility of hash values is not.

Examples and other topics

Performance

Performance on AVR

All figures are for the Arduino Uno running at 16 MHz. Figures for the Ardunino Mega 2560 running at 16 MHz are similar:

Encryption Algorithm Encryption (per byte) Decryption (per byte) Key Setup State Size (bytes)
AES128 (ECB mode) 36.90us 66.48us 160.00us 213
AES192 (ECB mode) 44.20us 80.35us 166.54us 245
AES256 (ECB mode) 51.50us 94.22us 227.97us 277
ChaCha (20 rounds) 14.87us 14.88us 43.74us 132
ChaCha (12 rounds) 10.38us 10.38us 43.74us 132
ChaCha (8 rounds) 8.13us 8.14us 43.74us 132
Speck (128-bit key, ECB mode) 10.72us 11.09us 287.02us 275
Speck (192-bit key, ECB mode) 11.03us 11.42us 298.21us 275
Speck (256-bit key, ECB mode) 11.35us 11.74us 309.66us 275
SpeckLowMemory (128-bit key, ECB mode) 35.25us 10.22us 35
SpeckLowMemory (192-bit key, ECB mode) 36.56us 13.62us 35
SpeckLowMemory (256-bit key, ECB mode) 37.87us 16.89us 35
AEAD Algorithm Encryption (per byte) Decryption (per byte) Key Setup State Size (bytes)
ChaChaPoly 41.23us 41.23us 902.55us 255
GCM<AES128> 186.47us 186.42us 1388.43us 316
GCM<AES192> 194.17us 193.72us 1628.67us 348
GCM<AES256> 201.47us 201.02us 1923.78us 380
Hash Algorithm Hashing (per byte) Finalization State Size (bytes)
SHA1 21.90us 1423.28us 95
SHA256 43.85us 2841.04us 107
SHA512 122.82us 15953.42us 211
SHA3_256 121.69us 16486.33us 405
SHA3_512 229.12us 16502.34us 405
BLAKE2s 18.54us 1200.06us 171
BLAKE2b 50.70us 6515.87us 339
Authentication Algorithm Hashing (per byte) Finalization Key Setup State Size (bytes)
SHA1 (HMAC mode) 21.90us 4296.33us 1420.24us 95
SHA256 (HMAC mode) 43.85us 8552.61us 2836.49us 107
BLAKE2s (HMAC mode) 18.54us 3649.98us 1214.81us 171
Poly1305 26.29us 486.15us 17.26us 87
GHASH 148.14us 17.09us 21.87us 33
Public Key Operation Time (per operation) Comment
Curve25519::eval() 3119ms Raw curve evaluation
Curve25519::dh1() 3121ms First half of Diffie-Hellman key agreement
Curve25519::dh2() 3120ms Second half of Diffie-Hellman key agreement
Ed25519::sign() 5688ms Digital signature generation
Ed25519::verify() 9030ms Digital signature verification
Ed25519::derivePublicKey() 5642ms Derive a public key from a private key

Where a cipher supports more than one key size (such as ChaCha), the values are typically almost identical for 128-bit and 256-bit keys so only the maximum is shown above.

Performance on ARM

All figures are for the Arduino Due running at 84 MHz:

Encryption Algorithm Encryption (per byte) Decryption (per byte) Key Setup State Size (bytes)
AES128 (ECB mode) 6.65us 11.00us 35.15us 220
AES192 (ECB mode) 8.02us 13.31us 36.59us 252
AES256 (ECB mode) 9.39us 15.63 50.19us 284
ChaCha (20 rounds) 0.87us 0.88us 4.96us 136
ChaCha (12 rounds) 0.70us 0.71us 4.96us 136
ChaCha (8 rounds) 0.62us 0.62us 4.96us 136
Speck (128-bit key, ECB mode) 0.97us 0.96us 36.80us 288
Speck (192-bit key, ECB mode) 1.00us 0.98us 38.14us 288
Speck (256-bit key, ECB mode) 1.03us 1.01us 39.31us 288
SpeckLowMemory (128-bit key, ECB mode) 2.72us 1.47us 48
SpeckLowMemory (192-bit key, ECB mode) 2.81us 1.54us 48
SpeckLowMemory (256-bit key, ECB mode) 2.90us 1.83us 48
AEAD Algorithm Encryption (per byte) Decryption (per byte) Key Setup State Size (bytes)
ChaChaPoly 1.66us 1.66us 45.02us 280
GCM<AES128> 11.01us 10.92us 247.90us 344
GCM<AES192> 12.40us 12.31us 294.07us 376
GCM<AES256> 13.73us 13.64us 347.40us 408
Hash Algorithm Hashing (per byte) Finalization State Size (bytes)
SHA1 0.94us 62.55us 112
SHA256 1.15us 76.60us 120
SHA512 2.87us 370.37us 224
SHA3_256 5.36us 697.65us 424
SHA3_512 9.89us 697.81us 424
BLAKE2s 0.76us 50.88us 184
BLAKE2b 1.33us 170.93us 352
Authentication Algorithm Hashing (per byte) Finalization Key Setup State Size (bytes)
SHA1 (HMAC mode) 0.94us 193.92us 65.09us 112
SHA256 (HMAC mode) 1.15us 238.98us 80.44us 120
BLAKE2s (HMAC mode) 0.76us 165.64us 59.92us 184
Poly1305 0.85us 19.25us 2.35us 96
GHASH 4.37us 1.50us 4.37us 36
Public Key Operation Time (per operation) Comment
Curve25519::eval() 103ms Raw curve evaluation
Curve25519::dh1() 103ms First half of Diffie-Hellman key agreement
Curve25519::dh2() 104ms Second half of Diffie-Hellman key agreement
Ed25519::sign() 195ms Digital signature generation
Ed25519::verify() 306ms Digital signature verification
Ed25519::derivePublicKey() 194ms Derive a public key from a private key


Viewing all articles
Browse latest Browse all 764

Trending Articles