mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-26 06:35:42 +01:00
CCM*: Add public API
Interface for CCM* (described in IEEE Std 802.15.4.).
This commit is contained in:
parent
84a1107818
commit
f60c815dc7
@ -60,6 +60,55 @@ typedef struct {
|
|||||||
}
|
}
|
||||||
mbedtls_ccm_context;
|
mbedtls_ccm_context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The CCM* callback for encrypting with variable tag length.
|
||||||
|
* The function pointer is passed to the APIs called. This
|
||||||
|
* function calculates the nonce and returns it in a buffer.
|
||||||
|
*
|
||||||
|
* \warning This function must not return the same nonce more than once
|
||||||
|
* in the lifetime of the key!
|
||||||
|
*
|
||||||
|
* \note To prevent attacks taking advantage of the variable tag
|
||||||
|
* length CCM* encodes the tag length in the nonce. The method
|
||||||
|
* of encoding may vary. Standards might mandate encoding other
|
||||||
|
* information in the nonce (e.g. address and frame counter)
|
||||||
|
* too.
|
||||||
|
*
|
||||||
|
* \param app_ctx A pointer to structure containing the application context
|
||||||
|
* if it is necessary for calculating the initialisation vector
|
||||||
|
* (nonce).
|
||||||
|
* \param tag_len Length of the tag in bytes.
|
||||||
|
* \nonce Output variable, points to the buffer capable of holding the
|
||||||
|
* calculated nonce. Must be at least \p nonce_len bytes long.
|
||||||
|
* \nonce_len The length of the nonce in bytes.
|
||||||
|
*
|
||||||
|
* \return \c 0 on success.
|
||||||
|
* \return MBEDTLS_ERR_CCM_BAD_INPUT error code on failure.
|
||||||
|
*/
|
||||||
|
typedef int (*mbedtls_ccm_star_get_nonce_t)( void *app_ctx, size_t tag_len,
|
||||||
|
unsigned char *nonce,
|
||||||
|
size_t nonce_len );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The CCM* callback for decrypting with variable tag length.
|
||||||
|
* The function pointer is passed to the APIs called. This
|
||||||
|
* function calculates and returns the length of the tag in the
|
||||||
|
* output parameter.
|
||||||
|
*
|
||||||
|
* \param app_ctx A pointer to structure containing the application context
|
||||||
|
* if it is necessary for decoding the tag length or validating
|
||||||
|
* the initialisation vector (nonce).
|
||||||
|
* \param tag_len Output variable for holding the tag length in bytes.
|
||||||
|
* \nonce A buffer containing the nonce.
|
||||||
|
* \nonce_len The length of the nonce in bytes.
|
||||||
|
*
|
||||||
|
* \return \c 0 on success.
|
||||||
|
* \return MBEDTLS_ERR_CCM_BAD_INPUT error code on failure.
|
||||||
|
*/
|
||||||
|
typedef int (*mbedtls_ccm_star_get_tag_len_t)( void *app_ctx, size_t* tag_len,
|
||||||
|
const unsigned char *nonce,
|
||||||
|
size_t nonce_len );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This function initializes the specified CCM context,
|
* \brief This function initializes the specified CCM context,
|
||||||
* to make references valid, and prepare the context
|
* to make references valid, and prepare the context
|
||||||
@ -97,7 +146,6 @@ void mbedtls_ccm_free( mbedtls_ccm_context *ctx );
|
|||||||
/**
|
/**
|
||||||
* \brief This function encrypts a buffer using CCM.
|
* \brief This function encrypts a buffer using CCM.
|
||||||
*
|
*
|
||||||
*
|
|
||||||
* \note The tag is written to a separate buffer. To concatenate
|
* \note The tag is written to a separate buffer. To concatenate
|
||||||
* the \p tag with the \p output, as done in <em>RFC-3610:
|
* the \p tag with the \p output, as done in <em>RFC-3610:
|
||||||
* Counter with CBC-MAC (CCM)</em>, use
|
* Counter with CBC-MAC (CCM)</em>, use
|
||||||
@ -127,6 +175,82 @@ int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,
|
|||||||
const unsigned char *input, unsigned char *output,
|
const unsigned char *input, unsigned char *output,
|
||||||
unsigned char *tag, size_t tag_len );
|
unsigned char *tag, size_t tag_len );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function encrypts a buffer using CCM* with fixed tag
|
||||||
|
* length.
|
||||||
|
*
|
||||||
|
* \note The tag is written to a separate buffer. To concatenate
|
||||||
|
* the \p tag with the \p output, as done in <em>RFC-3610:
|
||||||
|
* Counter with CBC-MAC (CCM)</em>, use
|
||||||
|
* \p tag = \p output + \p length, and make sure that the
|
||||||
|
* output buffer is at least \p length + \p tag_len wide.
|
||||||
|
*
|
||||||
|
* \param ctx The CCM context to use for encryption.
|
||||||
|
* \param length The length of the input data in Bytes.
|
||||||
|
* \param iv Initialization vector (nonce).
|
||||||
|
* \param iv_len The length of the IV in Bytes: 7, 8, 9, 10, 11, 12, or 13.
|
||||||
|
* \param add The additional data field.
|
||||||
|
* \param add_len The length of additional data in Bytes.
|
||||||
|
* Must be less than 2^16 - 2^8.
|
||||||
|
* \param input The buffer holding the input data.
|
||||||
|
* \param output The buffer holding the output data.
|
||||||
|
* Must be at least \p length Bytes wide.
|
||||||
|
* \param tag The buffer holding the tag.
|
||||||
|
* \param tag_len The length of the tag to generate in Bytes:
|
||||||
|
* 0, 4, 6, 8, 10, 12, 14 or 16.
|
||||||
|
*
|
||||||
|
* \warning Passing 0 as \p tag_len means that the message is no
|
||||||
|
* longer authenticated.
|
||||||
|
*
|
||||||
|
* \return \c 0 on success.
|
||||||
|
* \return A CCM or cipher-specific error code on failure.
|
||||||
|
*/
|
||||||
|
int mbedtls_ccm_sfix_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 );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function encrypts a buffer using CCM* with variable
|
||||||
|
* tag length.
|
||||||
|
*
|
||||||
|
* \note The tag is written to a separate buffer. To concatenate
|
||||||
|
* the \p tag with the \p output, as done in <em>RFC-3610:
|
||||||
|
* Counter with CBC-MAC (CCM)</em>, use
|
||||||
|
* \p tag = \p output + \p length, and make sure that the
|
||||||
|
* output buffer is at least \p length + \p tag_len wide.
|
||||||
|
*
|
||||||
|
* \param ctx The CCM context to use for encryption.
|
||||||
|
* \param length The length of the input data in Bytes.
|
||||||
|
* \param iv_len The length of the IV in Bytes: 7, 8, 9, 10, 11, 12,
|
||||||
|
* or 13.
|
||||||
|
* \param add The additional data field.
|
||||||
|
* \param add_len The length of additional data in Bytes.
|
||||||
|
* Must be less than 2^16 - 2^8.
|
||||||
|
* \param input The buffer holding the input data.
|
||||||
|
* \param output The buffer holding the output data.
|
||||||
|
* Must be at least \p length Bytes wide.
|
||||||
|
* \param tag The buffer holding the tag.
|
||||||
|
* \param tag_len The length of the tag to generate in Bytes:
|
||||||
|
* 0, 4, 6, 8, 10, 12, 14 or 16.
|
||||||
|
* \param get_iv A callback function returning the IV (nonce) with the
|
||||||
|
* tag length encoded in it.
|
||||||
|
* \param get_iv_ctx Context passed to the \p get_iv callback.
|
||||||
|
*
|
||||||
|
* \warning Passing 0 as \p tag_len means that the message is no
|
||||||
|
* longer authenticated.
|
||||||
|
*
|
||||||
|
* \return \c 0 on success.
|
||||||
|
* \return A CCM or cipher-specific error code on failure.
|
||||||
|
*/
|
||||||
|
int mbedtls_ccm_svar_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,
|
||||||
|
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, mbedtls_ccm_star_get_nonce_t get_iv,
|
||||||
|
void *get_iv_ctx );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This function performs a CCM authenticated decryption of a
|
* \brief This function performs a CCM authenticated decryption of a
|
||||||
* buffer.
|
* buffer.
|
||||||
@ -155,6 +279,74 @@ int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,
|
|||||||
const unsigned char *input, unsigned char *output,
|
const unsigned char *input, unsigned char *output,
|
||||||
const unsigned char *tag, size_t tag_len );
|
const unsigned char *tag, size_t tag_len );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function performs a CCM* authenticated decryption of a
|
||||||
|
* buffer with fixed tag length.
|
||||||
|
*
|
||||||
|
* \param ctx The CCM context to use for decryption.
|
||||||
|
* \param length The length of the input data in Bytes.
|
||||||
|
* \param iv Initialization vector.
|
||||||
|
* \param iv_len The length of the IV in Bytes: 7, 8, 9, 10, 11, 12, or 13.
|
||||||
|
* \param add The additional data field.
|
||||||
|
* \param add_len The length of additional data in Bytes.
|
||||||
|
* Must be less than 2^16 - 2^8.
|
||||||
|
* \param input The buffer holding the input data.
|
||||||
|
* \param output The buffer holding the output data.
|
||||||
|
* Must be at least \p length Bytes wide.
|
||||||
|
* \param tag The buffer holding the tag.
|
||||||
|
* \param tag_len The length of the tag in Bytes.
|
||||||
|
* 0, 4, 6, 8, 10, 12, 14 or 16.
|
||||||
|
*
|
||||||
|
* \warning Passing 0 as \p tag_len means that the message is no
|
||||||
|
* longer authenticated.
|
||||||
|
*
|
||||||
|
* \return \c 0 on success. This indicates that the message is
|
||||||
|
* authentic.
|
||||||
|
* \return #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match.
|
||||||
|
* \return A cipher-specific error code on calculation failure.
|
||||||
|
*/
|
||||||
|
int mbedtls_ccm_sfix_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 );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function performs a CCM* authenticated decryption
|
||||||
|
* of a buffer with variable tag length.
|
||||||
|
*
|
||||||
|
* \param ctx The CCM context to use for decryption.
|
||||||
|
* \param length The length of the input data in Bytes.
|
||||||
|
* \param iv Initialization vector.
|
||||||
|
* \param iv_len The length of the IV in Bytes: 7, 8, 9, 10, 11, 12,
|
||||||
|
* or 13.
|
||||||
|
* \param add The additional data field.
|
||||||
|
* \param add_len The length of additional data in Bytes.
|
||||||
|
* Must be less than 2^16 - 2^8.
|
||||||
|
* \param input The buffer holding the input data. Unlike the \p input
|
||||||
|
* parameters of other Mbed TLS CCM functions, this buffer
|
||||||
|
* holds the concatenation of the encrypted data and the
|
||||||
|
* authentication tag.
|
||||||
|
* \param output The buffer holding the output data.
|
||||||
|
* Must be at least \p length Bytes wide.
|
||||||
|
* \param output_len The length of the decrypted data.
|
||||||
|
* \param get_tag_len A callback function returning the tag length.
|
||||||
|
* \param get_tlen_ctx Context passed to the \p get_tag_len callback.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \return \c 0 on success. This indicates that the message is
|
||||||
|
* authentic.
|
||||||
|
* \return #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match.
|
||||||
|
* \return A cipher-specific error code on calculation failure.
|
||||||
|
*/
|
||||||
|
int mbedtls_ccm_svar_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,
|
||||||
|
size_t* output_len,
|
||||||
|
mbedtls_ccm_star_get_tag_len_t get_tag_len,
|
||||||
|
void *get_tlen_ctx );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user