Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
lwc
/
compare
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Pipelines
Members
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
8f3efffa
authored
5 years ago
by
Enrico Pozzobon
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master'
parents
b13825f4
be1cf907
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
25 additions
and
6135 deletions
+25
-6135
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/Makefile
+2
-1
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/aes.c
+2
-618
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/aes.h
+0
-469
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/cipher.c
+0
-1536
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/cipher.h
+0
-848
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/cipher_internal.h
+0
-149
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/cipher_wrap.c
+0
-2407
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/config.h
+0
-5
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/gcm.c
+21
-59
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/gcm.h
+0
-26
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/platform_util.c
+0
-12
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/platform_util.h
+0
-5
No files found.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/Makefile
View file @
8f3efffa
...
...
@@ -6,7 +6,7 @@ LFLAGS=-lm
all
:
gcm
gcm
:
gcm.c genkat_aead.c aes.c
cipher.c cipher_wrap.c
platform_util.c
gcm
:
gcm.c genkat_aead.c aes.c platform_util.c
$(CC)
$(NISTGCCFLAGS)
-o
$@
$^
$(LFLAGS)
.PHONY
:
clean
...
...
@@ -14,4 +14,5 @@ gcm: gcm.c genkat_aead.c aes.c cipher.c cipher_wrap.c platform_util.c
clean
:
rm
-rf
*
.o
rm
-rf
gcm
rm
-rf
LWC_
*
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/aes.c
View file @
8f3efffa
...
...
@@ -25,22 +25,14 @@
* http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
*/
#include "config.h"
#include "platform_util.h"
#if defined(MBEDTLS_AES_C)
#include <string.h>
#include "aes.h"
#if defined(MBEDTLS_PADLOCK_C)
#include "mbedtls/padlock.h"
#endif
#if defined(MBEDTLS_AESNI_C)
#include "mbedtls/aesni.h"
#endif
#if !defined(MBEDTLS_AES_ALT)
#define MBEDTLS_AES_ROM_TABLES
#define MBEDTLS_AES_FEWER_TABLES
/* Parameter validation macros based on platform_util.h */
#define AES_VALIDATE_RET( cond ) \
...
...
@@ -71,11 +63,6 @@
}
#endif
#if defined(MBEDTLS_PADLOCK_C) && \
( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )
static
int
aes_padlock_ace
=
-
1
;
#endif
#if defined(MBEDTLS_AES_ROM_TABLES)
/*
* Forward S-box
...
...
@@ -516,29 +503,9 @@ void mbedtls_aes_free( mbedtls_aes_context *ctx )
mbedtls_platform_zeroize
(
ctx
,
sizeof
(
mbedtls_aes_context
)
);
}
#if defined(MBEDTLS_CIPHER_MODE_XTS)
void
mbedtls_aes_xts_init
(
mbedtls_aes_xts_context
*
ctx
)
{
AES_VALIDATE
(
ctx
!=
NULL
);
mbedtls_aes_init
(
&
ctx
->
crypt
);
mbedtls_aes_init
(
&
ctx
->
tweak
);
}
void
mbedtls_aes_xts_free
(
mbedtls_aes_xts_context
*
ctx
)
{
if
(
ctx
==
NULL
)
return
;
mbedtls_aes_free
(
&
ctx
->
crypt
);
mbedtls_aes_free
(
&
ctx
->
tweak
);
}
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
/*
* AES key schedule (encryption)
*/
#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)
int
mbedtls_aes_setkey_enc
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
keybits
)
{
...
...
@@ -564,21 +531,8 @@ int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
}
#endif
#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
if
(
aes_padlock_ace
==
-
1
)
aes_padlock_ace
=
mbedtls_padlock_has_support
(
MBEDTLS_PADLOCK_ACE
);
if
(
aes_padlock_ace
)
ctx
->
rk
=
RK
=
MBEDTLS_PADLOCK_ALIGN16
(
ctx
->
buf
);
else
#endif
ctx
->
rk
=
RK
=
ctx
->
buf
;
#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
if
(
mbedtls_aesni_has_support
(
MBEDTLS_AESNI_AES
)
)
return
(
mbedtls_aesni_setkey_enc
(
(
unsigned
char
*
)
ctx
->
rk
,
key
,
keybits
)
);
#endif
for
(
i
=
0
;
i
<
(
keybits
>>
5
);
i
++
)
{
GET_UINT32_LE
(
RK
[
i
],
key
,
i
<<
2
);
...
...
@@ -649,12 +603,10 @@ int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
return
(
0
);
}
#endif
/* !MBEDTLS_AES_SETKEY_ENC_ALT */
/*
* AES key schedule (decryption)
*/
#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)
int
mbedtls_aes_setkey_dec
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
keybits
)
{
...
...
@@ -668,14 +620,6 @@ int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
mbedtls_aes_init
(
&
cty
);
#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)
if
(
aes_padlock_ace
==
-
1
)
aes_padlock_ace
=
mbedtls_padlock_has_support
(
MBEDTLS_PADLOCK_ACE
);
if
(
aes_padlock_ace
)
ctx
->
rk
=
RK
=
MBEDTLS_PADLOCK_ALIGN16
(
ctx
->
buf
);
else
#endif
ctx
->
rk
=
RK
=
ctx
->
buf
;
/* Also checks keybits */
...
...
@@ -684,15 +628,6 @@ int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
ctx
->
nr
=
cty
.
nr
;
#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
if
(
mbedtls_aesni_has_support
(
MBEDTLS_AESNI_AES
)
)
{
mbedtls_aesni_inverse_key
(
(
unsigned
char
*
)
ctx
->
rk
,
(
const
unsigned
char
*
)
cty
.
rk
,
ctx
->
nr
);
goto
exit
;
}
#endif
SK
=
cty
.
rk
+
cty
.
nr
*
4
;
*
RK
++
=
*
SK
++
;
...
...
@@ -722,84 +657,6 @@ exit:
return
(
ret
);
}
#if defined(MBEDTLS_CIPHER_MODE_XTS)
static
int
mbedtls_aes_xts_decode_keys
(
const
unsigned
char
*
key
,
unsigned
int
keybits
,
const
unsigned
char
**
key1
,
unsigned
int
*
key1bits
,
const
unsigned
char
**
key2
,
unsigned
int
*
key2bits
)
{
const
unsigned
int
half_keybits
=
keybits
/
2
;
const
unsigned
int
half_keybytes
=
half_keybits
/
8
;
switch
(
keybits
)
{
case
256
:
break
;
case
512
:
break
;
default
:
return
(
MBEDTLS_ERR_AES_INVALID_KEY_LENGTH
);
}
*
key1bits
=
half_keybits
;
*
key2bits
=
half_keybits
;
*
key1
=
&
key
[
0
];
*
key2
=
&
key
[
half_keybytes
];
return
0
;
}
int
mbedtls_aes_xts_setkey_enc
(
mbedtls_aes_xts_context
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
keybits
)
{
int
ret
;
const
unsigned
char
*
key1
,
*
key2
;
unsigned
int
key1bits
,
key2bits
;
AES_VALIDATE_RET
(
ctx
!=
NULL
);
AES_VALIDATE_RET
(
key
!=
NULL
);
ret
=
mbedtls_aes_xts_decode_keys
(
key
,
keybits
,
&
key1
,
&
key1bits
,
&
key2
,
&
key2bits
);
if
(
ret
!=
0
)
return
(
ret
);
/* Set the tweak key. Always set tweak key for the encryption mode. */
ret
=
mbedtls_aes_setkey_enc
(
&
ctx
->
tweak
,
key2
,
key2bits
);
if
(
ret
!=
0
)
return
(
ret
);
/* Set crypt key for encryption. */
return
mbedtls_aes_setkey_enc
(
&
ctx
->
crypt
,
key1
,
key1bits
);
}
int
mbedtls_aes_xts_setkey_dec
(
mbedtls_aes_xts_context
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
keybits
)
{
int
ret
;
const
unsigned
char
*
key1
,
*
key2
;
unsigned
int
key1bits
,
key2bits
;
AES_VALIDATE_RET
(
ctx
!=
NULL
);
AES_VALIDATE_RET
(
key
!=
NULL
);
ret
=
mbedtls_aes_xts_decode_keys
(
key
,
keybits
,
&
key1
,
&
key1bits
,
&
key2
,
&
key2bits
);
if
(
ret
!=
0
)
return
(
ret
);
/* Set the tweak key. Always set tweak key for encryption. */
ret
=
mbedtls_aes_setkey_enc
(
&
ctx
->
tweak
,
key2
,
key2bits
);
if
(
ret
!=
0
)
return
(
ret
);
/* Set crypt key for decryption. */
return
mbedtls_aes_setkey_dec
(
&
ctx
->
crypt
,
key1
,
key1bits
);
}
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
#endif
/* !MBEDTLS_AES_SETKEY_DEC_ALT */
#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
do \
...
...
@@ -852,7 +709,6 @@ int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx,
/*
* AES-ECB block encryption
*/
#if !defined(MBEDTLS_AES_ENCRYPT_ALT)
int
mbedtls_internal_aes_encrypt
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
input
[
16
],
unsigned
char
output
[
16
]
)
...
...
@@ -906,21 +762,10 @@ int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
return
(
0
);
}
#endif
/* !MBEDTLS_AES_ENCRYPT_ALT */
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
void
mbedtls_aes_encrypt
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
input
[
16
],
unsigned
char
output
[
16
]
)
{
mbedtls_internal_aes_encrypt
(
ctx
,
input
,
output
);
}
#endif
/* !MBEDTLS_DEPRECATED_REMOVED */
/*
* AES-ECB block decryption
*/
#if !defined(MBEDTLS_AES_DECRYPT_ALT)
int
mbedtls_internal_aes_decrypt
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
input
[
16
],
unsigned
char
output
[
16
]
)
...
...
@@ -974,16 +819,6 @@ int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
return
(
0
);
}
#endif
/* !MBEDTLS_AES_DECRYPT_ALT */
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
void
mbedtls_aes_decrypt
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
input
[
16
],
unsigned
char
output
[
16
]
)
{
mbedtls_internal_aes_decrypt
(
ctx
,
input
,
output
);
}
#endif
/* !MBEDTLS_DEPRECATED_REMOVED */
/*
* AES-ECB block encryption/decryption
...
...
@@ -999,460 +834,9 @@ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
AES_VALIDATE_RET
(
mode
==
MBEDTLS_AES_ENCRYPT
||
mode
==
MBEDTLS_AES_DECRYPT
);
#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
if
(
mbedtls_aesni_has_support
(
MBEDTLS_AESNI_AES
)
)
return
(
mbedtls_aesni_crypt_ecb
(
ctx
,
mode
,
input
,
output
)
);
#endif
#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
if
(
aes_padlock_ace
)
{
if
(
mbedtls_padlock_xcryptecb
(
ctx
,
mode
,
input
,
output
)
==
0
)
return
(
0
);
// If padlock data misaligned, we just fall back to
// unaccelerated mode
//
}
#endif
if
(
mode
==
MBEDTLS_AES_ENCRYPT
)
return
(
mbedtls_internal_aes_encrypt
(
ctx
,
input
,
output
)
);
else
return
(
mbedtls_internal_aes_decrypt
(
ctx
,
input
,
output
)
);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
/*
* AES-CBC buffer encryption/decryption
*/
int
mbedtls_aes_crypt_cbc
(
mbedtls_aes_context
*
ctx
,
int
mode
,
size_t
length
,
unsigned
char
iv
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
int
i
;
unsigned
char
temp
[
16
];
AES_VALIDATE_RET
(
ctx
!=
NULL
);
AES_VALIDATE_RET
(
mode
==
MBEDTLS_AES_ENCRYPT
||
mode
==
MBEDTLS_AES_DECRYPT
);
AES_VALIDATE_RET
(
iv
!=
NULL
);
AES_VALIDATE_RET
(
input
!=
NULL
);
AES_VALIDATE_RET
(
output
!=
NULL
);
if
(
length
%
16
)
return
(
MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH
);
#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)
if
(
aes_padlock_ace
)
{
if
(
mbedtls_padlock_xcryptcbc
(
ctx
,
mode
,
length
,
iv
,
input
,
output
)
==
0
)
return
(
0
);
// If padlock data misaligned, we just fall back to
// unaccelerated mode
//
}
#endif
if
(
mode
==
MBEDTLS_AES_DECRYPT
)
{
while
(
length
>
0
)
{
memcpy
(
temp
,
input
,
16
);
mbedtls_aes_crypt_ecb
(
ctx
,
mode
,
input
,
output
);
for
(
i
=
0
;
i
<
16
;
i
++
)
output
[
i
]
=
(
unsigned
char
)(
output
[
i
]
^
iv
[
i
]
);
memcpy
(
iv
,
temp
,
16
);
input
+=
16
;
output
+=
16
;
length
-=
16
;
}
}
else
{
while
(
length
>
0
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
output
[
i
]
=
(
unsigned
char
)(
input
[
i
]
^
iv
[
i
]
);
mbedtls_aes_crypt_ecb
(
ctx
,
mode
,
output
,
output
);
memcpy
(
iv
,
output
,
16
);
input
+=
16
;
output
+=
16
;
length
-=
16
;
}
}
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/* Endianess with 64 bits values */
#ifndef GET_UINT64_LE
#define GET_UINT64_LE(n,b,i) \
{ \
(n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \
| ( (uint64_t) (b)[(i) + 6] << 48 ) \
| ( (uint64_t) (b)[(i) + 5] << 40 ) \
| ( (uint64_t) (b)[(i) + 4] << 32 ) \
| ( (uint64_t) (b)[(i) + 3] << 24 ) \
| ( (uint64_t) (b)[(i) + 2] << 16 ) \
| ( (uint64_t) (b)[(i) + 1] << 8 ) \
| ( (uint64_t) (b)[(i) ] ); \
}
#endif
#ifndef PUT_UINT64_LE
#define PUT_UINT64_LE(n,b,i) \
{ \
(b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \
(b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \
(b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \
(b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \
(b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \
(b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \
(b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \
(b)[(i) ] = (unsigned char) ( (n) ); \
}
#endif
typedef
unsigned
char
mbedtls_be128
[
16
];
/*
* GF(2^128) multiplication function
*
* This function multiplies a field element by x in the polynomial field
* representation. It uses 64-bit word operations to gain speed but compensates
* for machine endianess and hence works correctly on both big and little
* endian machines.
*/
static
void
mbedtls_gf128mul_x_ble
(
unsigned
char
r
[
16
],
const
unsigned
char
x
[
16
]
)
{
uint64_t
a
,
b
,
ra
,
rb
;
GET_UINT64_LE
(
a
,
x
,
0
);
GET_UINT64_LE
(
b
,
x
,
8
);
ra
=
(
a
<<
1
)
^
0x0087
>>
(
8
-
(
(
b
>>
63
)
<<
3
)
);
rb
=
(
a
>>
63
)
|
(
b
<<
1
);
PUT_UINT64_LE
(
ra
,
r
,
0
);
PUT_UINT64_LE
(
rb
,
r
,
8
);
}
/*
* AES-XTS buffer encryption/decryption
*/
int
mbedtls_aes_crypt_xts
(
mbedtls_aes_xts_context
*
ctx
,
int
mode
,
size_t
length
,
const
unsigned
char
data_unit
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
int
ret
;
size_t
blocks
=
length
/
16
;
size_t
leftover
=
length
%
16
;
unsigned
char
tweak
[
16
];
unsigned
char
prev_tweak
[
16
];
unsigned
char
tmp
[
16
];
AES_VALIDATE_RET
(
ctx
!=
NULL
);
AES_VALIDATE_RET
(
mode
==
MBEDTLS_AES_ENCRYPT
||
mode
==
MBEDTLS_AES_DECRYPT
);
AES_VALIDATE_RET
(
data_unit
!=
NULL
);
AES_VALIDATE_RET
(
input
!=
NULL
);
AES_VALIDATE_RET
(
output
!=
NULL
);
/* Data units must be at least 16 bytes long. */
if
(
length
<
16
)
return
MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH
;
/* NIST SP 800-38E disallows data units larger than 2**20 blocks. */
if
(
length
>
(
1
<<
20
)
*
16
)
return
MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH
;
/* Compute the tweak. */
ret
=
mbedtls_aes_crypt_ecb
(
&
ctx
->
tweak
,
MBEDTLS_AES_ENCRYPT
,
data_unit
,
tweak
);
if
(
ret
!=
0
)
return
(
ret
);
while
(
blocks
--
)
{
size_t
i
;
if
(
leftover
&&
(
mode
==
MBEDTLS_AES_DECRYPT
)
&&
blocks
==
0
)
{
/* We are on the last block in a decrypt operation that has
* leftover bytes, so we need to use the next tweak for this block,
* and this tweak for the lefover bytes. Save the current tweak for
* the leftovers and then update the current tweak for use on this,
* the last full block. */
memcpy
(
prev_tweak
,
tweak
,
sizeof
(
tweak
)
);
mbedtls_gf128mul_x_ble
(
tweak
,
tweak
);
}
for
(
i
=
0
;
i
<
16
;
i
++
)
tmp
[
i
]
=
input
[
i
]
^
tweak
[
i
];
ret
=
mbedtls_aes_crypt_ecb
(
&
ctx
->
crypt
,
mode
,
tmp
,
tmp
);
if
(
ret
!=
0
)
return
(
ret
);
for
(
i
=
0
;
i
<
16
;
i
++
)
output
[
i
]
=
tmp
[
i
]
^
tweak
[
i
];
/* Update the tweak for the next block. */
mbedtls_gf128mul_x_ble
(
tweak
,
tweak
);
output
+=
16
;
input
+=
16
;
}
if
(
leftover
)
{
/* If we are on the leftover bytes in a decrypt operation, we need to
* use the previous tweak for these bytes (as saved in prev_tweak). */
unsigned
char
*
t
=
mode
==
MBEDTLS_AES_DECRYPT
?
prev_tweak
:
tweak
;
/* We are now on the final part of the data unit, which doesn't divide
* evenly by 16. It's time for ciphertext stealing. */
size_t
i
;
unsigned
char
*
prev_output
=
output
-
16
;
/* Copy ciphertext bytes from the previous block to our output for each
* byte of cyphertext we won't steal. At the same time, copy the
* remainder of the input for this final round (since the loop bounds
* are the same). */
for
(
i
=
0
;
i
<
leftover
;
i
++
)
{
output
[
i
]
=
prev_output
[
i
];
tmp
[
i
]
=
input
[
i
]
^
t
[
i
];
}
/* Copy ciphertext bytes from the previous block for input in this
* round. */
for
(
;
i
<
16
;
i
++
)
tmp
[
i
]
=
prev_output
[
i
]
^
t
[
i
];
ret
=
mbedtls_aes_crypt_ecb
(
&
ctx
->
crypt
,
mode
,
tmp
,
tmp
);
if
(
ret
!=
0
)
return
ret
;
/* Write the result back to the previous block, overriding the previous
* output we copied. */
for
(
i
=
0
;
i
<
16
;
i
++
)
prev_output
[
i
]
=
tmp
[
i
]
^
t
[
i
];
}
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
/*
* AES-CFB128 buffer encryption/decryption
*/
int
mbedtls_aes_crypt_cfb128
(
mbedtls_aes_context
*
ctx
,
int
mode
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
iv
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
int
c
;
size_t
n
;
AES_VALIDATE_RET
(
ctx
!=
NULL
);
AES_VALIDATE_RET
(
mode
==
MBEDTLS_AES_ENCRYPT
||
mode
==
MBEDTLS_AES_DECRYPT
);
AES_VALIDATE_RET
(
iv_off
!=
NULL
);
AES_VALIDATE_RET
(
iv
!=
NULL
);
AES_VALIDATE_RET
(
input
!=
NULL
);
AES_VALIDATE_RET
(
output
!=
NULL
);
n
=
*
iv_off
;
if
(
n
>
15
)
return
(
MBEDTLS_ERR_AES_BAD_INPUT_DATA
);
if
(
mode
==
MBEDTLS_AES_DECRYPT
)
{
while
(
length
--
)
{
if
(
n
==
0
)
mbedtls_aes_crypt_ecb
(
ctx
,
MBEDTLS_AES_ENCRYPT
,
iv
,
iv
);
c
=
*
input
++
;
*
output
++
=
(
unsigned
char
)(
c
^
iv
[
n
]
);
iv
[
n
]
=
(
unsigned
char
)
c
;
n
=
(
n
+
1
)
&
0x0F
;
}
}
else
{
while
(
length
--
)
{
if
(
n
==
0
)
mbedtls_aes_crypt_ecb
(
ctx
,
MBEDTLS_AES_ENCRYPT
,
iv
,
iv
);
iv
[
n
]
=
*
output
++
=
(
unsigned
char
)(
iv
[
n
]
^
*
input
++
);
n
=
(
n
+
1
)
&
0x0F
;
}
}
*
iv_off
=
n
;
return
(
0
);
}
/*
* AES-CFB8 buffer encryption/decryption
*/
int
mbedtls_aes_crypt_cfb8
(
mbedtls_aes_context
*
ctx
,
int
mode
,
size_t
length
,
unsigned
char
iv
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
unsigned
char
c
;
unsigned
char
ov
[
17
];
AES_VALIDATE_RET
(
ctx
!=
NULL
);
AES_VALIDATE_RET
(
mode
==
MBEDTLS_AES_ENCRYPT
||
mode
==
MBEDTLS_AES_DECRYPT
);
AES_VALIDATE_RET
(
iv
!=
NULL
);
AES_VALIDATE_RET
(
input
!=
NULL
);
AES_VALIDATE_RET
(
output
!=
NULL
);
while
(
length
--
)
{
memcpy
(
ov
,
iv
,
16
);
mbedtls_aes_crypt_ecb
(
ctx
,
MBEDTLS_AES_ENCRYPT
,
iv
,
iv
);
if
(
mode
==
MBEDTLS_AES_DECRYPT
)
ov
[
16
]
=
*
input
;
c
=
*
output
++
=
(
unsigned
char
)(
iv
[
0
]
^
*
input
++
);
if
(
mode
==
MBEDTLS_AES_ENCRYPT
)
ov
[
16
]
=
c
;
memcpy
(
iv
,
ov
+
1
,
16
);
}
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_OFB)
/*
* AES-OFB (Output Feedback Mode) buffer encryption/decryption
*/
int
mbedtls_aes_crypt_ofb
(
mbedtls_aes_context
*
ctx
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
iv
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
int
ret
=
0
;
size_t
n
;
AES_VALIDATE_RET
(
ctx
!=
NULL
);
AES_VALIDATE_RET
(
iv_off
!=
NULL
);
AES_VALIDATE_RET
(
iv
!=
NULL
);
AES_VALIDATE_RET
(
input
!=
NULL
);
AES_VALIDATE_RET
(
output
!=
NULL
);
n
=
*
iv_off
;
if
(
n
>
15
)
return
(
MBEDTLS_ERR_AES_BAD_INPUT_DATA
);
while
(
length
--
)
{
if
(
n
==
0
)
{
ret
=
mbedtls_aes_crypt_ecb
(
ctx
,
MBEDTLS_AES_ENCRYPT
,
iv
,
iv
);
if
(
ret
!=
0
)
goto
exit
;
}
*
output
++
=
*
input
++
^
iv
[
n
];
n
=
(
n
+
1
)
&
0x0F
;
}
*
iv_off
=
n
;
exit:
return
(
ret
);
}
#endif
/* MBEDTLS_CIPHER_MODE_OFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
/*
* AES-CTR buffer encryption/decryption
*/
int
mbedtls_aes_crypt_ctr
(
mbedtls_aes_context
*
ctx
,
size_t
length
,
size_t
*
nc_off
,
unsigned
char
nonce_counter
[
16
],
unsigned
char
stream_block
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
int
c
,
i
;
size_t
n
;
AES_VALIDATE_RET
(
ctx
!=
NULL
);
AES_VALIDATE_RET
(
nc_off
!=
NULL
);
AES_VALIDATE_RET
(
nonce_counter
!=
NULL
);
AES_VALIDATE_RET
(
stream_block
!=
NULL
);
AES_VALIDATE_RET
(
input
!=
NULL
);
AES_VALIDATE_RET
(
output
!=
NULL
);
n
=
*
nc_off
;
if
(
n
>
0x0F
)
return
(
MBEDTLS_ERR_AES_BAD_INPUT_DATA
);
while
(
length
--
)
{
if
(
n
==
0
)
{
mbedtls_aes_crypt_ecb
(
ctx
,
MBEDTLS_AES_ENCRYPT
,
nonce_counter
,
stream_block
);
for
(
i
=
16
;
i
>
0
;
i
--
)
if
(
++
nonce_counter
[
i
-
1
]
!=
0
)
break
;
}
c
=
*
input
++
;
*
output
++
=
(
unsigned
char
)(
c
^
stream_block
[
n
]
);
n
=
(
n
+
1
)
&
0x0F
;
}
*
nc_off
=
n
;
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
#endif
/* !MBEDTLS_AES_ALT */
#endif
/* MBEDTLS_AES_C */
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/aes.h
View file @
8f3efffa
...
...
@@ -41,8 +41,6 @@
#ifndef MBEDTLS_AES_H
#define MBEDTLS_AES_H
#include "config.h"
#include <stddef.h>
#include <stdint.h>
...
...
@@ -57,22 +55,10 @@
/* Error codes in range 0x0021-0x0025 */
#define MBEDTLS_ERR_AES_BAD_INPUT_DATA -0x0021
/**< Invalid input data. */
/* MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE is deprecated and should not be used. */
#define MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE -0x0023
/**< Feature not available. For example, an unsupported AES key size. */
/* MBEDTLS_ERR_AES_HW_ACCEL_FAILED is deprecated and should not be used. */
#define MBEDTLS_ERR_AES_HW_ACCEL_FAILED -0x0025
/**< AES hardware accelerator failed. */
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
!defined(inline) && !defined(__cplusplus)
#define inline __inline
#endif
#ifdef __cplusplus
extern
"C"
{
#endif
#if !defined(MBEDTLS_AES_ALT)
// Regular implementation
//
...
...
@@ -94,23 +80,6 @@ typedef struct mbedtls_aes_context
}
mbedtls_aes_context
;
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/**
* \brief The AES XTS context-type definition.
*/
typedef
struct
mbedtls_aes_xts_context
{
mbedtls_aes_context
crypt
;
/*!< The AES context to use for AES block
encryption or decryption. */
mbedtls_aes_context
tweak
;
/*!< The AES context used for tweak
computation. */
}
mbedtls_aes_xts_context
;
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
#else
/* MBEDTLS_AES_ALT */
#include "aes_alt.h"
#endif
/* MBEDTLS_AES_ALT */
/**
* \brief This function initializes the specified AES context.
*
...
...
@@ -130,27 +99,6 @@ void mbedtls_aes_init( mbedtls_aes_context *ctx );
*/
void
mbedtls_aes_free
(
mbedtls_aes_context
*
ctx
);
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/**
* \brief This function initializes the specified AES XTS context.
*
* It must be the first API called before using
* the context.
*
* \param ctx The AES XTS context to initialize. This must not be \c NULL.
*/
void
mbedtls_aes_xts_init
(
mbedtls_aes_xts_context
*
ctx
);
/**
* \brief This function releases and clears the specified AES XTS context.
*
* \param ctx The AES XTS context to clear.
* If this is \c NULL, this function does nothing.
* Otherwise, the context must have been at least initialized.
*/
void
mbedtls_aes_xts_free
(
mbedtls_aes_xts_context
*
ctx
);
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
/**
* \brief This function sets the encryption key.
*
...
...
@@ -187,48 +135,6 @@ int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
int
mbedtls_aes_setkey_dec
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
keybits
);
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/**
* \brief This function prepares an XTS context for encryption and
* sets the encryption key.
*
* \param ctx The AES XTS context to which the key should be bound.
* It must be initialized.
* \param key The encryption key. This is comprised of the XTS key1
* concatenated with the XTS key2.
* This must be a readable buffer of size \p keybits bits.
* \param keybits The size of \p key passed in bits. Valid options are:
* <ul><li>256 bits (each of key1 and key2 is a 128-bit key)</li>
* <li>512 bits (each of key1 and key2 is a 256-bit key)</li></ul>
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
*/
int
mbedtls_aes_xts_setkey_enc
(
mbedtls_aes_xts_context
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
keybits
);
/**
* \brief This function prepares an XTS context for decryption and
* sets the decryption key.
*
* \param ctx The AES XTS context to which the key should be bound.
* It must be initialized.
* \param key The decryption key. This is comprised of the XTS key1
* concatenated with the XTS key2.
* This must be a readable buffer of size \p keybits bits.
* \param keybits The size of \p key passed in bits. Valid options are:
* <ul><li>256 bits (each of key1 and key2 is a 128-bit key)</li>
* <li>512 bits (each of key1 and key2 is a 256-bit key)</li></ul>
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
*/
int
mbedtls_aes_xts_setkey_dec
(
mbedtls_aes_xts_context
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
keybits
);
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
/**
* \brief This function performs an AES single-block encryption or
* decryption operation.
...
...
@@ -257,333 +163,6 @@ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
const
unsigned
char
input
[
16
],
unsigned
char
output
[
16
]
);
#if defined(MBEDTLS_CIPHER_MODE_CBC)
/**
* \brief This function performs an AES-CBC encryption or decryption operation
* on full blocks.
*
* It performs the operation defined in the \p mode
* parameter (encrypt/decrypt), on the input data buffer defined in
* the \p input parameter.
*
* It can be called as many times as needed, until all the input
* data is processed. mbedtls_aes_init(), and either
* mbedtls_aes_setkey_enc() or mbedtls_aes_setkey_dec() must be called
* before the first call to this API with the same context.
*
* \note This function operates on full blocks, that is, the input size
* must be a multiple of the AES block size of \c 16 Bytes.
*
* \note Upon exit, the content of the IV is updated so that you can
* call the same function again on the next
* block(s) of data and get the same result as if it was
* encrypted in one call. This allows a "streaming" usage.
* If you need to retain the contents of the IV, you should
* either save it manually or use the cipher module instead.
*
*
* \param ctx The AES context to use for encryption or decryption.
* It must be initialized and bound to a key.
* \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or
* #MBEDTLS_AES_DECRYPT.
* \param length The length of the input data in Bytes. This must be a
* multiple of the block size (\c 16 Bytes).
* \param iv Initialization vector (updated after use).
* It must be a readable and writeable buffer of \c 16 Bytes.
* \param input The buffer holding the input data.
* It must be readable and of size \p length Bytes.
* \param output The buffer holding the output data.
* It must be writeable and of size \p length Bytes.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH
* on failure.
*/
int
mbedtls_aes_crypt_cbc
(
mbedtls_aes_context
*
ctx
,
int
mode
,
size_t
length
,
unsigned
char
iv
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/**
* \brief This function performs an AES-XTS encryption or decryption
* operation for an entire XTS data unit.
*
* AES-XTS encrypts or decrypts blocks based on their location as
* defined by a data unit number. The data unit number must be
* provided by \p data_unit.
*
* NIST SP 800-38E limits the maximum size of a data unit to 2^20
* AES blocks. If the data unit is larger than this, this function
* returns #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH.
*
* \param ctx The AES XTS context to use for AES XTS operations.
* It must be initialized and bound to a key.
* \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or
* #MBEDTLS_AES_DECRYPT.
* \param length The length of a data unit in Bytes. This can be any
* length between 16 bytes and 2^24 bytes inclusive
* (between 1 and 2^20 block cipher blocks).
* \param data_unit The address of the data unit encoded as an array of 16
* bytes in little-endian format. For disk encryption, this
* is typically the index of the block device sector that
* contains the data.
* \param input The buffer holding the input data (which is an entire
* data unit). This function reads \p length Bytes from \p
* input.
* \param output The buffer holding the output data (which is an entire
* data unit). This function writes \p length Bytes to \p
* output.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH if \p length is
* smaller than an AES block in size (16 Bytes) or if \p
* length is larger than 2^20 blocks (16 MiB).
*/
int
mbedtls_aes_crypt_xts
(
mbedtls_aes_xts_context
*
ctx
,
int
mode
,
size_t
length
,
const
unsigned
char
data_unit
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
/**
* \brief This function performs an AES-CFB128 encryption or decryption
* operation.
*
* It performs the operation defined in the \p mode
* parameter (encrypt or decrypt), on the input data buffer
* defined in the \p input parameter.
*
* For CFB, you must set up the context with mbedtls_aes_setkey_enc(),
* regardless of whether you are performing an encryption or decryption
* operation, that is, regardless of the \p mode parameter. This is
* because CFB mode uses the same key schedule for encryption and
* decryption.
*
* \note Upon exit, the content of the IV is updated so that you can
* call the same function again on the next
* block(s) of data and get the same result as if it was
* encrypted in one call. This allows a "streaming" usage.
* If you need to retain the contents of the
* IV, you must either save it manually or use the cipher
* module instead.
*
*
* \param ctx The AES context to use for encryption or decryption.
* It must be initialized and bound to a key.
* \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or
* #MBEDTLS_AES_DECRYPT.
* \param length The length of the input data in Bytes.
* \param iv_off The offset in IV (updated after use).
* It must point to a valid \c size_t.
* \param iv The initialization vector (updated after use).
* It must be a readable and writeable buffer of \c 16 Bytes.
* \param input The buffer holding the input data.
* It must be readable and of size \p length Bytes.
* \param output The buffer holding the output data.
* It must be writeable and of size \p length Bytes.
*
* \return \c 0 on success.
*/
int
mbedtls_aes_crypt_cfb128
(
mbedtls_aes_context
*
ctx
,
int
mode
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
iv
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
);
/**
* \brief This function performs an AES-CFB8 encryption or decryption
* operation.
*
* It performs the operation defined in the \p mode
* parameter (encrypt/decrypt), on the input data buffer defined
* in the \p input parameter.
*
* Due to the nature of CFB, you must use the same key schedule for
* both encryption and decryption operations. Therefore, you must
* use the context initialized with mbedtls_aes_setkey_enc() for
* both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT.
*
* \note Upon exit, the content of the IV is updated so that you can
* call the same function again on the next
* block(s) of data and get the same result as if it was
* encrypted in one call. This allows a "streaming" usage.
* If you need to retain the contents of the
* IV, you should either save it manually or use the cipher
* module instead.
*
*
* \param ctx The AES context to use for encryption or decryption.
* It must be initialized and bound to a key.
* \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or
* #MBEDTLS_AES_DECRYPT
* \param length The length of the input data.
* \param iv The initialization vector (updated after use).
* It must be a readable and writeable buffer of \c 16 Bytes.
* \param input The buffer holding the input data.
* It must be readable and of size \p length Bytes.
* \param output The buffer holding the output data.
* It must be writeable and of size \p length Bytes.
*
* \return \c 0 on success.
*/
int
mbedtls_aes_crypt_cfb8
(
mbedtls_aes_context
*
ctx
,
int
mode
,
size_t
length
,
unsigned
char
iv
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
/*MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_OFB)
/**
* \brief This function performs an AES-OFB (Output Feedback Mode)
* encryption or decryption operation.
*
* For OFB, you must set up the context with
* mbedtls_aes_setkey_enc(), regardless of whether you are
* performing an encryption or decryption operation. This is
* because OFB mode uses the same key schedule for encryption and
* decryption.
*
* The OFB operation is identical for encryption or decryption,
* therefore no operation mode needs to be specified.
*
* \note Upon exit, the content of iv, the Initialisation Vector, is
* updated so that you can call the same function again on the next
* block(s) of data and get the same result as if it was encrypted
* in one call. This allows a "streaming" usage, by initialising
* iv_off to 0 before the first call, and preserving its value
* between calls.
*
* For non-streaming use, the iv should be initialised on each call
* to a unique value, and iv_off set to 0 on each call.
*
* If you need to retain the contents of the initialisation vector,
* you must either save it manually or use the cipher module
* instead.
*
* \warning For the OFB mode, the initialisation vector must be unique
* every encryption operation. Reuse of an initialisation vector
* will compromise security.
*
* \param ctx The AES context to use for encryption or decryption.
* It must be initialized and bound to a key.
* \param length The length of the input data.
* \param iv_off The offset in IV (updated after use).
* It must point to a valid \c size_t.
* \param iv The initialization vector (updated after use).
* It must be a readable and writeable buffer of \c 16 Bytes.
* \param input The buffer holding the input data.
* It must be readable and of size \p length Bytes.
* \param output The buffer holding the output data.
* It must be writeable and of size \p length Bytes.
*
* \return \c 0 on success.
*/
int
mbedtls_aes_crypt_ofb
(
mbedtls_aes_context
*
ctx
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
iv
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
/* MBEDTLS_CIPHER_MODE_OFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
/**
* \brief This function performs an AES-CTR encryption or decryption
* operation.
*
* This function performs the operation defined in the \p mode
* parameter (encrypt/decrypt), on the input data buffer
* defined in the \p input parameter.
*
* Due to the nature of CTR, you must use the same key schedule
* for both encryption and decryption operations. Therefore, you
* must use the context initialized with mbedtls_aes_setkey_enc()
* for both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT.
*
* \warning You must never reuse a nonce value with the same key. Doing so
* would void the encryption for the two messages encrypted with
* the same nonce and key.
*
* There are two common strategies for managing nonces with CTR:
*
* 1. You can handle everything as a single message processed over
* successive calls to this function. In that case, you want to
* set \p nonce_counter and \p nc_off to 0 for the first call, and
* then preserve the values of \p nonce_counter, \p nc_off and \p
* stream_block across calls to this function as they will be
* updated by this function.
*
* With this strategy, you must not encrypt more than 2**128
* blocks of data with the same key.
*
* 2. You can encrypt separate messages by dividing the \p
* nonce_counter buffer in two areas: the first one used for a
* per-message nonce, handled by yourself, and the second one
* updated by this function internally.
*
* For example, you might reserve the first 12 bytes for the
* per-message nonce, and the last 4 bytes for internal use. In that
* case, before calling this function on a new message you need to
* set the first 12 bytes of \p nonce_counter to your chosen nonce
* value, the last 4 to 0, and \p nc_off to 0 (which will cause \p
* stream_block to be ignored). That way, you can encrypt at most
* 2**96 messages of up to 2**32 blocks each with the same key.
*
* The per-message nonce (or information sufficient to reconstruct
* it) needs to be communicated with the ciphertext and must be unique.
* The recommended way to ensure uniqueness is to use a message
* counter. An alternative is to generate random nonces, but this
* limits the number of messages that can be securely encrypted:
* for example, with 96-bit random nonces, you should not encrypt
* more than 2**32 messages with the same key.
*
* Note that for both stategies, sizes are measured in blocks and
* that an AES block is 16 bytes.
*
* \warning Upon return, \p stream_block contains sensitive data. Its
* content must not be written to insecure storage and should be
* securely discarded as soon as it's no longer needed.
*
* \param ctx The AES context to use for encryption or decryption.
* It must be initialized and bound to a key.
* \param length The length of the input data.
* \param nc_off The offset in the current \p stream_block, for
* resuming within the current cipher stream. The
* offset pointer should be 0 at the start of a stream.
* It must point to a valid \c size_t.
* \param nonce_counter The 128-bit nonce and counter.
* It must be a readable-writeable buffer of \c 16 Bytes.
* \param stream_block The saved stream block for resuming. This is
* overwritten by the function.
* It must be a readable-writeable buffer of \c 16 Bytes.
* \param input The buffer holding the input data.
* It must be readable and of size \p length Bytes.
* \param output The buffer holding the output data.
* It must be writeable and of size \p length Bytes.
*
* \return \c 0 on success.
*/
int
mbedtls_aes_crypt_ctr
(
mbedtls_aes_context
*
ctx
,
size_t
length
,
size_t
*
nc_off
,
unsigned
char
nonce_counter
[
16
],
unsigned
char
stream_block
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
/**
* \brief Internal AES block encryption function. This is only
* exposed to allow overriding it using
...
...
@@ -614,54 +193,6 @@ int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
const
unsigned
char
input
[
16
],
unsigned
char
output
[
16
]
);
#if !defined(MBEDTLS_DEPRECATED_REMOVED)
#if defined(MBEDTLS_DEPRECATED_WARNING)
#define MBEDTLS_DEPRECATED __attribute__((deprecated))
#else
#define MBEDTLS_DEPRECATED
#endif
/**
* \brief Deprecated internal AES block encryption function
* without return value.
*
* \deprecated Superseded by mbedtls_internal_aes_encrypt()
*
* \param ctx The AES context to use for encryption.
* \param input Plaintext block.
* \param output Output (ciphertext) block.
*/
MBEDTLS_DEPRECATED
void
mbedtls_aes_encrypt
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
input
[
16
],
unsigned
char
output
[
16
]
);
/**
* \brief Deprecated internal AES block decryption function
* without return value.
*
* \deprecated Superseded by mbedtls_internal_aes_decrypt()
*
* \param ctx The AES context to use for decryption.
* \param input Ciphertext block.
* \param output Output (plaintext) block.
*/
MBEDTLS_DEPRECATED
void
mbedtls_aes_decrypt
(
mbedtls_aes_context
*
ctx
,
const
unsigned
char
input
[
16
],
unsigned
char
output
[
16
]
);
#undef MBEDTLS_DEPRECATED
#endif
/* !MBEDTLS_DEPRECATED_REMOVED */
#if defined(MBEDTLS_SELF_TEST)
/**
* \brief Checkup routine.
*
* \return \c 0 on success.
* \return \c 1 on failure.
*/
int
mbedtls_aes_self_test
(
int
verbose
);
#endif
/* MBEDTLS_SELF_TEST */
#ifdef __cplusplus
}
...
...
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/cipher.c
deleted
100644 → 0
View file @
b13825f4
/**
* \file cipher.c
*
* \brief Generic cipher wrapper for mbed TLS
*
* \author Adriaan de Jong <dejong@fox-it.com>
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is part of mbed TLS (https://tls.mbed.org)
*/
#include "config.h"
#include "platform_util.h"
#if defined(MBEDTLS_CIPHER_C)
#include "cipher.h"
#include "cipher_internal.h"
#include <stdlib.h>
#include <string.h>
#if defined(MBEDTLS_CHACHAPOLY_C)
#include "mbedtls/chachapoly.h"
#endif
#if defined(MBEDTLS_GCM_C)
#include "gcm.h"
#endif
#if defined(MBEDTLS_CCM_C)
#include "mbedtls/ccm.h"
#endif
#if defined(MBEDTLS_CHACHA20_C)
#include "mbedtls/chacha20.h"
#endif
#if defined(MBEDTLS_CMAC_C)
#include "mbedtls/cmac.h"
#endif
#if defined(MBEDTLS_USE_PSA_CRYPTO)
#include "psa/crypto.h"
#include "mbedtls/psa_util.h"
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
#if defined(MBEDTLS_NIST_KW_C)
#include "mbedtls/nist_kw.h"
#endif
#if defined(MBEDTLS_PLATFORM_C)
#include "mbedtls/platform.h"
#else
#define mbedtls_calloc calloc
#define mbedtls_free free
#endif
#define CIPHER_VALIDATE_RET( cond ) \
MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA )
#define CIPHER_VALIDATE( cond ) \
MBEDTLS_INTERNAL_VALIDATE( cond )
#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
/* Compare the contents of two buffers in constant time.
* Returns 0 if the contents are bitwise identical, otherwise returns
* a non-zero value.
* This is currently only used by GCM and ChaCha20+Poly1305.
*/
static
int
mbedtls_constant_time_memcmp
(
const
void
*
v1
,
const
void
*
v2
,
size_t
len
)
{
const
unsigned
char
*
p1
=
(
const
unsigned
char
*
)
v1
;
const
unsigned
char
*
p2
=
(
const
unsigned
char
*
)
v2
;
size_t
i
;
unsigned
char
diff
;
for
(
diff
=
0
,
i
=
0
;
i
<
len
;
i
++
)
diff
|=
p1
[
i
]
^
p2
[
i
];
return
(
(
int
)
diff
);
}
#endif
/* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */
static
int
supported_init
=
0
;
const
int
*
mbedtls_cipher_list
(
void
)
{
const
mbedtls_cipher_definition_t
*
def
;
int
*
type
;
if
(
!
supported_init
)
{
def
=
mbedtls_cipher_definitions
;
type
=
mbedtls_cipher_supported
;
while
(
def
->
type
!=
0
)
*
type
++
=
(
*
def
++
).
type
;
*
type
=
0
;
supported_init
=
1
;
}
return
(
mbedtls_cipher_supported
);
}
const
mbedtls_cipher_info_t
*
mbedtls_cipher_info_from_type
(
const
mbedtls_cipher_type_t
cipher_type
)
{
const
mbedtls_cipher_definition_t
*
def
;
for
(
def
=
mbedtls_cipher_definitions
;
def
->
info
!=
NULL
;
def
++
)
if
(
def
->
type
==
cipher_type
)
return
(
def
->
info
);
return
(
NULL
);
}
const
mbedtls_cipher_info_t
*
mbedtls_cipher_info_from_string
(
const
char
*
cipher_name
)
{
const
mbedtls_cipher_definition_t
*
def
;
if
(
NULL
==
cipher_name
)
return
(
NULL
);
for
(
def
=
mbedtls_cipher_definitions
;
def
->
info
!=
NULL
;
def
++
)
if
(
!
strcmp
(
def
->
info
->
name
,
cipher_name
)
)
return
(
def
->
info
);
return
(
NULL
);
}
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
)
{
const
mbedtls_cipher_definition_t
*
def
;
for
(
def
=
mbedtls_cipher_definitions
;
def
->
info
!=
NULL
;
def
++
)
if
(
def
->
info
->
base
->
cipher
==
cipher_id
&&
def
->
info
->
key_bitlen
==
(
unsigned
)
key_bitlen
&&
def
->
info
->
mode
==
mode
)
return
(
def
->
info
);
return
(
NULL
);
}
void
mbedtls_cipher_init
(
mbedtls_cipher_context_t
*
ctx
)
{
CIPHER_VALIDATE
(
ctx
!=
NULL
);
memset
(
ctx
,
0
,
sizeof
(
mbedtls_cipher_context_t
)
);
}
void
mbedtls_cipher_free
(
mbedtls_cipher_context_t
*
ctx
)
{
if
(
ctx
==
NULL
)
return
;
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
if
(
ctx
->
cipher_ctx
!=
NULL
)
{
mbedtls_cipher_context_psa
*
const
cipher_psa
=
(
mbedtls_cipher_context_psa
*
)
ctx
->
cipher_ctx
;
if
(
cipher_psa
->
slot_state
==
MBEDTLS_CIPHER_PSA_KEY_OWNED
)
{
/* xxx_free() doesn't allow to return failures. */
(
void
)
psa_destroy_key
(
cipher_psa
->
slot
);
}
mbedtls_platform_zeroize
(
cipher_psa
,
sizeof
(
*
cipher_psa
)
);
mbedtls_free
(
cipher_psa
);
}
mbedtls_platform_zeroize
(
ctx
,
sizeof
(
mbedtls_cipher_context_t
)
);
return
;
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
#if defined(MBEDTLS_CMAC_C)
if
(
ctx
->
cmac_ctx
)
{
mbedtls_platform_zeroize
(
ctx
->
cmac_ctx
,
sizeof
(
mbedtls_cmac_context_t
)
);
mbedtls_free
(
ctx
->
cmac_ctx
);
}
#endif
if
(
ctx
->
cipher_ctx
)
ctx
->
cipher_info
->
base
->
ctx_free_func
(
ctx
->
cipher_ctx
);
mbedtls_platform_zeroize
(
ctx
,
sizeof
(
mbedtls_cipher_context_t
)
);
}
int
mbedtls_cipher_setup
(
mbedtls_cipher_context_t
*
ctx
,
const
mbedtls_cipher_info_t
*
cipher_info
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
if
(
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
memset
(
ctx
,
0
,
sizeof
(
mbedtls_cipher_context_t
)
);
if
(
NULL
==
(
ctx
->
cipher_ctx
=
cipher_info
->
base
->
ctx_alloc_func
()
)
)
return
(
MBEDTLS_ERR_CIPHER_ALLOC_FAILED
);
ctx
->
cipher_info
=
cipher_info
;
#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
/*
* Ignore possible errors caused by a cipher mode that doesn't use padding
*/
#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
(
void
)
mbedtls_cipher_set_padding_mode
(
ctx
,
MBEDTLS_PADDING_PKCS7
);
#else
(
void
)
mbedtls_cipher_set_padding_mode
(
ctx
,
MBEDTLS_PADDING_NONE
);
#endif
#endif
/* MBEDTLS_CIPHER_MODE_WITH_PADDING */
return
(
0
);
}
#if defined(MBEDTLS_USE_PSA_CRYPTO)
int
mbedtls_cipher_setup_psa
(
mbedtls_cipher_context_t
*
ctx
,
const
mbedtls_cipher_info_t
*
cipher_info
,
size_t
taglen
)
{
psa_algorithm_t
alg
;
mbedtls_cipher_context_psa
*
cipher_psa
;
if
(
NULL
==
cipher_info
||
NULL
==
ctx
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
/* Check that the underlying cipher mode and cipher type are
* supported by the underlying PSA Crypto implementation. */
alg
=
mbedtls_psa_translate_cipher_mode
(
cipher_info
->
mode
,
taglen
);
if
(
alg
==
0
)
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
if
(
mbedtls_psa_translate_cipher_type
(
cipher_info
->
type
)
==
0
)
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
memset
(
ctx
,
0
,
sizeof
(
mbedtls_cipher_context_t
)
);
cipher_psa
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_cipher_context_psa
)
);
if
(
cipher_psa
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_ALLOC_FAILED
);
cipher_psa
->
alg
=
alg
;
ctx
->
cipher_ctx
=
cipher_psa
;
ctx
->
cipher_info
=
cipher_info
;
ctx
->
psa_enabled
=
1
;
return
(
0
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
int
mbedtls_cipher_setkey
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
key
,
int
key_bitlen
,
const
mbedtls_operation_t
operation
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
key
!=
NULL
);
CIPHER_VALIDATE_RET
(
operation
==
MBEDTLS_ENCRYPT
||
operation
==
MBEDTLS_DECRYPT
);
if
(
ctx
->
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
mbedtls_cipher_context_psa
*
const
cipher_psa
=
(
mbedtls_cipher_context_psa
*
)
ctx
->
cipher_ctx
;
size_t
const
key_bytelen
=
(
(
size_t
)
key_bitlen
+
7
)
/
8
;
psa_status_t
status
;
psa_key_type_t
key_type
;
psa_key_usage_t
key_usage
;
psa_key_policy_t
key_policy
;
/* PSA Crypto API only accepts byte-aligned keys. */
if
(
key_bitlen
%
8
!=
0
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
/* Don't allow keys to be set multiple times. */
if
(
cipher_psa
->
slot_state
!=
MBEDTLS_CIPHER_PSA_KEY_UNSET
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
key_type
=
mbedtls_psa_translate_cipher_type
(
ctx
->
cipher_info
->
type
);
if
(
key_type
==
0
)
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
/* Allocate a key slot to use. */
status
=
psa_allocate_key
(
&
cipher_psa
->
slot
);
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
/* Indicate that we own the key slot and need to
* destroy it in mbedtls_cipher_free(). */
cipher_psa
->
slot_state
=
MBEDTLS_CIPHER_PSA_KEY_OWNED
;
/* From that point on, the responsibility for destroying the
* key slot is on mbedtls_cipher_free(). This includes the case
* where the policy setup or key import below fail, as
* mbedtls_cipher_free() needs to be called in any case. */
/* Setup policy for the new key slot. */
key_policy
=
psa_key_policy_init
();
/* Mbed TLS' cipher layer doesn't enforce the mode of operation
* (encrypt vs. decrypt): it is possible to setup a key for encryption
* and use it for AEAD decryption. Until tests relying on this
* are changed, allow any usage in PSA. */
/* key_usage = mbedtls_psa_translate_cipher_operation( operation ); */
key_usage
=
PSA_KEY_USAGE_ENCRYPT
|
PSA_KEY_USAGE_DECRYPT
;
psa_key_policy_set_usage
(
&
key_policy
,
key_usage
,
cipher_psa
->
alg
);
status
=
psa_set_key_policy
(
cipher_psa
->
slot
,
&
key_policy
);
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
/* Populate new key slot. */
status
=
psa_import_key
(
cipher_psa
->
slot
,
key_type
,
key
,
key_bytelen
);
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
ctx
->
key_bitlen
=
key_bitlen
;
ctx
->
operation
=
operation
;
return
(
0
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
if
(
(
ctx
->
cipher_info
->
flags
&
MBEDTLS_CIPHER_VARIABLE_KEY_LEN
)
==
0
&&
(
int
)
ctx
->
cipher_info
->
key_bitlen
!=
key_bitlen
)
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
ctx
->
key_bitlen
=
key_bitlen
;
ctx
->
operation
=
operation
;
/*
* For OFB, CFB and CTR mode always use the encryption key schedule
*/
if
(
MBEDTLS_ENCRYPT
==
operation
||
MBEDTLS_MODE_CFB
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_OFB
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_CTR
==
ctx
->
cipher_info
->
mode
)
{
return
(
ctx
->
cipher_info
->
base
->
setkey_enc_func
(
ctx
->
cipher_ctx
,
key
,
ctx
->
key_bitlen
)
);
}
if
(
MBEDTLS_DECRYPT
==
operation
)
return
(
ctx
->
cipher_info
->
base
->
setkey_dec_func
(
ctx
->
cipher_ctx
,
key
,
ctx
->
key_bitlen
)
);
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
int
mbedtls_cipher_set_iv
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
iv
,
size_t
iv_len
)
{
size_t
actual_iv_size
;
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
iv_len
==
0
||
iv
!=
NULL
);
if
(
ctx
->
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* While PSA Crypto has an API for multipart
* operations, we currently don't make it
* accessible through the cipher layer. */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
/* avoid buffer overflow in ctx->iv */
if
(
iv_len
>
MBEDTLS_MAX_IV_LENGTH
)
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
if
(
(
ctx
->
cipher_info
->
flags
&
MBEDTLS_CIPHER_VARIABLE_IV_LEN
)
!=
0
)
actual_iv_size
=
iv_len
;
else
{
actual_iv_size
=
ctx
->
cipher_info
->
iv_size
;
/* avoid reading past the end of input buffer */
if
(
actual_iv_size
>
iv_len
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
#if defined(MBEDTLS_CHACHA20_C)
if
(
ctx
->
cipher_info
->
type
==
MBEDTLS_CIPHER_CHACHA20
)
{
if
(
0
!=
mbedtls_chacha20_starts
(
(
mbedtls_chacha20_context
*
)
ctx
->
cipher_ctx
,
iv
,
0U
)
)
/* Initial counter value */
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
}
#endif
if
(
actual_iv_size
!=
0
)
{
memcpy
(
ctx
->
iv
,
iv
,
actual_iv_size
);
ctx
->
iv_size
=
actual_iv_size
;
}
return
(
0
);
}
int
mbedtls_cipher_reset
(
mbedtls_cipher_context_t
*
ctx
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
if
(
ctx
->
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* We don't support resetting PSA-based
* cipher contexts, yet. */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
ctx
->
unprocessed_len
=
0
;
return
(
0
);
}
#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
int
mbedtls_cipher_update_ad
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
ad
,
size_t
ad_len
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
ad_len
==
0
||
ad
!=
NULL
);
if
(
ctx
->
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* While PSA Crypto has an API for multipart
* operations, we currently don't make it
* accessible through the cipher layer. */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
#if defined(MBEDTLS_GCM_C)
if
(
MBEDTLS_MODE_GCM
==
ctx
->
cipher_info
->
mode
)
{
return
(
mbedtls_gcm_starts
(
(
mbedtls_gcm_context
*
)
ctx
->
cipher_ctx
,
ctx
->
operation
,
ctx
->
iv
,
ctx
->
iv_size
,
ad
,
ad_len
)
);
}
#endif
#if defined(MBEDTLS_CHACHAPOLY_C)
if
(
MBEDTLS_CIPHER_CHACHA20_POLY1305
==
ctx
->
cipher_info
->
type
)
{
int
result
;
mbedtls_chachapoly_mode_t
mode
;
mode
=
(
ctx
->
operation
==
MBEDTLS_ENCRYPT
)
?
MBEDTLS_CHACHAPOLY_ENCRYPT
:
MBEDTLS_CHACHAPOLY_DECRYPT
;
result
=
mbedtls_chachapoly_starts
(
(
mbedtls_chachapoly_context
*
)
ctx
->
cipher_ctx
,
ctx
->
iv
,
mode
);
if
(
result
!=
0
)
return
(
result
);
return
(
mbedtls_chachapoly_update_aad
(
(
mbedtls_chachapoly_context
*
)
ctx
->
cipher_ctx
,
ad
,
ad_len
)
);
}
#endif
return
(
0
);
}
#endif
/* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */
int
mbedtls_cipher_update
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
input
,
size_t
ilen
,
unsigned
char
*
output
,
size_t
*
olen
)
{
int
ret
;
size_t
block_size
;
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
ilen
==
0
||
input
!=
NULL
);
CIPHER_VALIDATE_RET
(
output
!=
NULL
);
CIPHER_VALIDATE_RET
(
olen
!=
NULL
);
if
(
ctx
->
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* While PSA Crypto has an API for multipart
* operations, we currently don't make it
* accessible through the cipher layer. */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
*
olen
=
0
;
block_size
=
mbedtls_cipher_get_block_size
(
ctx
);
if
(
ctx
->
cipher_info
->
mode
==
MBEDTLS_MODE_ECB
)
{
if
(
ilen
!=
block_size
)
return
(
MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED
);
*
olen
=
ilen
;
if
(
0
!=
(
ret
=
ctx
->
cipher_info
->
base
->
ecb_func
(
ctx
->
cipher_ctx
,
ctx
->
operation
,
input
,
output
)
)
)
{
return
(
ret
);
}
return
(
0
);
}
#if defined(MBEDTLS_GCM_C)
if
(
ctx
->
cipher_info
->
mode
==
MBEDTLS_MODE_GCM
)
{
*
olen
=
ilen
;
return
(
mbedtls_gcm_update
(
(
mbedtls_gcm_context
*
)
ctx
->
cipher_ctx
,
ilen
,
input
,
output
)
);
}
#endif
#if defined(MBEDTLS_CHACHAPOLY_C)
if
(
ctx
->
cipher_info
->
type
==
MBEDTLS_CIPHER_CHACHA20_POLY1305
)
{
*
olen
=
ilen
;
return
(
mbedtls_chachapoly_update
(
(
mbedtls_chachapoly_context
*
)
ctx
->
cipher_ctx
,
ilen
,
input
,
output
)
);
}
#endif
if
(
0
==
block_size
)
{
return
(
MBEDTLS_ERR_CIPHER_INVALID_CONTEXT
);
}
if
(
input
==
output
&&
(
ctx
->
unprocessed_len
!=
0
||
ilen
%
block_size
)
)
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
if
(
ctx
->
cipher_info
->
mode
==
MBEDTLS_MODE_CBC
)
{
size_t
copy_len
=
0
;
/*
* If there is not enough data for a full block, cache it.
*/
if
(
(
ctx
->
operation
==
MBEDTLS_DECRYPT
&&
NULL
!=
ctx
->
add_padding
&&
ilen
<=
block_size
-
ctx
->
unprocessed_len
)
||
(
ctx
->
operation
==
MBEDTLS_DECRYPT
&&
NULL
==
ctx
->
add_padding
&&
ilen
<
block_size
-
ctx
->
unprocessed_len
)
||
(
ctx
->
operation
==
MBEDTLS_ENCRYPT
&&
ilen
<
block_size
-
ctx
->
unprocessed_len
)
)
{
memcpy
(
&
(
ctx
->
unprocessed_data
[
ctx
->
unprocessed_len
]
),
input
,
ilen
);
ctx
->
unprocessed_len
+=
ilen
;
return
(
0
);
}
/*
* Process cached data first
*/
if
(
0
!=
ctx
->
unprocessed_len
)
{
copy_len
=
block_size
-
ctx
->
unprocessed_len
;
memcpy
(
&
(
ctx
->
unprocessed_data
[
ctx
->
unprocessed_len
]
),
input
,
copy_len
);
if
(
0
!=
(
ret
=
ctx
->
cipher_info
->
base
->
cbc_func
(
ctx
->
cipher_ctx
,
ctx
->
operation
,
block_size
,
ctx
->
iv
,
ctx
->
unprocessed_data
,
output
)
)
)
{
return
(
ret
);
}
*
olen
+=
block_size
;
output
+=
block_size
;
ctx
->
unprocessed_len
=
0
;
input
+=
copy_len
;
ilen
-=
copy_len
;
}
/*
* Cache final, incomplete block
*/
if
(
0
!=
ilen
)
{
if
(
0
==
block_size
)
{
return
(
MBEDTLS_ERR_CIPHER_INVALID_CONTEXT
);
}
/* Encryption: only cache partial blocks
* Decryption w/ padding: always keep at least one whole block
* Decryption w/o padding: only cache partial blocks
*/
copy_len
=
ilen
%
block_size
;
if
(
copy_len
==
0
&&
ctx
->
operation
==
MBEDTLS_DECRYPT
&&
NULL
!=
ctx
->
add_padding
)
{
copy_len
=
block_size
;
}
memcpy
(
ctx
->
unprocessed_data
,
&
(
input
[
ilen
-
copy_len
]
),
copy_len
);
ctx
->
unprocessed_len
+=
copy_len
;
ilen
-=
copy_len
;
}
/*
* Process remaining full blocks
*/
if
(
ilen
)
{
if
(
0
!=
(
ret
=
ctx
->
cipher_info
->
base
->
cbc_func
(
ctx
->
cipher_ctx
,
ctx
->
operation
,
ilen
,
ctx
->
iv
,
input
,
output
)
)
)
{
return
(
ret
);
}
*
olen
+=
ilen
;
}
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
if
(
ctx
->
cipher_info
->
mode
==
MBEDTLS_MODE_CFB
)
{
if
(
0
!=
(
ret
=
ctx
->
cipher_info
->
base
->
cfb_func
(
ctx
->
cipher_ctx
,
ctx
->
operation
,
ilen
,
&
ctx
->
unprocessed_len
,
ctx
->
iv
,
input
,
output
)
)
)
{
return
(
ret
);
}
*
olen
=
ilen
;
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_OFB)
if
(
ctx
->
cipher_info
->
mode
==
MBEDTLS_MODE_OFB
)
{
if
(
0
!=
(
ret
=
ctx
->
cipher_info
->
base
->
ofb_func
(
ctx
->
cipher_ctx
,
ilen
,
&
ctx
->
unprocessed_len
,
ctx
->
iv
,
input
,
output
)
)
)
{
return
(
ret
);
}
*
olen
=
ilen
;
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_OFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
if
(
ctx
->
cipher_info
->
mode
==
MBEDTLS_MODE_CTR
)
{
if
(
0
!=
(
ret
=
ctx
->
cipher_info
->
base
->
ctr_func
(
ctx
->
cipher_ctx
,
ilen
,
&
ctx
->
unprocessed_len
,
ctx
->
iv
,
ctx
->
unprocessed_data
,
input
,
output
)
)
)
{
return
(
ret
);
}
*
olen
=
ilen
;
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
#if defined(MBEDTLS_CIPHER_MODE_XTS)
if
(
ctx
->
cipher_info
->
mode
==
MBEDTLS_MODE_XTS
)
{
if
(
ctx
->
unprocessed_len
>
0
)
{
/* We can only process an entire data unit at a time. */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
ret
=
ctx
->
cipher_info
->
base
->
xts_func
(
ctx
->
cipher_ctx
,
ctx
->
operation
,
ilen
,
ctx
->
iv
,
input
,
output
);
if
(
ret
!=
0
)
{
return
(
ret
);
}
*
olen
=
ilen
;
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
if
(
ctx
->
cipher_info
->
mode
==
MBEDTLS_MODE_STREAM
)
{
if
(
0
!=
(
ret
=
ctx
->
cipher_info
->
base
->
stream_func
(
ctx
->
cipher_ctx
,
ilen
,
input
,
output
)
)
)
{
return
(
ret
);
}
*
olen
=
ilen
;
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_STREAM */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
/*
* PKCS7 (and PKCS5) padding: fill with ll bytes, with ll = padding_len
*/
static
void
add_pkcs_padding
(
unsigned
char
*
output
,
size_t
output_len
,
size_t
data_len
)
{
size_t
padding_len
=
output_len
-
data_len
;
unsigned
char
i
;
for
(
i
=
0
;
i
<
padding_len
;
i
++
)
output
[
data_len
+
i
]
=
(
unsigned
char
)
padding_len
;
}
static
int
get_pkcs_padding
(
unsigned
char
*
input
,
size_t
input_len
,
size_t
*
data_len
)
{
size_t
i
,
pad_idx
;
unsigned
char
padding_len
,
bad
=
0
;
if
(
NULL
==
input
||
NULL
==
data_len
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
padding_len
=
input
[
input_len
-
1
];
*
data_len
=
input_len
-
padding_len
;
/* Avoid logical || since it results in a branch */
bad
|=
padding_len
>
input_len
;
bad
|=
padding_len
==
0
;
/* The number of bytes checked must be independent of padding_len,
* so pick input_len, which is usually 8 or 16 (one block) */
pad_idx
=
input_len
-
padding_len
;
for
(
i
=
0
;
i
<
input_len
;
i
++
)
bad
|=
(
input
[
i
]
^
padding_len
)
*
(
i
>=
pad_idx
);
return
(
MBEDTLS_ERR_CIPHER_INVALID_PADDING
*
(
bad
!=
0
)
);
}
#endif
/* MBEDTLS_CIPHER_PADDING_PKCS7 */
#if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS)
/*
* One and zeros padding: fill with 80 00 ... 00
*/
static
void
add_one_and_zeros_padding
(
unsigned
char
*
output
,
size_t
output_len
,
size_t
data_len
)
{
size_t
padding_len
=
output_len
-
data_len
;
unsigned
char
i
=
0
;
output
[
data_len
]
=
0x80
;
for
(
i
=
1
;
i
<
padding_len
;
i
++
)
output
[
data_len
+
i
]
=
0x00
;
}
static
int
get_one_and_zeros_padding
(
unsigned
char
*
input
,
size_t
input_len
,
size_t
*
data_len
)
{
size_t
i
;
unsigned
char
done
=
0
,
prev_done
,
bad
;
if
(
NULL
==
input
||
NULL
==
data_len
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
bad
=
0x80
;
*
data_len
=
0
;
for
(
i
=
input_len
;
i
>
0
;
i
--
)
{
prev_done
=
done
;
done
|=
(
input
[
i
-
1
]
!=
0
);
*
data_len
|=
(
i
-
1
)
*
(
done
!=
prev_done
);
bad
^=
input
[
i
-
1
]
*
(
done
!=
prev_done
);
}
return
(
MBEDTLS_ERR_CIPHER_INVALID_PADDING
*
(
bad
!=
0
)
);
}
#endif
/* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */
#if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN)
/*
* Zeros and len padding: fill with 00 ... 00 ll, where ll is padding length
*/
static
void
add_zeros_and_len_padding
(
unsigned
char
*
output
,
size_t
output_len
,
size_t
data_len
)
{
size_t
padding_len
=
output_len
-
data_len
;
unsigned
char
i
=
0
;
for
(
i
=
1
;
i
<
padding_len
;
i
++
)
output
[
data_len
+
i
-
1
]
=
0x00
;
output
[
output_len
-
1
]
=
(
unsigned
char
)
padding_len
;
}
static
int
get_zeros_and_len_padding
(
unsigned
char
*
input
,
size_t
input_len
,
size_t
*
data_len
)
{
size_t
i
,
pad_idx
;
unsigned
char
padding_len
,
bad
=
0
;
if
(
NULL
==
input
||
NULL
==
data_len
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
padding_len
=
input
[
input_len
-
1
];
*
data_len
=
input_len
-
padding_len
;
/* Avoid logical || since it results in a branch */
bad
|=
padding_len
>
input_len
;
bad
|=
padding_len
==
0
;
/* The number of bytes checked must be independent of padding_len */
pad_idx
=
input_len
-
padding_len
;
for
(
i
=
0
;
i
<
input_len
-
1
;
i
++
)
bad
|=
input
[
i
]
*
(
i
>=
pad_idx
);
return
(
MBEDTLS_ERR_CIPHER_INVALID_PADDING
*
(
bad
!=
0
)
);
}
#endif
/* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */
#if defined(MBEDTLS_CIPHER_PADDING_ZEROS)
/*
* Zero padding: fill with 00 ... 00
*/
static
void
add_zeros_padding
(
unsigned
char
*
output
,
size_t
output_len
,
size_t
data_len
)
{
size_t
i
;
for
(
i
=
data_len
;
i
<
output_len
;
i
++
)
output
[
i
]
=
0x00
;
}
static
int
get_zeros_padding
(
unsigned
char
*
input
,
size_t
input_len
,
size_t
*
data_len
)
{
size_t
i
;
unsigned
char
done
=
0
,
prev_done
;
if
(
NULL
==
input
||
NULL
==
data_len
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
*
data_len
=
0
;
for
(
i
=
input_len
;
i
>
0
;
i
--
)
{
prev_done
=
done
;
done
|=
(
input
[
i
-
1
]
!=
0
);
*
data_len
|=
i
*
(
done
!=
prev_done
);
}
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_PADDING_ZEROS */
/*
* No padding: don't pad :)
*
* There is no add_padding function (check for NULL in mbedtls_cipher_finish)
* but a trivial get_padding function
*/
static
int
get_no_padding
(
unsigned
char
*
input
,
size_t
input_len
,
size_t
*
data_len
)
{
if
(
NULL
==
input
||
NULL
==
data_len
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
*
data_len
=
input_len
;
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_WITH_PADDING */
int
mbedtls_cipher_finish
(
mbedtls_cipher_context_t
*
ctx
,
unsigned
char
*
output
,
size_t
*
olen
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
output
!=
NULL
);
CIPHER_VALIDATE_RET
(
olen
!=
NULL
);
if
(
ctx
->
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* While PSA Crypto has an API for multipart
* operations, we currently don't make it
* accessible through the cipher layer. */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
*
olen
=
0
;
if
(
MBEDTLS_MODE_CFB
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_OFB
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_CTR
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_GCM
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_XTS
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_STREAM
==
ctx
->
cipher_info
->
mode
)
{
return
(
0
);
}
if
(
(
MBEDTLS_CIPHER_CHACHA20
==
ctx
->
cipher_info
->
type
)
||
(
MBEDTLS_CIPHER_CHACHA20_POLY1305
==
ctx
->
cipher_info
->
type
)
)
{
return
(
0
);
}
if
(
MBEDTLS_MODE_ECB
==
ctx
->
cipher_info
->
mode
)
{
if
(
ctx
->
unprocessed_len
!=
0
)
return
(
MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED
);
return
(
0
);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
if
(
MBEDTLS_MODE_CBC
==
ctx
->
cipher_info
->
mode
)
{
int
ret
=
0
;
if
(
MBEDTLS_ENCRYPT
==
ctx
->
operation
)
{
/* check for 'no padding' mode */
if
(
NULL
==
ctx
->
add_padding
)
{
if
(
0
!=
ctx
->
unprocessed_len
)
return
(
MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED
);
return
(
0
);
}
ctx
->
add_padding
(
ctx
->
unprocessed_data
,
mbedtls_cipher_get_iv_size
(
ctx
),
ctx
->
unprocessed_len
);
}
else
if
(
mbedtls_cipher_get_block_size
(
ctx
)
!=
ctx
->
unprocessed_len
)
{
/*
* For decrypt operations, expect a full block,
* or an empty block if no padding
*/
if
(
NULL
==
ctx
->
add_padding
&&
0
==
ctx
->
unprocessed_len
)
return
(
0
);
return
(
MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED
);
}
/* cipher block */
if
(
0
!=
(
ret
=
ctx
->
cipher_info
->
base
->
cbc_func
(
ctx
->
cipher_ctx
,
ctx
->
operation
,
mbedtls_cipher_get_block_size
(
ctx
),
ctx
->
iv
,
ctx
->
unprocessed_data
,
output
)
)
)
{
return
(
ret
);
}
/* Set output size for decryption */
if
(
MBEDTLS_DECRYPT
==
ctx
->
operation
)
return
(
ctx
->
get_padding
(
output
,
mbedtls_cipher_get_block_size
(
ctx
),
olen
)
);
/* Set output size for encryption */
*
olen
=
mbedtls_cipher_get_block_size
(
ctx
);
return
(
0
);
}
#else
((
void
)
output
);
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
int
mbedtls_cipher_set_padding_mode
(
mbedtls_cipher_context_t
*
ctx
,
mbedtls_cipher_padding_t
mode
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
if
(
NULL
==
ctx
->
cipher_info
||
MBEDTLS_MODE_CBC
!=
ctx
->
cipher_info
->
mode
)
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* While PSA Crypto knows about CBC padding
* schemes, we currently don't make them
* accessible through the cipher layer. */
if
(
mode
!=
MBEDTLS_PADDING_NONE
)
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
return
(
0
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
switch
(
mode
)
{
#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)
case
MBEDTLS_PADDING_PKCS7
:
ctx
->
add_padding
=
add_pkcs_padding
;
ctx
->
get_padding
=
get_pkcs_padding
;
break
;
#endif
#if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS)
case
MBEDTLS_PADDING_ONE_AND_ZEROS
:
ctx
->
add_padding
=
add_one_and_zeros_padding
;
ctx
->
get_padding
=
get_one_and_zeros_padding
;
break
;
#endif
#if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN)
case
MBEDTLS_PADDING_ZEROS_AND_LEN
:
ctx
->
add_padding
=
add_zeros_and_len_padding
;
ctx
->
get_padding
=
get_zeros_and_len_padding
;
break
;
#endif
#if defined(MBEDTLS_CIPHER_PADDING_ZEROS)
case
MBEDTLS_PADDING_ZEROS
:
ctx
->
add_padding
=
add_zeros_padding
;
ctx
->
get_padding
=
get_zeros_padding
;
break
;
#endif
case
MBEDTLS_PADDING_NONE
:
ctx
->
add_padding
=
NULL
;
ctx
->
get_padding
=
get_no_padding
;
break
;
default:
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
return
(
0
);
}
#endif
/* MBEDTLS_CIPHER_MODE_WITH_PADDING */
#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
int
mbedtls_cipher_write_tag
(
mbedtls_cipher_context_t
*
ctx
,
unsigned
char
*
tag
,
size_t
tag_len
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
tag_len
==
0
||
tag
!=
NULL
);
if
(
ctx
->
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
if
(
MBEDTLS_ENCRYPT
!=
ctx
->
operation
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* While PSA Crypto has an API for multipart
* operations, we currently don't make it
* accessible through the cipher layer. */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
return
(
0
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
#if defined(MBEDTLS_GCM_C)
if
(
MBEDTLS_MODE_GCM
==
ctx
->
cipher_info
->
mode
)
return
(
mbedtls_gcm_finish
(
(
mbedtls_gcm_context
*
)
ctx
->
cipher_ctx
,
tag
,
tag_len
)
);
#endif
#if defined(MBEDTLS_CHACHAPOLY_C)
if
(
MBEDTLS_CIPHER_CHACHA20_POLY1305
==
ctx
->
cipher_info
->
type
)
{
/* Don't allow truncated MAC for Poly1305 */
if
(
tag_len
!=
16U
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
return
(
mbedtls_chachapoly_finish
(
(
mbedtls_chachapoly_context
*
)
ctx
->
cipher_ctx
,
tag
)
);
}
#endif
return
(
0
);
}
int
mbedtls_cipher_check_tag
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
tag
,
size_t
tag_len
)
{
unsigned
char
check_tag
[
16
];
int
ret
;
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
tag_len
==
0
||
tag
!=
NULL
);
if
(
ctx
->
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
if
(
MBEDTLS_DECRYPT
!=
ctx
->
operation
)
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* While PSA Crypto has an API for multipart
* operations, we currently don't make it
* accessible through the cipher layer. */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
#if defined(MBEDTLS_GCM_C)
if
(
MBEDTLS_MODE_GCM
==
ctx
->
cipher_info
->
mode
)
{
if
(
tag_len
>
sizeof
(
check_tag
)
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
if
(
0
!=
(
ret
=
mbedtls_gcm_finish
(
(
mbedtls_gcm_context
*
)
ctx
->
cipher_ctx
,
check_tag
,
tag_len
)
)
)
{
return
(
ret
);
}
/* Check the tag in "constant-time" */
if
(
mbedtls_constant_time_memcmp
(
tag
,
check_tag
,
tag_len
)
!=
0
)
return
(
MBEDTLS_ERR_CIPHER_AUTH_FAILED
);
return
(
0
);
}
#endif
/* MBEDTLS_GCM_C */
#if defined(MBEDTLS_CHACHAPOLY_C)
if
(
MBEDTLS_CIPHER_CHACHA20_POLY1305
==
ctx
->
cipher_info
->
type
)
{
/* Don't allow truncated MAC for Poly1305 */
if
(
tag_len
!=
sizeof
(
check_tag
)
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
ret
=
mbedtls_chachapoly_finish
(
(
mbedtls_chachapoly_context
*
)
ctx
->
cipher_ctx
,
check_tag
);
if
(
ret
!=
0
)
{
return
(
ret
);
}
/* Check the tag in "constant-time" */
if
(
mbedtls_constant_time_memcmp
(
tag
,
check_tag
,
tag_len
)
!=
0
)
return
(
MBEDTLS_ERR_CIPHER_AUTH_FAILED
);
return
(
0
);
}
#endif
/* MBEDTLS_CHACHAPOLY_C */
return
(
0
);
}
#endif
/* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */
/*
* Packet-oriented wrapper for non-AEAD modes
*/
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
)
{
int
ret
;
size_t
finish_olen
;
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
iv_len
==
0
||
iv
!=
NULL
);
CIPHER_VALIDATE_RET
(
ilen
==
0
||
input
!=
NULL
);
CIPHER_VALIDATE_RET
(
output
!=
NULL
);
CIPHER_VALIDATE_RET
(
olen
!=
NULL
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* As in the non-PSA case, we don't check that
* a key has been set. If not, the key slot will
* still be in its default state of 0, which is
* guaranteed to be invalid, hence the PSA-call
* below will gracefully fail. */
mbedtls_cipher_context_psa
*
const
cipher_psa
=
(
mbedtls_cipher_context_psa
*
)
ctx
->
cipher_ctx
;
psa_status_t
status
;
psa_cipher_operation_t
cipher_op
=
PSA_CIPHER_OPERATION_INIT
;
size_t
part_len
;
if
(
ctx
->
operation
==
MBEDTLS_DECRYPT
)
{
status
=
psa_cipher_decrypt_setup
(
&
cipher_op
,
cipher_psa
->
slot
,
cipher_psa
->
alg
);
}
else
if
(
ctx
->
operation
==
MBEDTLS_ENCRYPT
)
{
status
=
psa_cipher_encrypt_setup
(
&
cipher_op
,
cipher_psa
->
slot
,
cipher_psa
->
alg
);
}
else
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
/* In the following, we can immediately return on an error,
* because the PSA Crypto API guarantees that cipher operations
* are terminated by unsuccessful calls to psa_cipher_update(),
* and by any call to psa_cipher_finish(). */
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
status
=
psa_cipher_set_iv
(
&
cipher_op
,
iv
,
iv_len
);
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
status
=
psa_cipher_update
(
&
cipher_op
,
input
,
ilen
,
output
,
ilen
,
olen
);
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
status
=
psa_cipher_finish
(
&
cipher_op
,
output
+
*
olen
,
ilen
-
*
olen
,
&
part_len
);
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
*
olen
+=
part_len
;
return
(
0
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
if
(
(
ret
=
mbedtls_cipher_set_iv
(
ctx
,
iv
,
iv_len
)
)
!=
0
)
return
(
ret
);
if
(
(
ret
=
mbedtls_cipher_reset
(
ctx
)
)
!=
0
)
return
(
ret
);
if
(
(
ret
=
mbedtls_cipher_update
(
ctx
,
input
,
ilen
,
output
,
olen
)
)
!=
0
)
return
(
ret
);
if
(
(
ret
=
mbedtls_cipher_finish
(
ctx
,
output
+
*
olen
,
&
finish_olen
)
)
!=
0
)
return
(
ret
);
*
olen
+=
finish_olen
;
return
(
0
);
}
#if defined(MBEDTLS_CIPHER_MODE_AEAD)
/*
* Packet-oriented encryption for AEAD modes
*/
int
mbedtls_cipher_auth_encrypt
(
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
*
olen
,
unsigned
char
*
tag
,
size_t
tag_len
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
iv
!=
NULL
);
CIPHER_VALIDATE_RET
(
ad_len
==
0
||
ad
!=
NULL
);
CIPHER_VALIDATE_RET
(
ilen
==
0
||
input
!=
NULL
);
CIPHER_VALIDATE_RET
(
output
!=
NULL
);
CIPHER_VALIDATE_RET
(
olen
!=
NULL
);
CIPHER_VALIDATE_RET
(
tag_len
==
0
||
tag
!=
NULL
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* As in the non-PSA case, we don't check that
* a key has been set. If not, the key slot will
* still be in its default state of 0, which is
* guaranteed to be invalid, hence the PSA-call
* below will gracefully fail. */
mbedtls_cipher_context_psa
*
const
cipher_psa
=
(
mbedtls_cipher_context_psa
*
)
ctx
->
cipher_ctx
;
psa_status_t
status
;
/* PSA Crypto API always writes the authentication tag
* at the end of the encrypted message. */
if
(
tag
!=
output
+
ilen
)
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
status
=
psa_aead_encrypt
(
cipher_psa
->
slot
,
cipher_psa
->
alg
,
iv
,
iv_len
,
ad
,
ad_len
,
input
,
ilen
,
output
,
ilen
+
tag_len
,
olen
);
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
*
olen
-=
tag_len
;
return
(
0
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
#if defined(MBEDTLS_GCM_C)
if
(
MBEDTLS_MODE_GCM
==
ctx
->
cipher_info
->
mode
)
{
*
olen
=
ilen
;
return
(
mbedtls_gcm_crypt_and_tag
(
ctx
->
cipher_ctx
,
MBEDTLS_GCM_ENCRYPT
,
ilen
,
iv
,
iv_len
,
ad
,
ad_len
,
input
,
output
,
tag_len
,
tag
)
);
}
#endif
/* MBEDTLS_GCM_C */
#if defined(MBEDTLS_CCM_C)
if
(
MBEDTLS_MODE_CCM
==
ctx
->
cipher_info
->
mode
)
{
*
olen
=
ilen
;
return
(
mbedtls_ccm_encrypt_and_tag
(
ctx
->
cipher_ctx
,
ilen
,
iv
,
iv_len
,
ad
,
ad_len
,
input
,
output
,
tag
,
tag_len
)
);
}
#endif
/* MBEDTLS_CCM_C */
#if defined(MBEDTLS_CHACHAPOLY_C)
if
(
MBEDTLS_CIPHER_CHACHA20_POLY1305
==
ctx
->
cipher_info
->
type
)
{
/* ChachaPoly has fixed length nonce and MAC (tag) */
if
(
(
iv_len
!=
ctx
->
cipher_info
->
iv_size
)
||
(
tag_len
!=
16U
)
)
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
*
olen
=
ilen
;
return
(
mbedtls_chachapoly_encrypt_and_tag
(
ctx
->
cipher_ctx
,
ilen
,
iv
,
ad
,
ad_len
,
input
,
output
,
tag
)
);
}
#endif
/* MBEDTLS_CHACHAPOLY_C */
#if defined(MBEDTLS_NIST_KW_C)
if
(
MBEDTLS_MODE_KW
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_KWP
==
ctx
->
cipher_info
->
mode
)
{
mbedtls_nist_kw_mode_t
mode
=
(
MBEDTLS_MODE_KW
==
ctx
->
cipher_info
->
mode
)
?
MBEDTLS_KW_MODE_KW
:
MBEDTLS_KW_MODE_KWP
;
/* There is no iv, tag or ad associated with KW and KWP, these length should be 0 */
if
(
iv_len
!=
0
||
tag_len
!=
0
||
ad_len
!=
0
)
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
return
(
mbedtls_nist_kw_wrap
(
ctx
->
cipher_ctx
,
mode
,
input
,
ilen
,
output
,
olen
,
SIZE_MAX
)
);
}
#endif
/* MBEDTLS_NIST_KW_C */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
/*
* Packet-oriented decryption for AEAD modes
*/
int
mbedtls_cipher_auth_decrypt
(
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
*
olen
,
const
unsigned
char
*
tag
,
size_t
tag_len
)
{
CIPHER_VALIDATE_RET
(
ctx
!=
NULL
);
CIPHER_VALIDATE_RET
(
iv
!=
NULL
);
CIPHER_VALIDATE_RET
(
ad_len
==
0
||
ad
!=
NULL
);
CIPHER_VALIDATE_RET
(
ilen
==
0
||
input
!=
NULL
);
CIPHER_VALIDATE_RET
(
output
!=
NULL
);
CIPHER_VALIDATE_RET
(
olen
!=
NULL
);
CIPHER_VALIDATE_RET
(
tag_len
==
0
||
tag
!=
NULL
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
if
(
ctx
->
psa_enabled
==
1
)
{
/* As in the non-PSA case, we don't check that
* a key has been set. If not, the key slot will
* still be in its default state of 0, which is
* guaranteed to be invalid, hence the PSA-call
* below will gracefully fail. */
mbedtls_cipher_context_psa
*
const
cipher_psa
=
(
mbedtls_cipher_context_psa
*
)
ctx
->
cipher_ctx
;
psa_status_t
status
;
/* PSA Crypto API always writes the authentication tag
* at the end of the encrypted message. */
if
(
tag
!=
input
+
ilen
)
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
status
=
psa_aead_decrypt
(
cipher_psa
->
slot
,
cipher_psa
->
alg
,
iv
,
iv_len
,
ad
,
ad_len
,
input
,
ilen
+
tag_len
,
output
,
ilen
,
olen
);
if
(
status
==
PSA_ERROR_INVALID_SIGNATURE
)
return
(
MBEDTLS_ERR_CIPHER_AUTH_FAILED
);
else
if
(
status
!=
PSA_SUCCESS
)
return
(
MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED
);
return
(
0
);
}
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
#if defined(MBEDTLS_GCM_C)
if
(
MBEDTLS_MODE_GCM
==
ctx
->
cipher_info
->
mode
)
{
int
ret
;
*
olen
=
ilen
;
ret
=
mbedtls_gcm_auth_decrypt
(
ctx
->
cipher_ctx
,
ilen
,
iv
,
iv_len
,
ad
,
ad_len
,
tag
,
tag_len
,
input
,
output
);
if
(
ret
==
MBEDTLS_ERR_GCM_AUTH_FAILED
)
ret
=
MBEDTLS_ERR_CIPHER_AUTH_FAILED
;
return
(
ret
);
}
#endif
/* MBEDTLS_GCM_C */
#if defined(MBEDTLS_CCM_C)
if
(
MBEDTLS_MODE_CCM
==
ctx
->
cipher_info
->
mode
)
{
int
ret
;
*
olen
=
ilen
;
ret
=
mbedtls_ccm_auth_decrypt
(
ctx
->
cipher_ctx
,
ilen
,
iv
,
iv_len
,
ad
,
ad_len
,
input
,
output
,
tag
,
tag_len
);
if
(
ret
==
MBEDTLS_ERR_CCM_AUTH_FAILED
)
ret
=
MBEDTLS_ERR_CIPHER_AUTH_FAILED
;
return
(
ret
);
}
#endif
/* MBEDTLS_CCM_C */
#if defined(MBEDTLS_CHACHAPOLY_C)
if
(
MBEDTLS_CIPHER_CHACHA20_POLY1305
==
ctx
->
cipher_info
->
type
)
{
int
ret
;
/* ChachaPoly has fixed length nonce and MAC (tag) */
if
(
(
iv_len
!=
ctx
->
cipher_info
->
iv_size
)
||
(
tag_len
!=
16U
)
)
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
*
olen
=
ilen
;
ret
=
mbedtls_chachapoly_auth_decrypt
(
ctx
->
cipher_ctx
,
ilen
,
iv
,
ad
,
ad_len
,
tag
,
input
,
output
);
if
(
ret
==
MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED
)
ret
=
MBEDTLS_ERR_CIPHER_AUTH_FAILED
;
return
(
ret
);
}
#endif
/* MBEDTLS_CHACHAPOLY_C */
#if defined(MBEDTLS_NIST_KW_C)
if
(
MBEDTLS_MODE_KW
==
ctx
->
cipher_info
->
mode
||
MBEDTLS_MODE_KWP
==
ctx
->
cipher_info
->
mode
)
{
mbedtls_nist_kw_mode_t
mode
=
(
MBEDTLS_MODE_KW
==
ctx
->
cipher_info
->
mode
)
?
MBEDTLS_KW_MODE_KW
:
MBEDTLS_KW_MODE_KWP
;
/* There is no iv, tag or ad associated with KW and KWP, these length should be 0 */
if
(
iv_len
!=
0
||
tag_len
!=
0
||
ad_len
!=
0
)
{
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
}
return
(
mbedtls_nist_kw_unwrap
(
ctx
->
cipher_ctx
,
mode
,
input
,
ilen
,
output
,
olen
,
SIZE_MAX
)
);
}
#endif
/* MBEDTLS_NIST_KW_C */
return
(
MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
);
}
#endif
/* MBEDTLS_CIPHER_MODE_AEAD */
#endif
/* MBEDTLS_CIPHER_C */
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/cipher.h
View file @
8f3efffa
...
...
@@ -29,183 +29,14 @@
#ifndef MBEDTLS_CIPHER_H
#define MBEDTLS_CIPHER_H
#include "config.h"
#include "platform_util.h"
#include <stddef.h>
#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
#define MBEDTLS_CIPHER_MODE_AEAD
#endif
#if defined(MBEDTLS_CIPHER_MODE_CBC)
#define MBEDTLS_CIPHER_MODE_WITH_PADDING
#endif
#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \
defined(MBEDTLS_CHACHA20_C)
#define MBEDTLS_CIPHER_MODE_STREAM
#endif
#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
!defined(inline) && !defined(__cplusplus)
#define inline __inline
#endif
#define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -0x6080
/**< The selected feature is not available. */
#define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -0x6100
/**< Bad input parameters. */
#define MBEDTLS_ERR_CIPHER_ALLOC_FAILED -0x6180
/**< Failed to allocate memory. */
#define MBEDTLS_ERR_CIPHER_INVALID_PADDING -0x6200
/**< Input data contains invalid padding and is rejected. */
#define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -0x6280
/**< Decryption of block requires a full block. */
#define MBEDTLS_ERR_CIPHER_AUTH_FAILED -0x6300
/**< Authentication failed (for AEAD modes). */
#define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT -0x6380
/**< The context is invalid. For example, because it was freed. */
/* MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED is deprecated and should not be used. */
#define MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED -0x6400
/**< Cipher hardware accelerator failed. */
#define MBEDTLS_CIPHER_VARIABLE_IV_LEN 0x01
/**< Cipher accepts IVs of variable length. */
#define MBEDTLS_CIPHER_VARIABLE_KEY_LEN 0x02
/**< Cipher accepts keys of variable length. */
#ifdef __cplusplus
extern
"C"
{
#endif
/**
* \brief Supported cipher types.
*
* \warning RC4 and DES are considered weak ciphers and their use
* constitutes a security risk. Arm recommends considering stronger
* ciphers instead.
*/
typedef
enum
{
MBEDTLS_CIPHER_ID_NONE
=
0
,
/**< Placeholder to mark the end of cipher ID lists. */
MBEDTLS_CIPHER_ID_NULL
,
/**< The identity cipher, treated as a stream cipher. */
MBEDTLS_CIPHER_ID_AES
,
/**< The AES cipher. */
MBEDTLS_CIPHER_ID_DES
,
/**< The DES cipher. */
MBEDTLS_CIPHER_ID_3DES
,
/**< The Triple DES cipher. */
MBEDTLS_CIPHER_ID_CAMELLIA
,
/**< The Camellia cipher. */
MBEDTLS_CIPHER_ID_BLOWFISH
,
/**< The Blowfish cipher. */
MBEDTLS_CIPHER_ID_ARC4
,
/**< The RC4 cipher. */
MBEDTLS_CIPHER_ID_ARIA
,
/**< The Aria cipher. */
MBEDTLS_CIPHER_ID_CHACHA20
,
/**< The ChaCha20 cipher. */
}
mbedtls_cipher_id_t
;
/**
* \brief Supported {cipher type, cipher mode} pairs.
*
* \warning RC4 and DES are considered weak ciphers and their use
* constitutes a security risk. Arm recommends considering stronger
* ciphers instead.
*/
typedef
enum
{
MBEDTLS_CIPHER_NONE
=
0
,
/**< Placeholder to mark the end of cipher-pair lists. */
MBEDTLS_CIPHER_NULL
,
/**< The identity stream cipher. */
MBEDTLS_CIPHER_AES_128_ECB
,
/**< AES cipher with 128-bit ECB mode. */
MBEDTLS_CIPHER_AES_192_ECB
,
/**< AES cipher with 192-bit ECB mode. */
MBEDTLS_CIPHER_AES_256_ECB
,
/**< AES cipher with 256-bit ECB mode. */
MBEDTLS_CIPHER_AES_128_CBC
,
/**< AES cipher with 128-bit CBC mode. */
MBEDTLS_CIPHER_AES_192_CBC
,
/**< AES cipher with 192-bit CBC mode. */
MBEDTLS_CIPHER_AES_256_CBC
,
/**< AES cipher with 256-bit CBC mode. */
MBEDTLS_CIPHER_AES_128_CFB128
,
/**< AES cipher with 128-bit CFB128 mode. */
MBEDTLS_CIPHER_AES_192_CFB128
,
/**< AES cipher with 192-bit CFB128 mode. */
MBEDTLS_CIPHER_AES_256_CFB128
,
/**< AES cipher with 256-bit CFB128 mode. */
MBEDTLS_CIPHER_AES_128_CTR
,
/**< AES cipher with 128-bit CTR mode. */
MBEDTLS_CIPHER_AES_192_CTR
,
/**< AES cipher with 192-bit CTR mode. */
MBEDTLS_CIPHER_AES_256_CTR
,
/**< AES cipher with 256-bit CTR mode. */
MBEDTLS_CIPHER_AES_128_GCM
,
/**< AES cipher with 128-bit GCM mode. */
MBEDTLS_CIPHER_AES_192_GCM
,
/**< AES cipher with 192-bit GCM mode. */
MBEDTLS_CIPHER_AES_256_GCM
,
/**< AES cipher with 256-bit GCM mode. */
MBEDTLS_CIPHER_CAMELLIA_128_ECB
,
/**< Camellia cipher with 128-bit ECB mode. */
MBEDTLS_CIPHER_CAMELLIA_192_ECB
,
/**< Camellia cipher with 192-bit ECB mode. */
MBEDTLS_CIPHER_CAMELLIA_256_ECB
,
/**< Camellia cipher with 256-bit ECB mode. */
MBEDTLS_CIPHER_CAMELLIA_128_CBC
,
/**< Camellia cipher with 128-bit CBC mode. */
MBEDTLS_CIPHER_CAMELLIA_192_CBC
,
/**< Camellia cipher with 192-bit CBC mode. */
MBEDTLS_CIPHER_CAMELLIA_256_CBC
,
/**< Camellia cipher with 256-bit CBC mode. */
MBEDTLS_CIPHER_CAMELLIA_128_CFB128
,
/**< Camellia cipher with 128-bit CFB128 mode. */
MBEDTLS_CIPHER_CAMELLIA_192_CFB128
,
/**< Camellia cipher with 192-bit CFB128 mode. */
MBEDTLS_CIPHER_CAMELLIA_256_CFB128
,
/**< Camellia cipher with 256-bit CFB128 mode. */
MBEDTLS_CIPHER_CAMELLIA_128_CTR
,
/**< Camellia cipher with 128-bit CTR mode. */
MBEDTLS_CIPHER_CAMELLIA_192_CTR
,
/**< Camellia cipher with 192-bit CTR mode. */
MBEDTLS_CIPHER_CAMELLIA_256_CTR
,
/**< Camellia cipher with 256-bit CTR mode. */
MBEDTLS_CIPHER_CAMELLIA_128_GCM
,
/**< Camellia cipher with 128-bit GCM mode. */
MBEDTLS_CIPHER_CAMELLIA_192_GCM
,
/**< Camellia cipher with 192-bit GCM mode. */
MBEDTLS_CIPHER_CAMELLIA_256_GCM
,
/**< Camellia cipher with 256-bit GCM mode. */
MBEDTLS_CIPHER_DES_ECB
,
/**< DES cipher with ECB mode. */
MBEDTLS_CIPHER_DES_CBC
,
/**< DES cipher with CBC mode. */
MBEDTLS_CIPHER_DES_EDE_ECB
,
/**< DES cipher with EDE ECB mode. */
MBEDTLS_CIPHER_DES_EDE_CBC
,
/**< DES cipher with EDE CBC mode. */
MBEDTLS_CIPHER_DES_EDE3_ECB
,
/**< DES cipher with EDE3 ECB mode. */
MBEDTLS_CIPHER_DES_EDE3_CBC
,
/**< DES cipher with EDE3 CBC mode. */
MBEDTLS_CIPHER_BLOWFISH_ECB
,
/**< Blowfish cipher with ECB mode. */
MBEDTLS_CIPHER_BLOWFISH_CBC
,
/**< Blowfish cipher with CBC mode. */
MBEDTLS_CIPHER_BLOWFISH_CFB64
,
/**< Blowfish cipher with CFB64 mode. */
MBEDTLS_CIPHER_BLOWFISH_CTR
,
/**< Blowfish cipher with CTR mode. */
MBEDTLS_CIPHER_ARC4_128
,
/**< RC4 cipher with 128-bit mode. */
MBEDTLS_CIPHER_AES_128_CCM
,
/**< AES cipher with 128-bit CCM mode. */
MBEDTLS_CIPHER_AES_192_CCM
,
/**< AES cipher with 192-bit CCM mode. */
MBEDTLS_CIPHER_AES_256_CCM
,
/**< AES cipher with 256-bit CCM mode. */
MBEDTLS_CIPHER_CAMELLIA_128_CCM
,
/**< Camellia cipher with 128-bit CCM mode. */
MBEDTLS_CIPHER_CAMELLIA_192_CCM
,
/**< Camellia cipher with 192-bit CCM mode. */
MBEDTLS_CIPHER_CAMELLIA_256_CCM
,
/**< Camellia cipher with 256-bit CCM mode. */
MBEDTLS_CIPHER_ARIA_128_ECB
,
/**< Aria cipher with 128-bit key and ECB mode. */
MBEDTLS_CIPHER_ARIA_192_ECB
,
/**< Aria cipher with 192-bit key and ECB mode. */
MBEDTLS_CIPHER_ARIA_256_ECB
,
/**< Aria cipher with 256-bit key and ECB mode. */
MBEDTLS_CIPHER_ARIA_128_CBC
,
/**< Aria cipher with 128-bit key and CBC mode. */
MBEDTLS_CIPHER_ARIA_192_CBC
,
/**< Aria cipher with 192-bit key and CBC mode. */
MBEDTLS_CIPHER_ARIA_256_CBC
,
/**< Aria cipher with 256-bit key and CBC mode. */
MBEDTLS_CIPHER_ARIA_128_CFB128
,
/**< Aria cipher with 128-bit key and CFB-128 mode. */
MBEDTLS_CIPHER_ARIA_192_CFB128
,
/**< Aria cipher with 192-bit key and CFB-128 mode. */
MBEDTLS_CIPHER_ARIA_256_CFB128
,
/**< Aria cipher with 256-bit key and CFB-128 mode. */
MBEDTLS_CIPHER_ARIA_128_CTR
,
/**< Aria cipher with 128-bit key and CTR mode. */
MBEDTLS_CIPHER_ARIA_192_CTR
,
/**< Aria cipher with 192-bit key and CTR mode. */
MBEDTLS_CIPHER_ARIA_256_CTR
,
/**< Aria cipher with 256-bit key and CTR mode. */
MBEDTLS_CIPHER_ARIA_128_GCM
,
/**< Aria cipher with 128-bit key and GCM mode. */
MBEDTLS_CIPHER_ARIA_192_GCM
,
/**< Aria cipher with 192-bit key and GCM mode. */
MBEDTLS_CIPHER_ARIA_256_GCM
,
/**< Aria cipher with 256-bit key and GCM mode. */
MBEDTLS_CIPHER_ARIA_128_CCM
,
/**< Aria cipher with 128-bit key and CCM mode. */
MBEDTLS_CIPHER_ARIA_192_CCM
,
/**< Aria cipher with 192-bit key and CCM mode. */
MBEDTLS_CIPHER_ARIA_256_CCM
,
/**< Aria cipher with 256-bit key and CCM mode. */
MBEDTLS_CIPHER_AES_128_OFB
,
/**< AES 128-bit cipher in OFB mode. */
MBEDTLS_CIPHER_AES_192_OFB
,
/**< AES 192-bit cipher in OFB mode. */
MBEDTLS_CIPHER_AES_256_OFB
,
/**< AES 256-bit cipher in OFB mode. */
MBEDTLS_CIPHER_AES_128_XTS
,
/**< AES 128-bit cipher in XTS block mode. */
MBEDTLS_CIPHER_AES_256_XTS
,
/**< AES 256-bit cipher in XTS block mode. */
MBEDTLS_CIPHER_CHACHA20
,
/**< ChaCha20 stream cipher. */
MBEDTLS_CIPHER_CHACHA20_POLY1305
,
/**< ChaCha20-Poly1305 AEAD cipher. */
MBEDTLS_CIPHER_AES_128_KW
,
/**< AES cipher with 128-bit NIST KW mode. */
MBEDTLS_CIPHER_AES_192_KW
,
/**< AES cipher with 192-bit NIST KW mode. */
MBEDTLS_CIPHER_AES_256_KW
,
/**< AES cipher with 256-bit NIST KW mode. */
MBEDTLS_CIPHER_AES_128_KWP
,
/**< AES cipher with 128-bit NIST KWP mode. */
MBEDTLS_CIPHER_AES_192_KWP
,
/**< AES cipher with 192-bit NIST KWP mode. */
MBEDTLS_CIPHER_AES_256_KWP
,
/**< AES cipher with 256-bit NIST KWP mode. */
}
mbedtls_cipher_type_t
;
/** Supported cipher modes. */
typedef
enum
{
MBEDTLS_MODE_NONE
=
0
,
/**< None. */
MBEDTLS_MODE_ECB
,
/**< The ECB cipher mode. */
MBEDTLS_MODE_CBC
,
/**< The CBC cipher mode. */
MBEDTLS_MODE_CFB
,
/**< The CFB cipher mode. */
MBEDTLS_MODE_OFB
,
/**< The OFB cipher mode. */
MBEDTLS_MODE_CTR
,
/**< The CTR cipher mode. */
MBEDTLS_MODE_GCM
,
/**< The GCM cipher mode. */
MBEDTLS_MODE_STREAM
,
/**< The stream cipher mode. */
MBEDTLS_MODE_CCM
,
/**< The CCM cipher mode. */
MBEDTLS_MODE_XTS
,
/**< The XTS cipher mode. */
MBEDTLS_MODE_CHACHAPOLY
,
/**< The ChaCha-Poly cipher mode. */
MBEDTLS_MODE_KW
,
/**< The SP800-38F KW mode */
MBEDTLS_MODE_KWP
,
/**< The SP800-38F KWP mode */
}
mbedtls_cipher_mode_t
;
/** Supported cipher padding types. */
typedef
enum
{
MBEDTLS_PADDING_PKCS7
=
0
,
/**< PKCS7 padding (default). */
MBEDTLS_PADDING_ONE_AND_ZEROS
,
/**< ISO/IEC 7816-4 padding. */
MBEDTLS_PADDING_ZEROS_AND_LEN
,
/**< ANSI X.923 padding. */
MBEDTLS_PADDING_ZEROS
,
/**< Zero padding (not reversible). */
MBEDTLS_PADDING_NONE
,
/**< Never pad (full blocks only). */
}
mbedtls_cipher_padding_t
;
/** Type of operation. */
typedef
enum
{
MBEDTLS_OPERATION_NONE
=
-
1
,
...
...
@@ -213,83 +44,16 @@ typedef enum {
MBEDTLS_ENCRYPT
,
}
mbedtls_operation_t
;
enum
{
/** Undefined key length. */
MBEDTLS_KEY_LENGTH_NONE
=
0
,
/** Key length, in bits (including parity), for DES keys. */
MBEDTLS_KEY_LENGTH_DES
=
64
,
/** Key length in bits, including parity, for DES in two-key EDE. */
MBEDTLS_KEY_LENGTH_DES_EDE
=
128
,
/** Key length in bits, including parity, for DES in three-key EDE. */
MBEDTLS_KEY_LENGTH_DES_EDE3
=
192
,
};
/** Maximum length of any IV, in Bytes. */
#define MBEDTLS_MAX_IV_LENGTH 16
/** Maximum block size of any cipher, in Bytes. */
#define MBEDTLS_MAX_BLOCK_LENGTH 16
/**
* Base cipher information (opaque struct).
*/
typedef
struct
mbedtls_cipher_base_t
mbedtls_cipher_base_t
;
/**
* CMAC context (opaque struct).
*/
typedef
struct
mbedtls_cmac_context_t
mbedtls_cmac_context_t
;
/**
* Cipher information. Allows calling cipher functions
* in a generic way.
*/
typedef
struct
mbedtls_cipher_info_t
{
/** Full cipher identifier. For example,
* MBEDTLS_CIPHER_AES_256_CBC.
*/
mbedtls_cipher_type_t
type
;
/** The cipher mode. For example, MBEDTLS_MODE_CBC. */
mbedtls_cipher_mode_t
mode
;
/** The cipher key length, in bits. This is the
* default length for variable sized ciphers.
* Includes parity bits for ciphers like DES.
*/
unsigned
int
key_bitlen
;
/** Name of the cipher. */
const
char
*
name
;
/** IV or nonce size, in Bytes.
* For ciphers that accept variable IV sizes,
* this is the recommended size.
*/
unsigned
int
iv_size
;
/** Bitflag comprised of MBEDTLS_CIPHER_VARIABLE_IV_LEN and
* MBEDTLS_CIPHER_VARIABLE_KEY_LEN indicating whether the
* cipher supports variable IV or variable key sizes, respectively.
*/
int
flags
;
/** The block size, in Bytes. */
unsigned
int
block_size
;
/** Struct for base cipher information and functions. */
const
mbedtls_cipher_base_t
*
base
;
}
mbedtls_cipher_info_t
;
/**
* Generic cipher context.
*/
typedef
struct
mbedtls_cipher_context_t
{
/** Information about the associated cipher. */
const
mbedtls_cipher_info_t
*
cipher_info
;
/** Key length to use. */
int
key_bitlen
;
...
...
@@ -298,623 +62,11 @@ typedef struct mbedtls_cipher_context_t
*/
mbedtls_operation_t
operation
;
#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
/** Padding functions to use, if relevant for
* the specific cipher mode.
*/
void
(
*
add_padding
)(
unsigned
char
*
output
,
size_t
olen
,
size_t
data_len
);
int
(
*
get_padding
)(
unsigned
char
*
input
,
size_t
ilen
,
size_t
*
data_len
);
#endif
/** Buffer for input that has not been processed yet. */
unsigned
char
unprocessed_data
[
MBEDTLS_MAX_BLOCK_LENGTH
];
/** Number of Bytes that have not been processed yet. */
size_t
unprocessed_len
;
/** Current IV or NONCE_COUNTER for CTR-mode, data unit (or sector) number
* for XTS-mode. */
unsigned
char
iv
[
MBEDTLS_MAX_IV_LENGTH
];
/** IV size in Bytes, for ciphers with variable-length IVs. */
size_t
iv_size
;
/** The cipher-specific context. */
void
*
cipher_ctx
;
#if defined(MBEDTLS_CMAC_C)
/** CMAC-specific context. */
mbedtls_cmac_context_t
*
cmac_ctx
;
#endif
#if defined(MBEDTLS_USE_PSA_CRYPTO)
/** Indicates whether the cipher operations should be performed
* by Mbed TLS' own crypto library or an external implementation
* of the PSA Crypto API.
* This is unset if the cipher context was established through
* mbedtls_cipher_setup(), and set if it was established through
* mbedtls_cipher_setup_psa().
*/
unsigned
char
psa_enabled
;
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
}
mbedtls_cipher_context_t
;
/**
* \brief This function retrieves the list of ciphers supported
* by the generic cipher module.
*
* For any cipher identifier in the returned list, you can
* obtain the corresponding generic cipher information structure
* via mbedtls_cipher_info_from_type(), which can then be used
* to prepare a cipher context via mbedtls_cipher_setup().
*
*
* \return A statically-allocated array of cipher identifiers
* of type cipher_type_t. The last entry is zero.
*/
const
int
*
mbedtls_cipher_list
(
void
);
/**
* \brief This function retrieves the cipher-information
* structure associated with the given cipher name.
*
* \param cipher_name Name of the cipher to search for. This must not be
* \c NULL.
*
* \return The cipher information structure associated with the
* given \p cipher_name.
* \return \c NULL if the associated cipher information is not found.
*/
const
mbedtls_cipher_info_t
*
mbedtls_cipher_info_from_string
(
const
char
*
cipher_name
);
/**
* \brief This function retrieves the cipher-information
* structure associated with the given cipher type.
*
* \param cipher_type Type of the cipher to search for.
*
* \return The cipher information structure associated with the
* given \p cipher_type.
* \return \c NULL if the associated cipher information is not found.
*/
const
mbedtls_cipher_info_t
*
mbedtls_cipher_info_from_type
(
const
mbedtls_cipher_type_t
cipher_type
);
/**
* \brief This function retrieves the cipher-information
* structure associated with the given cipher ID,
* key size and mode.
*
* \param cipher_id The ID of the cipher to search for. For example,
* #MBEDTLS_CIPHER_ID_AES.
* \param key_bitlen The length of the key in bits.
* \param mode The cipher mode. For example, #MBEDTLS_MODE_CBC.
*
* \return The cipher information structure associated with the
* given \p cipher_id.
* \return \c NULL if the associated cipher information is not found.
*/
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
);
/**
* \brief This function initializes a \p cipher_context as NONE.
*
* \param ctx The context to be initialized. This must not be \c NULL.
*/
void
mbedtls_cipher_init
(
mbedtls_cipher_context_t
*
ctx
);
/**
* \brief This function frees and clears the cipher-specific
* context of \p ctx. Freeing \p ctx itself remains the
* responsibility of the caller.
*
* \param ctx The context to be freed. If this is \c NULL, the
* function has no effect, otherwise this must point to an
* initialized context.
*/
void
mbedtls_cipher_free
(
mbedtls_cipher_context_t
*
ctx
);
/**
* \brief This function initializes a cipher context for
* use with the given cipher primitive.
*
* \param ctx The context to initialize. This must be initialized.
* \param cipher_info The cipher to use.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
* \return #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the
* cipher-specific context fails.
*
* \internal Currently, the function also clears the structure.
* In future versions, the caller will be required to call
* mbedtls_cipher_init() on the structure first.
*/
int
mbedtls_cipher_setup
(
mbedtls_cipher_context_t
*
ctx
,
const
mbedtls_cipher_info_t
*
cipher_info
);
#if defined(MBEDTLS_USE_PSA_CRYPTO)
/**
* \brief This function initializes a cipher context for
* PSA-based use with the given cipher primitive.
*
* \note See #MBEDTLS_USE_PSA_CRYPTO for information on PSA.
*
* \param ctx The context to initialize. May not be \c NULL.
* \param cipher_info The cipher to use.
* \param taglen For AEAD ciphers, the length in bytes of the
* authentication tag to use. Subsequent uses of
* mbedtls_cipher_auth_encrypt() or
* mbedtls_cipher_auth_decrypt() must provide
* the same tag length.
* For non-AEAD ciphers, the value must be \c 0.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
* \return #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the
* cipher-specific context fails.
*/
int
mbedtls_cipher_setup_psa
(
mbedtls_cipher_context_t
*
ctx
,
const
mbedtls_cipher_info_t
*
cipher_info
,
size_t
taglen
);
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
/**
* \brief This function returns the block size of the given cipher.
*
* \param ctx The context of the cipher. This must be initialized.
*
* \return The block size of the underlying cipher.
* \return \c 0 if \p ctx has not been initialized.
*/
static
inline
unsigned
int
mbedtls_cipher_get_block_size
(
const
mbedtls_cipher_context_t
*
ctx
)
{
MBEDTLS_INTERNAL_VALIDATE_RET
(
ctx
!=
NULL
,
0
);
if
(
ctx
->
cipher_info
==
NULL
)
return
0
;
return
ctx
->
cipher_info
->
block_size
;
}
/**
* \brief This function returns the mode of operation for
* the cipher. For example, MBEDTLS_MODE_CBC.
*
* \param ctx The context of the cipher. This must be initialized.
*
* \return The mode of operation.
* \return #MBEDTLS_MODE_NONE if \p ctx has not been initialized.
*/
static
inline
mbedtls_cipher_mode_t
mbedtls_cipher_get_cipher_mode
(
const
mbedtls_cipher_context_t
*
ctx
)
{
MBEDTLS_INTERNAL_VALIDATE_RET
(
ctx
!=
NULL
,
MBEDTLS_MODE_NONE
);
if
(
ctx
->
cipher_info
==
NULL
)
return
MBEDTLS_MODE_NONE
;
return
ctx
->
cipher_info
->
mode
;
}
/**
* \brief This function returns the size of the IV or nonce
* of the cipher, in Bytes.
*
* \param ctx The context of the cipher. This must be initialized.
*
* \return The recommended IV size if no IV has been set.
* \return \c 0 for ciphers not using an IV or a nonce.
* \return The actual size if an IV has been set.
*/
static
inline
int
mbedtls_cipher_get_iv_size
(
const
mbedtls_cipher_context_t
*
ctx
)
{
MBEDTLS_INTERNAL_VALIDATE_RET
(
ctx
!=
NULL
,
0
);
if
(
ctx
->
cipher_info
==
NULL
)
return
0
;
if
(
ctx
->
iv_size
!=
0
)
return
(
int
)
ctx
->
iv_size
;
return
(
int
)
ctx
->
cipher_info
->
iv_size
;
}
/**
* \brief This function returns the type of the given cipher.
*
* \param ctx The context of the cipher. This must be initialized.
*
* \return The type of the cipher.
* \return #MBEDTLS_CIPHER_NONE if \p ctx has not been initialized.
*/
static
inline
mbedtls_cipher_type_t
mbedtls_cipher_get_type
(
const
mbedtls_cipher_context_t
*
ctx
)
{
MBEDTLS_INTERNAL_VALIDATE_RET
(
ctx
!=
NULL
,
MBEDTLS_CIPHER_NONE
);
if
(
ctx
->
cipher_info
==
NULL
)
return
MBEDTLS_CIPHER_NONE
;
return
ctx
->
cipher_info
->
type
;
}
/**
* \brief This function returns the name of the given cipher
* as a string.
*
* \param ctx The context of the cipher. This must be initialized.
*
* \return The name of the cipher.
* \return NULL if \p ctx has not been not initialized.
*/
static
inline
const
char
*
mbedtls_cipher_get_name
(
const
mbedtls_cipher_context_t
*
ctx
)
{
MBEDTLS_INTERNAL_VALIDATE_RET
(
ctx
!=
NULL
,
0
);
if
(
ctx
->
cipher_info
==
NULL
)
return
0
;
return
ctx
->
cipher_info
->
name
;
}
/**
* \brief This function returns the key length of the cipher.
*
* \param ctx The context of the cipher. This must be initialized.
*
* \return The key length of the cipher in bits.
* \return #MBEDTLS_KEY_LENGTH_NONE if ctx \p has not been
* initialized.
*/
static
inline
int
mbedtls_cipher_get_key_bitlen
(
const
mbedtls_cipher_context_t
*
ctx
)
{
MBEDTLS_INTERNAL_VALIDATE_RET
(
ctx
!=
NULL
,
MBEDTLS_KEY_LENGTH_NONE
);
if
(
ctx
->
cipher_info
==
NULL
)
return
MBEDTLS_KEY_LENGTH_NONE
;
return
(
int
)
ctx
->
cipher_info
->
key_bitlen
;
}
/**
* \brief This function returns the operation of the given cipher.
*
* \param ctx The context of the cipher. This must be initialized.
*
* \return The type of operation: #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT.
* \return #MBEDTLS_OPERATION_NONE if \p ctx has not been initialized.
*/
static
inline
mbedtls_operation_t
mbedtls_cipher_get_operation
(
const
mbedtls_cipher_context_t
*
ctx
)
{
MBEDTLS_INTERNAL_VALIDATE_RET
(
ctx
!=
NULL
,
MBEDTLS_OPERATION_NONE
);
if
(
ctx
->
cipher_info
==
NULL
)
return
MBEDTLS_OPERATION_NONE
;
return
ctx
->
operation
;
}
/**
* \brief This function sets the key to use with the given context.
*
* \param ctx The generic cipher context. This must be initialized and
* bound to a cipher information structure.
* \param key The key to use. This must be a readable buffer of at
* least \p key_bitlen Bits.
* \param key_bitlen The key length to use, in Bits.
* \param operation The operation that the key will be used for:
* #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
* \return A cipher-specific error code on failure.
*/
int
mbedtls_cipher_setkey
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
key
,
int
key_bitlen
,
const
mbedtls_operation_t
operation
);
#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
/**
* \brief This function sets the padding mode, for cipher modes
* that use padding.
*
* The default passing mode is PKCS7 padding.
*
* \param ctx The generic cipher context. This must be initialized and
* bound to a cipher information structure.
* \param mode The padding mode.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE
* if the selected padding mode is not supported.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode
* does not support padding.
*/
int
mbedtls_cipher_set_padding_mode
(
mbedtls_cipher_context_t
*
ctx
,
mbedtls_cipher_padding_t
mode
);
#endif
/* MBEDTLS_CIPHER_MODE_WITH_PADDING */
/**
* \brief This function sets the initialization vector (IV)
* or nonce.
*
* \note Some ciphers do not use IVs nor nonce. For these
* ciphers, this function has no effect.
*
* \param ctx The generic cipher context. This must be initialized and
* bound to a cipher information structure.
* \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. This
* must be a readable buffer of at least \p iv_len Bytes.
* \param iv_len The IV length for ciphers with variable-size IV.
* This parameter is discarded by ciphers with fixed-size IV.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
*/
int
mbedtls_cipher_set_iv
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
iv
,
size_t
iv_len
);
/**
* \brief This function resets the cipher state.
*
* \param ctx The generic cipher context. This must be initialized.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
*/
int
mbedtls_cipher_reset
(
mbedtls_cipher_context_t
*
ctx
);
#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
/**
* \brief This function adds additional data for AEAD ciphers.
* Currently supported with GCM and ChaCha20+Poly1305.
* This must be called exactly once, after
* mbedtls_cipher_reset().
*
* \param ctx The generic cipher context. This must be initialized.
* \param ad The additional data to use. This must be a readable
* buffer of at least \p ad_len Bytes.
* \param ad_len The length of \p ad in Bytes.
*
* \return \c 0 on success.
* \return A specific error code on failure.
*/
int
mbedtls_cipher_update_ad
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
ad
,
size_t
ad_len
);
#endif
/* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */
/**
* \brief The generic cipher update function. It encrypts or
* decrypts using the given cipher context. Writes as
* many block-sized blocks of data as possible to output.
* Any data that cannot be written immediately is either
* added to the next block, or flushed when
* mbedtls_cipher_finish() is called.
* Exception: For MBEDTLS_MODE_ECB, expects a single block
* in size. For example, 16 Bytes for AES.
*
* \note If the underlying cipher is used in GCM mode, all calls
* to this function, except for the last one before
* mbedtls_cipher_finish(), must have \p ilen as a
* multiple of the block size of the cipher.
*
* \param ctx The generic cipher context. This must be initialized and
* bound to a key.
* \param input The buffer holding the input data. This must be a
* readable buffer of at least \p ilen Bytes.
* \param ilen The length of the input data.
* \param output The buffer for the output data. This must be able to
* hold at least `ilen + block_size`. This must not be the
* same buffer as \p input.
* \param olen The length of the output data, to be updated with the
* actual number of Bytes written. This must not be
* \c NULL.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
* \return #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an
* unsupported mode for a cipher.
* \return A cipher-specific error code on failure.
*/
int
mbedtls_cipher_update
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
input
,
size_t
ilen
,
unsigned
char
*
output
,
size_t
*
olen
);
/**
* \brief The generic cipher finalization function. If data still
* needs to be flushed from an incomplete block, the data
* contained in it is padded to the size of
* the last block, and written to the \p output buffer.
*
* \param ctx The generic cipher context. This must be initialized and
* bound to a key.
* \param output The buffer to write data to. This needs to be a writable
* buffer of at least \p block_size Bytes.
* \param olen The length of the data written to the \p output buffer.
* This may not be \c NULL.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
* \return #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption
* expecting a full block but not receiving one.
* \return #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding
* while decrypting.
* \return A cipher-specific error code on failure.
*/
int
mbedtls_cipher_finish
(
mbedtls_cipher_context_t
*
ctx
,
unsigned
char
*
output
,
size_t
*
olen
);
#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
/**
* \brief This function writes a tag for AEAD ciphers.
* Currently supported with GCM and ChaCha20+Poly1305.
* This must be called after mbedtls_cipher_finish().
*
* \param ctx The generic cipher context. This must be initialized,
* bound to a key, and have just completed a cipher
* operation through mbedtls_cipher_finish() the tag for
* which should be written.
* \param tag The buffer to write the tag to. This must be a writable
* buffer of at least \p tag_len Bytes.
* \param tag_len The length of the tag to write.
*
* \return \c 0 on success.
* \return A specific error code on failure.
*/
int
mbedtls_cipher_write_tag
(
mbedtls_cipher_context_t
*
ctx
,
unsigned
char
*
tag
,
size_t
tag_len
);
/**
* \brief This function checks the tag for AEAD ciphers.
* Currently supported with GCM and ChaCha20+Poly1305.
* This must be called after mbedtls_cipher_finish().
*
* \param ctx The generic cipher context. This must be initialized.
* \param tag The buffer holding the tag. This must be a readable
* buffer of at least \p tag_len Bytes.
* \param tag_len The length of the tag to check.
*
* \return \c 0 on success.
* \return A specific error code on failure.
*/
int
mbedtls_cipher_check_tag
(
mbedtls_cipher_context_t
*
ctx
,
const
unsigned
char
*
tag
,
size_t
tag_len
);
#endif
/* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */
/**
* \brief The generic all-in-one encryption/decryption function,
* for all ciphers except AEAD constructs.
*
* \param ctx The generic cipher context. This must be initialized.
* \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers.
* This must be a readable buffer of at least \p iv_len
* Bytes.
* \param iv_len The IV length for ciphers with variable-size IV.
* This parameter is discarded by ciphers with fixed-size
* IV.
* \param input The buffer holding the input data. This must be a
* readable buffer of at least \p ilen Bytes.
* \param ilen The length of the input data in Bytes.
* \param output The buffer for the output data. This must be able to
* hold at least `ilen + block_size`. This must not be the
* same buffer as \p input.
* \param olen The length of the output data, to be updated with the
* actual number of Bytes written. This must not be
* \c NULL.
*
* \note Some ciphers do not use IVs nor nonce. For these
* ciphers, use \p iv = NULL and \p iv_len = 0.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
* \return #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption
* expecting a full block but not receiving one.
* \return #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding
* while decrypting.
* \return A cipher-specific error code on failure.
*/
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
);
#if defined(MBEDTLS_CIPHER_MODE_AEAD)
/**
* \brief The generic autenticated encryption (AEAD) function.
*
* \param ctx The generic cipher context. This must be initialized and
* bound to a key.
* \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers.
* This must be a readable buffer of at least \p iv_len
* Bytes.
* \param iv_len The IV length for ciphers with variable-size IV.
* This parameter is discarded by ciphers with fixed-size IV.
* \param ad The additional data to authenticate. This must be a
* readable buffer of at least \p ad_len Bytes.
* \param ad_len The length of \p ad.
* \param input The buffer holding the input data. This must be a
* readable buffer of at least \p ilen Bytes.
* \param ilen The length of the input data.
* \param output The buffer for the output data. This must be able to
* hold at least \p ilen Bytes.
* \param olen The length of the output data, to be updated with the
* actual number of Bytes written. This must not be
* \c NULL.
* \param tag The buffer for the authentication tag. This must be a
* writable buffer of at least \p tag_len Bytes.
* \param tag_len The desired length of the authentication tag.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
* \return A cipher-specific error code on failure.
*/
int
mbedtls_cipher_auth_encrypt
(
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
*
olen
,
unsigned
char
*
tag
,
size_t
tag_len
);
/**
* \brief The generic autenticated decryption (AEAD) function.
*
* \note If the data is not authentic, then the output buffer
* is zeroed out to prevent the unauthentic plaintext being
* used, making this interface safer.
*
* \param ctx The generic cipher context. This must be initialized and
* and bound to a key.
* \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers.
* This must be a readable buffer of at least \p iv_len
* Bytes.
* \param iv_len The IV length for ciphers with variable-size IV.
* This parameter is discarded by ciphers with fixed-size IV.
* \param ad The additional data to be authenticated. This must be a
* readable buffer of at least \p ad_len Bytes.
* \param ad_len The length of \p ad.
* \param input The buffer holding the input data. This must be a
* readable buffer of at least \p ilen Bytes.
* \param ilen The length of the input data.
* \param output The buffer for the output data.
* This must be able to hold at least \p ilen Bytes.
* \param olen The length of the output data, to be updated with the
* actual number of Bytes written. This must not be
* \c NULL.
* \param tag The buffer holding the authentication tag. This must be
* a readable buffer of at least \p tag_len Bytes.
* \param tag_len The length of the authentication tag.
*
* \return \c 0 on success.
* \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on
* parameter-verification failure.
* \return #MBEDTLS_ERR_CIPHER_AUTH_FAILED if data is not authentic.
* \return A cipher-specific error code on failure.
*/
int
mbedtls_cipher_auth_decrypt
(
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
*
olen
,
const
unsigned
char
*
tag
,
size_t
tag_len
);
#endif
/* MBEDTLS_CIPHER_MODE_AEAD */
#ifdef __cplusplus
}
#endif
...
...
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/cipher_internal.h
deleted
100644 → 0
View file @
b13825f4
/**
* \file cipher_internal.h
*
* \brief Cipher wrappers.
*
* \author Adriaan de Jong <dejong@fox-it.com>
*/
/*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is part of mbed TLS (https://tls.mbed.org)
*/
#ifndef MBEDTLS_CIPHER_WRAP_H
#define MBEDTLS_CIPHER_WRAP_H
#include "config.h"
#include "cipher.h"
#if defined(MBEDTLS_USE_PSA_CRYPTO)
#include "psa/crypto.h"
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
#ifdef __cplusplus
extern
"C"
{
#endif
/**
* Base cipher information. The non-mode specific functions and values.
*/
struct
mbedtls_cipher_base_t
{
/** Base Cipher type (e.g. MBEDTLS_CIPHER_ID_AES) */
mbedtls_cipher_id_t
cipher
;
/** Encrypt using ECB */
int
(
*
ecb_func
)(
void
*
ctx
,
mbedtls_operation_t
mode
,
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#if defined(MBEDTLS_CIPHER_MODE_CBC)
/** Encrypt using CBC */
int
(
*
cbc_func
)(
void
*
ctx
,
mbedtls_operation_t
mode
,
size_t
length
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
/** Encrypt using CFB (Full length) */
int
(
*
cfb_func
)(
void
*
ctx
,
mbedtls_operation_t
mode
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
/** Encrypt using OFB (Full length) */
int
(
*
ofb_func
)(
void
*
ctx
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
/** Encrypt using CTR */
int
(
*
ctr_func
)(
void
*
ctx
,
size_t
length
,
size_t
*
nc_off
,
unsigned
char
*
nonce_counter
,
unsigned
char
*
stream_block
,
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
/** Encrypt or decrypt using XTS. */
int
(
*
xts_func
)(
void
*
ctx
,
mbedtls_operation_t
mode
,
size_t
length
,
const
unsigned
char
data_unit
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
/** Encrypt using STREAM */
int
(
*
stream_func
)(
void
*
ctx
,
size_t
length
,
const
unsigned
char
*
input
,
unsigned
char
*
output
);
#endif
/** Set key for encryption purposes */
int
(
*
setkey_enc_func
)(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
);
/** Set key for decryption purposes */
int
(
*
setkey_dec_func
)(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
);
/** Allocate a new context */
void
*
(
*
ctx_alloc_func
)(
void
);
/** Free the given context */
void
(
*
ctx_free_func
)(
void
*
ctx
);
};
typedef
struct
{
mbedtls_cipher_type_t
type
;
const
mbedtls_cipher_info_t
*
info
;
}
mbedtls_cipher_definition_t
;
#if defined(MBEDTLS_USE_PSA_CRYPTO)
typedef
enum
{
MBEDTLS_CIPHER_PSA_KEY_UNSET
=
0
,
MBEDTLS_CIPHER_PSA_KEY_OWNED
,
/* Used for PSA-based cipher contexts which */
/* use raw key material internally imported */
/* into a allocated key slot, and which */
/* hence need to destroy that key slot */
/* when they are no longer needed. */
MBEDTLS_CIPHER_PSA_KEY_NOT_OWNED
,
/* Used for PSA-based cipher contexts */
/* which use a key from a key slot */
/* provided by the user, and which */
/* hence should not be destroyed when */
/* the context is no longer needed. */
}
mbedtls_cipher_psa_key_ownership
;
typedef
struct
{
psa_algorithm_t
alg
;
psa_key_handle_t
slot
;
mbedtls_cipher_psa_key_ownership
slot_state
;
}
mbedtls_cipher_context_psa
;
#endif
/* MBEDTLS_USE_PSA_CRYPTO */
extern
const
mbedtls_cipher_definition_t
mbedtls_cipher_definitions
[];
extern
int
mbedtls_cipher_supported
[];
#ifdef __cplusplus
}
#endif
#endif
/* MBEDTLS_CIPHER_WRAP_H */
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/cipher_wrap.c
deleted
100644 → 0
View file @
b13825f4
/**
* \file cipher_wrap.c
*
* \brief Generic cipher wrapper for mbed TLS
*
* \author Adriaan de Jong <dejong@fox-it.com>
*
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This file is part of mbed TLS (https://tls.mbed.org)
*/
#include "config.h"
#if defined(MBEDTLS_CIPHER_C)
#include "cipher_internal.h"
#if defined(MBEDTLS_CHACHAPOLY_C)
#include "mbedtls/chachapoly.h"
#endif
#if defined(MBEDTLS_AES_C)
#include "aes.h"
#endif
#if defined(MBEDTLS_ARC4_C)
#include "mbedtls/arc4.h"
#endif
#if defined(MBEDTLS_CAMELLIA_C)
#include "mbedtls/camellia.h"
#endif
#if defined(MBEDTLS_ARIA_C)
#include "mbedtls/aria.h"
#endif
#if defined(MBEDTLS_DES_C)
#include "mbedtls/des.h"
#endif
#if defined(MBEDTLS_BLOWFISH_C)
#include "mbedtls/blowfish.h"
#endif
#if defined(MBEDTLS_CHACHA20_C)
#include "mbedtls/chacha20.h"
#endif
#if defined(MBEDTLS_GCM_C)
#include "gcm.h"
#endif
#if defined(MBEDTLS_CCM_C)
#include "mbedtls/ccm.h"
#endif
#if defined(MBEDTLS_NIST_KW_C)
#include "mbedtls/nist_kw.h"
#endif
#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
#include <string.h>
#endif
#if defined(MBEDTLS_PLATFORM_C)
#include "mbedtls/platform.h"
#else
#include <stdlib.h>
#define mbedtls_calloc calloc
#define mbedtls_free free
#endif
#if defined(MBEDTLS_GCM_C)
/* shared by all GCM ciphers */
static
void
*
gcm_ctx_alloc
(
void
)
{
void
*
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_gcm_context
)
);
if
(
ctx
!=
NULL
)
mbedtls_gcm_init
(
(
mbedtls_gcm_context
*
)
ctx
);
return
(
ctx
);
}
static
void
gcm_ctx_free
(
void
*
ctx
)
{
mbedtls_gcm_free
(
ctx
);
mbedtls_free
(
ctx
);
}
#endif
/* MBEDTLS_GCM_C */
#if defined(MBEDTLS_CCM_C)
/* shared by all CCM ciphers */
static
void
*
ccm_ctx_alloc
(
void
)
{
void
*
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_ccm_context
)
);
if
(
ctx
!=
NULL
)
mbedtls_ccm_init
(
(
mbedtls_ccm_context
*
)
ctx
);
return
(
ctx
);
}
static
void
ccm_ctx_free
(
void
*
ctx
)
{
mbedtls_ccm_free
(
ctx
);
mbedtls_free
(
ctx
);
}
#endif
/* MBEDTLS_CCM_C */
#if defined(MBEDTLS_AES_C)
static
int
aes_crypt_ecb_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_aes_crypt_ecb
(
(
mbedtls_aes_context
*
)
ctx
,
operation
,
input
,
output
);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
int
aes_crypt_cbc_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_aes_crypt_cbc
(
(
mbedtls_aes_context
*
)
ctx
,
operation
,
length
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
static
int
aes_crypt_cfb128_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_aes_crypt_cfb128
(
(
mbedtls_aes_context
*
)
ctx
,
operation
,
length
,
iv_off
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_OFB)
static
int
aes_crypt_ofb_wrap
(
void
*
ctx
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_aes_crypt_ofb
(
(
mbedtls_aes_context
*
)
ctx
,
length
,
iv_off
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_OFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
static
int
aes_crypt_ctr_wrap
(
void
*
ctx
,
size_t
length
,
size_t
*
nc_off
,
unsigned
char
*
nonce_counter
,
unsigned
char
*
stream_block
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_aes_crypt_ctr
(
(
mbedtls_aes_context
*
)
ctx
,
length
,
nc_off
,
nonce_counter
,
stream_block
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
#if defined(MBEDTLS_CIPHER_MODE_XTS)
static
int
aes_crypt_xts_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
const
unsigned
char
data_unit
[
16
],
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
mbedtls_aes_xts_context
*
xts_ctx
=
ctx
;
int
mode
;
switch
(
operation
)
{
case
MBEDTLS_ENCRYPT
:
mode
=
MBEDTLS_AES_ENCRYPT
;
break
;
case
MBEDTLS_DECRYPT
:
mode
=
MBEDTLS_AES_DECRYPT
;
break
;
default:
return
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
;
}
return
mbedtls_aes_crypt_xts
(
xts_ctx
,
mode
,
length
,
data_unit
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
static
int
aes_setkey_dec_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_aes_setkey_dec
(
(
mbedtls_aes_context
*
)
ctx
,
key
,
key_bitlen
);
}
static
int
aes_setkey_enc_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_aes_setkey_enc
(
(
mbedtls_aes_context
*
)
ctx
,
key
,
key_bitlen
);
}
static
void
*
aes_ctx_alloc
(
void
)
{
mbedtls_aes_context
*
aes
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_aes_context
)
);
if
(
aes
==
NULL
)
return
(
NULL
);
mbedtls_aes_init
(
aes
);
return
(
aes
);
}
static
void
aes_ctx_free
(
void
*
ctx
)
{
mbedtls_aes_free
(
(
mbedtls_aes_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
const
mbedtls_cipher_base_t
aes_info
=
{
MBEDTLS_CIPHER_ID_AES
,
aes_crypt_ecb_wrap
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
aes_crypt_cbc_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
aes_crypt_cfb128_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
aes_crypt_ofb_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
aes_crypt_ctr_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
aes_setkey_enc_wrap
,
aes_setkey_dec_wrap
,
aes_ctx_alloc
,
aes_ctx_free
};
static
const
mbedtls_cipher_info_t
aes_128_ecb_info
=
{
MBEDTLS_CIPHER_AES_128_ECB
,
MBEDTLS_MODE_ECB
,
128
,
"AES-128-ECB"
,
0
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_ecb_info
=
{
MBEDTLS_CIPHER_AES_192_ECB
,
MBEDTLS_MODE_ECB
,
192
,
"AES-192-ECB"
,
0
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_ecb_info
=
{
MBEDTLS_CIPHER_AES_256_ECB
,
MBEDTLS_MODE_ECB
,
256
,
"AES-256-ECB"
,
0
,
0
,
16
,
&
aes_info
};
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
const
mbedtls_cipher_info_t
aes_128_cbc_info
=
{
MBEDTLS_CIPHER_AES_128_CBC
,
MBEDTLS_MODE_CBC
,
128
,
"AES-128-CBC"
,
16
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_cbc_info
=
{
MBEDTLS_CIPHER_AES_192_CBC
,
MBEDTLS_MODE_CBC
,
192
,
"AES-192-CBC"
,
16
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_cbc_info
=
{
MBEDTLS_CIPHER_AES_256_CBC
,
MBEDTLS_MODE_CBC
,
256
,
"AES-256-CBC"
,
16
,
0
,
16
,
&
aes_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
static
const
mbedtls_cipher_info_t
aes_128_cfb128_info
=
{
MBEDTLS_CIPHER_AES_128_CFB128
,
MBEDTLS_MODE_CFB
,
128
,
"AES-128-CFB128"
,
16
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_cfb128_info
=
{
MBEDTLS_CIPHER_AES_192_CFB128
,
MBEDTLS_MODE_CFB
,
192
,
"AES-192-CFB128"
,
16
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_cfb128_info
=
{
MBEDTLS_CIPHER_AES_256_CFB128
,
MBEDTLS_MODE_CFB
,
256
,
"AES-256-CFB128"
,
16
,
0
,
16
,
&
aes_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_OFB)
static
const
mbedtls_cipher_info_t
aes_128_ofb_info
=
{
MBEDTLS_CIPHER_AES_128_OFB
,
MBEDTLS_MODE_OFB
,
128
,
"AES-128-OFB"
,
16
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_ofb_info
=
{
MBEDTLS_CIPHER_AES_192_OFB
,
MBEDTLS_MODE_OFB
,
192
,
"AES-192-OFB"
,
16
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_ofb_info
=
{
MBEDTLS_CIPHER_AES_256_OFB
,
MBEDTLS_MODE_OFB
,
256
,
"AES-256-OFB"
,
16
,
0
,
16
,
&
aes_info
};
#endif
/* MBEDTLS_CIPHER_MODE_OFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
static
const
mbedtls_cipher_info_t
aes_128_ctr_info
=
{
MBEDTLS_CIPHER_AES_128_CTR
,
MBEDTLS_MODE_CTR
,
128
,
"AES-128-CTR"
,
16
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_ctr_info
=
{
MBEDTLS_CIPHER_AES_192_CTR
,
MBEDTLS_MODE_CTR
,
192
,
"AES-192-CTR"
,
16
,
0
,
16
,
&
aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_ctr_info
=
{
MBEDTLS_CIPHER_AES_256_CTR
,
MBEDTLS_MODE_CTR
,
256
,
"AES-256-CTR"
,
16
,
0
,
16
,
&
aes_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
#if defined(MBEDTLS_CIPHER_MODE_XTS)
static
int
xts_aes_setkey_enc_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
mbedtls_aes_xts_context
*
xts_ctx
=
ctx
;
return
(
mbedtls_aes_xts_setkey_enc
(
xts_ctx
,
key
,
key_bitlen
)
);
}
static
int
xts_aes_setkey_dec_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
mbedtls_aes_xts_context
*
xts_ctx
=
ctx
;
return
(
mbedtls_aes_xts_setkey_dec
(
xts_ctx
,
key
,
key_bitlen
)
);
}
static
void
*
xts_aes_ctx_alloc
(
void
)
{
mbedtls_aes_xts_context
*
xts_ctx
=
mbedtls_calloc
(
1
,
sizeof
(
*
xts_ctx
)
);
if
(
xts_ctx
!=
NULL
)
mbedtls_aes_xts_init
(
xts_ctx
);
return
(
xts_ctx
);
}
static
void
xts_aes_ctx_free
(
void
*
ctx
)
{
mbedtls_aes_xts_context
*
xts_ctx
=
ctx
;
if
(
xts_ctx
==
NULL
)
return
;
mbedtls_aes_xts_free
(
xts_ctx
);
mbedtls_free
(
xts_ctx
);
}
static
const
mbedtls_cipher_base_t
xts_aes_info
=
{
MBEDTLS_CIPHER_ID_AES
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
aes_crypt_xts_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
xts_aes_setkey_enc_wrap
,
xts_aes_setkey_dec_wrap
,
xts_aes_ctx_alloc
,
xts_aes_ctx_free
};
static
const
mbedtls_cipher_info_t
aes_128_xts_info
=
{
MBEDTLS_CIPHER_AES_128_XTS
,
MBEDTLS_MODE_XTS
,
256
,
"AES-128-XTS"
,
16
,
0
,
16
,
&
xts_aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_xts_info
=
{
MBEDTLS_CIPHER_AES_256_XTS
,
MBEDTLS_MODE_XTS
,
512
,
"AES-256-XTS"
,
16
,
0
,
16
,
&
xts_aes_info
};
#endif
/* MBEDTLS_CIPHER_MODE_XTS */
#if defined(MBEDTLS_GCM_C)
static
int
gcm_aes_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_gcm_setkey
(
(
mbedtls_gcm_context
*
)
ctx
,
MBEDTLS_CIPHER_ID_AES
,
key
,
key_bitlen
);
}
static
const
mbedtls_cipher_base_t
gcm_aes_info
=
{
MBEDTLS_CIPHER_ID_AES
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
gcm_aes_setkey_wrap
,
gcm_aes_setkey_wrap
,
gcm_ctx_alloc
,
gcm_ctx_free
,
};
static
const
mbedtls_cipher_info_t
aes_128_gcm_info
=
{
MBEDTLS_CIPHER_AES_128_GCM
,
MBEDTLS_MODE_GCM
,
128
,
"AES-128-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_gcm_info
=
{
MBEDTLS_CIPHER_AES_192_GCM
,
MBEDTLS_MODE_GCM
,
192
,
"AES-192-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_gcm_info
=
{
MBEDTLS_CIPHER_AES_256_GCM
,
MBEDTLS_MODE_GCM
,
256
,
"AES-256-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_aes_info
};
#endif
/* MBEDTLS_GCM_C */
#if defined(MBEDTLS_CCM_C)
static
int
ccm_aes_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_ccm_setkey
(
(
mbedtls_ccm_context
*
)
ctx
,
MBEDTLS_CIPHER_ID_AES
,
key
,
key_bitlen
);
}
static
const
mbedtls_cipher_base_t
ccm_aes_info
=
{
MBEDTLS_CIPHER_ID_AES
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
ccm_aes_setkey_wrap
,
ccm_aes_setkey_wrap
,
ccm_ctx_alloc
,
ccm_ctx_free
,
};
static
const
mbedtls_cipher_info_t
aes_128_ccm_info
=
{
MBEDTLS_CIPHER_AES_128_CCM
,
MBEDTLS_MODE_CCM
,
128
,
"AES-128-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_ccm_info
=
{
MBEDTLS_CIPHER_AES_192_CCM
,
MBEDTLS_MODE_CCM
,
192
,
"AES-192-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_ccm_info
=
{
MBEDTLS_CIPHER_AES_256_CCM
,
MBEDTLS_MODE_CCM
,
256
,
"AES-256-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_aes_info
};
#endif
/* MBEDTLS_CCM_C */
#endif
/* MBEDTLS_AES_C */
#if defined(MBEDTLS_CAMELLIA_C)
static
int
camellia_crypt_ecb_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_camellia_crypt_ecb
(
(
mbedtls_camellia_context
*
)
ctx
,
operation
,
input
,
output
);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
int
camellia_crypt_cbc_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_camellia_crypt_cbc
(
(
mbedtls_camellia_context
*
)
ctx
,
operation
,
length
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
static
int
camellia_crypt_cfb128_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_camellia_crypt_cfb128
(
(
mbedtls_camellia_context
*
)
ctx
,
operation
,
length
,
iv_off
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
static
int
camellia_crypt_ctr_wrap
(
void
*
ctx
,
size_t
length
,
size_t
*
nc_off
,
unsigned
char
*
nonce_counter
,
unsigned
char
*
stream_block
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_camellia_crypt_ctr
(
(
mbedtls_camellia_context
*
)
ctx
,
length
,
nc_off
,
nonce_counter
,
stream_block
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
static
int
camellia_setkey_dec_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_camellia_setkey_dec
(
(
mbedtls_camellia_context
*
)
ctx
,
key
,
key_bitlen
);
}
static
int
camellia_setkey_enc_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_camellia_setkey_enc
(
(
mbedtls_camellia_context
*
)
ctx
,
key
,
key_bitlen
);
}
static
void
*
camellia_ctx_alloc
(
void
)
{
mbedtls_camellia_context
*
ctx
;
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_camellia_context
)
);
if
(
ctx
==
NULL
)
return
(
NULL
);
mbedtls_camellia_init
(
ctx
);
return
(
ctx
);
}
static
void
camellia_ctx_free
(
void
*
ctx
)
{
mbedtls_camellia_free
(
(
mbedtls_camellia_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
const
mbedtls_cipher_base_t
camellia_info
=
{
MBEDTLS_CIPHER_ID_CAMELLIA
,
camellia_crypt_ecb_wrap
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
camellia_crypt_cbc_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
camellia_crypt_cfb128_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
camellia_crypt_ctr_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
camellia_setkey_enc_wrap
,
camellia_setkey_dec_wrap
,
camellia_ctx_alloc
,
camellia_ctx_free
};
static
const
mbedtls_cipher_info_t
camellia_128_ecb_info
=
{
MBEDTLS_CIPHER_CAMELLIA_128_ECB
,
MBEDTLS_MODE_ECB
,
128
,
"CAMELLIA-128-ECB"
,
16
,
0
,
16
,
&
camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_192_ecb_info
=
{
MBEDTLS_CIPHER_CAMELLIA_192_ECB
,
MBEDTLS_MODE_ECB
,
192
,
"CAMELLIA-192-ECB"
,
16
,
0
,
16
,
&
camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_256_ecb_info
=
{
MBEDTLS_CIPHER_CAMELLIA_256_ECB
,
MBEDTLS_MODE_ECB
,
256
,
"CAMELLIA-256-ECB"
,
16
,
0
,
16
,
&
camellia_info
};
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
const
mbedtls_cipher_info_t
camellia_128_cbc_info
=
{
MBEDTLS_CIPHER_CAMELLIA_128_CBC
,
MBEDTLS_MODE_CBC
,
128
,
"CAMELLIA-128-CBC"
,
16
,
0
,
16
,
&
camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_192_cbc_info
=
{
MBEDTLS_CIPHER_CAMELLIA_192_CBC
,
MBEDTLS_MODE_CBC
,
192
,
"CAMELLIA-192-CBC"
,
16
,
0
,
16
,
&
camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_256_cbc_info
=
{
MBEDTLS_CIPHER_CAMELLIA_256_CBC
,
MBEDTLS_MODE_CBC
,
256
,
"CAMELLIA-256-CBC"
,
16
,
0
,
16
,
&
camellia_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
static
const
mbedtls_cipher_info_t
camellia_128_cfb128_info
=
{
MBEDTLS_CIPHER_CAMELLIA_128_CFB128
,
MBEDTLS_MODE_CFB
,
128
,
"CAMELLIA-128-CFB128"
,
16
,
0
,
16
,
&
camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_192_cfb128_info
=
{
MBEDTLS_CIPHER_CAMELLIA_192_CFB128
,
MBEDTLS_MODE_CFB
,
192
,
"CAMELLIA-192-CFB128"
,
16
,
0
,
16
,
&
camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_256_cfb128_info
=
{
MBEDTLS_CIPHER_CAMELLIA_256_CFB128
,
MBEDTLS_MODE_CFB
,
256
,
"CAMELLIA-256-CFB128"
,
16
,
0
,
16
,
&
camellia_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
static
const
mbedtls_cipher_info_t
camellia_128_ctr_info
=
{
MBEDTLS_CIPHER_CAMELLIA_128_CTR
,
MBEDTLS_MODE_CTR
,
128
,
"CAMELLIA-128-CTR"
,
16
,
0
,
16
,
&
camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_192_ctr_info
=
{
MBEDTLS_CIPHER_CAMELLIA_192_CTR
,
MBEDTLS_MODE_CTR
,
192
,
"CAMELLIA-192-CTR"
,
16
,
0
,
16
,
&
camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_256_ctr_info
=
{
MBEDTLS_CIPHER_CAMELLIA_256_CTR
,
MBEDTLS_MODE_CTR
,
256
,
"CAMELLIA-256-CTR"
,
16
,
0
,
16
,
&
camellia_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
#if defined(MBEDTLS_GCM_C)
static
int
gcm_camellia_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_gcm_setkey
(
(
mbedtls_gcm_context
*
)
ctx
,
MBEDTLS_CIPHER_ID_CAMELLIA
,
key
,
key_bitlen
);
}
static
const
mbedtls_cipher_base_t
gcm_camellia_info
=
{
MBEDTLS_CIPHER_ID_CAMELLIA
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
gcm_camellia_setkey_wrap
,
gcm_camellia_setkey_wrap
,
gcm_ctx_alloc
,
gcm_ctx_free
,
};
static
const
mbedtls_cipher_info_t
camellia_128_gcm_info
=
{
MBEDTLS_CIPHER_CAMELLIA_128_GCM
,
MBEDTLS_MODE_GCM
,
128
,
"CAMELLIA-128-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_192_gcm_info
=
{
MBEDTLS_CIPHER_CAMELLIA_192_GCM
,
MBEDTLS_MODE_GCM
,
192
,
"CAMELLIA-192-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_256_gcm_info
=
{
MBEDTLS_CIPHER_CAMELLIA_256_GCM
,
MBEDTLS_MODE_GCM
,
256
,
"CAMELLIA-256-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_camellia_info
};
#endif
/* MBEDTLS_GCM_C */
#if defined(MBEDTLS_CCM_C)
static
int
ccm_camellia_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_ccm_setkey
(
(
mbedtls_ccm_context
*
)
ctx
,
MBEDTLS_CIPHER_ID_CAMELLIA
,
key
,
key_bitlen
);
}
static
const
mbedtls_cipher_base_t
ccm_camellia_info
=
{
MBEDTLS_CIPHER_ID_CAMELLIA
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
ccm_camellia_setkey_wrap
,
ccm_camellia_setkey_wrap
,
ccm_ctx_alloc
,
ccm_ctx_free
,
};
static
const
mbedtls_cipher_info_t
camellia_128_ccm_info
=
{
MBEDTLS_CIPHER_CAMELLIA_128_CCM
,
MBEDTLS_MODE_CCM
,
128
,
"CAMELLIA-128-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_192_ccm_info
=
{
MBEDTLS_CIPHER_CAMELLIA_192_CCM
,
MBEDTLS_MODE_CCM
,
192
,
"CAMELLIA-192-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_camellia_info
};
static
const
mbedtls_cipher_info_t
camellia_256_ccm_info
=
{
MBEDTLS_CIPHER_CAMELLIA_256_CCM
,
MBEDTLS_MODE_CCM
,
256
,
"CAMELLIA-256-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_camellia_info
};
#endif
/* MBEDTLS_CCM_C */
#endif
/* MBEDTLS_CAMELLIA_C */
#if defined(MBEDTLS_ARIA_C)
static
int
aria_crypt_ecb_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
(
void
)
operation
;
return
mbedtls_aria_crypt_ecb
(
(
mbedtls_aria_context
*
)
ctx
,
input
,
output
);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
int
aria_crypt_cbc_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_aria_crypt_cbc
(
(
mbedtls_aria_context
*
)
ctx
,
operation
,
length
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
static
int
aria_crypt_cfb128_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_aria_crypt_cfb128
(
(
mbedtls_aria_context
*
)
ctx
,
operation
,
length
,
iv_off
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
static
int
aria_crypt_ctr_wrap
(
void
*
ctx
,
size_t
length
,
size_t
*
nc_off
,
unsigned
char
*
nonce_counter
,
unsigned
char
*
stream_block
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_aria_crypt_ctr
(
(
mbedtls_aria_context
*
)
ctx
,
length
,
nc_off
,
nonce_counter
,
stream_block
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
static
int
aria_setkey_dec_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_aria_setkey_dec
(
(
mbedtls_aria_context
*
)
ctx
,
key
,
key_bitlen
);
}
static
int
aria_setkey_enc_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_aria_setkey_enc
(
(
mbedtls_aria_context
*
)
ctx
,
key
,
key_bitlen
);
}
static
void
*
aria_ctx_alloc
(
void
)
{
mbedtls_aria_context
*
ctx
;
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_aria_context
)
);
if
(
ctx
==
NULL
)
return
(
NULL
);
mbedtls_aria_init
(
ctx
);
return
(
ctx
);
}
static
void
aria_ctx_free
(
void
*
ctx
)
{
mbedtls_aria_free
(
(
mbedtls_aria_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
const
mbedtls_cipher_base_t
aria_info
=
{
MBEDTLS_CIPHER_ID_ARIA
,
aria_crypt_ecb_wrap
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
aria_crypt_cbc_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
aria_crypt_cfb128_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
aria_crypt_ctr_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
aria_setkey_enc_wrap
,
aria_setkey_dec_wrap
,
aria_ctx_alloc
,
aria_ctx_free
};
static
const
mbedtls_cipher_info_t
aria_128_ecb_info
=
{
MBEDTLS_CIPHER_ARIA_128_ECB
,
MBEDTLS_MODE_ECB
,
128
,
"ARIA-128-ECB"
,
16
,
0
,
16
,
&
aria_info
};
static
const
mbedtls_cipher_info_t
aria_192_ecb_info
=
{
MBEDTLS_CIPHER_ARIA_192_ECB
,
MBEDTLS_MODE_ECB
,
192
,
"ARIA-192-ECB"
,
16
,
0
,
16
,
&
aria_info
};
static
const
mbedtls_cipher_info_t
aria_256_ecb_info
=
{
MBEDTLS_CIPHER_ARIA_256_ECB
,
MBEDTLS_MODE_ECB
,
256
,
"ARIA-256-ECB"
,
16
,
0
,
16
,
&
aria_info
};
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
const
mbedtls_cipher_info_t
aria_128_cbc_info
=
{
MBEDTLS_CIPHER_ARIA_128_CBC
,
MBEDTLS_MODE_CBC
,
128
,
"ARIA-128-CBC"
,
16
,
0
,
16
,
&
aria_info
};
static
const
mbedtls_cipher_info_t
aria_192_cbc_info
=
{
MBEDTLS_CIPHER_ARIA_192_CBC
,
MBEDTLS_MODE_CBC
,
192
,
"ARIA-192-CBC"
,
16
,
0
,
16
,
&
aria_info
};
static
const
mbedtls_cipher_info_t
aria_256_cbc_info
=
{
MBEDTLS_CIPHER_ARIA_256_CBC
,
MBEDTLS_MODE_CBC
,
256
,
"ARIA-256-CBC"
,
16
,
0
,
16
,
&
aria_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
static
const
mbedtls_cipher_info_t
aria_128_cfb128_info
=
{
MBEDTLS_CIPHER_ARIA_128_CFB128
,
MBEDTLS_MODE_CFB
,
128
,
"ARIA-128-CFB128"
,
16
,
0
,
16
,
&
aria_info
};
static
const
mbedtls_cipher_info_t
aria_192_cfb128_info
=
{
MBEDTLS_CIPHER_ARIA_192_CFB128
,
MBEDTLS_MODE_CFB
,
192
,
"ARIA-192-CFB128"
,
16
,
0
,
16
,
&
aria_info
};
static
const
mbedtls_cipher_info_t
aria_256_cfb128_info
=
{
MBEDTLS_CIPHER_ARIA_256_CFB128
,
MBEDTLS_MODE_CFB
,
256
,
"ARIA-256-CFB128"
,
16
,
0
,
16
,
&
aria_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
static
const
mbedtls_cipher_info_t
aria_128_ctr_info
=
{
MBEDTLS_CIPHER_ARIA_128_CTR
,
MBEDTLS_MODE_CTR
,
128
,
"ARIA-128-CTR"
,
16
,
0
,
16
,
&
aria_info
};
static
const
mbedtls_cipher_info_t
aria_192_ctr_info
=
{
MBEDTLS_CIPHER_ARIA_192_CTR
,
MBEDTLS_MODE_CTR
,
192
,
"ARIA-192-CTR"
,
16
,
0
,
16
,
&
aria_info
};
static
const
mbedtls_cipher_info_t
aria_256_ctr_info
=
{
MBEDTLS_CIPHER_ARIA_256_CTR
,
MBEDTLS_MODE_CTR
,
256
,
"ARIA-256-CTR"
,
16
,
0
,
16
,
&
aria_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
#if defined(MBEDTLS_GCM_C)
static
int
gcm_aria_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_gcm_setkey
(
(
mbedtls_gcm_context
*
)
ctx
,
MBEDTLS_CIPHER_ID_ARIA
,
key
,
key_bitlen
);
}
static
const
mbedtls_cipher_base_t
gcm_aria_info
=
{
MBEDTLS_CIPHER_ID_ARIA
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
gcm_aria_setkey_wrap
,
gcm_aria_setkey_wrap
,
gcm_ctx_alloc
,
gcm_ctx_free
,
};
static
const
mbedtls_cipher_info_t
aria_128_gcm_info
=
{
MBEDTLS_CIPHER_ARIA_128_GCM
,
MBEDTLS_MODE_GCM
,
128
,
"ARIA-128-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_aria_info
};
static
const
mbedtls_cipher_info_t
aria_192_gcm_info
=
{
MBEDTLS_CIPHER_ARIA_192_GCM
,
MBEDTLS_MODE_GCM
,
192
,
"ARIA-192-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_aria_info
};
static
const
mbedtls_cipher_info_t
aria_256_gcm_info
=
{
MBEDTLS_CIPHER_ARIA_256_GCM
,
MBEDTLS_MODE_GCM
,
256
,
"ARIA-256-GCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
gcm_aria_info
};
#endif
/* MBEDTLS_GCM_C */
#if defined(MBEDTLS_CCM_C)
static
int
ccm_aria_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_ccm_setkey
(
(
mbedtls_ccm_context
*
)
ctx
,
MBEDTLS_CIPHER_ID_ARIA
,
key
,
key_bitlen
);
}
static
const
mbedtls_cipher_base_t
ccm_aria_info
=
{
MBEDTLS_CIPHER_ID_ARIA
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
ccm_aria_setkey_wrap
,
ccm_aria_setkey_wrap
,
ccm_ctx_alloc
,
ccm_ctx_free
,
};
static
const
mbedtls_cipher_info_t
aria_128_ccm_info
=
{
MBEDTLS_CIPHER_ARIA_128_CCM
,
MBEDTLS_MODE_CCM
,
128
,
"ARIA-128-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_aria_info
};
static
const
mbedtls_cipher_info_t
aria_192_ccm_info
=
{
MBEDTLS_CIPHER_ARIA_192_CCM
,
MBEDTLS_MODE_CCM
,
192
,
"ARIA-192-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_aria_info
};
static
const
mbedtls_cipher_info_t
aria_256_ccm_info
=
{
MBEDTLS_CIPHER_ARIA_256_CCM
,
MBEDTLS_MODE_CCM
,
256
,
"ARIA-256-CCM"
,
12
,
MBEDTLS_CIPHER_VARIABLE_IV_LEN
,
16
,
&
ccm_aria_info
};
#endif
/* MBEDTLS_CCM_C */
#endif
/* MBEDTLS_ARIA_C */
#if defined(MBEDTLS_DES_C)
static
int
des_crypt_ecb_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
((
void
)
operation
);
return
mbedtls_des_crypt_ecb
(
(
mbedtls_des_context
*
)
ctx
,
input
,
output
);
}
static
int
des3_crypt_ecb_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
((
void
)
operation
);
return
mbedtls_des3_crypt_ecb
(
(
mbedtls_des3_context
*
)
ctx
,
input
,
output
);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
int
des_crypt_cbc_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_des_crypt_cbc
(
(
mbedtls_des_context
*
)
ctx
,
operation
,
length
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
int
des3_crypt_cbc_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_des3_crypt_cbc
(
(
mbedtls_des3_context
*
)
ctx
,
operation
,
length
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
static
int
des_setkey_dec_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
((
void
)
key_bitlen
);
return
mbedtls_des_setkey_dec
(
(
mbedtls_des_context
*
)
ctx
,
key
);
}
static
int
des_setkey_enc_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
((
void
)
key_bitlen
);
return
mbedtls_des_setkey_enc
(
(
mbedtls_des_context
*
)
ctx
,
key
);
}
static
int
des3_set2key_dec_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
((
void
)
key_bitlen
);
return
mbedtls_des3_set2key_dec
(
(
mbedtls_des3_context
*
)
ctx
,
key
);
}
static
int
des3_set2key_enc_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
((
void
)
key_bitlen
);
return
mbedtls_des3_set2key_enc
(
(
mbedtls_des3_context
*
)
ctx
,
key
);
}
static
int
des3_set3key_dec_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
((
void
)
key_bitlen
);
return
mbedtls_des3_set3key_dec
(
(
mbedtls_des3_context
*
)
ctx
,
key
);
}
static
int
des3_set3key_enc_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
((
void
)
key_bitlen
);
return
mbedtls_des3_set3key_enc
(
(
mbedtls_des3_context
*
)
ctx
,
key
);
}
static
void
*
des_ctx_alloc
(
void
)
{
mbedtls_des_context
*
des
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_des_context
)
);
if
(
des
==
NULL
)
return
(
NULL
);
mbedtls_des_init
(
des
);
return
(
des
);
}
static
void
des_ctx_free
(
void
*
ctx
)
{
mbedtls_des_free
(
(
mbedtls_des_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
void
*
des3_ctx_alloc
(
void
)
{
mbedtls_des3_context
*
des3
;
des3
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_des3_context
)
);
if
(
des3
==
NULL
)
return
(
NULL
);
mbedtls_des3_init
(
des3
);
return
(
des3
);
}
static
void
des3_ctx_free
(
void
*
ctx
)
{
mbedtls_des3_free
(
(
mbedtls_des3_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
const
mbedtls_cipher_base_t
des_info
=
{
MBEDTLS_CIPHER_ID_DES
,
des_crypt_ecb_wrap
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
des_crypt_cbc_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
des_setkey_enc_wrap
,
des_setkey_dec_wrap
,
des_ctx_alloc
,
des_ctx_free
};
static
const
mbedtls_cipher_info_t
des_ecb_info
=
{
MBEDTLS_CIPHER_DES_ECB
,
MBEDTLS_MODE_ECB
,
MBEDTLS_KEY_LENGTH_DES
,
"DES-ECB"
,
8
,
0
,
8
,
&
des_info
};
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
const
mbedtls_cipher_info_t
des_cbc_info
=
{
MBEDTLS_CIPHER_DES_CBC
,
MBEDTLS_MODE_CBC
,
MBEDTLS_KEY_LENGTH_DES
,
"DES-CBC"
,
8
,
0
,
8
,
&
des_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
static
const
mbedtls_cipher_base_t
des_ede_info
=
{
MBEDTLS_CIPHER_ID_DES
,
des3_crypt_ecb_wrap
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
des3_crypt_cbc_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
des3_set2key_enc_wrap
,
des3_set2key_dec_wrap
,
des3_ctx_alloc
,
des3_ctx_free
};
static
const
mbedtls_cipher_info_t
des_ede_ecb_info
=
{
MBEDTLS_CIPHER_DES_EDE_ECB
,
MBEDTLS_MODE_ECB
,
MBEDTLS_KEY_LENGTH_DES_EDE
,
"DES-EDE-ECB"
,
8
,
0
,
8
,
&
des_ede_info
};
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
const
mbedtls_cipher_info_t
des_ede_cbc_info
=
{
MBEDTLS_CIPHER_DES_EDE_CBC
,
MBEDTLS_MODE_CBC
,
MBEDTLS_KEY_LENGTH_DES_EDE
,
"DES-EDE-CBC"
,
8
,
0
,
8
,
&
des_ede_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
static
const
mbedtls_cipher_base_t
des_ede3_info
=
{
MBEDTLS_CIPHER_ID_3DES
,
des3_crypt_ecb_wrap
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
des3_crypt_cbc_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
des3_set3key_enc_wrap
,
des3_set3key_dec_wrap
,
des3_ctx_alloc
,
des3_ctx_free
};
static
const
mbedtls_cipher_info_t
des_ede3_ecb_info
=
{
MBEDTLS_CIPHER_DES_EDE3_ECB
,
MBEDTLS_MODE_ECB
,
MBEDTLS_KEY_LENGTH_DES_EDE3
,
"DES-EDE3-ECB"
,
8
,
0
,
8
,
&
des_ede3_info
};
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
const
mbedtls_cipher_info_t
des_ede3_cbc_info
=
{
MBEDTLS_CIPHER_DES_EDE3_CBC
,
MBEDTLS_MODE_CBC
,
MBEDTLS_KEY_LENGTH_DES_EDE3
,
"DES-EDE3-CBC"
,
8
,
0
,
8
,
&
des_ede3_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#endif
/* MBEDTLS_DES_C */
#if defined(MBEDTLS_BLOWFISH_C)
static
int
blowfish_crypt_ecb_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_blowfish_crypt_ecb
(
(
mbedtls_blowfish_context
*
)
ctx
,
operation
,
input
,
output
);
}
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
int
blowfish_crypt_cbc_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_blowfish_crypt_cbc
(
(
mbedtls_blowfish_context
*
)
ctx
,
operation
,
length
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
static
int
blowfish_crypt_cfb64_wrap
(
void
*
ctx
,
mbedtls_operation_t
operation
,
size_t
length
,
size_t
*
iv_off
,
unsigned
char
*
iv
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_blowfish_crypt_cfb64
(
(
mbedtls_blowfish_context
*
)
ctx
,
operation
,
length
,
iv_off
,
iv
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
static
int
blowfish_crypt_ctr_wrap
(
void
*
ctx
,
size_t
length
,
size_t
*
nc_off
,
unsigned
char
*
nonce_counter
,
unsigned
char
*
stream_block
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
mbedtls_blowfish_crypt_ctr
(
(
mbedtls_blowfish_context
*
)
ctx
,
length
,
nc_off
,
nonce_counter
,
stream_block
,
input
,
output
);
}
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
static
int
blowfish_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_blowfish_setkey
(
(
mbedtls_blowfish_context
*
)
ctx
,
key
,
key_bitlen
);
}
static
void
*
blowfish_ctx_alloc
(
void
)
{
mbedtls_blowfish_context
*
ctx
;
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_blowfish_context
)
);
if
(
ctx
==
NULL
)
return
(
NULL
);
mbedtls_blowfish_init
(
ctx
);
return
(
ctx
);
}
static
void
blowfish_ctx_free
(
void
*
ctx
)
{
mbedtls_blowfish_free
(
(
mbedtls_blowfish_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
const
mbedtls_cipher_base_t
blowfish_info
=
{
MBEDTLS_CIPHER_ID_BLOWFISH
,
blowfish_crypt_ecb_wrap
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
blowfish_crypt_cbc_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
blowfish_crypt_cfb64_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
blowfish_crypt_ctr_wrap
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
blowfish_setkey_wrap
,
blowfish_setkey_wrap
,
blowfish_ctx_alloc
,
blowfish_ctx_free
};
static
const
mbedtls_cipher_info_t
blowfish_ecb_info
=
{
MBEDTLS_CIPHER_BLOWFISH_ECB
,
MBEDTLS_MODE_ECB
,
128
,
"BLOWFISH-ECB"
,
8
,
MBEDTLS_CIPHER_VARIABLE_KEY_LEN
,
8
,
&
blowfish_info
};
#if defined(MBEDTLS_CIPHER_MODE_CBC)
static
const
mbedtls_cipher_info_t
blowfish_cbc_info
=
{
MBEDTLS_CIPHER_BLOWFISH_CBC
,
MBEDTLS_MODE_CBC
,
128
,
"BLOWFISH-CBC"
,
8
,
MBEDTLS_CIPHER_VARIABLE_KEY_LEN
,
8
,
&
blowfish_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CBC */
#if defined(MBEDTLS_CIPHER_MODE_CFB)
static
const
mbedtls_cipher_info_t
blowfish_cfb64_info
=
{
MBEDTLS_CIPHER_BLOWFISH_CFB64
,
MBEDTLS_MODE_CFB
,
128
,
"BLOWFISH-CFB64"
,
8
,
MBEDTLS_CIPHER_VARIABLE_KEY_LEN
,
8
,
&
blowfish_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CFB */
#if defined(MBEDTLS_CIPHER_MODE_CTR)
static
const
mbedtls_cipher_info_t
blowfish_ctr_info
=
{
MBEDTLS_CIPHER_BLOWFISH_CTR
,
MBEDTLS_MODE_CTR
,
128
,
"BLOWFISH-CTR"
,
8
,
MBEDTLS_CIPHER_VARIABLE_KEY_LEN
,
8
,
&
blowfish_info
};
#endif
/* MBEDTLS_CIPHER_MODE_CTR */
#endif
/* MBEDTLS_BLOWFISH_C */
#if defined(MBEDTLS_ARC4_C)
static
int
arc4_crypt_stream_wrap
(
void
*
ctx
,
size_t
length
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
return
(
mbedtls_arc4_crypt
(
(
mbedtls_arc4_context
*
)
ctx
,
length
,
input
,
output
)
);
}
static
int
arc4_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
/* we get key_bitlen in bits, arc4 expects it in bytes */
if
(
key_bitlen
%
8
!=
0
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
mbedtls_arc4_setup
(
(
mbedtls_arc4_context
*
)
ctx
,
key
,
key_bitlen
/
8
);
return
(
0
);
}
static
void
*
arc4_ctx_alloc
(
void
)
{
mbedtls_arc4_context
*
ctx
;
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_arc4_context
)
);
if
(
ctx
==
NULL
)
return
(
NULL
);
mbedtls_arc4_init
(
ctx
);
return
(
ctx
);
}
static
void
arc4_ctx_free
(
void
*
ctx
)
{
mbedtls_arc4_free
(
(
mbedtls_arc4_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
const
mbedtls_cipher_base_t
arc4_base_info
=
{
MBEDTLS_CIPHER_ID_ARC4
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
arc4_crypt_stream_wrap
,
#endif
arc4_setkey_wrap
,
arc4_setkey_wrap
,
arc4_ctx_alloc
,
arc4_ctx_free
};
static
const
mbedtls_cipher_info_t
arc4_128_info
=
{
MBEDTLS_CIPHER_ARC4_128
,
MBEDTLS_MODE_STREAM
,
128
,
"ARC4-128"
,
0
,
0
,
1
,
&
arc4_base_info
};
#endif
/* MBEDTLS_ARC4_C */
#if defined(MBEDTLS_CHACHA20_C)
static
int
chacha20_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
if
(
key_bitlen
!=
256U
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
if
(
0
!=
mbedtls_chacha20_setkey
(
(
mbedtls_chacha20_context
*
)
ctx
,
key
)
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
return
(
0
);
}
static
int
chacha20_stream_wrap
(
void
*
ctx
,
size_t
length
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
int
ret
;
ret
=
mbedtls_chacha20_update
(
ctx
,
length
,
input
,
output
);
if
(
ret
==
MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
return
(
ret
);
}
static
void
*
chacha20_ctx_alloc
(
void
)
{
mbedtls_chacha20_context
*
ctx
;
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_chacha20_context
)
);
if
(
ctx
==
NULL
)
return
(
NULL
);
mbedtls_chacha20_init
(
ctx
);
return
(
ctx
);
}
static
void
chacha20_ctx_free
(
void
*
ctx
)
{
mbedtls_chacha20_free
(
(
mbedtls_chacha20_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
const
mbedtls_cipher_base_t
chacha20_base_info
=
{
MBEDTLS_CIPHER_ID_CHACHA20
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
chacha20_stream_wrap
,
#endif
chacha20_setkey_wrap
,
chacha20_setkey_wrap
,
chacha20_ctx_alloc
,
chacha20_ctx_free
};
static
const
mbedtls_cipher_info_t
chacha20_info
=
{
MBEDTLS_CIPHER_CHACHA20
,
MBEDTLS_MODE_STREAM
,
256
,
"CHACHA20"
,
12
,
0
,
1
,
&
chacha20_base_info
};
#endif
/* MBEDTLS_CHACHA20_C */
#if defined(MBEDTLS_CHACHAPOLY_C)
static
int
chachapoly_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
if
(
key_bitlen
!=
256U
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
if
(
0
!=
mbedtls_chachapoly_setkey
(
(
mbedtls_chachapoly_context
*
)
ctx
,
key
)
)
return
(
MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA
);
return
(
0
);
}
static
void
*
chachapoly_ctx_alloc
(
void
)
{
mbedtls_chachapoly_context
*
ctx
;
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_chachapoly_context
)
);
if
(
ctx
==
NULL
)
return
(
NULL
);
mbedtls_chachapoly_init
(
ctx
);
return
(
ctx
);
}
static
void
chachapoly_ctx_free
(
void
*
ctx
)
{
mbedtls_chachapoly_free
(
(
mbedtls_chachapoly_context
*
)
ctx
);
mbedtls_free
(
ctx
);
}
static
const
mbedtls_cipher_base_t
chachapoly_base_info
=
{
MBEDTLS_CIPHER_ID_CHACHA20
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
chachapoly_setkey_wrap
,
chachapoly_setkey_wrap
,
chachapoly_ctx_alloc
,
chachapoly_ctx_free
};
static
const
mbedtls_cipher_info_t
chachapoly_info
=
{
MBEDTLS_CIPHER_CHACHA20_POLY1305
,
MBEDTLS_MODE_CHACHAPOLY
,
256
,
"CHACHA20-POLY1305"
,
12
,
0
,
1
,
&
chachapoly_base_info
};
#endif
/* MBEDTLS_CHACHAPOLY_C */
#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
static
int
null_crypt_stream
(
void
*
ctx
,
size_t
length
,
const
unsigned
char
*
input
,
unsigned
char
*
output
)
{
((
void
)
ctx
);
memmove
(
output
,
input
,
length
);
return
(
0
);
}
static
int
null_setkey
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
((
void
)
ctx
);
((
void
)
key
);
((
void
)
key_bitlen
);
return
(
0
);
}
static
void
*
null_ctx_alloc
(
void
)
{
return
(
(
void
*
)
1
);
}
static
void
null_ctx_free
(
void
*
ctx
)
{
((
void
)
ctx
);
}
static
const
mbedtls_cipher_base_t
null_base_info
=
{
MBEDTLS_CIPHER_ID_NULL
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
null_crypt_stream
,
#endif
null_setkey
,
null_setkey
,
null_ctx_alloc
,
null_ctx_free
};
static
const
mbedtls_cipher_info_t
null_cipher_info
=
{
MBEDTLS_CIPHER_NULL
,
MBEDTLS_MODE_STREAM
,
0
,
"NULL"
,
0
,
0
,
1
,
&
null_base_info
};
#endif
/* defined(MBEDTLS_CIPHER_NULL_CIPHER) */
#if defined(MBEDTLS_NIST_KW_C)
static
void
*
kw_ctx_alloc
(
void
)
{
void
*
ctx
=
mbedtls_calloc
(
1
,
sizeof
(
mbedtls_nist_kw_context
)
);
if
(
ctx
!=
NULL
)
mbedtls_nist_kw_init
(
(
mbedtls_nist_kw_context
*
)
ctx
);
return
(
ctx
);
}
static
void
kw_ctx_free
(
void
*
ctx
)
{
mbedtls_nist_kw_free
(
ctx
);
mbedtls_free
(
ctx
);
}
static
int
kw_aes_setkey_wrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_nist_kw_setkey
(
(
mbedtls_nist_kw_context
*
)
ctx
,
MBEDTLS_CIPHER_ID_AES
,
key
,
key_bitlen
,
1
);
}
static
int
kw_aes_setkey_unwrap
(
void
*
ctx
,
const
unsigned
char
*
key
,
unsigned
int
key_bitlen
)
{
return
mbedtls_nist_kw_setkey
(
(
mbedtls_nist_kw_context
*
)
ctx
,
MBEDTLS_CIPHER_ID_AES
,
key
,
key_bitlen
,
0
);
}
static
const
mbedtls_cipher_base_t
kw_aes_info
=
{
MBEDTLS_CIPHER_ID_AES
,
NULL
,
#if defined(MBEDTLS_CIPHER_MODE_CBC)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
NULL
,
#endif
#if defined(MBEDTLS_CIPHER_MODE_STREAM)
NULL
,
#endif
kw_aes_setkey_wrap
,
kw_aes_setkey_unwrap
,
kw_ctx_alloc
,
kw_ctx_free
,
};
static
const
mbedtls_cipher_info_t
aes_128_nist_kw_info
=
{
MBEDTLS_CIPHER_AES_128_KW
,
MBEDTLS_MODE_KW
,
128
,
"AES-128-KW"
,
0
,
0
,
16
,
&
kw_aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_nist_kw_info
=
{
MBEDTLS_CIPHER_AES_192_KW
,
MBEDTLS_MODE_KW
,
192
,
"AES-192-KW"
,
0
,
0
,
16
,
&
kw_aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_nist_kw_info
=
{
MBEDTLS_CIPHER_AES_256_KW
,
MBEDTLS_MODE_KW
,
256
,
"AES-256-KW"
,
0
,
0
,
16
,
&
kw_aes_info
};
static
const
mbedtls_cipher_info_t
aes_128_nist_kwp_info
=
{
MBEDTLS_CIPHER_AES_128_KWP
,
MBEDTLS_MODE_KWP
,
128
,
"AES-128-KWP"
,
0
,
0
,
16
,
&
kw_aes_info
};
static
const
mbedtls_cipher_info_t
aes_192_nist_kwp_info
=
{
MBEDTLS_CIPHER_AES_192_KWP
,
MBEDTLS_MODE_KWP
,
192
,
"AES-192-KWP"
,
0
,
0
,
16
,
&
kw_aes_info
};
static
const
mbedtls_cipher_info_t
aes_256_nist_kwp_info
=
{
MBEDTLS_CIPHER_AES_256_KWP
,
MBEDTLS_MODE_KWP
,
256
,
"AES-256-KWP"
,
0
,
0
,
16
,
&
kw_aes_info
};
#endif
/* MBEDTLS_NIST_KW_C */
const
mbedtls_cipher_definition_t
mbedtls_cipher_definitions
[]
=
{
#if defined(MBEDTLS_AES_C)
{
MBEDTLS_CIPHER_AES_128_ECB
,
&
aes_128_ecb_info
},
{
MBEDTLS_CIPHER_AES_192_ECB
,
&
aes_192_ecb_info
},
{
MBEDTLS_CIPHER_AES_256_ECB
,
&
aes_256_ecb_info
},
#if defined(MBEDTLS_CIPHER_MODE_CBC)
{
MBEDTLS_CIPHER_AES_128_CBC
,
&
aes_128_cbc_info
},
{
MBEDTLS_CIPHER_AES_192_CBC
,
&
aes_192_cbc_info
},
{
MBEDTLS_CIPHER_AES_256_CBC
,
&
aes_256_cbc_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
{
MBEDTLS_CIPHER_AES_128_CFB128
,
&
aes_128_cfb128_info
},
{
MBEDTLS_CIPHER_AES_192_CFB128
,
&
aes_192_cfb128_info
},
{
MBEDTLS_CIPHER_AES_256_CFB128
,
&
aes_256_cfb128_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_OFB)
{
MBEDTLS_CIPHER_AES_128_OFB
,
&
aes_128_ofb_info
},
{
MBEDTLS_CIPHER_AES_192_OFB
,
&
aes_192_ofb_info
},
{
MBEDTLS_CIPHER_AES_256_OFB
,
&
aes_256_ofb_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
{
MBEDTLS_CIPHER_AES_128_CTR
,
&
aes_128_ctr_info
},
{
MBEDTLS_CIPHER_AES_192_CTR
,
&
aes_192_ctr_info
},
{
MBEDTLS_CIPHER_AES_256_CTR
,
&
aes_256_ctr_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_XTS)
{
MBEDTLS_CIPHER_AES_128_XTS
,
&
aes_128_xts_info
},
{
MBEDTLS_CIPHER_AES_256_XTS
,
&
aes_256_xts_info
},
#endif
#if defined(MBEDTLS_GCM_C)
{
MBEDTLS_CIPHER_AES_128_GCM
,
&
aes_128_gcm_info
},
{
MBEDTLS_CIPHER_AES_192_GCM
,
&
aes_192_gcm_info
},
{
MBEDTLS_CIPHER_AES_256_GCM
,
&
aes_256_gcm_info
},
#endif
#if defined(MBEDTLS_CCM_C)
{
MBEDTLS_CIPHER_AES_128_CCM
,
&
aes_128_ccm_info
},
{
MBEDTLS_CIPHER_AES_192_CCM
,
&
aes_192_ccm_info
},
{
MBEDTLS_CIPHER_AES_256_CCM
,
&
aes_256_ccm_info
},
#endif
#endif
/* MBEDTLS_AES_C */
#if defined(MBEDTLS_ARC4_C)
{
MBEDTLS_CIPHER_ARC4_128
,
&
arc4_128_info
},
#endif
#if defined(MBEDTLS_BLOWFISH_C)
{
MBEDTLS_CIPHER_BLOWFISH_ECB
,
&
blowfish_ecb_info
},
#if defined(MBEDTLS_CIPHER_MODE_CBC)
{
MBEDTLS_CIPHER_BLOWFISH_CBC
,
&
blowfish_cbc_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
{
MBEDTLS_CIPHER_BLOWFISH_CFB64
,
&
blowfish_cfb64_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
{
MBEDTLS_CIPHER_BLOWFISH_CTR
,
&
blowfish_ctr_info
},
#endif
#endif
/* MBEDTLS_BLOWFISH_C */
#if defined(MBEDTLS_CAMELLIA_C)
{
MBEDTLS_CIPHER_CAMELLIA_128_ECB
,
&
camellia_128_ecb_info
},
{
MBEDTLS_CIPHER_CAMELLIA_192_ECB
,
&
camellia_192_ecb_info
},
{
MBEDTLS_CIPHER_CAMELLIA_256_ECB
,
&
camellia_256_ecb_info
},
#if defined(MBEDTLS_CIPHER_MODE_CBC)
{
MBEDTLS_CIPHER_CAMELLIA_128_CBC
,
&
camellia_128_cbc_info
},
{
MBEDTLS_CIPHER_CAMELLIA_192_CBC
,
&
camellia_192_cbc_info
},
{
MBEDTLS_CIPHER_CAMELLIA_256_CBC
,
&
camellia_256_cbc_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
{
MBEDTLS_CIPHER_CAMELLIA_128_CFB128
,
&
camellia_128_cfb128_info
},
{
MBEDTLS_CIPHER_CAMELLIA_192_CFB128
,
&
camellia_192_cfb128_info
},
{
MBEDTLS_CIPHER_CAMELLIA_256_CFB128
,
&
camellia_256_cfb128_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
{
MBEDTLS_CIPHER_CAMELLIA_128_CTR
,
&
camellia_128_ctr_info
},
{
MBEDTLS_CIPHER_CAMELLIA_192_CTR
,
&
camellia_192_ctr_info
},
{
MBEDTLS_CIPHER_CAMELLIA_256_CTR
,
&
camellia_256_ctr_info
},
#endif
#if defined(MBEDTLS_GCM_C)
{
MBEDTLS_CIPHER_CAMELLIA_128_GCM
,
&
camellia_128_gcm_info
},
{
MBEDTLS_CIPHER_CAMELLIA_192_GCM
,
&
camellia_192_gcm_info
},
{
MBEDTLS_CIPHER_CAMELLIA_256_GCM
,
&
camellia_256_gcm_info
},
#endif
#if defined(MBEDTLS_CCM_C)
{
MBEDTLS_CIPHER_CAMELLIA_128_CCM
,
&
camellia_128_ccm_info
},
{
MBEDTLS_CIPHER_CAMELLIA_192_CCM
,
&
camellia_192_ccm_info
},
{
MBEDTLS_CIPHER_CAMELLIA_256_CCM
,
&
camellia_256_ccm_info
},
#endif
#endif
/* MBEDTLS_CAMELLIA_C */
#if defined(MBEDTLS_ARIA_C)
{
MBEDTLS_CIPHER_ARIA_128_ECB
,
&
aria_128_ecb_info
},
{
MBEDTLS_CIPHER_ARIA_192_ECB
,
&
aria_192_ecb_info
},
{
MBEDTLS_CIPHER_ARIA_256_ECB
,
&
aria_256_ecb_info
},
#if defined(MBEDTLS_CIPHER_MODE_CBC)
{
MBEDTLS_CIPHER_ARIA_128_CBC
,
&
aria_128_cbc_info
},
{
MBEDTLS_CIPHER_ARIA_192_CBC
,
&
aria_192_cbc_info
},
{
MBEDTLS_CIPHER_ARIA_256_CBC
,
&
aria_256_cbc_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_CFB)
{
MBEDTLS_CIPHER_ARIA_128_CFB128
,
&
aria_128_cfb128_info
},
{
MBEDTLS_CIPHER_ARIA_192_CFB128
,
&
aria_192_cfb128_info
},
{
MBEDTLS_CIPHER_ARIA_256_CFB128
,
&
aria_256_cfb128_info
},
#endif
#if defined(MBEDTLS_CIPHER_MODE_CTR)
{
MBEDTLS_CIPHER_ARIA_128_CTR
,
&
aria_128_ctr_info
},
{
MBEDTLS_CIPHER_ARIA_192_CTR
,
&
aria_192_ctr_info
},
{
MBEDTLS_CIPHER_ARIA_256_CTR
,
&
aria_256_ctr_info
},
#endif
#if defined(MBEDTLS_GCM_C)
{
MBEDTLS_CIPHER_ARIA_128_GCM
,
&
aria_128_gcm_info
},
{
MBEDTLS_CIPHER_ARIA_192_GCM
,
&
aria_192_gcm_info
},
{
MBEDTLS_CIPHER_ARIA_256_GCM
,
&
aria_256_gcm_info
},
#endif
#if defined(MBEDTLS_CCM_C)
{
MBEDTLS_CIPHER_ARIA_128_CCM
,
&
aria_128_ccm_info
},
{
MBEDTLS_CIPHER_ARIA_192_CCM
,
&
aria_192_ccm_info
},
{
MBEDTLS_CIPHER_ARIA_256_CCM
,
&
aria_256_ccm_info
},
#endif
#endif
/* MBEDTLS_ARIA_C */
#if defined(MBEDTLS_DES_C)
{
MBEDTLS_CIPHER_DES_ECB
,
&
des_ecb_info
},
{
MBEDTLS_CIPHER_DES_EDE_ECB
,
&
des_ede_ecb_info
},
{
MBEDTLS_CIPHER_DES_EDE3_ECB
,
&
des_ede3_ecb_info
},
#if defined(MBEDTLS_CIPHER_MODE_CBC)
{
MBEDTLS_CIPHER_DES_CBC
,
&
des_cbc_info
},
{
MBEDTLS_CIPHER_DES_EDE_CBC
,
&
des_ede_cbc_info
},
{
MBEDTLS_CIPHER_DES_EDE3_CBC
,
&
des_ede3_cbc_info
},
#endif
#endif
/* MBEDTLS_DES_C */
#if defined(MBEDTLS_CHACHA20_C)
{
MBEDTLS_CIPHER_CHACHA20
,
&
chacha20_info
},
#endif
#if defined(MBEDTLS_CHACHAPOLY_C)
{
MBEDTLS_CIPHER_CHACHA20_POLY1305
,
&
chachapoly_info
},
#endif
#if defined(MBEDTLS_NIST_KW_C)
{
MBEDTLS_CIPHER_AES_128_KW
,
&
aes_128_nist_kw_info
},
{
MBEDTLS_CIPHER_AES_192_KW
,
&
aes_192_nist_kw_info
},
{
MBEDTLS_CIPHER_AES_256_KW
,
&
aes_256_nist_kw_info
},
{
MBEDTLS_CIPHER_AES_128_KWP
,
&
aes_128_nist_kwp_info
},
{
MBEDTLS_CIPHER_AES_192_KWP
,
&
aes_192_nist_kwp_info
},
{
MBEDTLS_CIPHER_AES_256_KWP
,
&
aes_256_nist_kwp_info
},
#endif
#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
{
MBEDTLS_CIPHER_NULL
,
&
null_cipher_info
},
#endif
/* MBEDTLS_CIPHER_NULL_CIPHER */
{
MBEDTLS_CIPHER_NONE
,
NULL
}
};
#define NUM_CIPHERS ( sizeof(mbedtls_cipher_definitions) / \
sizeof(mbedtls_cipher_definitions[0]) )
int
mbedtls_cipher_supported
[
NUM_CIPHERS
];
#endif
/* MBEDTLS_CIPHER_C */
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/config.h
deleted
100644 → 0
View file @
b13825f4
#pragma once
#undef MBEDTLS_SELF_TEST
#define MBEDTLS_GCM_C
#define MBEDTLS_CIPHER_C
#define MBEDTLS_AES_C
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/gcm.c
View file @
8f3efffa
...
...
@@ -29,23 +29,15 @@
* [MGV] 4.1, pp. 12-13, to enhance speed without using too much memory.
*/
#include "config.h"
#include "platform_util.h"
#if defined(MBEDTLS_GCM_C)
#include "gcm.h"
#include "aes.h"
#include "api.h"
#include "crypto_aead.h"
#include <string.h>
#if defined(MBEDTLS_AESNI_C)
#include "mbedtls/aesni.h"
#endif
#if !defined(MBEDTLS_GCM_ALT)
/* Parameter validation macros */
#define GCM_VALIDATE_RET( cond ) \
MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_GCM_BAD_INPUT )
...
...
@@ -86,6 +78,9 @@ void mbedtls_gcm_init( mbedtls_gcm_context *ctx )
memset
(
ctx
,
0
,
sizeof
(
mbedtls_gcm_context
)
);
}
#define mbedtls_cipher_update(ctx, input, output) \
mbedtls_aes_crypt_ecb((ctx)->cipher_ctx, MBEDTLS_ENCRYPT, input, output)
/*
* Encrypt function for NIST API
*/
...
...
@@ -100,6 +95,7 @@ int crypto_aead_encrypt(
{
(
void
)
nsec
;
mbedtls_gcm_context
ctx
;
mbedtls_aes_context
aes
;
int
ret
;
unsigned
long
long
mask
=
15
;
unsigned
long
long
mlenp
=
(
mlen
+
mask
)
&
(
~
mask
);
...
...
@@ -107,9 +103,11 @@ int crypto_aead_encrypt(
*
clen
=
mlenp
+
CRYPTO_ABYTES
;
mbedtls_gcm_init
(
&
ctx
);
ret
=
mbedtls_gcm_setkey
(
&
ctx
,
MBEDTLS_CIPHER_ID_AES
,
k
,
128
);
ctx
.
cipher_ctx
.
cipher_ctx
=
&
aes
;
ret
=
mbedtls_gcm_setkey
(
&
ctx
,
k
,
128
);
ret
=
mbedtls_gcm_crypt_and_tag
(
&
ctx
,
1
,
mlen
,
npub
,
12
,
ad
,
adlen
,
m
,
c
,
16
,
tag_buf
);
mbedtls_gcm_free
(
&
ctx
);
mbedtls_platform_zeroize
(
&
aes
,
sizeof
(
aes
)
);
memcpy
(
c
+
mlenp
,
tag_buf
,
CRYPTO_ABYTES
);
return
ret
;
}
...
...
@@ -125,6 +123,7 @@ int crypto_aead_decrypt(
{
(
void
)
nsec
;
mbedtls_gcm_context
ctx
;
mbedtls_aes_context
aes
;
int
ret
;
unsigned
char
tag_buf
[
CRYPTO_ABYTES
];
...
...
@@ -133,9 +132,11 @@ int crypto_aead_decrypt(
*
mlen
=
clen
;
mbedtls_gcm_init
(
&
ctx
);
ret
=
mbedtls_gcm_setkey
(
&
ctx
,
MBEDTLS_CIPHER_ID_AES
,
k
,
128
);
ctx
.
cipher_ctx
.
cipher_ctx
=
&
aes
;
ret
=
mbedtls_gcm_setkey
(
&
ctx
,
k
,
128
);
ret
=
mbedtls_gcm_auth_decrypt
(
&
ctx
,
clen
,
npub
,
12
,
ad
,
adlen
,
tag_buf
,
16
,
c
,
m
);
mbedtls_gcm_free
(
&
ctx
);
mbedtls_platform_zeroize
(
&
aes
,
sizeof
(
aes
)
);
return
ret
;
...
...
@@ -155,10 +156,9 @@ static int gcm_gen_table( mbedtls_gcm_context *ctx )
uint64_t
hi
,
lo
;
uint64_t
vl
,
vh
;
unsigned
char
h
[
16
];
size_t
olen
=
0
;
memset
(
h
,
0
,
16
);
if
(
(
ret
=
mbedtls_cipher_update
(
&
ctx
->
cipher_ctx
,
h
,
16
,
h
,
&
olen
)
)
!=
0
)
if
(
(
ret
=
mbedtls_cipher_update
(
&
ctx
->
cipher_ctx
,
h
,
h
)
)
!=
0
)
return
(
ret
);
/* pack h as two 64-bits ints, big-endian */
...
...
@@ -174,12 +174,6 @@ static int gcm_gen_table( mbedtls_gcm_context *ctx )
ctx
->
HL
[
8
]
=
vl
;
ctx
->
HH
[
8
]
=
vh
;
#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
/* With CLMUL support, we need only h, not the rest of the table */
if
(
mbedtls_aesni_has_support
(
MBEDTLS_AESNI_CLMUL
)
)
return
(
0
);
#endif
/* 0 corresponds to 0 in GF(2^128) */
ctx
->
HH
[
0
]
=
0
;
ctx
->
HL
[
0
]
=
0
;
...
...
@@ -210,32 +204,18 @@ static int gcm_gen_table( mbedtls_gcm_context *ctx )
}
int
mbedtls_gcm_setkey
(
mbedtls_gcm_context
*
ctx
,
mbedtls_cipher_id_t
cipher
,
const
unsigned
char
*
key
,
unsigned
int
keybits
)
{
int
ret
;
const
mbedtls_cipher_info_t
*
cipher_info
;
GCM_VALIDATE_RET
(
ctx
!=
NULL
);
GCM_VALIDATE_RET
(
key
!=
NULL
);
GCM_VALIDATE_RET
(
keybits
==
128
||
keybits
==
192
||
keybits
==
256
);
cipher_info
=
mbedtls_cipher_info_from_values
(
cipher
,
keybits
,
MBEDTLS_MODE_ECB
);
if
(
cipher_info
==
NULL
)
return
(
MBEDTLS_ERR_GCM_BAD_INPUT
);
if
(
cipher_info
->
block_size
!=
16
)
return
(
MBEDTLS_ERR_GCM_BAD_INPUT
);
ctx
->
cipher_ctx
.
key_bitlen
=
keybits
;
mbedtls_cipher_free
(
&
ctx
->
cipher_ctx
);
if
(
(
ret
=
mbedtls_cipher_setup
(
&
ctx
->
cipher_ctx
,
cipher_info
)
)
!=
0
)
return
(
ret
);
if
(
(
ret
=
mbedtls_cipher_setkey
(
&
ctx
->
cipher_ctx
,
key
,
keybits
,
MBEDTLS_ENCRYPT
)
)
!=
0
)
if
(
(
ret
=
mbedtls_aes_setkey_enc
(
ctx
->
cipher_ctx
.
cipher_ctx
,
key
,
keybits
)
)
!=
0
)
{
return
(
ret
);
}
...
...
@@ -270,20 +250,6 @@ static void gcm_mult( mbedtls_gcm_context *ctx, const unsigned char x[16],
unsigned
char
lo
,
hi
,
rem
;
uint64_t
zh
,
zl
;
#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)
if
(
mbedtls_aesni_has_support
(
MBEDTLS_AESNI_CLMUL
)
)
{
unsigned
char
h
[
16
];
PUT_UINT32_BE
(
ctx
->
HH
[
8
]
>>
32
,
h
,
0
);
PUT_UINT32_BE
(
ctx
->
HH
[
8
],
h
,
4
);
PUT_UINT32_BE
(
ctx
->
HL
[
8
]
>>
32
,
h
,
8
);
PUT_UINT32_BE
(
ctx
->
HL
[
8
],
h
,
12
);
mbedtls_aesni_gcm_mult
(
output
,
x
,
h
);
return
;
}
#endif
/* MBEDTLS_AESNI_C && MBEDTLS_HAVE_X86_64 */
lo
=
x
[
15
]
&
0xf
;
zh
=
ctx
->
HH
[
lo
];
...
...
@@ -330,7 +296,7 @@ int mbedtls_gcm_starts( mbedtls_gcm_context *ctx,
unsigned
char
work_buf
[
16
];
size_t
i
;
const
unsigned
char
*
p
;
size_t
use_len
,
olen
=
0
;
size_t
use_len
;
GCM_VALIDATE_RET
(
ctx
!=
NULL
);
GCM_VALIDATE_RET
(
iv
!=
NULL
);
...
...
@@ -382,8 +348,8 @@ int mbedtls_gcm_starts( mbedtls_gcm_context *ctx,
gcm_mult
(
ctx
,
ctx
->
y
,
ctx
->
y
);
}
if
(
(
ret
=
mbedtls_cipher_update
(
&
ctx
->
cipher_ctx
,
ctx
->
y
,
16
,
ctx
->
base_ectr
,
&
olen
)
)
!=
0
)
if
(
(
ret
=
mbedtls_cipher_update
(
&
ctx
->
cipher_ctx
,
ctx
->
y
,
ctx
->
base_ectr
)
)
!=
0
)
{
return
(
ret
);
}
...
...
@@ -416,7 +382,7 @@ int mbedtls_gcm_update( mbedtls_gcm_context *ctx,
size_t
i
;
const
unsigned
char
*
p
;
unsigned
char
*
out_p
=
output
;
size_t
use_len
,
olen
=
0
;
size_t
use_len
;
GCM_VALIDATE_RET
(
ctx
!=
NULL
);
GCM_VALIDATE_RET
(
length
==
0
||
input
!=
NULL
);
...
...
@@ -444,8 +410,8 @@ int mbedtls_gcm_update( mbedtls_gcm_context *ctx,
if
(
++
ctx
->
y
[
i
-
1
]
!=
0
)
break
;
if
(
(
ret
=
mbedtls_cipher_update
(
&
ctx
->
cipher_ctx
,
ctx
->
y
,
16
,
ectr
,
&
olen
)
)
!=
0
)
if
(
(
ret
=
mbedtls_cipher_update
(
&
ctx
->
cipher_ctx
,
ctx
->
y
,
ectr
)
)
!=
0
)
{
return
(
ret
);
}
...
...
@@ -590,10 +556,6 @@ void mbedtls_gcm_free( mbedtls_gcm_context *ctx )
{
if
(
ctx
==
NULL
)
return
;
mbedtls_cipher_free
(
&
ctx
->
cipher_ctx
);
mbedtls_platform_zeroize
(
ctx
,
sizeof
(
mbedtls_gcm_context
)
);
}
#endif
/* !MBEDTLS_GCM_ALT */
#endif
/* MBEDTLS_GCM_C */
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/gcm.h
View file @
8f3efffa
...
...
@@ -33,8 +33,6 @@
#ifndef MBEDTLS_GCM_H
#define MBEDTLS_GCM_H
#include "config.h"
#include "cipher.h"
#include <stdint.h>
...
...
@@ -43,18 +41,12 @@
#define MBEDTLS_GCM_DECRYPT 0
#define MBEDTLS_ERR_GCM_AUTH_FAILED -0x0012
/**< Authenticated decryption failed. */
/* MBEDTLS_ERR_GCM_HW_ACCEL_FAILED is deprecated and should not be used. */
#define MBEDTLS_ERR_GCM_HW_ACCEL_FAILED -0x0013
/**< GCM hardware accelerator failed. */
#define MBEDTLS_ERR_GCM_BAD_INPUT -0x0014
/**< Bad input parameters to function. */
#ifdef __cplusplus
extern
"C"
{
#endif
#if !defined(MBEDTLS_GCM_ALT)
/**
* \brief The GCM context structure.
*/
...
...
@@ -74,10 +66,6 @@ typedef struct mbedtls_gcm_context
}
mbedtls_gcm_context
;
#else
/* !MBEDTLS_GCM_ALT */
#include "gcm_alt.h"
#endif
/* !MBEDTLS_GCM_ALT */
/**
* \brief This function initializes the specified GCM context,
* to make references valid, and prepares the context
...
...
@@ -96,7 +84,6 @@ void mbedtls_gcm_init( mbedtls_gcm_context *ctx );
* cipher algorithm and a key.
*
* \param ctx The GCM context. This must be initialized.
* \param cipher The 128-bit block cipher to use.
* \param key The encryption key. This must be a readable buffer of at
* least \p keybits bits.
* \param keybits The key size in bits. Valid options are:
...
...
@@ -108,7 +95,6 @@ void mbedtls_gcm_init( mbedtls_gcm_context *ctx );
* \return A cipher-specific error code on failure.
*/
int
mbedtls_gcm_setkey
(
mbedtls_gcm_context
*
ctx
,
mbedtls_cipher_id_t
cipher
,
const
unsigned
char
*
key
,
unsigned
int
keybits
);
...
...
@@ -302,18 +288,6 @@ int mbedtls_gcm_finish( mbedtls_gcm_context *ctx,
*/
void
mbedtls_gcm_free
(
mbedtls_gcm_context
*
ctx
);
#if defined(MBEDTLS_SELF_TEST)
/**
* \brief The GCM checkup routine.
*
* \return \c 0 on success.
* \return \c 1 on failure.
*/
int
mbedtls_gcm_self_test
(
int
verbose
);
#endif
/* MBEDTLS_SELF_TEST */
#ifdef __cplusplus
}
#endif
...
...
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/platform_util.c
View file @
8f3efffa
...
...
@@ -20,22 +20,11 @@
* This file is part of Mbed TLS (https://tls.mbed.org)
*/
/*
* Ensure gmtime_r is available even with -std=c99; must be defined before
* config.h, which pulls in glibc's features.h. Harmless on other platforms.
*/
#if !defined(_POSIX_C_SOURCE)
#define _POSIX_C_SOURCE 200112L
#endif
#include "config.h"
#include "platform_util.h"
#include <stddef.h>
#include <string.h>
#if !defined(MBEDTLS_PLATFORM_ZEROIZE_ALT)
/*
* This implementation should never be optimized out by the compiler
*
...
...
@@ -68,5 +57,4 @@ void mbedtls_platform_zeroize( void *buf, size_t len )
{
memset_func
(
buf
,
0
,
len
);
}
#endif
/* MBEDTLS_PLATFORM_ZEROIZE_ALT */
This diff is collapsed.
Click to expand it.
mbed_aes_gcm/Implementations/crypto_aead/aes128k96n/ref/platform_util.h
View file @
8f3efffa
...
...
@@ -25,8 +25,6 @@
#ifndef MBEDTLS_PLATFORM_UTIL_H
#define MBEDTLS_PLATFORM_UTIL_H
#include "config.h"
#include <stddef.h>
#ifdef __cplusplus
...
...
@@ -34,9 +32,6 @@ extern "C" {
#endif
#define MBEDTLS_PARAM_FAILED( cond ) assert( cond )
#define MBEDTLS_PARAM_FAILED_ALT
/* Internal macros meant to be called only from within the library. */
#define MBEDTLS_INTERNAL_VALIDATE_RET( cond, ret ) do { } while( 0 )
#define MBEDTLS_INTERNAL_VALIDATE( cond ) do { } while( 0 )
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment