mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-29 18:27:29 +02:00
Added DES3 Crypto callback support.
This commit is contained in:
@ -434,6 +434,72 @@ int wc_CryptoCb_AesCbcDecrypt(Aes* aes, byte* out,
|
||||
#endif /* HAVE_AES_CBC */
|
||||
#endif /* !NO_AES */
|
||||
|
||||
#ifndef NO_DES3
|
||||
int wc_CryptoCb_Des3Encrypt(Des3* des3, byte* out,
|
||||
const byte* in, word32 sz)
|
||||
{
|
||||
int ret = CRYPTOCB_UNAVAILABLE;
|
||||
CryptoCb* dev;
|
||||
|
||||
/* locate registered callback */
|
||||
if (des3) {
|
||||
dev = wc_CryptoCb_FindDevice(des3->devId);
|
||||
}
|
||||
else {
|
||||
/* locate first callback and try using it */
|
||||
dev = wc_CryptoCb_FindDeviceByIndex(0);
|
||||
}
|
||||
|
||||
if (dev && dev->cb) {
|
||||
wc_CryptoInfo cryptoInfo;
|
||||
XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo));
|
||||
cryptoInfo.algo_type = WC_ALGO_TYPE_CIPHER;
|
||||
cryptoInfo.cipher.type = WC_CIPHER_DES3;
|
||||
cryptoInfo.cipher.enc = 1;
|
||||
cryptoInfo.cipher.des3.des = des3;
|
||||
cryptoInfo.cipher.des3.out = out;
|
||||
cryptoInfo.cipher.des3.in = in;
|
||||
cryptoInfo.cipher.des3.sz = sz;
|
||||
|
||||
ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx);
|
||||
}
|
||||
|
||||
return wc_CryptoCb_TranslateErrorCode(ret);
|
||||
}
|
||||
|
||||
int wc_CryptoCb_Des3Decrypt(Des3* des3, byte* out,
|
||||
const byte* in, word32 sz)
|
||||
{
|
||||
int ret = CRYPTOCB_UNAVAILABLE;
|
||||
CryptoCb* dev;
|
||||
|
||||
/* locate registered callback */
|
||||
if (des3) {
|
||||
dev = wc_CryptoCb_FindDevice(des3->devId);
|
||||
}
|
||||
else {
|
||||
/* locate first callback and try using it */
|
||||
dev = wc_CryptoCb_FindDeviceByIndex(0);
|
||||
}
|
||||
|
||||
if (dev && dev->cb) {
|
||||
wc_CryptoInfo cryptoInfo;
|
||||
XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo));
|
||||
cryptoInfo.algo_type = WC_ALGO_TYPE_CIPHER;
|
||||
cryptoInfo.cipher.type = WC_CIPHER_DES3;
|
||||
cryptoInfo.cipher.enc = 0;
|
||||
cryptoInfo.cipher.des3.des = des3;
|
||||
cryptoInfo.cipher.des3.out = out;
|
||||
cryptoInfo.cipher.des3.in = in;
|
||||
cryptoInfo.cipher.des3.sz = sz;
|
||||
|
||||
ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx);
|
||||
}
|
||||
|
||||
return wc_CryptoCb_TranslateErrorCode(ret);
|
||||
}
|
||||
#endif /* !NO_DES3 */
|
||||
|
||||
#ifndef NO_SHA
|
||||
int wc_CryptoCb_ShaHash(wc_Sha* sha, const byte* in,
|
||||
word32 inSz, byte* digest)
|
||||
|
@ -45,6 +45,10 @@
|
||||
|
||||
#include <wolfssl/wolfcrypt/des3.h>
|
||||
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
#include <wolfssl/wolfcrypt/cryptocb.h>
|
||||
#endif
|
||||
|
||||
/* fips wrapper calls, user can call direct */
|
||||
#if defined(HAVE_FIPS) && \
|
||||
(!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))
|
||||
@ -1587,6 +1591,15 @@
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
if (des->devId != INVALID_DEVID) {
|
||||
int ret = wc_CryptoCb_Des3Encrypt(des, out, in, sz);
|
||||
if (ret != CRYPTOCB_UNAVAILABLE)
|
||||
return ret;
|
||||
/* fall-through when unavailable */
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_3DES)
|
||||
if (des->asyncDev.marker == WOLFSSL_ASYNC_MARKER_3DES &&
|
||||
sz >= WC_ASYNC_THRESH_DES3_CBC) {
|
||||
@ -1629,6 +1642,15 @@
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
if (des->devId != INVALID_DEVID) {
|
||||
int ret = wc_CryptoCb_Des3Decrypt(des, out, in, sz);
|
||||
if (ret != CRYPTOCB_UNAVAILABLE)
|
||||
return ret;
|
||||
/* fall-through when unavailable */
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_ASYNC_CRYPT)
|
||||
if (des->asyncDev.marker == WOLFSSL_ASYNC_MARKER_3DES &&
|
||||
sz >= WC_ASYNC_THRESH_DES3_CBC) {
|
||||
@ -1734,11 +1756,16 @@ int wc_Des3Init(Des3* des3, void* heap, int devId)
|
||||
|
||||
des3->heap = heap;
|
||||
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
des3->devId = devId;
|
||||
des3->devCtx = NULL;
|
||||
#else
|
||||
(void)devId;
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_3DES)
|
||||
ret = wolfAsync_DevCtxInit(&des3->asyncDev, WOLFSSL_ASYNC_MARKER_3DES,
|
||||
des3->heap, devId);
|
||||
#else
|
||||
(void)devId;
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
|
@ -24334,7 +24334,7 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx)
|
||||
#endif /* HAVE_ECC */
|
||||
}
|
||||
else if (info->algo_type == WC_ALGO_TYPE_CIPHER) {
|
||||
#ifndef NO_AES
|
||||
#if !defined(NO_AES) || !defined(NO_DES3)
|
||||
#ifdef HAVE_AESGCM
|
||||
if (info->cipher.type == WC_CIPHER_AES_GCM) {
|
||||
if (info->cipher.enc) {
|
||||
@ -24407,7 +24407,37 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx)
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_AES_CBC */
|
||||
#endif /* !NO_AES */
|
||||
#ifndef NO_DES3
|
||||
if (info->cipher.type == WC_CIPHER_DES3) {
|
||||
if (info->cipher.enc) {
|
||||
/* set devId to invalid, so software is used */
|
||||
info->cipher.des3.des->devId = INVALID_DEVID;
|
||||
|
||||
ret = wc_Des3_CbcEncrypt(
|
||||
info->cipher.des3.des,
|
||||
info->cipher.des3.out,
|
||||
info->cipher.des3.in,
|
||||
info->cipher.des3.sz);
|
||||
|
||||
/* reset devId */
|
||||
info->cipher.des3.des->devId = devIdArg;
|
||||
}
|
||||
else {
|
||||
/* set devId to invalid, so software is used */
|
||||
info->cipher.des3.des->devId = INVALID_DEVID;
|
||||
|
||||
ret = wc_Des3_CbcDecrypt(
|
||||
info->cipher.des3.des,
|
||||
info->cipher.des3.out,
|
||||
info->cipher.des3.in,
|
||||
info->cipher.des3.sz);
|
||||
|
||||
/* reset devId */
|
||||
info->cipher.des3.des->devId = devIdArg;
|
||||
}
|
||||
}
|
||||
#endif /* !NO_DES3 */
|
||||
#endif /* !NO_AES || !NO_DES3 */
|
||||
}
|
||||
#if !defined(NO_SHA) || !defined(NO_SHA256)
|
||||
else if (info->algo_type == WC_ALGO_TYPE_HASH) {
|
||||
@ -24527,6 +24557,10 @@ int cryptocb_test(void)
|
||||
ret = aes_test();
|
||||
#endif
|
||||
#endif /* !NO_AES */
|
||||
#ifndef NO_DES3
|
||||
if (ret == 0)
|
||||
ret = des3_test();
|
||||
#endif /* !NO_DES3 */
|
||||
#if !defined(NO_SHA) || !defined(NO_SHA256)
|
||||
#ifndef NO_SHA
|
||||
if (ret == 0)
|
||||
|
@ -55,6 +55,10 @@
|
||||
#ifndef WC_NO_RNG
|
||||
#include <wolfssl/wolfcrypt/random.h>
|
||||
#endif
|
||||
#ifndef NO_DES3
|
||||
#include <wolfssl/wolfcrypt/des3.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* Crypto Information Structure for callbacks */
|
||||
typedef struct wc_CryptoInfo {
|
||||
@ -115,7 +119,7 @@ typedef struct wc_CryptoInfo {
|
||||
};
|
||||
} pk;
|
||||
#endif /* !NO_RSA || HAVE_ECC */
|
||||
#ifndef NO_AES
|
||||
#if !defined(NO_AES) || !defined(NO_DES3)
|
||||
struct {
|
||||
int type; /* enum wc_CipherType */
|
||||
int enc;
|
||||
@ -154,9 +158,17 @@ typedef struct wc_CryptoInfo {
|
||||
word32 sz;
|
||||
} aescbc;
|
||||
#endif /* HAVE_AES_CBC */
|
||||
#ifndef NO_DES3
|
||||
struct {
|
||||
Des3* des;
|
||||
byte* out;
|
||||
const byte* in;
|
||||
word32 sz;
|
||||
} des3;
|
||||
#endif
|
||||
};
|
||||
} cipher;
|
||||
#endif /* !NO_AES */
|
||||
#endif /* !NO_AES || !NO_DES3 */
|
||||
#if !defined(NO_SHA) || !defined(NO_SHA256)
|
||||
struct {
|
||||
int type; /* enum wc_HashType */
|
||||
@ -252,6 +264,13 @@ WOLFSSL_LOCAL int wc_CryptoCb_AesCbcDecrypt(Aes* aes, byte* out,
|
||||
#endif /* HAVE_AES_CBC */
|
||||
#endif /* !NO_AES */
|
||||
|
||||
#ifndef NO_DES3
|
||||
WOLFSSL_LOCAL int wc_CryptoCb_Des3Encrypt(Des3* des3, byte* out,
|
||||
const byte* in, word32 sz);
|
||||
WOLFSSL_LOCAL int wc_CryptoCb_Des3Decrypt(Des3* des3, byte* out,
|
||||
const byte* in, word32 sz);
|
||||
#endif /* !NO_DES3 */
|
||||
|
||||
#ifndef NO_SHA
|
||||
WOLFSSL_LOCAL int wc_CryptoCb_ShaHash(wc_Sha* sha, const byte* in,
|
||||
word32 inSz, byte* digest);
|
||||
|
@ -103,6 +103,10 @@ typedef struct Des3 {
|
||||
const byte* key_raw;
|
||||
const byte* iv_raw;
|
||||
WC_ASYNC_DEV asyncDev;
|
||||
#endif
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
int devId;
|
||||
void* devCtx;
|
||||
#endif
|
||||
void* heap;
|
||||
} Des3;
|
||||
|
Reference in New Issue
Block a user