| 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 |