File ccm.h
This file provides an API for the CCM authenticated encryption mode for block ciphers.
CCM combines Counter mode encryption with CBC-MAC authentication for 128-bit block ciphers.
Input to CCM includes the following elements:
Payload - data that is both authenticated and encrypted.
Associated data (Adata) - data that is authenticated but not encrypted, For example, a header.
Nonce - A unique value that is assigned to the payload and the associated data.
Definition of CCM: http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf RFC 3610 “Counter with CBC-MAC (CCM)”
Related: RFC 5116 “An Interface and Algorithms for Authenticated Encryption”
Definition of CCM*: IEEE 802.15.4 - IEEE Standard for Local and metropolitan area networks Integer representation is fixed most-significant-octet-first order and the representation of octets is most-significant-bit-first order. This is consistent with RFC 3610.
Defines
-
MBEDTLS_ERR_CCM_BAD_INPUT
Bad input parameters to the function.
-
MBEDTLS_ERR_CCM_AUTH_FAILED
Authenticated decryption failed.
-
MBEDTLS_ERR_CCM_HW_ACCEL_FAILED
CCM hardware accelerator failed.
Functions
-
void mbedtls_ccm_init(mbedtls_ccm_context *ctx)
This function initializes the specified CCM context, to make references valid, and prepare the context for mbedtls_ccm_setkey() or mbedtls_ccm_free().
- Parameters
ctx – The CCM context to initialize. This must not be
NULL.
-
int mbedtls_ccm_setkey(mbedtls_ccm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits)
This function initializes the CCM context set in the
ctxparameter and sets the encryption key.- Parameters
ctx – The CCM context to initialize. This must be an initialized context.
cipher – The 128-bit block cipher to use.
key – The encryption key. This must not be
NULL.keybits – The key size in bits. This must be acceptable by the cipher.
- Returns
0on success.- Returns
A CCM or cipher-specific error code on failure.
-
void mbedtls_ccm_free(mbedtls_ccm_context *ctx)
This function releases and clears the specified CCM context and underlying cipher sub-context.
- Parameters
ctx – The CCM context to clear. If this is
NULL, the function has no effect. Otherwise, this must be initialized.
-
int mbedtls_ccm_encrypt_and_tag(mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len)
This function encrypts a buffer using CCM.
Note
The tag is written to a separate buffer. To concatenate the
tagwith theoutput, as done in RFC-3610: Counter with CBC-MAC (CCM), usetag=output+length, and make sure that the output buffer is at leastlength+tag_lenwide.- Parameters
ctx – The CCM context to use for encryption. This must be initialized and bound to a key.
length – The length of the input data in Bytes.
iv – The initialization vector (nonce). This must be a readable buffer of at least
iv_lenBytes.iv_len – The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, or 13. The length L of the message length field is 15 -
iv_len.add – The additional data field. If
add_lenis greater than zero,addmust be a readable buffer of at least that length.add_len – The length of additional data in Bytes. This must be less than
2^16 - 2^8.input – The buffer holding the input data. If
lengthis greater than zero,inputmust be a readable buffer of at least that length.output – The buffer holding the output data. If
lengthis greater than zero,outputmust be a writable buffer of at least that length.tag – The buffer holding the authentication field. This must be a writable buffer of at least
tag_lenBytes.tag_len – The length of the authentication field to generate in Bytes: 4, 6, 8, 10, 12, 14 or 16.
- Returns
0on success.- Returns
A CCM or cipher-specific error code on failure.
-
int mbedtls_ccm_star_encrypt_and_tag(mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len)
This function encrypts a buffer using CCM*.
Note
The tag is written to a separate buffer. To concatenate the
tagwith theoutput, as done in RFC-3610: Counter with CBC-MAC (CCM), usetag=output+length, and make sure that the output buffer is at leastlength+tag_lenwide.Note
When using this function in a variable tag length context, the tag length has to be encoded into the
ivpassed to this function.Warning
Passing
0astag_lenmeans that the message is no longer authenticated.- Parameters
ctx – The CCM context to use for encryption. This must be initialized and bound to a key.
length – The length of the input data in Bytes.
iv – The initialization vector (nonce). This must be a readable buffer of at least
iv_lenBytes.iv_len – The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, or 13. The length L of the message length field is 15 -
iv_len.add – The additional data field. This must be a readable buffer of at least
add_lenBytes.add_len – The length of additional data in Bytes. This must be less than 2^16 - 2^8.
input – The buffer holding the input data. If
lengthis greater than zero,inputmust be a readable buffer of at least that length.output – The buffer holding the output data. If
lengthis greater than zero,outputmust be a writable buffer of at least that length.tag – The buffer holding the authentication field. This must be a writable buffer of at least
tag_lenBytes.tag_len – The length of the authentication field to generate in Bytes: 0, 4, 6, 8, 10, 12, 14 or 16.
- Returns
0on success.- Returns
A CCM or cipher-specific error code on failure.
-
int mbedtls_ccm_auth_decrypt(mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len)
This function performs a CCM authenticated decryption of a buffer.
- Parameters
ctx – The CCM context to use for decryption. This must be initialized and bound to a key.
length – The length of the input data in Bytes.
iv – The initialization vector (nonce). This must be a readable buffer of at least
iv_lenBytes.iv_len – The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, or 13. The length L of the message length field is 15 -
iv_len.add – The additional data field. This must be a readable buffer of at least that
add_lenBytes..add_len – The length of additional data in Bytes. This must be less than 2^16 - 2^8.
input – The buffer holding the input data. If
lengthis greater than zero,inputmust be a readable buffer of at least that length.output – The buffer holding the output data. If
lengthis greater than zero,outputmust be a writable buffer of at least that length.tag – The buffer holding the authentication field. This must be a readable buffer of at least
tag_lenBytes.tag_len – The length of the authentication field to generate in Bytes: 4, 6, 8, 10, 12, 14 or 16.
- Returns
0on success. This indicates that the message is authentic.- Returns
MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match.
- Returns
A cipher-specific error code on calculation failure.
-
int mbedtls_ccm_star_auth_decrypt(mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len)
This function performs a CCM* authenticated decryption of a buffer.
Note
When using this function in a variable tag length context, the tag length has to be decoded from
ivand passed to this function astag_len. (tagneeds to be adjusted accordingly.)Warning
Passing
0astag_lenmeans that the message is nos longer authenticated.- Parameters
ctx – The CCM context to use for decryption. This must be initialized and bound to a key.
length – The length of the input data in Bytes.
iv – The initialization vector (nonce). This must be a readable buffer of at least
iv_lenBytes.iv_len – The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, or 13. The length L of the message length field is 15 -
iv_len.add – The additional data field. This must be a readable buffer of at least that
add_lenBytes.add_len – The length of additional data in Bytes. This must be less than 2^16 - 2^8.
input – The buffer holding the input data. If
lengthis greater than zero,inputmust be a readable buffer of at least that length.output – The buffer holding the output data. If
lengthis greater than zero,outputmust be a writable buffer of at least that length.tag – The buffer holding the authentication field. This must be a readable buffer of at least
tag_lenBytes.tag_len – The length of the authentication field in Bytes. 0, 4, 6, 8, 10, 12, 14 or 16.
- Returns
0on success.- Returns
MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match.
- Returns
A cipher-specific error code on calculation failure.
-
int mbedtls_ccm_self_test(int verbose)
The CCM checkup routine.
- Returns
0on success.- Returns
1on failure.