]>
git.ipfire.org Git - thirdparty/openssl.git/blob - providers/implementations/ciphers/cipher_tdes_hw.c
2 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
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
11 * DES low level APIs are deprecated for public use, but still ok for internal
14 #include "internal/deprecated.h"
16 #include "prov/ciphercommon.h"
17 #include "cipher_tdes.h"
23 int ossl_cipher_hw_tdes_ede3_initkey(PROV_CIPHER_CTX
*ctx
,
24 const unsigned char *key
, size_t keylen
)
26 PROV_TDES_CTX
*tctx
= (PROV_TDES_CTX
*)ctx
;
27 DES_cblock
*deskey
= (DES_cblock
*)key
;
29 tctx
->tstream
.cbc
= NULL
;
30 # if defined(SPARC_DES_CAPABLE)
31 if (SPARC_DES_CAPABLE
) {
32 if (ctx
->mode
== EVP_CIPH_CBC_MODE
) {
33 des_t4_key_expand(&deskey
[0], &tctx
->ks1
);
34 des_t4_key_expand(&deskey
[1], &tctx
->ks2
);
35 des_t4_key_expand(&deskey
[2], &tctx
->ks3
);
36 tctx
->tstream
.cbc
= ctx
->enc
? des_t4_ede3_cbc_encrypt
:
37 des_t4_ede3_cbc_decrypt
;
42 DES_set_key_unchecked(&deskey
[0], &tctx
->ks1
);
43 DES_set_key_unchecked(&deskey
[1], &tctx
->ks2
);
44 DES_set_key_unchecked(&deskey
[2], &tctx
->ks3
);
48 void ossl_cipher_hw_tdes_copyctx(PROV_CIPHER_CTX
*dst
,
49 const PROV_CIPHER_CTX
*src
)
51 PROV_TDES_CTX
*sctx
= (PROV_TDES_CTX
*)src
;
52 PROV_TDES_CTX
*dctx
= (PROV_TDES_CTX
*)dst
;
55 dst
->ks
= &dctx
->tks
.ks
;
58 int ossl_cipher_hw_tdes_cbc(PROV_CIPHER_CTX
*ctx
, unsigned char *out
,
59 const unsigned char *in
, size_t inl
)
61 PROV_TDES_CTX
*tctx
= (PROV_TDES_CTX
*)ctx
;
63 if (tctx
->tstream
.cbc
!= NULL
) {
64 (*tctx
->tstream
.cbc
) (in
, out
, inl
, tctx
->tks
.ks
, ctx
->iv
);
68 while (inl
>= MAXCHUNK
) {
69 DES_ede3_cbc_encrypt(in
, out
, (long)MAXCHUNK
, &tctx
->ks1
, &tctx
->ks2
,
70 &tctx
->ks3
, (DES_cblock
*)ctx
->iv
, ctx
->enc
);
76 DES_ede3_cbc_encrypt(in
, out
, (long)inl
, &tctx
->ks1
, &tctx
->ks2
,
77 &tctx
->ks3
, (DES_cblock
*)ctx
->iv
, ctx
->enc
);
81 int ossl_cipher_hw_tdes_ecb(PROV_CIPHER_CTX
*ctx
, unsigned char *out
,
82 const unsigned char *in
, size_t len
)
85 PROV_TDES_CTX
*tctx
= (PROV_TDES_CTX
*)ctx
;
87 if (len
< DES_BLOCK_SIZE
)
90 for (i
= 0, len
-= DES_BLOCK_SIZE
; i
<= len
; i
+= DES_BLOCK_SIZE
) {
91 DES_ecb3_encrypt((const_DES_cblock
*)(in
+ i
), (DES_cblock
*)(out
+ i
),
92 &tctx
->ks1
, &tctx
->ks2
, &tctx
->ks3
, ctx
->enc
);
97 PROV_CIPHER_HW_tdes_mode(ede3
, ecb
)
98 PROV_CIPHER_HW_tdes_mode(ede3
, cbc
)