2 * Copyright 2006-2017 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 /* ====================================================================
11 * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
14 #include "internal/cryptlib.h"
15 #ifndef OPENSSL_NO_ARIA
16 # include <openssl/evp.h>
17 # include <openssl/modes.h>
18 # include"internal/aria.h"
19 # include "internal/evp_int.h"
21 /* ARIA subkey Structure */
26 /* The subkey for ARIA is generated. */
27 static int aria_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
28 const unsigned char *iv, int enc)
31 int mode = EVP_CIPHER_CTX_mode(ctx);
33 if (enc || (mode != EVP_CIPH_ECB_MODE && mode != EVP_CIPH_CBC_MODE))
34 ret = aria_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
35 EVP_CIPHER_CTX_get_cipher_data(ctx));
37 ret = aria_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
38 EVP_CIPHER_CTX_get_cipher_data(ctx));
40 EVPerr(EVP_F_ARIA_INIT_KEY,EVP_R_ARIA_KEY_SETUP_FAILED);
46 static void aria_cbc_encrypt(const unsigned char *in, unsigned char *out,
47 size_t len, const ARIA_KEY *key,
48 unsigned char *ivec, const int enc)
52 CRYPTO_cbc128_encrypt(in, out, len, key, ivec,
53 (block128_f) aria_encrypt);
55 CRYPTO_cbc128_decrypt(in, out, len, key, ivec,
56 (block128_f) aria_encrypt);
59 static void aria_cfb128_encrypt(const unsigned char *in, unsigned char *out,
60 size_t length, const ARIA_KEY *key,
61 unsigned char *ivec, int *num, const int enc)
64 CRYPTO_cfb128_encrypt(in, out, length, key, ivec, num, enc,
65 (block128_f) aria_encrypt);
68 static void aria_cfb1_encrypt(const unsigned char *in, unsigned char *out,
69 size_t length, const ARIA_KEY *key,
70 unsigned char *ivec, int *num, const int enc)
72 CRYPTO_cfb128_1_encrypt(in, out, length, key, ivec, num, enc,
73 (block128_f) aria_encrypt);
76 static void aria_cfb8_encrypt(const unsigned char *in, unsigned char *out,
77 size_t length, const ARIA_KEY *key,
78 unsigned char *ivec, int *num, const int enc)
80 CRYPTO_cfb128_8_encrypt(in, out, length, key, ivec, num, enc,
81 (block128_f) aria_encrypt);
84 static void aria_ecb_encrypt(const unsigned char *in, unsigned char *out,
85 const ARIA_KEY *key, const int enc)
87 aria_encrypt(in, out, key);
90 static void aria_ofb128_encrypt(const unsigned char *in, unsigned char *out,
91 size_t length, const ARIA_KEY *key,
92 unsigned char *ivec, int *num)
94 CRYPTO_ofb128_encrypt(in, out, length, key, ivec, num,
95 (block128_f) aria_encrypt);
98 IMPLEMENT_BLOCK_CIPHER(aria_128, ks, aria, EVP_ARIA_KEY,
99 NID_aria_128, 16, 16, 16, 128,
100 0, aria_init_key, NULL,
101 EVP_CIPHER_set_asn1_iv,
102 EVP_CIPHER_get_asn1_iv,
104 IMPLEMENT_BLOCK_CIPHER(aria_192, ks, aria, EVP_ARIA_KEY,
105 NID_aria_192, 16, 24, 16, 128,
106 0, aria_init_key, NULL,
107 EVP_CIPHER_set_asn1_iv,
108 EVP_CIPHER_get_asn1_iv,
110 IMPLEMENT_BLOCK_CIPHER(aria_256, ks, aria, EVP_ARIA_KEY,
111 NID_aria_256, 16, 32, 16, 128,
112 0, aria_init_key, NULL,
113 EVP_CIPHER_set_asn1_iv,
114 EVP_CIPHER_get_asn1_iv,
117 # define IMPLEMENT_ARIA_CFBR(ksize,cbits) \
118 IMPLEMENT_CFBR(aria,aria,EVP_ARIA_KEY,ks,ksize,cbits,16,0)
119 IMPLEMENT_ARIA_CFBR(128,1)
120 IMPLEMENT_ARIA_CFBR(192,1)
121 IMPLEMENT_ARIA_CFBR(256,1)
122 IMPLEMENT_ARIA_CFBR(128,8)
123 IMPLEMENT_ARIA_CFBR(192,8)
124 IMPLEMENT_ARIA_CFBR(256,8)
126 # define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
127 static const EVP_CIPHER aria_##keylen##_##mode = { \
128 nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
129 flags|EVP_CIPH_##MODE##_MODE, \
131 aria_##mode##_cipher, \
133 sizeof(EVP_ARIA_KEY), \
134 NULL,NULL,NULL,NULL }; \
135 const EVP_CIPHER *EVP_aria_##keylen##_##mode(void) \
136 { return &aria_##keylen##_##mode; }
138 static int aria_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
139 const unsigned char *in, size_t len)
141 unsigned int num = EVP_CIPHER_CTX_num(ctx);
142 EVP_ARIA_KEY *dat = EVP_C_DATA(EVP_ARIA_KEY,ctx);
144 CRYPTO_ctr128_encrypt(in, out, len, &dat->ks,
145 EVP_CIPHER_CTX_iv_noconst(ctx),
146 EVP_CIPHER_CTX_buf_noconst(ctx), &num,
147 (block128_f) aria_encrypt);
148 EVP_CIPHER_CTX_set_num(ctx, num);
152 BLOCK_CIPHER_generic(NID_aria, 128, 1, 16, ctr, ctr, CTR, 0)
153 BLOCK_CIPHER_generic(NID_aria, 192, 1, 16, ctr, ctr, CTR, 0)
154 BLOCK_CIPHER_generic(NID_aria, 256, 1, 16, ctr, ctr, CTR, 0)