Mbed TLS v3.6.5
cipher.h
Go to the documentation of this file.
1 
10 /*
11  * Copyright The Mbed TLS Contributors
12  * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
13  */
14 
15 #ifndef MBEDTLS_CIPHER_H
16 #define MBEDTLS_CIPHER_H
17 #include "mbedtls/private_access.h"
18 
19 #include "mbedtls/build_info.h"
20 
21 #include <stddef.h>
22 #include "mbedtls/platform_util.h"
23 
24 #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
25 #define MBEDTLS_CIPHER_MODE_AEAD
26 #endif
27 
28 #if defined(MBEDTLS_CIPHER_MODE_CBC)
29 #define MBEDTLS_CIPHER_MODE_WITH_PADDING
30 #endif
31 
32 #if defined(MBEDTLS_CIPHER_NULL_CIPHER) || \
33  defined(MBEDTLS_CHACHA20_C)
34 #define MBEDTLS_CIPHER_MODE_STREAM
35 #endif
36 
38 #define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -0x6080
39 
40 #define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -0x6100
41 
42 #define MBEDTLS_ERR_CIPHER_ALLOC_FAILED -0x6180
43 
44 #define MBEDTLS_ERR_CIPHER_INVALID_PADDING -0x6200
45 
46 #define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -0x6280
47 
48 #define MBEDTLS_ERR_CIPHER_AUTH_FAILED -0x6300
49 
50 #define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT -0x6380
51 
52 #define MBEDTLS_CIPHER_VARIABLE_IV_LEN 0x01
53 #define MBEDTLS_CIPHER_VARIABLE_KEY_LEN 0x02
55 #ifdef __cplusplus
56 extern "C" {
57 #endif
58 
66 typedef enum {
76 
84 typedef enum {
170 
172 typedef enum {
188 
190 typedef enum {
197 
199 typedef enum {
204 
205 enum {
214 };
215 
217 /* This should ideally be derived automatically from list of ciphers.
218  * This should be kept in sync with MBEDTLS_SSL_MAX_IV_LENGTH defined
219  * in library/ssl_misc.h. */
220 #define MBEDTLS_MAX_IV_LENGTH 16
221 
223 /* This should ideally be derived automatically from list of ciphers.
224  * This should be kept in sync with MBEDTLS_SSL_MAX_BLOCK_LENGTH defined
225  * in library/ssl_misc.h. */
226 #define MBEDTLS_MAX_BLOCK_LENGTH 16
227 
229 /* This should ideally be derived automatically from list of ciphers.
230  * For now, only check whether XTS is enabled which uses 64 Byte keys,
231  * and use 32 Bytes as an upper bound for the maximum key length otherwise.
232  * This should be kept in sync with MBEDTLS_SSL_MAX_BLOCK_LENGTH defined
233  * in library/ssl_misc.h, which however deliberately ignores the case of XTS
234  * since the latter isn't used in SSL/TLS. */
235 #if defined(MBEDTLS_CIPHER_MODE_XTS)
236 #define MBEDTLS_MAX_KEY_LENGTH 64
237 #else
238 #define MBEDTLS_MAX_KEY_LENGTH 32
239 #endif /* MBEDTLS_CIPHER_MODE_XTS */
240 
245 
250 
266 typedef struct mbedtls_cipher_info_t {
268  const char *MBEDTLS_PRIVATE(name);
269 
271  unsigned int MBEDTLS_PRIVATE(block_size) : 5;
272 
277  unsigned int MBEDTLS_PRIVATE(iv_size) : 3;
278 
283  unsigned int MBEDTLS_PRIVATE(key_bitlen) : 4;
284 
288  unsigned int MBEDTLS_PRIVATE(mode) : 4;
289 
296  unsigned int MBEDTLS_PRIVATE(type) : 8;
297 
302  unsigned int MBEDTLS_PRIVATE(flags) : 2;
303 
305  unsigned int MBEDTLS_PRIVATE(base_idx) : 5;
306 
308 
309 /* For internal use only.
310  * These are used to more compactly represent the fields above. */
311 #define MBEDTLS_KEY_BITLEN_SHIFT 6
312 #define MBEDTLS_IV_SIZE_SHIFT 2
313 
316 typedef struct mbedtls_cipher_context_t {
319 
321  int MBEDTLS_PRIVATE(key_bitlen);
322 
327 
328 #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
329 
332  void(*MBEDTLS_PRIVATE(add_padding))(unsigned char *output, size_t olen,
333  size_t data_len);
334  /* Report invalid-padding condition through the output parameter
335  * invalid_padding. To minimize changes in Mbed TLS 3.6, where this
336  * declaration is in a public header, use the public type size_t
337  * rather than the internal type mbedtls_ct_condition_t. */
338  int(*MBEDTLS_PRIVATE(get_padding))(unsigned char *input, size_t ilen,
339  size_t *data_len,
340  size_t *invalid_padding);
341 #endif
342 
344  unsigned char MBEDTLS_PRIVATE(unprocessed_data)[MBEDTLS_MAX_BLOCK_LENGTH];
345 
347  size_t MBEDTLS_PRIVATE(unprocessed_len);
348 
352 
354  size_t MBEDTLS_PRIVATE(iv_size);
355 
357  void *MBEDTLS_PRIVATE(cipher_ctx);
358 
359 #if defined(MBEDTLS_CMAC_C)
360 
362 #endif
363 
364 #if defined(MBEDTLS_USE_PSA_CRYPTO) && !defined(MBEDTLS_DEPRECATED_REMOVED)
365 
372  unsigned char MBEDTLS_PRIVATE(psa_enabled);
373 #endif /* MBEDTLS_USE_PSA_CRYPTO && !MBEDTLS_DEPRECATED_REMOVED */
374 
376 
390 const int *mbedtls_cipher_list(void);
391 
403 const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string(const char *cipher_name);
404 
416 
432  int key_bitlen,
433  const mbedtls_cipher_mode_t mode);
434 
445  const mbedtls_cipher_info_t *info)
446 {
447  if (info == NULL) {
448  return MBEDTLS_CIPHER_NONE;
449  } else {
450  return (mbedtls_cipher_type_t) info->MBEDTLS_PRIVATE(type);
451  }
452 }
453 
464  const mbedtls_cipher_info_t *info)
465 {
466  if (info == NULL) {
467  return MBEDTLS_MODE_NONE;
468  } else {
469  return (mbedtls_cipher_mode_t) info->MBEDTLS_PRIVATE(mode);
470  }
471 }
472 
485  const mbedtls_cipher_info_t *info)
486 {
487  if (info == NULL) {
488  return 0;
489  } else {
490  return ((size_t) info->MBEDTLS_PRIVATE(key_bitlen)) << MBEDTLS_KEY_BITLEN_SHIFT;
491  }
492 }
493 
505 static inline const char *mbedtls_cipher_info_get_name(
506  const mbedtls_cipher_info_t *info)
507 {
508  if (info == NULL) {
509  return NULL;
510  } else {
511  return info->MBEDTLS_PRIVATE(name);
512  }
513 }
514 
525 static inline size_t mbedtls_cipher_info_get_iv_size(
526  const mbedtls_cipher_info_t *info)
527 {
528  if (info == NULL) {
529  return 0;
530  }
531 
532  return ((size_t) info->MBEDTLS_PRIVATE(iv_size)) << MBEDTLS_IV_SIZE_SHIFT;
533 }
534 
546  const mbedtls_cipher_info_t *info)
547 {
548  if (info == NULL) {
549  return 0;
550  }
551 
552  return (size_t) (info->MBEDTLS_PRIVATE(block_size));
553 }
554 
565  const mbedtls_cipher_info_t *info)
566 {
567  if (info == NULL) {
568  return 0;
569  }
570 
571  return info->MBEDTLS_PRIVATE(flags) & MBEDTLS_CIPHER_VARIABLE_KEY_LEN;
572 }
573 
584  const mbedtls_cipher_info_t *info)
585 {
586  if (info == NULL) {
587  return 0;
588  }
589 
590  return info->MBEDTLS_PRIVATE(flags) & MBEDTLS_CIPHER_VARIABLE_IV_LEN;
591 }
592 
599 
610 
611 
639  const mbedtls_cipher_info_t *cipher_info);
640 
641 #if defined(MBEDTLS_USE_PSA_CRYPTO)
642 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
643 
669 int MBEDTLS_DEPRECATED mbedtls_cipher_setup_psa(mbedtls_cipher_context_t *ctx,
670  const mbedtls_cipher_info_t *cipher_info,
671  size_t taglen);
672 #endif /* MBEDTLS_DEPRECATED_REMOVED */
673 #endif /* MBEDTLS_USE_PSA_CRYPTO */
674 
685 static inline unsigned int mbedtls_cipher_get_block_size(
686  const mbedtls_cipher_context_t *ctx)
687 {
688  if (ctx->MBEDTLS_PRIVATE(cipher_info) == NULL) {
689  return 0;
690  }
691 
692  return (unsigned int) ctx->MBEDTLS_PRIVATE(cipher_info)->MBEDTLS_PRIVATE(block_size);
693 }
694 
705  const mbedtls_cipher_context_t *ctx)
706 {
707  if (ctx->MBEDTLS_PRIVATE(cipher_info) == NULL) {
708  return MBEDTLS_MODE_NONE;
709  }
710 
711  return (mbedtls_cipher_mode_t) ctx->MBEDTLS_PRIVATE(cipher_info)->MBEDTLS_PRIVATE(mode);
712 }
713 
724 static inline int mbedtls_cipher_get_iv_size(
725  const mbedtls_cipher_context_t *ctx)
726 {
727  if (ctx->MBEDTLS_PRIVATE(cipher_info) == NULL) {
728  return 0;
729  }
730 
731  if (ctx->MBEDTLS_PRIVATE(iv_size) != 0) {
732  return (int) ctx->MBEDTLS_PRIVATE(iv_size);
733  }
734 
735  return (int) (((int) ctx->MBEDTLS_PRIVATE(cipher_info)->MBEDTLS_PRIVATE(iv_size)) <<
737 }
738 
748  const mbedtls_cipher_context_t *ctx)
749 {
750  if (ctx->MBEDTLS_PRIVATE(cipher_info) == NULL) {
751  return MBEDTLS_CIPHER_NONE;
752  }
753 
754  return (mbedtls_cipher_type_t) ctx->MBEDTLS_PRIVATE(cipher_info)->MBEDTLS_PRIVATE(type);
755 }
756 
766 static inline const char *mbedtls_cipher_get_name(
767  const mbedtls_cipher_context_t *ctx)
768 {
769  if (ctx->MBEDTLS_PRIVATE(cipher_info) == NULL) {
770  return 0;
771  }
772 
773  return ctx->MBEDTLS_PRIVATE(cipher_info)->MBEDTLS_PRIVATE(name);
774 }
775 
786  const mbedtls_cipher_context_t *ctx)
787 {
788  if (ctx->MBEDTLS_PRIVATE(cipher_info) == NULL) {
790  }
791 
792  return (int) ctx->MBEDTLS_PRIVATE(cipher_info)->MBEDTLS_PRIVATE(key_bitlen) <<
794 }
795 
805  const mbedtls_cipher_context_t *ctx)
806 {
807  if (ctx->MBEDTLS_PRIVATE(cipher_info) == NULL) {
808  return MBEDTLS_OPERATION_NONE;
809  }
810 
811  return ctx->MBEDTLS_PRIVATE(operation);
812 }
813 
831  const unsigned char *key,
832  int key_bitlen,
833  const mbedtls_operation_t operation);
834 
835 #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
836 
853 #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
854 
880  const unsigned char *iv,
881  size_t iv_len);
882 
917 
918 #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
919 
932  const unsigned char *ad, size_t ad_len);
933 #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */
934 
966  const unsigned char *input,
967  size_t ilen, unsigned char *output,
968  size_t *olen);
969 
1012  unsigned char *output, size_t *olen);
1013 
1058  unsigned char *output, size_t *olen,
1059  size_t *invalid_padding);
1060 
1061 #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
1062 
1080  unsigned char *tag, size_t tag_len);
1081 
1097  const unsigned char *tag, size_t tag_len);
1098 #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */
1099 
1134  const unsigned char *iv, size_t iv_len,
1135  const unsigned char *input, size_t ilen,
1136  unsigned char *output, size_t *olen);
1137 
1138 #if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C)
1139 
1184  const unsigned char *iv, size_t iv_len,
1185  const unsigned char *ad, size_t ad_len,
1186  const unsigned char *input, size_t ilen,
1187  unsigned char *output, size_t output_len,
1188  size_t *olen, size_t tag_len);
1189 
1240  const unsigned char *iv, size_t iv_len,
1241  const unsigned char *ad, size_t ad_len,
1242  const unsigned char *input, size_t ilen,
1243  unsigned char *output, size_t output_len,
1244  size_t *olen, size_t tag_len);
1245 #endif /* MBEDTLS_CIPHER_MODE_AEAD || MBEDTLS_NIST_KW_C */
1246 #ifdef __cplusplus
1247 }
1248 #endif
1249 
1250 #endif /* MBEDTLS_CIPHER_H */
#define MBEDTLS_CIPHER_VARIABLE_KEY_LEN
Definition: cipher.h:53
#define MBEDTLS_CIPHER_VARIABLE_IV_LEN
Definition: cipher.h:52
mbedtls_operation_t
Definition: cipher.h:199
static const char * mbedtls_cipher_info_get_name(const mbedtls_cipher_info_t *info)
Retrieve the human-readable name for a cipher info structure.
Definition: cipher.h:505
mbedtls_cipher_padding_t
Definition: cipher.h:190
static mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode(const mbedtls_cipher_context_t *ctx)
This function returns the mode of operation for the cipher. For example, MBEDTLS_MODE_CBC.
Definition: cipher.h:704
static unsigned int mbedtls_cipher_get_block_size(const mbedtls_cipher_context_t *ctx)
This function returns the block size of the given cipher in bytes.
Definition: cipher.h:685
static size_t mbedtls_cipher_info_get_key_bitlen(const mbedtls_cipher_info_t *info)
Retrieve the key size for a cipher info structure.
Definition: cipher.h:484
mbedtls_cipher_mode_t
Definition: cipher.h:172
const mbedtls_cipher_info_t * mbedtls_cipher_info_from_string(const char *cipher_name)
This function retrieves the cipher-information structure associated with the given cipher name...
static int mbedtls_cipher_info_has_variable_iv_size(const mbedtls_cipher_info_t *info)
This function returns a non-zero value if the IV size for the given cipher is variable.
Definition: cipher.h:583
int mbedtls_cipher_finish_padded(mbedtls_cipher_context_t *ctx, unsigned char *output, size_t *olen, size_t *invalid_padding)
The generic cipher finalization function. If data still needs to be flushed from an incomplete block...
int mbedtls_cipher_finish(mbedtls_cipher_context_t *ctx, unsigned char *output, size_t *olen)
The generic cipher finalization function. If data still needs to be flushed from an incomplete block...
int mbedtls_cipher_auth_decrypt_ext(mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t output_len, size_t *olen, size_t tag_len)
The authenticated encryption (AEAD/NIST_KW) function.
int mbedtls_cipher_reset(mbedtls_cipher_context_t *ctx)
This function resets the cipher state.
static const char * mbedtls_cipher_get_name(const mbedtls_cipher_context_t *ctx)
This function returns the name of the given cipher as a string.
Definition: cipher.h:766
#define MBEDTLS_PRIVATE(member)
int mbedtls_cipher_set_iv(mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len)
This function sets the initialization vector (IV) or nonce.
static int mbedtls_cipher_info_has_variable_key_bitlen(const mbedtls_cipher_info_t *info)
This function returns a non-zero value if the key length for the given cipher is variable.
Definition: cipher.h:564
int mbedtls_cipher_set_padding_mode(mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode)
This function sets the padding mode, for cipher modes that use padding.
static size_t mbedtls_cipher_info_get_iv_size(const mbedtls_cipher_info_t *info)
This function returns the size of the IV or nonce for the cipher info structure, in bytes...
Definition: cipher.h:525
int mbedtls_cipher_update(mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen)
The generic cipher update function. It encrypts or decrypts using the given cipher context...
void mbedtls_cipher_free(mbedtls_cipher_context_t *ctx)
This function frees and clears the cipher-specific context of ctx. Freeing ctx itself remains the res...
static mbedtls_operation_t mbedtls_cipher_get_operation(const mbedtls_cipher_context_t *ctx)
This function returns the operation of the given cipher.
Definition: cipher.h:804
const int * mbedtls_cipher_list(void)
This function retrieves the list of ciphers supported by the generic cipher module.
static int mbedtls_cipher_get_key_bitlen(const mbedtls_cipher_context_t *ctx)
This function returns the key length of the cipher.
Definition: cipher.h:785
mbedtls_cipher_type_t
Supported {cipher type, cipher mode} pairs.
Definition: cipher.h:84
struct mbedtls_cipher_info_t mbedtls_cipher_info_t
Common and shared functions used by multiple modules in the Mbed TLS library.
struct mbedtls_cipher_base_t mbedtls_cipher_base_t
Definition: cipher.h:244
const mbedtls_cipher_info_t * mbedtls_cipher_info_from_values(const mbedtls_cipher_id_t cipher_id, int key_bitlen, const mbedtls_cipher_mode_t mode)
This function retrieves the cipher-information structure associated with the given cipher ID...
static mbedtls_cipher_type_t mbedtls_cipher_get_type(const mbedtls_cipher_context_t *ctx)
This function returns the type of the given cipher.
Definition: cipher.h:747
mbedtls_cipher_id_t
Supported cipher types.
Definition: cipher.h:66
int mbedtls_cipher_setkey(mbedtls_cipher_context_t *ctx, const unsigned char *key, int key_bitlen, const mbedtls_operation_t operation)
This function sets the key to use with the given context.
static mbedtls_cipher_mode_t mbedtls_cipher_info_get_mode(const mbedtls_cipher_info_t *info)
Retrieve the operation mode for a cipher info structure.
Definition: cipher.h:463
int mbedtls_cipher_auth_encrypt_ext(mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t output_len, size_t *olen, size_t tag_len)
The authenticated encryption (AEAD/NIST_KW) function.
#define MBEDTLS_MAX_IV_LENGTH
Definition: cipher.h:220
Macro wrapper for struct's members.
#define MBEDTLS_DEPRECATED
Definition: platform_util.h:37
#define MBEDTLS_IV_SIZE_SHIFT
Definition: cipher.h:312
Build-time configuration info.
int mbedtls_cipher_crypt(mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen)
The generic all-in-one encryption/decryption function, for all ciphers except AEAD constructs...
void mbedtls_cipher_init(mbedtls_cipher_context_t *ctx)
This function initializes a ctx as NONE.
int mbedtls_cipher_update_ad(mbedtls_cipher_context_t *ctx, const unsigned char *ad, size_t ad_len)
This function adds additional data for AEAD ciphers. Currently supported with GCM and ChaCha20+Poly13...
int mbedtls_cipher_setup(mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info)
This function prepares a cipher context for use with the given cipher primitive.
int mbedtls_cipher_check_tag(mbedtls_cipher_context_t *ctx, const unsigned char *tag, size_t tag_len)
This function checks the tag for AEAD ciphers. Currently supported with GCM and ChaCha20+Poly1305. This must be called after mbedtls_cipher_finish() or mbedtls_cipher_finish_padded().
static int mbedtls_cipher_get_iv_size(const mbedtls_cipher_context_t *ctx)
This function returns the size of the IV or nonce of the cipher, in Bytes.
Definition: cipher.h:724
struct mbedtls_cipher_context_t mbedtls_cipher_context_t
#define MBEDTLS_KEY_BITLEN_SHIFT
Definition: cipher.h:311
static mbedtls_cipher_type_t mbedtls_cipher_info_get_type(const mbedtls_cipher_info_t *info)
Retrieve the identifier for a cipher info structure.
Definition: cipher.h:444
int mbedtls_cipher_write_tag(mbedtls_cipher_context_t *ctx, unsigned char *tag, size_t tag_len)
This function writes a tag for AEAD ciphers. Currently supported with GCM and ChaCha20+Poly1305. This must be called after mbedtls_cipher_finish() or mbedtls_cipher_finish_padded().
static size_t mbedtls_cipher_info_get_block_size(const mbedtls_cipher_info_t *info)
This function returns the block size of the given cipher info structure in bytes. ...
Definition: cipher.h:545
#define MBEDTLS_MAX_BLOCK_LENGTH
Definition: cipher.h:226
const mbedtls_cipher_info_t * mbedtls_cipher_info_from_type(const mbedtls_cipher_type_t cipher_type)
This function retrieves the cipher-information structure associated with the given cipher type...