OLD | NEW |
1 /* crypto/camellia/camellia_misc.c -*- mode:C; c-file-style: "eay" -*- */ | 1 /* crypto/camellia/camellia_misc.c -*- mode:C; c-file-style: "eay" -*- */ |
2 /* ==================================================================== | 2 /* ==================================================================== |
3 * Copyright (c) 2006 The OpenSSL Project. All rights reserved. | 3 * Copyright (c) 2006 The OpenSSL Project. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
47 * OF THE POSSIBILITY OF SUCH DAMAGE. | 47 * OF THE POSSIBILITY OF SUCH DAMAGE. |
48 * ==================================================================== | 48 * ==================================================================== |
49 * | 49 * |
50 */ | 50 */ |
51 | 51 |
52 #include <openssl/opensslv.h> | 52 #include <openssl/opensslv.h> |
53 #include <openssl/camellia.h> | 53 #include <openssl/camellia.h> |
54 #include "cmll_locl.h" | 54 #include "cmll_locl.h" |
55 #include <openssl/crypto.h> | |
56 #ifdef OPENSSL_FIPS | |
57 #include <openssl/fips.h> | |
58 #endif | |
59 | 55 |
60 const char CAMELLIA_version[]="CAMELLIA" OPENSSL_VERSION_PTEXT; | 56 const char CAMELLIA_version[]="CAMELLIA" OPENSSL_VERSION_PTEXT; |
61 | 57 |
62 int Camellia_set_key(const unsigned char *userKey, const int bits, | 58 int Camellia_set_key(const unsigned char *userKey, const int bits, |
63 CAMELLIA_KEY *key) | 59 CAMELLIA_KEY *key) |
64 #ifdef OPENSSL_FIPS | |
65 { | 60 { |
66 » if (FIPS_mode()) | 61 » if(!userKey || !key) |
67 » » FIPS_BAD_ABORT(CAMELLIA) | |
68 » return private_Camellia_set_key(userKey, bits, key); | |
69 » } | |
70 int private_Camellia_set_key(const unsigned char *userKey, const int bits, | |
71 » CAMELLIA_KEY *key) | |
72 #endif | |
73 » { | |
74 » if (!userKey || !key) | |
75 » » { | |
76 return -1; | 62 return -1; |
77 » » } | 63 » if(bits != 128 && bits != 192 && bits != 256) |
78 » | |
79 » switch(bits) | |
80 » » { | |
81 » case 128: | |
82 » » camellia_setup128(userKey, (unsigned int *)key->rd_key); | |
83 » » key->enc = camellia_encrypt128; | |
84 » » key->dec = camellia_decrypt128; | |
85 » » break; | |
86 » case 192: | |
87 » » camellia_setup192(userKey, (unsigned int *)key->rd_key); | |
88 » » key->enc = camellia_encrypt256; | |
89 » » key->dec = camellia_decrypt256; | |
90 » » break; | |
91 » case 256: | |
92 » » camellia_setup256(userKey, (unsigned int *)key->rd_key); | |
93 » » key->enc = camellia_encrypt256; | |
94 » » key->dec = camellia_decrypt256; | |
95 » » break; | |
96 » default: | |
97 return -2; | 64 return -2; |
98 » » } | 65 » key->grand_rounds = Camellia_Ekeygen(bits , userKey, key->u.rd_key); |
99 » | |
100 » key->bitLength = bits; | |
101 return 0; | 66 return 0; |
102 } | 67 } |
103 | 68 |
104 void Camellia_encrypt(const unsigned char *in, unsigned char *out, | 69 void Camellia_encrypt(const unsigned char *in, unsigned char *out, |
105 const CAMELLIA_KEY *key) | 70 const CAMELLIA_KEY *key) |
106 { | 71 { |
107 » u32 tmp[CAMELLIA_BLOCK_SIZE/sizeof(u32)]; | 72 » Camellia_EncryptBlock_Rounds(key->grand_rounds, in , key->u.rd_key , out
); |
108 » const union { long one; char little; } camellia_endian = {1}; | |
109 | |
110 » memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); | |
111 » if (camellia_endian.little) SWAP4WORD(tmp); | |
112 » key->enc(key->rd_key, tmp); | |
113 » if (camellia_endian.little) SWAP4WORD(tmp); | |
114 » memcpy(out, tmp, CAMELLIA_BLOCK_SIZE); | |
115 } | 73 } |
116 | 74 |
117 void Camellia_decrypt(const unsigned char *in, unsigned char *out, | 75 void Camellia_decrypt(const unsigned char *in, unsigned char *out, |
118 const CAMELLIA_KEY *key) | 76 const CAMELLIA_KEY *key) |
119 { | 77 { |
120 » u32 tmp[CAMELLIA_BLOCK_SIZE/sizeof(u32)]; | 78 » Camellia_DecryptBlock_Rounds(key->grand_rounds, in , key->u.rd_key , out
); |
121 » const union { long one; char little; } camellia_endian = {1}; | |
122 | |
123 » memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); | |
124 » if (camellia_endian.little) SWAP4WORD(tmp); | |
125 » key->dec(key->rd_key, tmp); | |
126 » if (camellia_endian.little) SWAP4WORD(tmp); | |
127 » memcpy(out, tmp, CAMELLIA_BLOCK_SIZE); | |
128 } | 79 } |
129 | |
OLD | NEW |