cmll_cbc.c (162911) | cmll_cbc.c (167612) |
---|---|
1/* crypto/camellia/camellia_cbc.c -*- mode:C; c-file-style: "eay" -*- */ 2/* ==================================================================== 3 * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * --- 53 unchanged lines hidden (view full) --- 62#include "cmll_locl.h" 63 64void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out, 65 const unsigned long length, const CAMELLIA_KEY *key, 66 unsigned char *ivec, const int enc) { 67 68 unsigned long n; 69 unsigned long len = length; | 1/* crypto/camellia/camellia_cbc.c -*- mode:C; c-file-style: "eay" -*- */ 2/* ==================================================================== 3 * Copyright (c) 2006 The OpenSSL Project. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * --- 53 unchanged lines hidden (view full) --- 62#include "cmll_locl.h" 63 64void Camellia_cbc_encrypt(const unsigned char *in, unsigned char *out, 65 const unsigned long length, const CAMELLIA_KEY *key, 66 unsigned char *ivec, const int enc) { 67 68 unsigned long n; 69 unsigned long len = length; |
70 unsigned char tmp[CAMELLIA_BLOCK_SIZE]; | |
71 const unsigned char *iv = ivec; | 70 const unsigned char *iv = ivec; |
72 uint32_t t32[UNITSIZE]; | 71 union { u32 t32[CAMELLIA_BLOCK_SIZE/sizeof(u32)]; 72 u8 t8 [CAMELLIA_BLOCK_SIZE]; } tmp; 73 const union { long one; char little; } camellia_endian = {1}; |
73 74 75 assert(in && out && key && ivec); 76 assert((CAMELLIA_ENCRYPT == enc)||(CAMELLIA_DECRYPT == enc)); 77 | 74 75 76 assert(in && out && key && ivec); 77 assert((CAMELLIA_ENCRYPT == enc)||(CAMELLIA_DECRYPT == enc)); 78 |
78 if(((size_t)in) % ALIGN == 0 79 && ((size_t)out) % ALIGN == 0 80 && ((size_t)ivec) % ALIGN == 0) | 79 if(((size_t)in|(size_t)out|(size_t)ivec) % sizeof(u32) == 0) |
81 { 82 if (CAMELLIA_ENCRYPT == enc) 83 { 84 while (len >= CAMELLIA_BLOCK_SIZE) 85 { | 80 { 81 if (CAMELLIA_ENCRYPT == enc) 82 { 83 while (len >= CAMELLIA_BLOCK_SIZE) 84 { |
86 XOR4WORD2((uint32_t *)out, 87 (uint32_t *)in, (uint32_t *)iv); 88 key->enc(key->rd_key, (uint32_t *)out); | 85 XOR4WORD2((u32 *)out, 86 (u32 *)in, (u32 *)iv); 87 if (camellia_endian.little) 88 SWAP4WORD((u32 *)out); 89 key->enc(key->rd_key, (u32 *)out); 90 if (camellia_endian.little) 91 SWAP4WORD((u32 *)out); |
89 iv = out; 90 len -= CAMELLIA_BLOCK_SIZE; 91 in += CAMELLIA_BLOCK_SIZE; 92 out += CAMELLIA_BLOCK_SIZE; 93 } 94 if (len) 95 { 96 for(n=0; n < len; ++n) 97 out[n] = in[n] ^ iv[n]; 98 for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n) 99 out[n] = iv[n]; | 92 iv = out; 93 len -= CAMELLIA_BLOCK_SIZE; 94 in += CAMELLIA_BLOCK_SIZE; 95 out += CAMELLIA_BLOCK_SIZE; 96 } 97 if (len) 98 { 99 for(n=0; n < len; ++n) 100 out[n] = in[n] ^ iv[n]; 101 for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n) 102 out[n] = iv[n]; |
100 key->enc(key->rd_key, (uint32_t *)out); | 103 if (camellia_endian.little) 104 SWAP4WORD((u32 *)out); 105 key->enc(key->rd_key, (u32 *)out); 106 if (camellia_endian.little) 107 SWAP4WORD((u32 *)out); |
101 iv = out; 102 } 103 memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE); 104 } 105 else if (in != out) 106 { 107 while (len >= CAMELLIA_BLOCK_SIZE) 108 { 109 memcpy(out,in,CAMELLIA_BLOCK_SIZE); | 108 iv = out; 109 } 110 memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE); 111 } 112 else if (in != out) 113 { 114 while (len >= CAMELLIA_BLOCK_SIZE) 115 { 116 memcpy(out,in,CAMELLIA_BLOCK_SIZE); |
110 key->dec(key->rd_key,(uint32_t *)out); 111 XOR4WORD((uint32_t *)out, (uint32_t *)iv); | 117 if (camellia_endian.little) 118 SWAP4WORD((u32 *)out); 119 key->dec(key->rd_key,(u32 *)out); 120 if (camellia_endian.little) 121 SWAP4WORD((u32 *)out); 122 XOR4WORD((u32 *)out, (u32 *)iv); |
112 iv = in; 113 len -= CAMELLIA_BLOCK_SIZE; 114 in += CAMELLIA_BLOCK_SIZE; 115 out += CAMELLIA_BLOCK_SIZE; 116 } 117 if (len) 118 { | 123 iv = in; 124 len -= CAMELLIA_BLOCK_SIZE; 125 in += CAMELLIA_BLOCK_SIZE; 126 out += CAMELLIA_BLOCK_SIZE; 127 } 128 if (len) 129 { |
119 memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); 120 key->dec(key->rd_key, (uint32_t *)tmp); | 130 memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE); 131 if (camellia_endian.little) 132 SWAP4WORD(tmp.t32); 133 key->dec(key->rd_key, tmp.t32); 134 if (camellia_endian.little) 135 SWAP4WORD(tmp.t32); |
121 for(n=0; n < len; ++n) | 136 for(n=0; n < len; ++n) |
122 out[n] = tmp[n] ^ iv[n]; | 137 out[n] = tmp.t8[n] ^ iv[n]; |
123 iv = in; 124 } 125 memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE); 126 } 127 else /* in == out */ 128 { 129 while (len >= CAMELLIA_BLOCK_SIZE) 130 { | 138 iv = in; 139 } 140 memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE); 141 } 142 else /* in == out */ 143 { 144 while (len >= CAMELLIA_BLOCK_SIZE) 145 { |
131 memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); 132 key->dec(key->rd_key, (uint32_t *)out); 133 XOR4WORD((uint32_t *)out, (uint32_t *)ivec); 134 memcpy(ivec, tmp, CAMELLIA_BLOCK_SIZE); | 146 memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE); 147 if (camellia_endian.little) 148 SWAP4WORD((u32 *)out); 149 key->dec(key->rd_key, (u32 *)out); 150 if (camellia_endian.little) 151 SWAP4WORD((u32 *)out); 152 XOR4WORD((u32 *)out, (u32 *)ivec); 153 memcpy(ivec, tmp.t8, CAMELLIA_BLOCK_SIZE); |
135 len -= CAMELLIA_BLOCK_SIZE; 136 in += CAMELLIA_BLOCK_SIZE; 137 out += CAMELLIA_BLOCK_SIZE; 138 } 139 if (len) 140 { | 154 len -= CAMELLIA_BLOCK_SIZE; 155 in += CAMELLIA_BLOCK_SIZE; 156 out += CAMELLIA_BLOCK_SIZE; 157 } 158 if (len) 159 { |
141 memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); 142 key->dec(key->rd_key,(uint32_t *)out); | 160 memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE); 161 if (camellia_endian.little) 162 SWAP4WORD((u32 *)out); 163 key->dec(key->rd_key,(u32 *)out); 164 if (camellia_endian.little) 165 SWAP4WORD((u32 *)out); |
143 for(n=0; n < len; ++n) 144 out[n] ^= ivec[n]; 145 for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n) | 166 for(n=0; n < len; ++n) 167 out[n] ^= ivec[n]; 168 for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n) |
146 out[n] = tmp[n]; 147 memcpy(ivec, tmp, CAMELLIA_BLOCK_SIZE); | 169 out[n] = tmp.t8[n]; 170 memcpy(ivec, tmp.t8, CAMELLIA_BLOCK_SIZE); |
148 } 149 } 150 } 151 else /* no aligned */ 152 { 153 if (CAMELLIA_ENCRYPT == enc) 154 { 155 while (len >= CAMELLIA_BLOCK_SIZE) 156 { 157 for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n) | 171 } 172 } 173 } 174 else /* no aligned */ 175 { 176 if (CAMELLIA_ENCRYPT == enc) 177 { 178 while (len >= CAMELLIA_BLOCK_SIZE) 179 { 180 for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n) |
158 out[n] = in[n] ^ iv[n]; 159 memcpy(t32, out, CAMELLIA_BLOCK_SIZE); 160 key->enc(key->rd_key, t32); 161 memcpy(out, t32, CAMELLIA_BLOCK_SIZE); | 181 tmp.t8[n] = in[n] ^ iv[n]; 182 if (camellia_endian.little) 183 SWAP4WORD(tmp.t32); 184 key->enc(key->rd_key, tmp.t32); 185 if (camellia_endian.little) 186 SWAP4WORD(tmp.t32); 187 memcpy(out, tmp.t8, CAMELLIA_BLOCK_SIZE); |
162 iv = out; 163 len -= CAMELLIA_BLOCK_SIZE; 164 in += CAMELLIA_BLOCK_SIZE; 165 out += CAMELLIA_BLOCK_SIZE; 166 } 167 if (len) 168 { 169 for(n=0; n < len; ++n) | 188 iv = out; 189 len -= CAMELLIA_BLOCK_SIZE; 190 in += CAMELLIA_BLOCK_SIZE; 191 out += CAMELLIA_BLOCK_SIZE; 192 } 193 if (len) 194 { 195 for(n=0; n < len; ++n) |
170 out[n] = in[n] ^ iv[n]; | 196 tmp.t8[n] = in[n] ^ iv[n]; |
171 for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n) | 197 for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n) |
172 out[n] = iv[n]; 173 key->enc(key->rd_key, (uint32_t *)out); | 198 tmp.t8[n] = iv[n]; 199 if (camellia_endian.little) 200 SWAP4WORD(tmp.t32); 201 key->enc(key->rd_key, tmp.t32); 202 if (camellia_endian.little) 203 SWAP4WORD(tmp.t32); 204 memcpy(out, tmp.t8, CAMELLIA_BLOCK_SIZE); |
174 iv = out; 175 } 176 memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE); 177 } 178 else if (in != out) 179 { 180 while (len >= CAMELLIA_BLOCK_SIZE) 181 { | 205 iv = out; 206 } 207 memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE); 208 } 209 else if (in != out) 210 { 211 while (len >= CAMELLIA_BLOCK_SIZE) 212 { |
182 memcpy(t32,in,CAMELLIA_BLOCK_SIZE); 183 key->dec(key->rd_key,t32); 184 memcpy(out,t32,CAMELLIA_BLOCK_SIZE); | 213 memcpy(tmp.t8,in,CAMELLIA_BLOCK_SIZE); 214 if (camellia_endian.little) 215 SWAP4WORD(tmp.t32); 216 key->dec(key->rd_key,tmp.t32); 217 if (camellia_endian.little) 218 SWAP4WORD(tmp.t32); |
185 for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n) | 219 for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n) |
186 out[n] ^= iv[n]; | 220 out[n] = tmp.t8[n] ^ iv[n]; |
187 iv = in; 188 len -= CAMELLIA_BLOCK_SIZE; 189 in += CAMELLIA_BLOCK_SIZE; 190 out += CAMELLIA_BLOCK_SIZE; 191 } 192 if (len) 193 { | 221 iv = in; 222 len -= CAMELLIA_BLOCK_SIZE; 223 in += CAMELLIA_BLOCK_SIZE; 224 out += CAMELLIA_BLOCK_SIZE; 225 } 226 if (len) 227 { |
194 memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); 195 memcpy(t32, in, CAMELLIA_BLOCK_SIZE); 196 key->dec(key->rd_key, t32); 197 memcpy(out, t32, CAMELLIA_BLOCK_SIZE); | 228 memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE); 229 if (camellia_endian.little) 230 SWAP4WORD(tmp.t32); 231 key->dec(key->rd_key, tmp.t32); 232 if (camellia_endian.little) 233 SWAP4WORD(tmp.t32); |
198 for(n=0; n < len; ++n) | 234 for(n=0; n < len; ++n) |
199 out[n] = tmp[n] ^ iv[n]; | 235 out[n] = tmp.t8[n] ^ iv[n]; |
200 iv = in; 201 } 202 memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE); 203 } 204 else 205 { 206 while (len >= CAMELLIA_BLOCK_SIZE) 207 { | 236 iv = in; 237 } 238 memcpy(ivec,iv,CAMELLIA_BLOCK_SIZE); 239 } 240 else 241 { 242 while (len >= CAMELLIA_BLOCK_SIZE) 243 { |
208 memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); 209 memcpy(t32, in, CAMELLIA_BLOCK_SIZE); 210 key->dec(key->rd_key, t32); 211 memcpy(out, t32, CAMELLIA_BLOCK_SIZE); | 244 memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE); 245 if (camellia_endian.little) 246 SWAP4WORD(tmp.t32); 247 key->dec(key->rd_key, tmp.t32); 248 if (camellia_endian.little) 249 SWAP4WORD(tmp.t32); |
212 for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n) | 250 for(n=0; n < CAMELLIA_BLOCK_SIZE; ++n) |
213 out[n] ^= ivec[n]; 214 memcpy(ivec, tmp, CAMELLIA_BLOCK_SIZE); | 251 tmp.t8[n] ^= ivec[n]; 252 memcpy(ivec, in, CAMELLIA_BLOCK_SIZE); 253 memcpy(out, tmp.t8, CAMELLIA_BLOCK_SIZE); |
215 len -= CAMELLIA_BLOCK_SIZE; 216 in += CAMELLIA_BLOCK_SIZE; 217 out += CAMELLIA_BLOCK_SIZE; 218 } 219 if (len) 220 { | 254 len -= CAMELLIA_BLOCK_SIZE; 255 in += CAMELLIA_BLOCK_SIZE; 256 out += CAMELLIA_BLOCK_SIZE; 257 } 258 if (len) 259 { |
221 memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); 222 memcpy(t32, in, CAMELLIA_BLOCK_SIZE); 223 key->dec(key->rd_key,t32); 224 memcpy(out, t32, CAMELLIA_BLOCK_SIZE); | 260 memcpy(tmp.t8, in, CAMELLIA_BLOCK_SIZE); 261 if (camellia_endian.little) 262 SWAP4WORD(tmp.t32); 263 key->dec(key->rd_key,tmp.t32); 264 if (camellia_endian.little) 265 SWAP4WORD(tmp.t32); |
225 for(n=0; n < len; ++n) | 266 for(n=0; n < len; ++n) |
226 out[n] ^= ivec[n]; 227 for(n=len; n < CAMELLIA_BLOCK_SIZE; ++n) 228 out[n] = tmp[n]; 229 memcpy(ivec, tmp, CAMELLIA_BLOCK_SIZE); | 267 tmp.t8[n] ^= ivec[n]; 268 memcpy(ivec, in, CAMELLIA_BLOCK_SIZE); 269 memcpy(out,tmp.t8,len); |
230 } 231 } 232 } 233} | 270 } 271 } 272 } 273} |
234 | |