1 /**
2  * \file xtea.h
3  *
4  * \brief XTEA block cipher (32-bit)
5  */
6 /*
7  *  Copyright The Mbed TLS Contributors
8  *  SPDX-License-Identifier: Apache-2.0
9  *
10  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
11  *  not use this file except in compliance with the License.
12  *  You may obtain a copy of the License at
13  *
14  *  http://www.apache.org/licenses/LICENSE-2.0
15  *
16  *  Unless required by applicable law or agreed to in writing, software
17  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
18  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  *  See the License for the specific language governing permissions and
20  *  limitations under the License.
21  */
22 #ifndef MBEDTLS_XTEA_H
23 #define MBEDTLS_XTEA_H
24 
25 #if !defined(MBEDTLS_CONFIG_FILE)
26 #include "mbedtls/config.h"
27 #else
28 #include MBEDTLS_CONFIG_FILE
29 #endif
30 
31 #include <stddef.h>
32 #include <stdint.h>
33 
34 #define MBEDTLS_XTEA_ENCRYPT     1
35 #define MBEDTLS_XTEA_DECRYPT     0
36 
37 #define MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH             -0x0028  /**< The data input has an invalid length. */
38 
39 /* MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED is deprecated and should not be used. */
40 #define MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED                  -0x0029  /**< XTEA hardware accelerator failed. */
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 #if !defined(MBEDTLS_XTEA_ALT)
47 // Regular implementation
48 //
49 
50 /**
51  * \brief          XTEA context structure
52  */
53 typedef struct mbedtls_xtea_context
54 {
55     uint32_t k[4];       /*!< key */
56 }
57 mbedtls_xtea_context;
58 
59 #else  /* MBEDTLS_XTEA_ALT */
60 #include "xtea_alt.h"
61 #endif /* MBEDTLS_XTEA_ALT */
62 
63 /**
64  * \brief          Initialize XTEA context
65  *
66  * \param ctx      XTEA context to be initialized
67  */
68 void mbedtls_xtea_init( mbedtls_xtea_context *ctx );
69 
70 /**
71  * \brief          Clear XTEA context
72  *
73  * \param ctx      XTEA context to be cleared
74  */
75 void mbedtls_xtea_free( mbedtls_xtea_context *ctx );
76 
77 /**
78  * \brief          XTEA key schedule
79  *
80  * \param ctx      XTEA context to be initialized
81  * \param key      the secret key
82  */
83 void mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] );
84 
85 /**
86  * \brief          XTEA cipher function
87  *
88  * \param ctx      XTEA context
89  * \param mode     MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT
90  * \param input    8-byte input block
91  * \param output   8-byte output block
92  *
93  * \return         0 if successful
94  */
95 int mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx,
96                     int mode,
97                     const unsigned char input[8],
98                     unsigned char output[8] );
99 
100 #if defined(MBEDTLS_CIPHER_MODE_CBC)
101 /**
102  * \brief          XTEA CBC cipher function
103  *
104  * \param ctx      XTEA context
105  * \param mode     MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT
106  * \param length   the length of input, multiple of 8
107  * \param iv       initialization vector for CBC mode
108  * \param input    input block
109  * \param output   output block
110  *
111  * \return         0 if successful,
112  *                 MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH if the length % 8 != 0
113  */
114 int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx,
115                     int mode,
116                     size_t length,
117                     unsigned char iv[8],
118                     const unsigned char *input,
119                     unsigned char *output);
120 #endif /* MBEDTLS_CIPHER_MODE_CBC */
121 
122 #if defined(MBEDTLS_SELF_TEST)
123 
124 /**
125  * \brief          Checkup routine
126  *
127  * \return         0 if successful, or 1 if the test failed
128  */
129 int mbedtls_xtea_self_test( int verbose );
130 
131 #endif /* MBEDTLS_SELF_TEST */
132 
133 #ifdef __cplusplus
134 }
135 #endif
136 
137 #endif /* xtea.h */
138