doc: crypto: Remove TinyCrypt from documentation
TinyCrypt is being removed from Zephyr in favor of PSA Crypto. Signed-off-by: Flavio Ceolin <flavio.ceolin@intel.com>
This commit is contained in:
parent
9751f78ce5
commit
c1bcf3c72f
2 changed files with 0 additions and 326 deletions
|
@ -13,6 +13,5 @@ The following crypto libraries have been included:
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
tinycrypt.rst
|
|
||||||
random/index.rst
|
random/index.rst
|
||||||
api/index.rst
|
api/index.rst
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
.. _tinycrypt:
|
|
||||||
|
|
||||||
TinyCrypt Cryptographic Library
|
|
||||||
###############################
|
|
||||||
|
|
||||||
Overview
|
|
||||||
********
|
|
||||||
The TinyCrypt Library provides an implementation for targeting constrained devices
|
|
||||||
with a minimal set of standard cryptography primitives, as listed below. To better
|
|
||||||
serve applications targeting constrained devices, TinyCrypt implementations differ
|
|
||||||
from the standard specifications (see the Important Remarks section for some
|
|
||||||
important differences). Certain cryptographic primitives depend on other
|
|
||||||
primitives, as mentioned in the list below.
|
|
||||||
|
|
||||||
Aside from the Important Remarks section below, valuable information on the usage,
|
|
||||||
security and technicalities of each cryptographic primitive are found in the
|
|
||||||
corresponding header file.
|
|
||||||
|
|
||||||
* SHA-256:
|
|
||||||
|
|
||||||
* Type of primitive: Hash function.
|
|
||||||
* Standard Specification: NIST FIPS PUB 180-4.
|
|
||||||
* Requires: --
|
|
||||||
|
|
||||||
* HMAC-SHA256:
|
|
||||||
|
|
||||||
* Type of primitive: Message authentication code.
|
|
||||||
* Standard Specification: RFC 2104.
|
|
||||||
* Requires: SHA-256
|
|
||||||
|
|
||||||
* HMAC-PRNG:
|
|
||||||
|
|
||||||
* Type of primitive: Pseudo-random number generator.
|
|
||||||
* Standard Specification: NIST SP 800-90A.
|
|
||||||
* Requires: SHA-256 and HMAC-SHA256.
|
|
||||||
|
|
||||||
* AES-128:
|
|
||||||
|
|
||||||
* Type of primitive: Block cipher.
|
|
||||||
* Standard Specification: NIST FIPS PUB 197.
|
|
||||||
* Requires: --
|
|
||||||
|
|
||||||
* AES-CBC mode:
|
|
||||||
|
|
||||||
* Type of primitive: Encryption mode of operation.
|
|
||||||
* Standard Specification: NIST SP 800-38A.
|
|
||||||
* Requires: AES-128.
|
|
||||||
|
|
||||||
* AES-CTR mode:
|
|
||||||
|
|
||||||
* Type of primitive: Encryption mode of operation.
|
|
||||||
* Standard Specification: NIST SP 800-38A.
|
|
||||||
* Requires: AES-128.
|
|
||||||
|
|
||||||
* AES-CMAC mode:
|
|
||||||
|
|
||||||
* Type of primitive: Message authentication code.
|
|
||||||
* Standard Specification: NIST SP 800-38B.
|
|
||||||
* Requires: AES-128.
|
|
||||||
|
|
||||||
* AES-CCM mode:
|
|
||||||
|
|
||||||
* Type of primitive: Authenticated encryption.
|
|
||||||
* Standard Specification: NIST SP 800-38C.
|
|
||||||
* Requires: AES-128.
|
|
||||||
|
|
||||||
* ECC-DH:
|
|
||||||
|
|
||||||
* Type of primitive: Key exchange.
|
|
||||||
* Standard Specification: RFC 6090.
|
|
||||||
* Requires: ECC auxiliary functions (ecc.h/c).
|
|
||||||
|
|
||||||
* ECC-DSA:
|
|
||||||
|
|
||||||
* Type of primitive: Digital signature.
|
|
||||||
* Standard Specification: RFC 6090.
|
|
||||||
* Requires: ECC auxiliary functions (ecc.h/c).
|
|
||||||
|
|
||||||
Design Goals
|
|
||||||
************
|
|
||||||
|
|
||||||
* Minimize the code size of each cryptographic primitive. This means minimize
|
|
||||||
the size of a board-independent implementation, as presented in TinyCrypt.
|
|
||||||
Note that various applications may require further features, optimizations with
|
|
||||||
respect to other metrics and countermeasures for particular threats. These
|
|
||||||
peculiarities would increase the code size and thus are not considered here.
|
|
||||||
|
|
||||||
* Minimize the dependencies among the cryptographic primitives. This means
|
|
||||||
that it is unnecessary to build and allocate object code for more primitives
|
|
||||||
than the ones strictly required by the intended application. In other words,
|
|
||||||
one can select and compile only the primitives required by the application.
|
|
||||||
|
|
||||||
|
|
||||||
Important Remarks
|
|
||||||
*****************
|
|
||||||
|
|
||||||
The cryptographic implementations in TinyCrypt library have some limitations.
|
|
||||||
Some of these limitations are inherent to the cryptographic primitives
|
|
||||||
themselves, while others are specific to TinyCrypt. Some of these limitations
|
|
||||||
are discussed in-depth below.
|
|
||||||
|
|
||||||
General Remarks
|
|
||||||
***************
|
|
||||||
|
|
||||||
* TinyCrypt does **not** intend to be fully side-channel resistant. Due to the
|
|
||||||
variety of side-channel attacks, many of them making certain boards
|
|
||||||
vulnerable. In this sense, instead of penalizing all library users with
|
|
||||||
side-channel countermeasures such as increasing the overall code size,
|
|
||||||
TinyCrypt only implements certain generic timing-attack countermeasures.
|
|
||||||
|
|
||||||
Specific Remarks
|
|
||||||
****************
|
|
||||||
|
|
||||||
* SHA-256:
|
|
||||||
|
|
||||||
* The number of bits_hashed in the state is not checked for overflow. Note
|
|
||||||
however that this will only be a problem if you intend to hash more than
|
|
||||||
2^64 bits, which is an extremely large window.
|
|
||||||
|
|
||||||
* HMAC:
|
|
||||||
|
|
||||||
* The HMAC verification process is assumed to be performed by the application.
|
|
||||||
This compares the computed tag with some given tag.
|
|
||||||
Note that conventional memory-comparison methods (such as memcmp function)
|
|
||||||
might be vulnerable to timing attacks; thus be sure to use a constant-time
|
|
||||||
memory comparison function (such as compare_constant_time
|
|
||||||
function provided in lib/utils.c).
|
|
||||||
|
|
||||||
* HMAC-PRNG:
|
|
||||||
|
|
||||||
* Before using HMAC-PRNG, you *must* find an entropy source to produce a seed.
|
|
||||||
PRNGs only stretch the seed into a seemingly random output of arbitrary
|
|
||||||
length. The security of the output is exactly equal to the
|
|
||||||
unpredictability of the seed.
|
|
||||||
|
|
||||||
* NIST SP 800-90A requires three items as seed material in the initialization
|
|
||||||
step: entropy seed, personalization and a nonce (which is not implemented).
|
|
||||||
TinyCrypt requires the personalization byte array and automatically creates
|
|
||||||
the entropy seed using a mandatory call to the re-seed function.
|
|
||||||
|
|
||||||
* AES-128:
|
|
||||||
|
|
||||||
* The current implementation does not support other key-lengths (such as 256
|
|
||||||
bits). Note that if you need AES-256, it doesn't sound as though your
|
|
||||||
application is running in a constrained environment. AES-256 requires keys
|
|
||||||
twice the size as for AES-128, and the key schedule is 40% larger.
|
|
||||||
|
|
||||||
* CTR mode:
|
|
||||||
|
|
||||||
* The AES-CTR mode limits the size of a data message they encrypt to 2^32
|
|
||||||
blocks. If you need to encrypt larger data sets, your application would
|
|
||||||
need to replace the key after 2^32 block encryptions.
|
|
||||||
|
|
||||||
* CBC mode:
|
|
||||||
|
|
||||||
* TinyCrypt CBC decryption assumes that the iv and the ciphertext are
|
|
||||||
contiguous (as produced by TinyCrypt CBC encryption). This allows for a
|
|
||||||
very efficient decryption algorithm that would not otherwise be possible.
|
|
||||||
|
|
||||||
* CMAC mode:
|
|
||||||
|
|
||||||
* AES128-CMAC mode of operation offers 64 bits of security against collision
|
|
||||||
attacks. Note however that an external attacker cannot generate the tags
|
|
||||||
him/herself without knowing the MAC key. In this sense, to attack the
|
|
||||||
collision property of AES128-CMAC, an external attacker would need the
|
|
||||||
cooperation of the legal user to produce an exponentially high number of
|
|
||||||
tags (e.g. 2^64) to finally be able to look for collisions and benefit
|
|
||||||
from them. As an extra precaution, the current implementation allows to at
|
|
||||||
most 2^48 calls to tc_cmac_update function before re-calling tc_cmac_setup
|
|
||||||
(allowing a new key to be set), as suggested in Appendix B of SP 800-38B.
|
|
||||||
|
|
||||||
* CCM mode:
|
|
||||||
|
|
||||||
* There are a few tradeoffs for the selection of the parameters of CCM mode.
|
|
||||||
In special, there is a tradeoff between the maximum number of invocations
|
|
||||||
of CCM under a given key and the maximum payload length for those
|
|
||||||
invocations. Both things are related to the parameter 'q' of CCM mode. The
|
|
||||||
maximum number of invocations of CCM under a given key is determined by
|
|
||||||
the nonce size, which is: 15-q bytes. The maximum payload length for those
|
|
||||||
invocations is defined as 2^(8q) bytes.
|
|
||||||
|
|
||||||
To achieve minimal code size, TinyCrypt CCM implementation fixes q = 2,
|
|
||||||
which is a quite reasonable choice for constrained applications. The
|
|
||||||
implications of this choice are:
|
|
||||||
|
|
||||||
The nonce size is: 13 bytes.
|
|
||||||
|
|
||||||
The maximum payload length is: 2^16 bytes = 65 KB.
|
|
||||||
|
|
||||||
The mac size parameter is an important parameter to estimate the security
|
|
||||||
against collision attacks (that aim at finding different messages that
|
|
||||||
produce the same authentication tag). TinyCrypt CCM implementation
|
|
||||||
accepts any even integer between 4 and 16, as suggested in SP 800-38C.
|
|
||||||
|
|
||||||
* TinyCrypt CCM implementation accepts associated data of any length between
|
|
||||||
0 and (2^16 - 2^8) = 65280 bytes.
|
|
||||||
|
|
||||||
* TinyCrypt CCM implementation accepts:
|
|
||||||
|
|
||||||
* Both non-empty payload and associated data (it encrypts and
|
|
||||||
authenticates the payload and only authenticates the associated data);
|
|
||||||
|
|
||||||
* Non-empty payload and empty associated data (it encrypts and
|
|
||||||
authenticates the payload);
|
|
||||||
|
|
||||||
* Non-empty associated data and empty payload (it degenerates to an
|
|
||||||
authentication-only mode on the associated data).
|
|
||||||
|
|
||||||
* RFC-3610, which also specifies CCM, presents a few relevant security
|
|
||||||
suggestions, such as: it is recommended for most applications to use a
|
|
||||||
mac size greater than 8. Besides, it is emphasized that the usage of the
|
|
||||||
same nonce for two different messages which are encrypted with the same
|
|
||||||
key obviously destroys the security properties of CCM mode.
|
|
||||||
|
|
||||||
* ECC-DH and ECC-DSA:
|
|
||||||
|
|
||||||
* TinyCrypt ECC implementation is based on nano-ecc (see
|
|
||||||
https://github.com/iSECPartners/nano-ecc) which in turn is based on
|
|
||||||
micro-ecc (see https://github.com/kmackay/micro-ecc). In the original
|
|
||||||
nano and micro-ecc documentation, there is an important remark about the
|
|
||||||
way integers are represented:
|
|
||||||
|
|
||||||
"Integer representation: To reduce code size, all large integers are
|
|
||||||
represented using little-endian words - so the least significant word is
|
|
||||||
first. You can use the 'ecc_bytes2native()' and 'ecc_native2bytes()'
|
|
||||||
functions to convert between the native integer representation and the
|
|
||||||
standardized octet representation."
|
|
||||||
|
|
||||||
Examples of Applications
|
|
||||||
************************
|
|
||||||
It is possible to do useful cryptography with only the given small set of
|
|
||||||
primitives. With this list of primitives it becomes feasible to support a range
|
|
||||||
of cryptography usages:
|
|
||||||
|
|
||||||
* Measurement of code, data structures, and other digital artifacts (SHA256);
|
|
||||||
|
|
||||||
* Generate commitments (SHA256);
|
|
||||||
|
|
||||||
* Construct keys (HMAC-SHA256);
|
|
||||||
|
|
||||||
* Extract entropy from strings containing some randomness (HMAC-SHA256);
|
|
||||||
|
|
||||||
* Construct random mappings (HMAC-SHA256);
|
|
||||||
|
|
||||||
* Construct nonces and challenges (HMAC-PRNG);
|
|
||||||
|
|
||||||
* Authenticate using a shared secret (HMAC-SHA256);
|
|
||||||
|
|
||||||
* Create an authenticated, replay-protected session (HMAC-SHA256 + HMAC-PRNG);
|
|
||||||
|
|
||||||
* Authenticated encryption (AES-128 + AES-CCM);
|
|
||||||
|
|
||||||
* Key-exchange (EC-DH);
|
|
||||||
|
|
||||||
* Digital signature (EC-DSA);
|
|
||||||
|
|
||||||
Test Vectors
|
|
||||||
************
|
|
||||||
|
|
||||||
The library provides a test program for each cryptographic primitive (see 'test'
|
|
||||||
folder). Besides illustrating how to use the primitives, these tests evaluate
|
|
||||||
the correctness of the implementations by checking the results against
|
|
||||||
well-known publicly validated test vectors.
|
|
||||||
|
|
||||||
For the case of the HMAC-PRNG, due to the necessity of performing an extensive
|
|
||||||
battery test to produce meaningful conclusions, we suggest the user to evaluate
|
|
||||||
the unpredictability of the implementation by using the NIST Statistical Test
|
|
||||||
Suite (see References).
|
|
||||||
|
|
||||||
For the case of the EC-DH and EC-DSA implementations, most of the test vectors
|
|
||||||
were obtained from the site of the NIST Cryptographic Algorithm Validation
|
|
||||||
Program (CAVP), see References.
|
|
||||||
|
|
||||||
References
|
|
||||||
**********
|
|
||||||
|
|
||||||
* `NIST FIPS PUB 180-4 (SHA-256)`_
|
|
||||||
|
|
||||||
.. _NIST FIPS PUB 180-4 (SHA-256):
|
|
||||||
http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
|
|
||||||
|
|
||||||
* `NIST FIPS PUB 197 (AES-128)`_
|
|
||||||
|
|
||||||
.. _NIST FIPS PUB 197 (AES-128):
|
|
||||||
http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
|
|
||||||
|
|
||||||
* `NIST SP800-90A (HMAC-PRNG)`_
|
|
||||||
|
|
||||||
.. _NIST SP800-90A (HMAC-PRNG):
|
|
||||||
http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf
|
|
||||||
|
|
||||||
* `NIST SP 800-38A (AES-CBC and AES-CTR)`_
|
|
||||||
|
|
||||||
.. _NIST SP 800-38A (AES-CBC and AES-CTR):
|
|
||||||
http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
|
|
||||||
|
|
||||||
* `NIST SP 800-38B (AES-CMAC)`_
|
|
||||||
|
|
||||||
.. _NIST SP 800-38B (AES-CMAC):
|
|
||||||
http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf
|
|
||||||
|
|
||||||
* `NIST SP 800-38C (AES-CCM)`_
|
|
||||||
|
|
||||||
.. _NIST SP 800-38C (AES-CCM):
|
|
||||||
http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf
|
|
||||||
|
|
||||||
* `NIST Statistical Test Suite`_
|
|
||||||
|
|
||||||
.. _NIST Statistical Test Suite:
|
|
||||||
http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html
|
|
||||||
|
|
||||||
* `NIST Cryptographic Algorithm Validation Program (CAVP) site`_
|
|
||||||
|
|
||||||
.. _NIST Cryptographic Algorithm Validation Program (CAVP) site:
|
|
||||||
http://csrc.nist.gov/groups/STM/cavp/
|
|
||||||
|
|
||||||
* `RFC 2104 (HMAC-SHA256)`_
|
|
||||||
|
|
||||||
.. _RFC 2104 (HMAC-SHA256):
|
|
||||||
https://www.ietf.org/rfc/rfc2104.txt
|
|
||||||
|
|
||||||
* `RFC 6090 (ECC-DH and ECC-DSA)`_
|
|
||||||
|
|
||||||
.. _RFC 6090 (ECC-DH and ECC-DSA):
|
|
||||||
https://www.ietf.org/rfc/rfc6090.txt
|
|
Loading…
Add table
Add a link
Reference in a new issue