RTC auf true

Committer:
kevman
Date:
Wed Nov 28 15:10:15 2018 +0000
Revision:
0:38ceb79fef03
RTC modified

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1 /*
kevman 0:38ceb79fef03 2 * FIPS-46-3 compliant Triple-DES implementation
kevman 0:38ceb79fef03 3 *
kevman 0:38ceb79fef03 4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
kevman 0:38ceb79fef03 5 * SPDX-License-Identifier: Apache-2.0
kevman 0:38ceb79fef03 6 *
kevman 0:38ceb79fef03 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
kevman 0:38ceb79fef03 8 * not use this file except in compliance with the License.
kevman 0:38ceb79fef03 9 * You may obtain a copy of the License at
kevman 0:38ceb79fef03 10 *
kevman 0:38ceb79fef03 11 * http://www.apache.org/licenses/LICENSE-2.0
kevman 0:38ceb79fef03 12 *
kevman 0:38ceb79fef03 13 * Unless required by applicable law or agreed to in writing, software
kevman 0:38ceb79fef03 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
kevman 0:38ceb79fef03 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 0:38ceb79fef03 16 * See the License for the specific language governing permissions and
kevman 0:38ceb79fef03 17 * limitations under the License.
kevman 0:38ceb79fef03 18 *
kevman 0:38ceb79fef03 19 * This file is part of mbed TLS (https://tls.mbed.org)
kevman 0:38ceb79fef03 20 */
kevman 0:38ceb79fef03 21 /*
kevman 0:38ceb79fef03 22 * DES, on which TDES is based, was originally designed by Horst Feistel
kevman 0:38ceb79fef03 23 * at IBM in 1974, and was adopted as a standard by NIST (formerly NBS).
kevman 0:38ceb79fef03 24 *
kevman 0:38ceb79fef03 25 * http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf
kevman 0:38ceb79fef03 26 */
kevman 0:38ceb79fef03 27
kevman 0:38ceb79fef03 28 #if !defined(MBEDTLS_CONFIG_FILE)
kevman 0:38ceb79fef03 29 #include "mbedtls/config.h"
kevman 0:38ceb79fef03 30 #else
kevman 0:38ceb79fef03 31 #include MBEDTLS_CONFIG_FILE
kevman 0:38ceb79fef03 32 #endif
kevman 0:38ceb79fef03 33
kevman 0:38ceb79fef03 34 #if defined(MBEDTLS_DES_C)
kevman 0:38ceb79fef03 35
kevman 0:38ceb79fef03 36 #include "mbedtls/des.h"
kevman 0:38ceb79fef03 37 #include "mbedtls/platform_util.h"
kevman 0:38ceb79fef03 38
kevman 0:38ceb79fef03 39 #include <string.h>
kevman 0:38ceb79fef03 40
kevman 0:38ceb79fef03 41 #if defined(MBEDTLS_SELF_TEST)
kevman 0:38ceb79fef03 42 #if defined(MBEDTLS_PLATFORM_C)
kevman 0:38ceb79fef03 43 #include "mbedtls/platform.h"
kevman 0:38ceb79fef03 44 #else
kevman 0:38ceb79fef03 45 #include <stdio.h>
kevman 0:38ceb79fef03 46 #define mbedtls_printf printf
kevman 0:38ceb79fef03 47 #endif /* MBEDTLS_PLATFORM_C */
kevman 0:38ceb79fef03 48 #endif /* MBEDTLS_SELF_TEST */
kevman 0:38ceb79fef03 49
kevman 0:38ceb79fef03 50 #if !defined(MBEDTLS_DES_ALT)
kevman 0:38ceb79fef03 51
kevman 0:38ceb79fef03 52 /*
kevman 0:38ceb79fef03 53 * 32-bit integer manipulation macros (big endian)
kevman 0:38ceb79fef03 54 */
kevman 0:38ceb79fef03 55 #ifndef GET_UINT32_BE
kevman 0:38ceb79fef03 56 #define GET_UINT32_BE(n,b,i) \
kevman 0:38ceb79fef03 57 { \
kevman 0:38ceb79fef03 58 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
kevman 0:38ceb79fef03 59 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
kevman 0:38ceb79fef03 60 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
kevman 0:38ceb79fef03 61 | ( (uint32_t) (b)[(i) + 3] ); \
kevman 0:38ceb79fef03 62 }
kevman 0:38ceb79fef03 63 #endif
kevman 0:38ceb79fef03 64
kevman 0:38ceb79fef03 65 #ifndef PUT_UINT32_BE
kevman 0:38ceb79fef03 66 #define PUT_UINT32_BE(n,b,i) \
kevman 0:38ceb79fef03 67 { \
kevman 0:38ceb79fef03 68 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
kevman 0:38ceb79fef03 69 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
kevman 0:38ceb79fef03 70 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
kevman 0:38ceb79fef03 71 (b)[(i) + 3] = (unsigned char) ( (n) ); \
kevman 0:38ceb79fef03 72 }
kevman 0:38ceb79fef03 73 #endif
kevman 0:38ceb79fef03 74
kevman 0:38ceb79fef03 75 /*
kevman 0:38ceb79fef03 76 * Expanded DES S-boxes
kevman 0:38ceb79fef03 77 */
kevman 0:38ceb79fef03 78 static const uint32_t SB1[64] =
kevman 0:38ceb79fef03 79 {
kevman 0:38ceb79fef03 80 0x01010400, 0x00000000, 0x00010000, 0x01010404,
kevman 0:38ceb79fef03 81 0x01010004, 0x00010404, 0x00000004, 0x00010000,
kevman 0:38ceb79fef03 82 0x00000400, 0x01010400, 0x01010404, 0x00000400,
kevman 0:38ceb79fef03 83 0x01000404, 0x01010004, 0x01000000, 0x00000004,
kevman 0:38ceb79fef03 84 0x00000404, 0x01000400, 0x01000400, 0x00010400,
kevman 0:38ceb79fef03 85 0x00010400, 0x01010000, 0x01010000, 0x01000404,
kevman 0:38ceb79fef03 86 0x00010004, 0x01000004, 0x01000004, 0x00010004,
kevman 0:38ceb79fef03 87 0x00000000, 0x00000404, 0x00010404, 0x01000000,
kevman 0:38ceb79fef03 88 0x00010000, 0x01010404, 0x00000004, 0x01010000,
kevman 0:38ceb79fef03 89 0x01010400, 0x01000000, 0x01000000, 0x00000400,
kevman 0:38ceb79fef03 90 0x01010004, 0x00010000, 0x00010400, 0x01000004,
kevman 0:38ceb79fef03 91 0x00000400, 0x00000004, 0x01000404, 0x00010404,
kevman 0:38ceb79fef03 92 0x01010404, 0x00010004, 0x01010000, 0x01000404,
kevman 0:38ceb79fef03 93 0x01000004, 0x00000404, 0x00010404, 0x01010400,
kevman 0:38ceb79fef03 94 0x00000404, 0x01000400, 0x01000400, 0x00000000,
kevman 0:38ceb79fef03 95 0x00010004, 0x00010400, 0x00000000, 0x01010004
kevman 0:38ceb79fef03 96 };
kevman 0:38ceb79fef03 97
kevman 0:38ceb79fef03 98 static const uint32_t SB2[64] =
kevman 0:38ceb79fef03 99 {
kevman 0:38ceb79fef03 100 0x80108020, 0x80008000, 0x00008000, 0x00108020,
kevman 0:38ceb79fef03 101 0x00100000, 0x00000020, 0x80100020, 0x80008020,
kevman 0:38ceb79fef03 102 0x80000020, 0x80108020, 0x80108000, 0x80000000,
kevman 0:38ceb79fef03 103 0x80008000, 0x00100000, 0x00000020, 0x80100020,
kevman 0:38ceb79fef03 104 0x00108000, 0x00100020, 0x80008020, 0x00000000,
kevman 0:38ceb79fef03 105 0x80000000, 0x00008000, 0x00108020, 0x80100000,
kevman 0:38ceb79fef03 106 0x00100020, 0x80000020, 0x00000000, 0x00108000,
kevman 0:38ceb79fef03 107 0x00008020, 0x80108000, 0x80100000, 0x00008020,
kevman 0:38ceb79fef03 108 0x00000000, 0x00108020, 0x80100020, 0x00100000,
kevman 0:38ceb79fef03 109 0x80008020, 0x80100000, 0x80108000, 0x00008000,
kevman 0:38ceb79fef03 110 0x80100000, 0x80008000, 0x00000020, 0x80108020,
kevman 0:38ceb79fef03 111 0x00108020, 0x00000020, 0x00008000, 0x80000000,
kevman 0:38ceb79fef03 112 0x00008020, 0x80108000, 0x00100000, 0x80000020,
kevman 0:38ceb79fef03 113 0x00100020, 0x80008020, 0x80000020, 0x00100020,
kevman 0:38ceb79fef03 114 0x00108000, 0x00000000, 0x80008000, 0x00008020,
kevman 0:38ceb79fef03 115 0x80000000, 0x80100020, 0x80108020, 0x00108000
kevman 0:38ceb79fef03 116 };
kevman 0:38ceb79fef03 117
kevman 0:38ceb79fef03 118 static const uint32_t SB3[64] =
kevman 0:38ceb79fef03 119 {
kevman 0:38ceb79fef03 120 0x00000208, 0x08020200, 0x00000000, 0x08020008,
kevman 0:38ceb79fef03 121 0x08000200, 0x00000000, 0x00020208, 0x08000200,
kevman 0:38ceb79fef03 122 0x00020008, 0x08000008, 0x08000008, 0x00020000,
kevman 0:38ceb79fef03 123 0x08020208, 0x00020008, 0x08020000, 0x00000208,
kevman 0:38ceb79fef03 124 0x08000000, 0x00000008, 0x08020200, 0x00000200,
kevman 0:38ceb79fef03 125 0x00020200, 0x08020000, 0x08020008, 0x00020208,
kevman 0:38ceb79fef03 126 0x08000208, 0x00020200, 0x00020000, 0x08000208,
kevman 0:38ceb79fef03 127 0x00000008, 0x08020208, 0x00000200, 0x08000000,
kevman 0:38ceb79fef03 128 0x08020200, 0x08000000, 0x00020008, 0x00000208,
kevman 0:38ceb79fef03 129 0x00020000, 0x08020200, 0x08000200, 0x00000000,
kevman 0:38ceb79fef03 130 0x00000200, 0x00020008, 0x08020208, 0x08000200,
kevman 0:38ceb79fef03 131 0x08000008, 0x00000200, 0x00000000, 0x08020008,
kevman 0:38ceb79fef03 132 0x08000208, 0x00020000, 0x08000000, 0x08020208,
kevman 0:38ceb79fef03 133 0x00000008, 0x00020208, 0x00020200, 0x08000008,
kevman 0:38ceb79fef03 134 0x08020000, 0x08000208, 0x00000208, 0x08020000,
kevman 0:38ceb79fef03 135 0x00020208, 0x00000008, 0x08020008, 0x00020200
kevman 0:38ceb79fef03 136 };
kevman 0:38ceb79fef03 137
kevman 0:38ceb79fef03 138 static const uint32_t SB4[64] =
kevman 0:38ceb79fef03 139 {
kevman 0:38ceb79fef03 140 0x00802001, 0x00002081, 0x00002081, 0x00000080,
kevman 0:38ceb79fef03 141 0x00802080, 0x00800081, 0x00800001, 0x00002001,
kevman 0:38ceb79fef03 142 0x00000000, 0x00802000, 0x00802000, 0x00802081,
kevman 0:38ceb79fef03 143 0x00000081, 0x00000000, 0x00800080, 0x00800001,
kevman 0:38ceb79fef03 144 0x00000001, 0x00002000, 0x00800000, 0x00802001,
kevman 0:38ceb79fef03 145 0x00000080, 0x00800000, 0x00002001, 0x00002080,
kevman 0:38ceb79fef03 146 0x00800081, 0x00000001, 0x00002080, 0x00800080,
kevman 0:38ceb79fef03 147 0x00002000, 0x00802080, 0x00802081, 0x00000081,
kevman 0:38ceb79fef03 148 0x00800080, 0x00800001, 0x00802000, 0x00802081,
kevman 0:38ceb79fef03 149 0x00000081, 0x00000000, 0x00000000, 0x00802000,
kevman 0:38ceb79fef03 150 0x00002080, 0x00800080, 0x00800081, 0x00000001,
kevman 0:38ceb79fef03 151 0x00802001, 0x00002081, 0x00002081, 0x00000080,
kevman 0:38ceb79fef03 152 0x00802081, 0x00000081, 0x00000001, 0x00002000,
kevman 0:38ceb79fef03 153 0x00800001, 0x00002001, 0x00802080, 0x00800081,
kevman 0:38ceb79fef03 154 0x00002001, 0x00002080, 0x00800000, 0x00802001,
kevman 0:38ceb79fef03 155 0x00000080, 0x00800000, 0x00002000, 0x00802080
kevman 0:38ceb79fef03 156 };
kevman 0:38ceb79fef03 157
kevman 0:38ceb79fef03 158 static const uint32_t SB5[64] =
kevman 0:38ceb79fef03 159 {
kevman 0:38ceb79fef03 160 0x00000100, 0x02080100, 0x02080000, 0x42000100,
kevman 0:38ceb79fef03 161 0x00080000, 0x00000100, 0x40000000, 0x02080000,
kevman 0:38ceb79fef03 162 0x40080100, 0x00080000, 0x02000100, 0x40080100,
kevman 0:38ceb79fef03 163 0x42000100, 0x42080000, 0x00080100, 0x40000000,
kevman 0:38ceb79fef03 164 0x02000000, 0x40080000, 0x40080000, 0x00000000,
kevman 0:38ceb79fef03 165 0x40000100, 0x42080100, 0x42080100, 0x02000100,
kevman 0:38ceb79fef03 166 0x42080000, 0x40000100, 0x00000000, 0x42000000,
kevman 0:38ceb79fef03 167 0x02080100, 0x02000000, 0x42000000, 0x00080100,
kevman 0:38ceb79fef03 168 0x00080000, 0x42000100, 0x00000100, 0x02000000,
kevman 0:38ceb79fef03 169 0x40000000, 0x02080000, 0x42000100, 0x40080100,
kevman 0:38ceb79fef03 170 0x02000100, 0x40000000, 0x42080000, 0x02080100,
kevman 0:38ceb79fef03 171 0x40080100, 0x00000100, 0x02000000, 0x42080000,
kevman 0:38ceb79fef03 172 0x42080100, 0x00080100, 0x42000000, 0x42080100,
kevman 0:38ceb79fef03 173 0x02080000, 0x00000000, 0x40080000, 0x42000000,
kevman 0:38ceb79fef03 174 0x00080100, 0x02000100, 0x40000100, 0x00080000,
kevman 0:38ceb79fef03 175 0x00000000, 0x40080000, 0x02080100, 0x40000100
kevman 0:38ceb79fef03 176 };
kevman 0:38ceb79fef03 177
kevman 0:38ceb79fef03 178 static const uint32_t SB6[64] =
kevman 0:38ceb79fef03 179 {
kevman 0:38ceb79fef03 180 0x20000010, 0x20400000, 0x00004000, 0x20404010,
kevman 0:38ceb79fef03 181 0x20400000, 0x00000010, 0x20404010, 0x00400000,
kevman 0:38ceb79fef03 182 0x20004000, 0x00404010, 0x00400000, 0x20000010,
kevman 0:38ceb79fef03 183 0x00400010, 0x20004000, 0x20000000, 0x00004010,
kevman 0:38ceb79fef03 184 0x00000000, 0x00400010, 0x20004010, 0x00004000,
kevman 0:38ceb79fef03 185 0x00404000, 0x20004010, 0x00000010, 0x20400010,
kevman 0:38ceb79fef03 186 0x20400010, 0x00000000, 0x00404010, 0x20404000,
kevman 0:38ceb79fef03 187 0x00004010, 0x00404000, 0x20404000, 0x20000000,
kevman 0:38ceb79fef03 188 0x20004000, 0x00000010, 0x20400010, 0x00404000,
kevman 0:38ceb79fef03 189 0x20404010, 0x00400000, 0x00004010, 0x20000010,
kevman 0:38ceb79fef03 190 0x00400000, 0x20004000, 0x20000000, 0x00004010,
kevman 0:38ceb79fef03 191 0x20000010, 0x20404010, 0x00404000, 0x20400000,
kevman 0:38ceb79fef03 192 0x00404010, 0x20404000, 0x00000000, 0x20400010,
kevman 0:38ceb79fef03 193 0x00000010, 0x00004000, 0x20400000, 0x00404010,
kevman 0:38ceb79fef03 194 0x00004000, 0x00400010, 0x20004010, 0x00000000,
kevman 0:38ceb79fef03 195 0x20404000, 0x20000000, 0x00400010, 0x20004010
kevman 0:38ceb79fef03 196 };
kevman 0:38ceb79fef03 197
kevman 0:38ceb79fef03 198 static const uint32_t SB7[64] =
kevman 0:38ceb79fef03 199 {
kevman 0:38ceb79fef03 200 0x00200000, 0x04200002, 0x04000802, 0x00000000,
kevman 0:38ceb79fef03 201 0x00000800, 0x04000802, 0x00200802, 0x04200800,
kevman 0:38ceb79fef03 202 0x04200802, 0x00200000, 0x00000000, 0x04000002,
kevman 0:38ceb79fef03 203 0x00000002, 0x04000000, 0x04200002, 0x00000802,
kevman 0:38ceb79fef03 204 0x04000800, 0x00200802, 0x00200002, 0x04000800,
kevman 0:38ceb79fef03 205 0x04000002, 0x04200000, 0x04200800, 0x00200002,
kevman 0:38ceb79fef03 206 0x04200000, 0x00000800, 0x00000802, 0x04200802,
kevman 0:38ceb79fef03 207 0x00200800, 0x00000002, 0x04000000, 0x00200800,
kevman 0:38ceb79fef03 208 0x04000000, 0x00200800, 0x00200000, 0x04000802,
kevman 0:38ceb79fef03 209 0x04000802, 0x04200002, 0x04200002, 0x00000002,
kevman 0:38ceb79fef03 210 0x00200002, 0x04000000, 0x04000800, 0x00200000,
kevman 0:38ceb79fef03 211 0x04200800, 0x00000802, 0x00200802, 0x04200800,
kevman 0:38ceb79fef03 212 0x00000802, 0x04000002, 0x04200802, 0x04200000,
kevman 0:38ceb79fef03 213 0x00200800, 0x00000000, 0x00000002, 0x04200802,
kevman 0:38ceb79fef03 214 0x00000000, 0x00200802, 0x04200000, 0x00000800,
kevman 0:38ceb79fef03 215 0x04000002, 0x04000800, 0x00000800, 0x00200002
kevman 0:38ceb79fef03 216 };
kevman 0:38ceb79fef03 217
kevman 0:38ceb79fef03 218 static const uint32_t SB8[64] =
kevman 0:38ceb79fef03 219 {
kevman 0:38ceb79fef03 220 0x10001040, 0x00001000, 0x00040000, 0x10041040,
kevman 0:38ceb79fef03 221 0x10000000, 0x10001040, 0x00000040, 0x10000000,
kevman 0:38ceb79fef03 222 0x00040040, 0x10040000, 0x10041040, 0x00041000,
kevman 0:38ceb79fef03 223 0x10041000, 0x00041040, 0x00001000, 0x00000040,
kevman 0:38ceb79fef03 224 0x10040000, 0x10000040, 0x10001000, 0x00001040,
kevman 0:38ceb79fef03 225 0x00041000, 0x00040040, 0x10040040, 0x10041000,
kevman 0:38ceb79fef03 226 0x00001040, 0x00000000, 0x00000000, 0x10040040,
kevman 0:38ceb79fef03 227 0x10000040, 0x10001000, 0x00041040, 0x00040000,
kevman 0:38ceb79fef03 228 0x00041040, 0x00040000, 0x10041000, 0x00001000,
kevman 0:38ceb79fef03 229 0x00000040, 0x10040040, 0x00001000, 0x00041040,
kevman 0:38ceb79fef03 230 0x10001000, 0x00000040, 0x10000040, 0x10040000,
kevman 0:38ceb79fef03 231 0x10040040, 0x10000000, 0x00040000, 0x10001040,
kevman 0:38ceb79fef03 232 0x00000000, 0x10041040, 0x00040040, 0x10000040,
kevman 0:38ceb79fef03 233 0x10040000, 0x10001000, 0x10001040, 0x00000000,
kevman 0:38ceb79fef03 234 0x10041040, 0x00041000, 0x00041000, 0x00001040,
kevman 0:38ceb79fef03 235 0x00001040, 0x00040040, 0x10000000, 0x10041000
kevman 0:38ceb79fef03 236 };
kevman 0:38ceb79fef03 237
kevman 0:38ceb79fef03 238 /*
kevman 0:38ceb79fef03 239 * PC1: left and right halves bit-swap
kevman 0:38ceb79fef03 240 */
kevman 0:38ceb79fef03 241 static const uint32_t LHs[16] =
kevman 0:38ceb79fef03 242 {
kevman 0:38ceb79fef03 243 0x00000000, 0x00000001, 0x00000100, 0x00000101,
kevman 0:38ceb79fef03 244 0x00010000, 0x00010001, 0x00010100, 0x00010101,
kevman 0:38ceb79fef03 245 0x01000000, 0x01000001, 0x01000100, 0x01000101,
kevman 0:38ceb79fef03 246 0x01010000, 0x01010001, 0x01010100, 0x01010101
kevman 0:38ceb79fef03 247 };
kevman 0:38ceb79fef03 248
kevman 0:38ceb79fef03 249 static const uint32_t RHs[16] =
kevman 0:38ceb79fef03 250 {
kevman 0:38ceb79fef03 251 0x00000000, 0x01000000, 0x00010000, 0x01010000,
kevman 0:38ceb79fef03 252 0x00000100, 0x01000100, 0x00010100, 0x01010100,
kevman 0:38ceb79fef03 253 0x00000001, 0x01000001, 0x00010001, 0x01010001,
kevman 0:38ceb79fef03 254 0x00000101, 0x01000101, 0x00010101, 0x01010101,
kevman 0:38ceb79fef03 255 };
kevman 0:38ceb79fef03 256
kevman 0:38ceb79fef03 257 /*
kevman 0:38ceb79fef03 258 * Initial Permutation macro
kevman 0:38ceb79fef03 259 */
kevman 0:38ceb79fef03 260 #define DES_IP(X,Y) \
kevman 0:38ceb79fef03 261 { \
kevman 0:38ceb79fef03 262 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
kevman 0:38ceb79fef03 263 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
kevman 0:38ceb79fef03 264 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
kevman 0:38ceb79fef03 265 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
kevman 0:38ceb79fef03 266 Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \
kevman 0:38ceb79fef03 267 T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \
kevman 0:38ceb79fef03 268 X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \
kevman 0:38ceb79fef03 269 }
kevman 0:38ceb79fef03 270
kevman 0:38ceb79fef03 271 /*
kevman 0:38ceb79fef03 272 * Final Permutation macro
kevman 0:38ceb79fef03 273 */
kevman 0:38ceb79fef03 274 #define DES_FP(X,Y) \
kevman 0:38ceb79fef03 275 { \
kevman 0:38ceb79fef03 276 X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \
kevman 0:38ceb79fef03 277 T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \
kevman 0:38ceb79fef03 278 Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \
kevman 0:38ceb79fef03 279 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
kevman 0:38ceb79fef03 280 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
kevman 0:38ceb79fef03 281 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
kevman 0:38ceb79fef03 282 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
kevman 0:38ceb79fef03 283 }
kevman 0:38ceb79fef03 284
kevman 0:38ceb79fef03 285 /*
kevman 0:38ceb79fef03 286 * DES round macro
kevman 0:38ceb79fef03 287 */
kevman 0:38ceb79fef03 288 #define DES_ROUND(X,Y) \
kevman 0:38ceb79fef03 289 { \
kevman 0:38ceb79fef03 290 T = *SK++ ^ X; \
kevman 0:38ceb79fef03 291 Y ^= SB8[ (T ) & 0x3F ] ^ \
kevman 0:38ceb79fef03 292 SB6[ (T >> 8) & 0x3F ] ^ \
kevman 0:38ceb79fef03 293 SB4[ (T >> 16) & 0x3F ] ^ \
kevman 0:38ceb79fef03 294 SB2[ (T >> 24) & 0x3F ]; \
kevman 0:38ceb79fef03 295 \
kevman 0:38ceb79fef03 296 T = *SK++ ^ ((X << 28) | (X >> 4)); \
kevman 0:38ceb79fef03 297 Y ^= SB7[ (T ) & 0x3F ] ^ \
kevman 0:38ceb79fef03 298 SB5[ (T >> 8) & 0x3F ] ^ \
kevman 0:38ceb79fef03 299 SB3[ (T >> 16) & 0x3F ] ^ \
kevman 0:38ceb79fef03 300 SB1[ (T >> 24) & 0x3F ]; \
kevman 0:38ceb79fef03 301 }
kevman 0:38ceb79fef03 302
kevman 0:38ceb79fef03 303 #define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; }
kevman 0:38ceb79fef03 304
kevman 0:38ceb79fef03 305 void mbedtls_des_init( mbedtls_des_context *ctx )
kevman 0:38ceb79fef03 306 {
kevman 0:38ceb79fef03 307 memset( ctx, 0, sizeof( mbedtls_des_context ) );
kevman 0:38ceb79fef03 308 }
kevman 0:38ceb79fef03 309
kevman 0:38ceb79fef03 310 void mbedtls_des_free( mbedtls_des_context *ctx )
kevman 0:38ceb79fef03 311 {
kevman 0:38ceb79fef03 312 if( ctx == NULL )
kevman 0:38ceb79fef03 313 return;
kevman 0:38ceb79fef03 314
kevman 0:38ceb79fef03 315 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_des_context ) );
kevman 0:38ceb79fef03 316 }
kevman 0:38ceb79fef03 317
kevman 0:38ceb79fef03 318 void mbedtls_des3_init( mbedtls_des3_context *ctx )
kevman 0:38ceb79fef03 319 {
kevman 0:38ceb79fef03 320 memset( ctx, 0, sizeof( mbedtls_des3_context ) );
kevman 0:38ceb79fef03 321 }
kevman 0:38ceb79fef03 322
kevman 0:38ceb79fef03 323 void mbedtls_des3_free( mbedtls_des3_context *ctx )
kevman 0:38ceb79fef03 324 {
kevman 0:38ceb79fef03 325 if( ctx == NULL )
kevman 0:38ceb79fef03 326 return;
kevman 0:38ceb79fef03 327
kevman 0:38ceb79fef03 328 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_des3_context ) );
kevman 0:38ceb79fef03 329 }
kevman 0:38ceb79fef03 330
kevman 0:38ceb79fef03 331 static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8,
kevman 0:38ceb79fef03 332 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44,
kevman 0:38ceb79fef03 333 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81,
kevman 0:38ceb79fef03 334 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112,
kevman 0:38ceb79fef03 335 115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140,
kevman 0:38ceb79fef03 336 143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168,
kevman 0:38ceb79fef03 337 171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196,
kevman 0:38ceb79fef03 338 199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224,
kevman 0:38ceb79fef03 339 227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253,
kevman 0:38ceb79fef03 340 254 };
kevman 0:38ceb79fef03 341
kevman 0:38ceb79fef03 342 void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] )
kevman 0:38ceb79fef03 343 {
kevman 0:38ceb79fef03 344 int i;
kevman 0:38ceb79fef03 345
kevman 0:38ceb79fef03 346 for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ )
kevman 0:38ceb79fef03 347 key[i] = odd_parity_table[key[i] / 2];
kevman 0:38ceb79fef03 348 }
kevman 0:38ceb79fef03 349
kevman 0:38ceb79fef03 350 /*
kevman 0:38ceb79fef03 351 * Check the given key's parity, returns 1 on failure, 0 on SUCCESS
kevman 0:38ceb79fef03 352 */
kevman 0:38ceb79fef03 353 int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
kevman 0:38ceb79fef03 354 {
kevman 0:38ceb79fef03 355 int i;
kevman 0:38ceb79fef03 356
kevman 0:38ceb79fef03 357 for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ )
kevman 0:38ceb79fef03 358 if( key[i] != odd_parity_table[key[i] / 2] )
kevman 0:38ceb79fef03 359 return( 1 );
kevman 0:38ceb79fef03 360
kevman 0:38ceb79fef03 361 return( 0 );
kevman 0:38ceb79fef03 362 }
kevman 0:38ceb79fef03 363
kevman 0:38ceb79fef03 364 /*
kevman 0:38ceb79fef03 365 * Table of weak and semi-weak keys
kevman 0:38ceb79fef03 366 *
kevman 0:38ceb79fef03 367 * Source: http://en.wikipedia.org/wiki/Weak_key
kevman 0:38ceb79fef03 368 *
kevman 0:38ceb79fef03 369 * Weak:
kevman 0:38ceb79fef03 370 * Alternating ones + zeros (0x0101010101010101)
kevman 0:38ceb79fef03 371 * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE)
kevman 0:38ceb79fef03 372 * '0xE0E0E0E0F1F1F1F1'
kevman 0:38ceb79fef03 373 * '0x1F1F1F1F0E0E0E0E'
kevman 0:38ceb79fef03 374 *
kevman 0:38ceb79fef03 375 * Semi-weak:
kevman 0:38ceb79fef03 376 * 0x011F011F010E010E and 0x1F011F010E010E01
kevman 0:38ceb79fef03 377 * 0x01E001E001F101F1 and 0xE001E001F101F101
kevman 0:38ceb79fef03 378 * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01
kevman 0:38ceb79fef03 379 * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E
kevman 0:38ceb79fef03 380 * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E
kevman 0:38ceb79fef03 381 * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1
kevman 0:38ceb79fef03 382 *
kevman 0:38ceb79fef03 383 */
kevman 0:38ceb79fef03 384
kevman 0:38ceb79fef03 385 #define WEAK_KEY_COUNT 16
kevman 0:38ceb79fef03 386
kevman 0:38ceb79fef03 387 static const unsigned char weak_key_table[WEAK_KEY_COUNT][MBEDTLS_DES_KEY_SIZE] =
kevman 0:38ceb79fef03 388 {
kevman 0:38ceb79fef03 389 { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
kevman 0:38ceb79fef03 390 { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
kevman 0:38ceb79fef03 391 { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
kevman 0:38ceb79fef03 392 { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 },
kevman 0:38ceb79fef03 393
kevman 0:38ceb79fef03 394 { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E },
kevman 0:38ceb79fef03 395 { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 },
kevman 0:38ceb79fef03 396 { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 },
kevman 0:38ceb79fef03 397 { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 },
kevman 0:38ceb79fef03 398 { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE },
kevman 0:38ceb79fef03 399 { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 },
kevman 0:38ceb79fef03 400 { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 },
kevman 0:38ceb79fef03 401 { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E },
kevman 0:38ceb79fef03 402 { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },
kevman 0:38ceb79fef03 403 { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E },
kevman 0:38ceb79fef03 404 { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
kevman 0:38ceb79fef03 405 { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 }
kevman 0:38ceb79fef03 406 };
kevman 0:38ceb79fef03 407
kevman 0:38ceb79fef03 408 int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
kevman 0:38ceb79fef03 409 {
kevman 0:38ceb79fef03 410 int i;
kevman 0:38ceb79fef03 411
kevman 0:38ceb79fef03 412 for( i = 0; i < WEAK_KEY_COUNT; i++ )
kevman 0:38ceb79fef03 413 if( memcmp( weak_key_table[i], key, MBEDTLS_DES_KEY_SIZE) == 0 )
kevman 0:38ceb79fef03 414 return( 1 );
kevman 0:38ceb79fef03 415
kevman 0:38ceb79fef03 416 return( 0 );
kevman 0:38ceb79fef03 417 }
kevman 0:38ceb79fef03 418
kevman 0:38ceb79fef03 419 #if !defined(MBEDTLS_DES_SETKEY_ALT)
kevman 0:38ceb79fef03 420 void mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
kevman 0:38ceb79fef03 421 {
kevman 0:38ceb79fef03 422 int i;
kevman 0:38ceb79fef03 423 uint32_t X, Y, T;
kevman 0:38ceb79fef03 424
kevman 0:38ceb79fef03 425 GET_UINT32_BE( X, key, 0 );
kevman 0:38ceb79fef03 426 GET_UINT32_BE( Y, key, 4 );
kevman 0:38ceb79fef03 427
kevman 0:38ceb79fef03 428 /*
kevman 0:38ceb79fef03 429 * Permuted Choice 1
kevman 0:38ceb79fef03 430 */
kevman 0:38ceb79fef03 431 T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4);
kevman 0:38ceb79fef03 432 T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T );
kevman 0:38ceb79fef03 433
kevman 0:38ceb79fef03 434 X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2)
kevman 0:38ceb79fef03 435 | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] )
kevman 0:38ceb79fef03 436 | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)
kevman 0:38ceb79fef03 437 | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);
kevman 0:38ceb79fef03 438
kevman 0:38ceb79fef03 439 Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2)
kevman 0:38ceb79fef03 440 | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] )
kevman 0:38ceb79fef03 441 | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)
kevman 0:38ceb79fef03 442 | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);
kevman 0:38ceb79fef03 443
kevman 0:38ceb79fef03 444 X &= 0x0FFFFFFF;
kevman 0:38ceb79fef03 445 Y &= 0x0FFFFFFF;
kevman 0:38ceb79fef03 446
kevman 0:38ceb79fef03 447 /*
kevman 0:38ceb79fef03 448 * calculate subkeys
kevman 0:38ceb79fef03 449 */
kevman 0:38ceb79fef03 450 for( i = 0; i < 16; i++ )
kevman 0:38ceb79fef03 451 {
kevman 0:38ceb79fef03 452 if( i < 2 || i == 8 || i == 15 )
kevman 0:38ceb79fef03 453 {
kevman 0:38ceb79fef03 454 X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF;
kevman 0:38ceb79fef03 455 Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF;
kevman 0:38ceb79fef03 456 }
kevman 0:38ceb79fef03 457 else
kevman 0:38ceb79fef03 458 {
kevman 0:38ceb79fef03 459 X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF;
kevman 0:38ceb79fef03 460 Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF;
kevman 0:38ceb79fef03 461 }
kevman 0:38ceb79fef03 462
kevman 0:38ceb79fef03 463 *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000)
kevman 0:38ceb79fef03 464 | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)
kevman 0:38ceb79fef03 465 | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000)
kevman 0:38ceb79fef03 466 | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000)
kevman 0:38ceb79fef03 467 | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000)
kevman 0:38ceb79fef03 468 | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000)
kevman 0:38ceb79fef03 469 | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400)
kevman 0:38ceb79fef03 470 | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100)
kevman 0:38ceb79fef03 471 | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010)
kevman 0:38ceb79fef03 472 | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004)
kevman 0:38ceb79fef03 473 | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);
kevman 0:38ceb79fef03 474
kevman 0:38ceb79fef03 475 *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)
kevman 0:38ceb79fef03 476 | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)
kevman 0:38ceb79fef03 477 | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000)
kevman 0:38ceb79fef03 478 | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)
kevman 0:38ceb79fef03 479 | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000)
kevman 0:38ceb79fef03 480 | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000)
kevman 0:38ceb79fef03 481 | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000)
kevman 0:38ceb79fef03 482 | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400)
kevman 0:38ceb79fef03 483 | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100)
kevman 0:38ceb79fef03 484 | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011)
kevman 0:38ceb79fef03 485 | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002);
kevman 0:38ceb79fef03 486 }
kevman 0:38ceb79fef03 487 }
kevman 0:38ceb79fef03 488 #endif /* !MBEDTLS_DES_SETKEY_ALT */
kevman 0:38ceb79fef03 489
kevman 0:38ceb79fef03 490 /*
kevman 0:38ceb79fef03 491 * DES key schedule (56-bit, encryption)
kevman 0:38ceb79fef03 492 */
kevman 0:38ceb79fef03 493 int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
kevman 0:38ceb79fef03 494 {
kevman 0:38ceb79fef03 495 mbedtls_des_setkey( ctx->sk, key );
kevman 0:38ceb79fef03 496
kevman 0:38ceb79fef03 497 return( 0 );
kevman 0:38ceb79fef03 498 }
kevman 0:38ceb79fef03 499
kevman 0:38ceb79fef03 500 /*
kevman 0:38ceb79fef03 501 * DES key schedule (56-bit, decryption)
kevman 0:38ceb79fef03 502 */
kevman 0:38ceb79fef03 503 int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
kevman 0:38ceb79fef03 504 {
kevman 0:38ceb79fef03 505 int i;
kevman 0:38ceb79fef03 506
kevman 0:38ceb79fef03 507 mbedtls_des_setkey( ctx->sk, key );
kevman 0:38ceb79fef03 508
kevman 0:38ceb79fef03 509 for( i = 0; i < 16; i += 2 )
kevman 0:38ceb79fef03 510 {
kevman 0:38ceb79fef03 511 SWAP( ctx->sk[i ], ctx->sk[30 - i] );
kevman 0:38ceb79fef03 512 SWAP( ctx->sk[i + 1], ctx->sk[31 - i] );
kevman 0:38ceb79fef03 513 }
kevman 0:38ceb79fef03 514
kevman 0:38ceb79fef03 515 return( 0 );
kevman 0:38ceb79fef03 516 }
kevman 0:38ceb79fef03 517
kevman 0:38ceb79fef03 518 static void des3_set2key( uint32_t esk[96],
kevman 0:38ceb79fef03 519 uint32_t dsk[96],
kevman 0:38ceb79fef03 520 const unsigned char key[MBEDTLS_DES_KEY_SIZE*2] )
kevman 0:38ceb79fef03 521 {
kevman 0:38ceb79fef03 522 int i;
kevman 0:38ceb79fef03 523
kevman 0:38ceb79fef03 524 mbedtls_des_setkey( esk, key );
kevman 0:38ceb79fef03 525 mbedtls_des_setkey( dsk + 32, key + 8 );
kevman 0:38ceb79fef03 526
kevman 0:38ceb79fef03 527 for( i = 0; i < 32; i += 2 )
kevman 0:38ceb79fef03 528 {
kevman 0:38ceb79fef03 529 dsk[i ] = esk[30 - i];
kevman 0:38ceb79fef03 530 dsk[i + 1] = esk[31 - i];
kevman 0:38ceb79fef03 531
kevman 0:38ceb79fef03 532 esk[i + 32] = dsk[62 - i];
kevman 0:38ceb79fef03 533 esk[i + 33] = dsk[63 - i];
kevman 0:38ceb79fef03 534
kevman 0:38ceb79fef03 535 esk[i + 64] = esk[i ];
kevman 0:38ceb79fef03 536 esk[i + 65] = esk[i + 1];
kevman 0:38ceb79fef03 537
kevman 0:38ceb79fef03 538 dsk[i + 64] = dsk[i ];
kevman 0:38ceb79fef03 539 dsk[i + 65] = dsk[i + 1];
kevman 0:38ceb79fef03 540 }
kevman 0:38ceb79fef03 541 }
kevman 0:38ceb79fef03 542
kevman 0:38ceb79fef03 543 /*
kevman 0:38ceb79fef03 544 * Triple-DES key schedule (112-bit, encryption)
kevman 0:38ceb79fef03 545 */
kevman 0:38ceb79fef03 546 int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx,
kevman 0:38ceb79fef03 547 const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] )
kevman 0:38ceb79fef03 548 {
kevman 0:38ceb79fef03 549 uint32_t sk[96];
kevman 0:38ceb79fef03 550
kevman 0:38ceb79fef03 551 des3_set2key( ctx->sk, sk, key );
kevman 0:38ceb79fef03 552 mbedtls_platform_zeroize( sk, sizeof( sk ) );
kevman 0:38ceb79fef03 553
kevman 0:38ceb79fef03 554 return( 0 );
kevman 0:38ceb79fef03 555 }
kevman 0:38ceb79fef03 556
kevman 0:38ceb79fef03 557 /*
kevman 0:38ceb79fef03 558 * Triple-DES key schedule (112-bit, decryption)
kevman 0:38ceb79fef03 559 */
kevman 0:38ceb79fef03 560 int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx,
kevman 0:38ceb79fef03 561 const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] )
kevman 0:38ceb79fef03 562 {
kevman 0:38ceb79fef03 563 uint32_t sk[96];
kevman 0:38ceb79fef03 564
kevman 0:38ceb79fef03 565 des3_set2key( sk, ctx->sk, key );
kevman 0:38ceb79fef03 566 mbedtls_platform_zeroize( sk, sizeof( sk ) );
kevman 0:38ceb79fef03 567
kevman 0:38ceb79fef03 568 return( 0 );
kevman 0:38ceb79fef03 569 }
kevman 0:38ceb79fef03 570
kevman 0:38ceb79fef03 571 static void des3_set3key( uint32_t esk[96],
kevman 0:38ceb79fef03 572 uint32_t dsk[96],
kevman 0:38ceb79fef03 573 const unsigned char key[24] )
kevman 0:38ceb79fef03 574 {
kevman 0:38ceb79fef03 575 int i;
kevman 0:38ceb79fef03 576
kevman 0:38ceb79fef03 577 mbedtls_des_setkey( esk, key );
kevman 0:38ceb79fef03 578 mbedtls_des_setkey( dsk + 32, key + 8 );
kevman 0:38ceb79fef03 579 mbedtls_des_setkey( esk + 64, key + 16 );
kevman 0:38ceb79fef03 580
kevman 0:38ceb79fef03 581 for( i = 0; i < 32; i += 2 )
kevman 0:38ceb79fef03 582 {
kevman 0:38ceb79fef03 583 dsk[i ] = esk[94 - i];
kevman 0:38ceb79fef03 584 dsk[i + 1] = esk[95 - i];
kevman 0:38ceb79fef03 585
kevman 0:38ceb79fef03 586 esk[i + 32] = dsk[62 - i];
kevman 0:38ceb79fef03 587 esk[i + 33] = dsk[63 - i];
kevman 0:38ceb79fef03 588
kevman 0:38ceb79fef03 589 dsk[i + 64] = esk[30 - i];
kevman 0:38ceb79fef03 590 dsk[i + 65] = esk[31 - i];
kevman 0:38ceb79fef03 591 }
kevman 0:38ceb79fef03 592 }
kevman 0:38ceb79fef03 593
kevman 0:38ceb79fef03 594 /*
kevman 0:38ceb79fef03 595 * Triple-DES key schedule (168-bit, encryption)
kevman 0:38ceb79fef03 596 */
kevman 0:38ceb79fef03 597 int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx,
kevman 0:38ceb79fef03 598 const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] )
kevman 0:38ceb79fef03 599 {
kevman 0:38ceb79fef03 600 uint32_t sk[96];
kevman 0:38ceb79fef03 601
kevman 0:38ceb79fef03 602 des3_set3key( ctx->sk, sk, key );
kevman 0:38ceb79fef03 603 mbedtls_platform_zeroize( sk, sizeof( sk ) );
kevman 0:38ceb79fef03 604
kevman 0:38ceb79fef03 605 return( 0 );
kevman 0:38ceb79fef03 606 }
kevman 0:38ceb79fef03 607
kevman 0:38ceb79fef03 608 /*
kevman 0:38ceb79fef03 609 * Triple-DES key schedule (168-bit, decryption)
kevman 0:38ceb79fef03 610 */
kevman 0:38ceb79fef03 611 int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx,
kevman 0:38ceb79fef03 612 const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] )
kevman 0:38ceb79fef03 613 {
kevman 0:38ceb79fef03 614 uint32_t sk[96];
kevman 0:38ceb79fef03 615
kevman 0:38ceb79fef03 616 des3_set3key( sk, ctx->sk, key );
kevman 0:38ceb79fef03 617 mbedtls_platform_zeroize( sk, sizeof( sk ) );
kevman 0:38ceb79fef03 618
kevman 0:38ceb79fef03 619 return( 0 );
kevman 0:38ceb79fef03 620 }
kevman 0:38ceb79fef03 621
kevman 0:38ceb79fef03 622 /*
kevman 0:38ceb79fef03 623 * DES-ECB block encryption/decryption
kevman 0:38ceb79fef03 624 */
kevman 0:38ceb79fef03 625 #if !defined(MBEDTLS_DES_CRYPT_ECB_ALT)
kevman 0:38ceb79fef03 626 int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx,
kevman 0:38ceb79fef03 627 const unsigned char input[8],
kevman 0:38ceb79fef03 628 unsigned char output[8] )
kevman 0:38ceb79fef03 629 {
kevman 0:38ceb79fef03 630 int i;
kevman 0:38ceb79fef03 631 uint32_t X, Y, T, *SK;
kevman 0:38ceb79fef03 632
kevman 0:38ceb79fef03 633 SK = ctx->sk;
kevman 0:38ceb79fef03 634
kevman 0:38ceb79fef03 635 GET_UINT32_BE( X, input, 0 );
kevman 0:38ceb79fef03 636 GET_UINT32_BE( Y, input, 4 );
kevman 0:38ceb79fef03 637
kevman 0:38ceb79fef03 638 DES_IP( X, Y );
kevman 0:38ceb79fef03 639
kevman 0:38ceb79fef03 640 for( i = 0; i < 8; i++ )
kevman 0:38ceb79fef03 641 {
kevman 0:38ceb79fef03 642 DES_ROUND( Y, X );
kevman 0:38ceb79fef03 643 DES_ROUND( X, Y );
kevman 0:38ceb79fef03 644 }
kevman 0:38ceb79fef03 645
kevman 0:38ceb79fef03 646 DES_FP( Y, X );
kevman 0:38ceb79fef03 647
kevman 0:38ceb79fef03 648 PUT_UINT32_BE( Y, output, 0 );
kevman 0:38ceb79fef03 649 PUT_UINT32_BE( X, output, 4 );
kevman 0:38ceb79fef03 650
kevman 0:38ceb79fef03 651 return( 0 );
kevman 0:38ceb79fef03 652 }
kevman 0:38ceb79fef03 653 #endif /* !MBEDTLS_DES_CRYPT_ECB_ALT */
kevman 0:38ceb79fef03 654
kevman 0:38ceb79fef03 655 #if defined(MBEDTLS_CIPHER_MODE_CBC)
kevman 0:38ceb79fef03 656 /*
kevman 0:38ceb79fef03 657 * DES-CBC buffer encryption/decryption
kevman 0:38ceb79fef03 658 */
kevman 0:38ceb79fef03 659 int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx,
kevman 0:38ceb79fef03 660 int mode,
kevman 0:38ceb79fef03 661 size_t length,
kevman 0:38ceb79fef03 662 unsigned char iv[8],
kevman 0:38ceb79fef03 663 const unsigned char *input,
kevman 0:38ceb79fef03 664 unsigned char *output )
kevman 0:38ceb79fef03 665 {
kevman 0:38ceb79fef03 666 int i;
kevman 0:38ceb79fef03 667 unsigned char temp[8];
kevman 0:38ceb79fef03 668
kevman 0:38ceb79fef03 669 if( length % 8 )
kevman 0:38ceb79fef03 670 return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH );
kevman 0:38ceb79fef03 671
kevman 0:38ceb79fef03 672 if( mode == MBEDTLS_DES_ENCRYPT )
kevman 0:38ceb79fef03 673 {
kevman 0:38ceb79fef03 674 while( length > 0 )
kevman 0:38ceb79fef03 675 {
kevman 0:38ceb79fef03 676 for( i = 0; i < 8; i++ )
kevman 0:38ceb79fef03 677 output[i] = (unsigned char)( input[i] ^ iv[i] );
kevman 0:38ceb79fef03 678
kevman 0:38ceb79fef03 679 mbedtls_des_crypt_ecb( ctx, output, output );
kevman 0:38ceb79fef03 680 memcpy( iv, output, 8 );
kevman 0:38ceb79fef03 681
kevman 0:38ceb79fef03 682 input += 8;
kevman 0:38ceb79fef03 683 output += 8;
kevman 0:38ceb79fef03 684 length -= 8;
kevman 0:38ceb79fef03 685 }
kevman 0:38ceb79fef03 686 }
kevman 0:38ceb79fef03 687 else /* MBEDTLS_DES_DECRYPT */
kevman 0:38ceb79fef03 688 {
kevman 0:38ceb79fef03 689 while( length > 0 )
kevman 0:38ceb79fef03 690 {
kevman 0:38ceb79fef03 691 memcpy( temp, input, 8 );
kevman 0:38ceb79fef03 692 mbedtls_des_crypt_ecb( ctx, input, output );
kevman 0:38ceb79fef03 693
kevman 0:38ceb79fef03 694 for( i = 0; i < 8; i++ )
kevman 0:38ceb79fef03 695 output[i] = (unsigned char)( output[i] ^ iv[i] );
kevman 0:38ceb79fef03 696
kevman 0:38ceb79fef03 697 memcpy( iv, temp, 8 );
kevman 0:38ceb79fef03 698
kevman 0:38ceb79fef03 699 input += 8;
kevman 0:38ceb79fef03 700 output += 8;
kevman 0:38ceb79fef03 701 length -= 8;
kevman 0:38ceb79fef03 702 }
kevman 0:38ceb79fef03 703 }
kevman 0:38ceb79fef03 704
kevman 0:38ceb79fef03 705 return( 0 );
kevman 0:38ceb79fef03 706 }
kevman 0:38ceb79fef03 707 #endif /* MBEDTLS_CIPHER_MODE_CBC */
kevman 0:38ceb79fef03 708
kevman 0:38ceb79fef03 709 /*
kevman 0:38ceb79fef03 710 * 3DES-ECB block encryption/decryption
kevman 0:38ceb79fef03 711 */
kevman 0:38ceb79fef03 712 #if !defined(MBEDTLS_DES3_CRYPT_ECB_ALT)
kevman 0:38ceb79fef03 713 int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx,
kevman 0:38ceb79fef03 714 const unsigned char input[8],
kevman 0:38ceb79fef03 715 unsigned char output[8] )
kevman 0:38ceb79fef03 716 {
kevman 0:38ceb79fef03 717 int i;
kevman 0:38ceb79fef03 718 uint32_t X, Y, T, *SK;
kevman 0:38ceb79fef03 719
kevman 0:38ceb79fef03 720 SK = ctx->sk;
kevman 0:38ceb79fef03 721
kevman 0:38ceb79fef03 722 GET_UINT32_BE( X, input, 0 );
kevman 0:38ceb79fef03 723 GET_UINT32_BE( Y, input, 4 );
kevman 0:38ceb79fef03 724
kevman 0:38ceb79fef03 725 DES_IP( X, Y );
kevman 0:38ceb79fef03 726
kevman 0:38ceb79fef03 727 for( i = 0; i < 8; i++ )
kevman 0:38ceb79fef03 728 {
kevman 0:38ceb79fef03 729 DES_ROUND( Y, X );
kevman 0:38ceb79fef03 730 DES_ROUND( X, Y );
kevman 0:38ceb79fef03 731 }
kevman 0:38ceb79fef03 732
kevman 0:38ceb79fef03 733 for( i = 0; i < 8; i++ )
kevman 0:38ceb79fef03 734 {
kevman 0:38ceb79fef03 735 DES_ROUND( X, Y );
kevman 0:38ceb79fef03 736 DES_ROUND( Y, X );
kevman 0:38ceb79fef03 737 }
kevman 0:38ceb79fef03 738
kevman 0:38ceb79fef03 739 for( i = 0; i < 8; i++ )
kevman 0:38ceb79fef03 740 {
kevman 0:38ceb79fef03 741 DES_ROUND( Y, X );
kevman 0:38ceb79fef03 742 DES_ROUND( X, Y );
kevman 0:38ceb79fef03 743 }
kevman 0:38ceb79fef03 744
kevman 0:38ceb79fef03 745 DES_FP( Y, X );
kevman 0:38ceb79fef03 746
kevman 0:38ceb79fef03 747 PUT_UINT32_BE( Y, output, 0 );
kevman 0:38ceb79fef03 748 PUT_UINT32_BE( X, output, 4 );
kevman 0:38ceb79fef03 749
kevman 0:38ceb79fef03 750 return( 0 );
kevman 0:38ceb79fef03 751 }
kevman 0:38ceb79fef03 752 #endif /* !MBEDTLS_DES3_CRYPT_ECB_ALT */
kevman 0:38ceb79fef03 753
kevman 0:38ceb79fef03 754 #if defined(MBEDTLS_CIPHER_MODE_CBC)
kevman 0:38ceb79fef03 755 /*
kevman 0:38ceb79fef03 756 * 3DES-CBC buffer encryption/decryption
kevman 0:38ceb79fef03 757 */
kevman 0:38ceb79fef03 758 int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx,
kevman 0:38ceb79fef03 759 int mode,
kevman 0:38ceb79fef03 760 size_t length,
kevman 0:38ceb79fef03 761 unsigned char iv[8],
kevman 0:38ceb79fef03 762 const unsigned char *input,
kevman 0:38ceb79fef03 763 unsigned char *output )
kevman 0:38ceb79fef03 764 {
kevman 0:38ceb79fef03 765 int i;
kevman 0:38ceb79fef03 766 unsigned char temp[8];
kevman 0:38ceb79fef03 767
kevman 0:38ceb79fef03 768 if( length % 8 )
kevman 0:38ceb79fef03 769 return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH );
kevman 0:38ceb79fef03 770
kevman 0:38ceb79fef03 771 if( mode == MBEDTLS_DES_ENCRYPT )
kevman 0:38ceb79fef03 772 {
kevman 0:38ceb79fef03 773 while( length > 0 )
kevman 0:38ceb79fef03 774 {
kevman 0:38ceb79fef03 775 for( i = 0; i < 8; i++ )
kevman 0:38ceb79fef03 776 output[i] = (unsigned char)( input[i] ^ iv[i] );
kevman 0:38ceb79fef03 777
kevman 0:38ceb79fef03 778 mbedtls_des3_crypt_ecb( ctx, output, output );
kevman 0:38ceb79fef03 779 memcpy( iv, output, 8 );
kevman 0:38ceb79fef03 780
kevman 0:38ceb79fef03 781 input += 8;
kevman 0:38ceb79fef03 782 output += 8;
kevman 0:38ceb79fef03 783 length -= 8;
kevman 0:38ceb79fef03 784 }
kevman 0:38ceb79fef03 785 }
kevman 0:38ceb79fef03 786 else /* MBEDTLS_DES_DECRYPT */
kevman 0:38ceb79fef03 787 {
kevman 0:38ceb79fef03 788 while( length > 0 )
kevman 0:38ceb79fef03 789 {
kevman 0:38ceb79fef03 790 memcpy( temp, input, 8 );
kevman 0:38ceb79fef03 791 mbedtls_des3_crypt_ecb( ctx, input, output );
kevman 0:38ceb79fef03 792
kevman 0:38ceb79fef03 793 for( i = 0; i < 8; i++ )
kevman 0:38ceb79fef03 794 output[i] = (unsigned char)( output[i] ^ iv[i] );
kevman 0:38ceb79fef03 795
kevman 0:38ceb79fef03 796 memcpy( iv, temp, 8 );
kevman 0:38ceb79fef03 797
kevman 0:38ceb79fef03 798 input += 8;
kevman 0:38ceb79fef03 799 output += 8;
kevman 0:38ceb79fef03 800 length -= 8;
kevman 0:38ceb79fef03 801 }
kevman 0:38ceb79fef03 802 }
kevman 0:38ceb79fef03 803
kevman 0:38ceb79fef03 804 return( 0 );
kevman 0:38ceb79fef03 805 }
kevman 0:38ceb79fef03 806 #endif /* MBEDTLS_CIPHER_MODE_CBC */
kevman 0:38ceb79fef03 807
kevman 0:38ceb79fef03 808 #endif /* !MBEDTLS_DES_ALT */
kevman 0:38ceb79fef03 809
kevman 0:38ceb79fef03 810 #if defined(MBEDTLS_SELF_TEST)
kevman 0:38ceb79fef03 811 /*
kevman 0:38ceb79fef03 812 * DES and 3DES test vectors from:
kevman 0:38ceb79fef03 813 *
kevman 0:38ceb79fef03 814 * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip
kevman 0:38ceb79fef03 815 */
kevman 0:38ceb79fef03 816 static const unsigned char des3_test_keys[24] =
kevman 0:38ceb79fef03 817 {
kevman 0:38ceb79fef03 818 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
kevman 0:38ceb79fef03 819 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01,
kevman 0:38ceb79fef03 820 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23
kevman 0:38ceb79fef03 821 };
kevman 0:38ceb79fef03 822
kevman 0:38ceb79fef03 823 static const unsigned char des3_test_buf[8] =
kevman 0:38ceb79fef03 824 {
kevman 0:38ceb79fef03 825 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74
kevman 0:38ceb79fef03 826 };
kevman 0:38ceb79fef03 827
kevman 0:38ceb79fef03 828 static const unsigned char des3_test_ecb_dec[3][8] =
kevman 0:38ceb79fef03 829 {
kevman 0:38ceb79fef03 830 { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D },
kevman 0:38ceb79fef03 831 { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB },
kevman 0:38ceb79fef03 832 { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A }
kevman 0:38ceb79fef03 833 };
kevman 0:38ceb79fef03 834
kevman 0:38ceb79fef03 835 static const unsigned char des3_test_ecb_enc[3][8] =
kevman 0:38ceb79fef03 836 {
kevman 0:38ceb79fef03 837 { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B },
kevman 0:38ceb79fef03 838 { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 },
kevman 0:38ceb79fef03 839 { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 }
kevman 0:38ceb79fef03 840 };
kevman 0:38ceb79fef03 841
kevman 0:38ceb79fef03 842 #if defined(MBEDTLS_CIPHER_MODE_CBC)
kevman 0:38ceb79fef03 843 static const unsigned char des3_test_iv[8] =
kevman 0:38ceb79fef03 844 {
kevman 0:38ceb79fef03 845 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF,
kevman 0:38ceb79fef03 846 };
kevman 0:38ceb79fef03 847
kevman 0:38ceb79fef03 848 static const unsigned char des3_test_cbc_dec[3][8] =
kevman 0:38ceb79fef03 849 {
kevman 0:38ceb79fef03 850 { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 },
kevman 0:38ceb79fef03 851 { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 },
kevman 0:38ceb79fef03 852 { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C }
kevman 0:38ceb79fef03 853 };
kevman 0:38ceb79fef03 854
kevman 0:38ceb79fef03 855 static const unsigned char des3_test_cbc_enc[3][8] =
kevman 0:38ceb79fef03 856 {
kevman 0:38ceb79fef03 857 { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 },
kevman 0:38ceb79fef03 858 { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D },
kevman 0:38ceb79fef03 859 { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 }
kevman 0:38ceb79fef03 860 };
kevman 0:38ceb79fef03 861 #endif /* MBEDTLS_CIPHER_MODE_CBC */
kevman 0:38ceb79fef03 862
kevman 0:38ceb79fef03 863 /*
kevman 0:38ceb79fef03 864 * Checkup routine
kevman 0:38ceb79fef03 865 */
kevman 0:38ceb79fef03 866 int mbedtls_des_self_test( int verbose )
kevman 0:38ceb79fef03 867 {
kevman 0:38ceb79fef03 868 int i, j, u, v, ret = 0;
kevman 0:38ceb79fef03 869 mbedtls_des_context ctx;
kevman 0:38ceb79fef03 870 mbedtls_des3_context ctx3;
kevman 0:38ceb79fef03 871 unsigned char buf[8];
kevman 0:38ceb79fef03 872 #if defined(MBEDTLS_CIPHER_MODE_CBC)
kevman 0:38ceb79fef03 873 unsigned char prv[8];
kevman 0:38ceb79fef03 874 unsigned char iv[8];
kevman 0:38ceb79fef03 875 #endif
kevman 0:38ceb79fef03 876
kevman 0:38ceb79fef03 877 mbedtls_des_init( &ctx );
kevman 0:38ceb79fef03 878 mbedtls_des3_init( &ctx3 );
kevman 0:38ceb79fef03 879 /*
kevman 0:38ceb79fef03 880 * ECB mode
kevman 0:38ceb79fef03 881 */
kevman 0:38ceb79fef03 882 for( i = 0; i < 6; i++ )
kevman 0:38ceb79fef03 883 {
kevman 0:38ceb79fef03 884 u = i >> 1;
kevman 0:38ceb79fef03 885 v = i & 1;
kevman 0:38ceb79fef03 886
kevman 0:38ceb79fef03 887 if( verbose != 0 )
kevman 0:38ceb79fef03 888 mbedtls_printf( " DES%c-ECB-%3d (%s): ",
kevman 0:38ceb79fef03 889 ( u == 0 ) ? ' ' : '3', 56 + u * 56,
kevman 0:38ceb79fef03 890 ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" );
kevman 0:38ceb79fef03 891
kevman 0:38ceb79fef03 892 memcpy( buf, des3_test_buf, 8 );
kevman 0:38ceb79fef03 893
kevman 0:38ceb79fef03 894 switch( i )
kevman 0:38ceb79fef03 895 {
kevman 0:38ceb79fef03 896 case 0:
kevman 0:38ceb79fef03 897 mbedtls_des_setkey_dec( &ctx, des3_test_keys );
kevman 0:38ceb79fef03 898 break;
kevman 0:38ceb79fef03 899
kevman 0:38ceb79fef03 900 case 1:
kevman 0:38ceb79fef03 901 mbedtls_des_setkey_enc( &ctx, des3_test_keys );
kevman 0:38ceb79fef03 902 break;
kevman 0:38ceb79fef03 903
kevman 0:38ceb79fef03 904 case 2:
kevman 0:38ceb79fef03 905 mbedtls_des3_set2key_dec( &ctx3, des3_test_keys );
kevman 0:38ceb79fef03 906 break;
kevman 0:38ceb79fef03 907
kevman 0:38ceb79fef03 908 case 3:
kevman 0:38ceb79fef03 909 mbedtls_des3_set2key_enc( &ctx3, des3_test_keys );
kevman 0:38ceb79fef03 910 break;
kevman 0:38ceb79fef03 911
kevman 0:38ceb79fef03 912 case 4:
kevman 0:38ceb79fef03 913 mbedtls_des3_set3key_dec( &ctx3, des3_test_keys );
kevman 0:38ceb79fef03 914 break;
kevman 0:38ceb79fef03 915
kevman 0:38ceb79fef03 916 case 5:
kevman 0:38ceb79fef03 917 mbedtls_des3_set3key_enc( &ctx3, des3_test_keys );
kevman 0:38ceb79fef03 918 break;
kevman 0:38ceb79fef03 919
kevman 0:38ceb79fef03 920 default:
kevman 0:38ceb79fef03 921 return( 1 );
kevman 0:38ceb79fef03 922 }
kevman 0:38ceb79fef03 923
kevman 0:38ceb79fef03 924 for( j = 0; j < 10000; j++ )
kevman 0:38ceb79fef03 925 {
kevman 0:38ceb79fef03 926 if( u == 0 )
kevman 0:38ceb79fef03 927 mbedtls_des_crypt_ecb( &ctx, buf, buf );
kevman 0:38ceb79fef03 928 else
kevman 0:38ceb79fef03 929 mbedtls_des3_crypt_ecb( &ctx3, buf, buf );
kevman 0:38ceb79fef03 930 }
kevman 0:38ceb79fef03 931
kevman 0:38ceb79fef03 932 if( ( v == MBEDTLS_DES_DECRYPT &&
kevman 0:38ceb79fef03 933 memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) ||
kevman 0:38ceb79fef03 934 ( v != MBEDTLS_DES_DECRYPT &&
kevman 0:38ceb79fef03 935 memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) )
kevman 0:38ceb79fef03 936 {
kevman 0:38ceb79fef03 937 if( verbose != 0 )
kevman 0:38ceb79fef03 938 mbedtls_printf( "failed\n" );
kevman 0:38ceb79fef03 939
kevman 0:38ceb79fef03 940 ret = 1;
kevman 0:38ceb79fef03 941 goto exit;
kevman 0:38ceb79fef03 942 }
kevman 0:38ceb79fef03 943
kevman 0:38ceb79fef03 944 if( verbose != 0 )
kevman 0:38ceb79fef03 945 mbedtls_printf( "passed\n" );
kevman 0:38ceb79fef03 946 }
kevman 0:38ceb79fef03 947
kevman 0:38ceb79fef03 948 if( verbose != 0 )
kevman 0:38ceb79fef03 949 mbedtls_printf( "\n" );
kevman 0:38ceb79fef03 950
kevman 0:38ceb79fef03 951 #if defined(MBEDTLS_CIPHER_MODE_CBC)
kevman 0:38ceb79fef03 952 /*
kevman 0:38ceb79fef03 953 * CBC mode
kevman 0:38ceb79fef03 954 */
kevman 0:38ceb79fef03 955 for( i = 0; i < 6; i++ )
kevman 0:38ceb79fef03 956 {
kevman 0:38ceb79fef03 957 u = i >> 1;
kevman 0:38ceb79fef03 958 v = i & 1;
kevman 0:38ceb79fef03 959
kevman 0:38ceb79fef03 960 if( verbose != 0 )
kevman 0:38ceb79fef03 961 mbedtls_printf( " DES%c-CBC-%3d (%s): ",
kevman 0:38ceb79fef03 962 ( u == 0 ) ? ' ' : '3', 56 + u * 56,
kevman 0:38ceb79fef03 963 ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" );
kevman 0:38ceb79fef03 964
kevman 0:38ceb79fef03 965 memcpy( iv, des3_test_iv, 8 );
kevman 0:38ceb79fef03 966 memcpy( prv, des3_test_iv, 8 );
kevman 0:38ceb79fef03 967 memcpy( buf, des3_test_buf, 8 );
kevman 0:38ceb79fef03 968
kevman 0:38ceb79fef03 969 switch( i )
kevman 0:38ceb79fef03 970 {
kevman 0:38ceb79fef03 971 case 0:
kevman 0:38ceb79fef03 972 mbedtls_des_setkey_dec( &ctx, des3_test_keys );
kevman 0:38ceb79fef03 973 break;
kevman 0:38ceb79fef03 974
kevman 0:38ceb79fef03 975 case 1:
kevman 0:38ceb79fef03 976 mbedtls_des_setkey_enc( &ctx, des3_test_keys );
kevman 0:38ceb79fef03 977 break;
kevman 0:38ceb79fef03 978
kevman 0:38ceb79fef03 979 case 2:
kevman 0:38ceb79fef03 980 mbedtls_des3_set2key_dec( &ctx3, des3_test_keys );
kevman 0:38ceb79fef03 981 break;
kevman 0:38ceb79fef03 982
kevman 0:38ceb79fef03 983 case 3:
kevman 0:38ceb79fef03 984 mbedtls_des3_set2key_enc( &ctx3, des3_test_keys );
kevman 0:38ceb79fef03 985 break;
kevman 0:38ceb79fef03 986
kevman 0:38ceb79fef03 987 case 4:
kevman 0:38ceb79fef03 988 mbedtls_des3_set3key_dec( &ctx3, des3_test_keys );
kevman 0:38ceb79fef03 989 break;
kevman 0:38ceb79fef03 990
kevman 0:38ceb79fef03 991 case 5:
kevman 0:38ceb79fef03 992 mbedtls_des3_set3key_enc( &ctx3, des3_test_keys );
kevman 0:38ceb79fef03 993 break;
kevman 0:38ceb79fef03 994
kevman 0:38ceb79fef03 995 default:
kevman 0:38ceb79fef03 996 return( 1 );
kevman 0:38ceb79fef03 997 }
kevman 0:38ceb79fef03 998
kevman 0:38ceb79fef03 999 if( v == MBEDTLS_DES_DECRYPT )
kevman 0:38ceb79fef03 1000 {
kevman 0:38ceb79fef03 1001 for( j = 0; j < 10000; j++ )
kevman 0:38ceb79fef03 1002 {
kevman 0:38ceb79fef03 1003 if( u == 0 )
kevman 0:38ceb79fef03 1004 mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf );
kevman 0:38ceb79fef03 1005 else
kevman 0:38ceb79fef03 1006 mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );
kevman 0:38ceb79fef03 1007 }
kevman 0:38ceb79fef03 1008 }
kevman 0:38ceb79fef03 1009 else
kevman 0:38ceb79fef03 1010 {
kevman 0:38ceb79fef03 1011 for( j = 0; j < 10000; j++ )
kevman 0:38ceb79fef03 1012 {
kevman 0:38ceb79fef03 1013 unsigned char tmp[8];
kevman 0:38ceb79fef03 1014
kevman 0:38ceb79fef03 1015 if( u == 0 )
kevman 0:38ceb79fef03 1016 mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf );
kevman 0:38ceb79fef03 1017 else
kevman 0:38ceb79fef03 1018 mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );
kevman 0:38ceb79fef03 1019
kevman 0:38ceb79fef03 1020 memcpy( tmp, prv, 8 );
kevman 0:38ceb79fef03 1021 memcpy( prv, buf, 8 );
kevman 0:38ceb79fef03 1022 memcpy( buf, tmp, 8 );
kevman 0:38ceb79fef03 1023 }
kevman 0:38ceb79fef03 1024
kevman 0:38ceb79fef03 1025 memcpy( buf, prv, 8 );
kevman 0:38ceb79fef03 1026 }
kevman 0:38ceb79fef03 1027
kevman 0:38ceb79fef03 1028 if( ( v == MBEDTLS_DES_DECRYPT &&
kevman 0:38ceb79fef03 1029 memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) ||
kevman 0:38ceb79fef03 1030 ( v != MBEDTLS_DES_DECRYPT &&
kevman 0:38ceb79fef03 1031 memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) )
kevman 0:38ceb79fef03 1032 {
kevman 0:38ceb79fef03 1033 if( verbose != 0 )
kevman 0:38ceb79fef03 1034 mbedtls_printf( "failed\n" );
kevman 0:38ceb79fef03 1035
kevman 0:38ceb79fef03 1036 ret = 1;
kevman 0:38ceb79fef03 1037 goto exit;
kevman 0:38ceb79fef03 1038 }
kevman 0:38ceb79fef03 1039
kevman 0:38ceb79fef03 1040 if( verbose != 0 )
kevman 0:38ceb79fef03 1041 mbedtls_printf( "passed\n" );
kevman 0:38ceb79fef03 1042 }
kevman 0:38ceb79fef03 1043 #endif /* MBEDTLS_CIPHER_MODE_CBC */
kevman 0:38ceb79fef03 1044
kevman 0:38ceb79fef03 1045 if( verbose != 0 )
kevman 0:38ceb79fef03 1046 mbedtls_printf( "\n" );
kevman 0:38ceb79fef03 1047
kevman 0:38ceb79fef03 1048 exit:
kevman 0:38ceb79fef03 1049 mbedtls_des_free( &ctx );
kevman 0:38ceb79fef03 1050 mbedtls_des3_free( &ctx3 );
kevman 0:38ceb79fef03 1051
kevman 0:38ceb79fef03 1052 return( ret );
kevman 0:38ceb79fef03 1053 }
kevman 0:38ceb79fef03 1054
kevman 0:38ceb79fef03 1055 #endif /* MBEDTLS_SELF_TEST */
kevman 0:38ceb79fef03 1056
kevman 0:38ceb79fef03 1057 #endif /* MBEDTLS_DES_C */