]>
Commit | Line | Data |
---|---|---|
e1178600 | 1 | /* |
a28d06f3 | 2 | * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved. |
e1178600 SL |
3 | * |
4 | * Licensed under the Apache License 2.0 (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 | |
8 | */ | |
9 | ||
10 | /*- | |
11 | * Fujitsu SPARC64 X support for camellia modes. | |
12 | * This file is included by cipher_camellia_hw.c | |
13 | */ | |
14 | ||
15 | static int cipher_hw_camellia_t4_initkey(PROV_CIPHER_CTX *dat, | |
16 | const unsigned char *key, | |
17 | size_t keylen) | |
18 | { | |
19 | int ret = 0, bits, mode = dat->mode; | |
20 | PROV_CAMELLIA_CTX *adat = (PROV_CAMELLIA_CTX *)dat; | |
21 | CAMELLIA_KEY *ks = &adat->ks.ks; | |
22 | ||
23 | dat->ks = ks; | |
24 | bits = keylen * 8; | |
25 | ||
26 | cmll_t4_set_key(key, bits, ks); | |
27 | ||
28 | if (dat->enc || (mode != EVP_CIPH_ECB_MODE && mode != EVP_CIPH_CBC_MODE)) { | |
29 | dat->block = (block128_f) cmll_t4_encrypt; | |
30 | switch (bits) { | |
31 | case 128: | |
32 | if (mode == EVP_CIPH_CBC_MODE) | |
33 | dat->stream.cbc = (cbc128_f) cmll128_t4_cbc_encrypt; | |
34 | else if (mode == EVP_CIPH_CTR_MODE) | |
35 | dat->stream.ctr = (ctr128_f) cmll128_t4_ctr32_encrypt; | |
36 | else | |
37 | dat->stream.cbc = NULL; | |
38 | break; | |
39 | case 192: | |
40 | case 256: | |
41 | if (mode == EVP_CIPH_CBC_MODE) | |
42 | dat->stream.cbc = (cbc128_f) cmll256_t4_cbc_encrypt; | |
43 | else if (mode == EVP_CIPH_CTR_MODE) | |
44 | dat->stream.ctr = (ctr128_f) cmll256_t4_ctr32_encrypt; | |
45 | else | |
46 | dat->stream.cbc = NULL; | |
47 | break; | |
48 | default: | |
49 | ret = -1; | |
50 | break; | |
51 | } | |
52 | } else { | |
53 | dat->block = (block128_f) cmll_t4_decrypt; | |
54 | switch (bits) { | |
55 | case 128: | |
56 | dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ? | |
57 | (cbc128_f) cmll128_t4_cbc_decrypt : NULL; | |
58 | break; | |
59 | case 192: | |
60 | case 256: | |
61 | dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ? | |
62 | (cbc128_f) cmll256_t4_cbc_decrypt : NULL; | |
63 | break; | |
64 | default: | |
65 | ret = -1; | |
66 | break; | |
67 | } | |
68 | } | |
69 | if (ret < 0) { | |
f5f29796 | 70 | ERR_raise(ERR_LIB_PROV, PROV_R_KEY_SETUP_FAILED); |
e1178600 SL |
71 | return 0; |
72 | } | |
73 | return 1; | |
74 | } | |
75 | ||
76 | #define PROV_CIPHER_HW_declare(mode) \ | |
77 | static const PROV_CIPHER_HW t4_camellia_##mode = { \ | |
78 | cipher_hw_camellia_t4_initkey, \ | |
5723a8ec | 79 | ossl_cipher_hw_generic_##mode, \ |
f75abcc0 | 80 | cipher_hw_camellia_copyctx \ |
e1178600 SL |
81 | }; |
82 | #define PROV_CIPHER_HW_select(mode) \ | |
83 | if (SPARC_CMLL_CAPABLE) \ | |
84 | return &t4_camellia_##mode; |