Skip to content

Commit 0430d25

Browse files
committed
linuxkm shims for all SHA and SHA-HMAC flavors.
1 parent f7407e4 commit 0430d25

5 files changed

Lines changed: 863 additions & 64 deletions

File tree

configure.ac

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9421,6 +9421,20 @@ then
94219421
'ofb(aes)') test "$ENABLED_AESOFB" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: AES-OFB implementation not enabled.])
94229422
AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_AESOFB" ;;
94239423
'ecb(aes)') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_AESECB -DHAVE_AES_ECB" ;;
9424+
'sha1') test "$ENABLED_SHA" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: SHA-1 implementation not enabled.])
9425+
AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_SHA1" ;;
9426+
'sha2') test "$ENABLED_SHA224" != "no" || test "$ENABLED_SHA256" != "no" || test "$ENABLED_SHA384" != "no" || test "$ENABLED_SHA512" != "no" || \
9427+
AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: No SHA-2 implementations are enabled.])
9428+
AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_SHA2" ;;
9429+
'sha3') test "$ENABLED_SHA3" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: SHA-3 implementation not enabled.])
9430+
AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_SHA3" ;;
9431+
'hmac(sha1)') test "$ENABLED_SHA" != "no" && test "$ENABLED_HMAC" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: SHA-1 HMAC implementation not enabled.])
9432+
AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_SHA1_HMAC" ;;
9433+
'hmac(sha2)') (test "$ENABLED_SHA224" != "no" || test "$ENABLED_SHA256" != "no" || test "$ENABLED_SHA384" != "no" || test "$ENABLED_SHA512" != "no") && \
9434+
test "$ENABLED_HMAC" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: No SHA-2 HMAC implementations are enabled.])
9435+
AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_SHA2_HMAC" ;;
9436+
'hmac(sha3)') test "$ENABLED_SHA3" != "no" && test "$ENABLED_HMAC" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: SHA-3 HMAC implementation not enabled.])
9437+
AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_SHA3_HMAC" ;;
94249438
'ecdsa') test "$ENABLED_ECC" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: ECDSA implementation not enabled.])
94259439
AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_ECDSA" ;;
94269440
'ecdh') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_ECDH" ;;
@@ -9436,6 +9450,12 @@ then
94369450
'-ctr(aes)') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_AESCTR" ;;
94379451
'-ofb(aes)') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_AESOFB" ;;
94389452
'-ecb(aes)') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_AESECB" ;;
9453+
'-sha1') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_SHA1" ;;
9454+
'-sha2') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_SHA2" ;;
9455+
'-sha3') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_SHA3" ;;
9456+
'-hmac(sha1)') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_SHA1_HMAC" ;;
9457+
'-hmac(sha2)') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_SHA2_HMAC" ;;
9458+
'-hmac(sha3)') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_SHA3_HMAC" ;;
94399459
'-ecdsa') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_ECDSA" ;;
94409460
'-ecdh') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_ECDH" ;;
94419461
'-rsa') AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_DONT_REGISTER_RSA" ;;

linuxkm/linuxkm_wc_port.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@
293293
#include <linux/scatterlist.h>
294294
#include <crypto/scatterwalk.h>
295295
#include <crypto/internal/aead.h>
296+
#include <crypto/internal/hash.h>
296297
#include <crypto/internal/skcipher.h>
297298
#include <crypto/internal/akcipher.h>
298299
#include <crypto/internal/kpp.h>

linuxkm/lkcapi_aes_glue.c

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
#error lkcapi_aes_glue.c compiled with NO_AES.
2626
#endif
2727

28+
#include <wolfssl/wolfcrypt/aes.h>
29+
2830
#if defined(WC_LINUXKM_C_FALLBACK_IN_SHIMS) && !defined(WC_FLAG_DONT_USE_AESNI)
2931
#error WC_LINUXKM_C_FALLBACK_IN_SHIMS is defined but WC_FLAG_DONT_USE_AESNI is missing.
3032
#endif
3133

32-
#include <wolfssl/wolfcrypt/aes.h>
33-
3434
/* note the FIPS code will be returned on failure even in non-FIPS builds. */
3535
#define LINUXKM_LKCAPI_AES_KAT_MISMATCH_E AES_KAT_FIPS_E
3636
#define LINUXKM_LKCAPI_AESGCM_KAT_MISMATCH_E AESGCM_KAT_FIPS_E
@@ -1001,7 +1001,12 @@ static int AesGcmCrypt_1(struct aead_request *req, int decrypt_p, int rfc4106_p)
10011001

10021002
if (req->src->length >= assoclen && req->src->length) {
10031003
scatterwalk_start(&assocSgWalk, req->src);
1004+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
1005+
scatterwalk_map(&assocSgWalk);
1006+
assoc = assocSgWalk.addr;
1007+
#else
10041008
assoc = scatterwalk_map(&assocSgWalk);
1009+
#endif
10051010
if (unlikely(IS_ERR(assoc))) {
10061011
pr_err("%s: scatterwalk_map failed: %ld\n",
10071012
crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)),
@@ -1033,8 +1038,13 @@ static int AesGcmCrypt_1(struct aead_request *req, int decrypt_p, int rfc4106_p)
10331038

10341039
if (assocmem)
10351040
free(assocmem);
1036-
else
1041+
else {
1042+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
1043+
scatterwalk_unmap(&assocSgWalk);
1044+
#else
10371045
scatterwalk_unmap(assoc);
1046+
#endif
1047+
}
10381048

10391049
if (unlikely(err)) {
10401050
pr_err("%s: %s failed: %d\n",
@@ -1184,7 +1194,12 @@ static int AesGcmCrypt_1(struct aead_request *req, int decrypt_p, int rfc4106_p)
11841194
(req->dst->length >= req->assoclen + req->cryptlen))
11851195
{
11861196
scatterwalk_start(&in_walk, req->src);
1197+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
1198+
scatterwalk_map(&in_walk);
1199+
in_map = in_walk.addr;
1200+
#else
11871201
in_map = scatterwalk_map(&in_walk);
1202+
#endif
11881203
if (unlikely(IS_ERR(in_map))) {
11891204
pr_err("%s: scatterwalk_map failed: %ld\n",
11901205
crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)),
@@ -1195,7 +1210,12 @@ static int AesGcmCrypt_1(struct aead_request *req, int decrypt_p, int rfc4106_p)
11951210
in_text = in_map + req->assoclen;
11961211

11971212
scatterwalk_start(&out_walk, req->dst);
1213+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
1214+
scatterwalk_map(&out_walk);
1215+
out_map = out_walk.addr;
1216+
#else
11981217
out_map = scatterwalk_map(&out_walk);
1218+
#endif
11991219
if (unlikely(IS_ERR(out_map))) {
12001220
pr_err("%s: scatterwalk_map failed: %ld\n",
12011221
crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)),
@@ -1281,10 +1301,20 @@ static int AesGcmCrypt_1(struct aead_request *req, int decrypt_p, int rfc4106_p)
12811301
free(sg_buf);
12821302
}
12831303
else {
1284-
if (in_map)
1304+
if (in_map) {
1305+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
1306+
scatterwalk_unmap(&in_walk);
1307+
#else
12851308
scatterwalk_unmap(in_map);
1286-
if (out_map)
1309+
#endif
1310+
}
1311+
if (out_map) {
1312+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
1313+
scatterwalk_unmap(&out_walk);
1314+
#else
12871315
scatterwalk_unmap(out_map);
1316+
#endif
1317+
}
12881318
}
12891319

12901320
km_AesFree(&aes_copy);

linuxkm/lkcapi_glue.c

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,45 @@ WC_MAYBE_UNUSED static int check_aead_driver_masking(struct crypto_aead *tfm, co
176176
#endif
177177
}
178178

179+
WC_MAYBE_UNUSED static int check_shash_driver_masking(struct crypto_shash *tfm, const char *alg_name, const char *expected_driver_name) {
180+
#ifdef LINUXKM_LKCAPI_PRIORITY_ALLOW_MASKING
181+
(void)tfm; (void)alg_name; (void)expected_driver_name;
182+
return 0;
183+
#else
184+
const char *actual_driver_name;
185+
int ret;
186+
int alloced_tfm = 0;
187+
188+
if (! tfm) {
189+
alloced_tfm = 1;
190+
tfm = crypto_alloc_shash(alg_name, 0, 0);
191+
}
192+
if (IS_ERR(tfm)) {
193+
pr_err("error: allocating shash algorithm %s failed: %ld\n",
194+
alg_name, PTR_ERR(tfm));
195+
return -EINVAL;
196+
}
197+
actual_driver_name = crypto_tfm_alg_driver_name(crypto_shash_tfm(tfm));
198+
if (strcmp(actual_driver_name, expected_driver_name)) {
199+
pr_err("error: unexpected implementation for %s: %s (expected %s)\n",
200+
alg_name, actual_driver_name, expected_driver_name);
201+
ret = -ENOENT;
202+
} else
203+
ret = 0;
204+
205+
if (alloced_tfm)
206+
crypto_free_shash(tfm);
207+
208+
return ret;
209+
#endif
210+
}
211+
179212
#ifndef NO_AES
180213
#include "lkcapi_aes_glue.c"
181214
#endif
182215

216+
#include "lkcapi_sha_glue.c"
217+
183218
#ifdef HAVE_ECC
184219
#if (defined(LINUXKM_LKCAPI_REGISTER_ALL) && !defined(LINUXKM_LKCAPI_DONT_REGISTER_ECDSA)) && \
185220
!defined(LINUXKM_LKCAPI_REGISTER_ECDSA)
@@ -350,6 +385,64 @@ static int linuxkm_lkcapi_register(void)
350385
REGISTER_ALG(ecbAesAlg, crypto_register_skcipher, linuxkm_test_aesecb);
351386
#endif
352387

388+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA1
389+
REGISTER_ALG(sha1_alg, crypto_register_shash, linuxkm_test_sha1);
390+
#endif
391+
392+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_224
393+
REGISTER_ALG(sha2_224_alg, crypto_register_shash, linuxkm_test_sha2_224);
394+
#endif
395+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_256
396+
REGISTER_ALG(sha2_256_alg, crypto_register_shash, linuxkm_test_sha2_256);
397+
#endif
398+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_384
399+
REGISTER_ALG(sha2_384_alg, crypto_register_shash, linuxkm_test_sha2_384);
400+
#endif
401+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_512
402+
REGISTER_ALG(sha2_512_alg, crypto_register_shash, linuxkm_test_sha2_512);
403+
#endif
404+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_224
405+
REGISTER_ALG(sha3_224_alg, crypto_register_shash, linuxkm_test_sha3_224);
406+
#endif
407+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_256
408+
REGISTER_ALG(sha3_256_alg, crypto_register_shash, linuxkm_test_sha3_256);
409+
#endif
410+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_384
411+
REGISTER_ALG(sha3_384_alg, crypto_register_shash, linuxkm_test_sha3_384);
412+
#endif
413+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_512
414+
REGISTER_ALG(sha3_512_alg, crypto_register_shash, linuxkm_test_sha3_512);
415+
#endif
416+
417+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA1_HMAC
418+
REGISTER_ALG(sha1_hmac_alg, crypto_register_shash, linuxkm_test_sha1_hmac);
419+
#endif
420+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_224_HMAC
421+
REGISTER_ALG(sha2_224_hmac_alg, crypto_register_shash, linuxkm_test_sha2_224_hmac);
422+
#endif
423+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_256_HMAC
424+
REGISTER_ALG(sha2_256_hmac_alg, crypto_register_shash, linuxkm_test_sha2_256_hmac);
425+
#endif
426+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_384_HMAC
427+
REGISTER_ALG(sha2_384_hmac_alg, crypto_register_shash, linuxkm_test_sha2_384_hmac);
428+
#endif
429+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_512_HMAC
430+
REGISTER_ALG(sha2_512_hmac_alg, crypto_register_shash, linuxkm_test_sha2_512_hmac);
431+
#endif
432+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_224_HMAC
433+
REGISTER_ALG(sha3_224_hmac_alg, crypto_register_shash, linuxkm_test_sha3_224_hmac);
434+
#endif
435+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_256_HMAC
436+
REGISTER_ALG(sha3_256_hmac_alg, crypto_register_shash, linuxkm_test_sha3_256_hmac);
437+
#endif
438+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_384_HMAC
439+
REGISTER_ALG(sha3_384_hmac_alg, crypto_register_shash, linuxkm_test_sha3_384_hmac);
440+
#endif
441+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_512_HMAC
442+
REGISTER_ALG(sha3_512_hmac_alg, crypto_register_shash, linuxkm_test_sha3_512_hmac);
443+
#endif
444+
445+
353446
#ifdef LINUXKM_LKCAPI_REGISTER_ECDSA
354447
#if defined(LINUXKM_ECC192)
355448
REGISTER_ALG(ecdsa_nist_p192, crypto_register_akcipher,
@@ -445,6 +538,64 @@ static void linuxkm_lkcapi_unregister(void)
445538
UNREGISTER_ALG(ecbAesAlg, crypto_unregister_skcipher);
446539
#endif
447540

541+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA1
542+
UNREGISTER_ALG(sha1_alg, crypto_unregister_shash);
543+
#endif
544+
545+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_224
546+
UNREGISTER_ALG(sha2_224_alg, crypto_unregister_shash);
547+
#endif
548+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_256
549+
UNREGISTER_ALG(sha2_256_alg, crypto_unregister_shash);
550+
#endif
551+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_384
552+
UNREGISTER_ALG(sha2_384_alg, crypto_unregister_shash);
553+
#endif
554+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_512
555+
UNREGISTER_ALG(sha2_512_alg, crypto_unregister_shash);
556+
#endif
557+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_224
558+
UNREGISTER_ALG(sha3_224_alg, crypto_unregister_shash);
559+
#endif
560+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_256
561+
UNREGISTER_ALG(sha3_256_alg, crypto_unregister_shash);
562+
#endif
563+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_384
564+
UNREGISTER_ALG(sha3_384_alg, crypto_unregister_shash);
565+
#endif
566+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_512
567+
UNREGISTER_ALG(sha3_512_alg, crypto_unregister_shash);
568+
#endif
569+
570+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA1
571+
UNREGISTER_ALG(sha1_hmac_alg, crypto_unregister_shash);
572+
#endif
573+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_224_HMAC
574+
UNREGISTER_ALG(sha2_224_hmac_alg, crypto_unregister_shash);
575+
#endif
576+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_256_HMAC
577+
UNREGISTER_ALG(sha2_256_hmac_alg, crypto_unregister_shash);
578+
#endif
579+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_384_HMAC
580+
UNREGISTER_ALG(sha2_384_hmac_alg, crypto_unregister_shash);
581+
#endif
582+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA2_512_HMAC
583+
UNREGISTER_ALG(sha2_512_hmac_alg, crypto_unregister_shash);
584+
#endif
585+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_224_HMAC
586+
UNREGISTER_ALG(sha3_224_hmac_alg, crypto_unregister_shash);
587+
#endif
588+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_256_HMAC
589+
UNREGISTER_ALG(sha3_256_hmac_alg, crypto_unregister_shash);
590+
#endif
591+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_384_HMAC
592+
UNREGISTER_ALG(sha3_384_hmac_alg, crypto_unregister_shash);
593+
#endif
594+
#ifdef LINUXKM_LKCAPI_REGISTER_SHA3_512_HMAC
595+
UNREGISTER_ALG(sha3_512_hmac_alg, crypto_unregister_shash);
596+
#endif
597+
598+
448599
#ifdef LINUXKM_LKCAPI_REGISTER_ECDSA
449600
#if defined(LINUXKM_ECC192)
450601
UNREGISTER_ALG(ecdsa_nist_p192, crypto_unregister_akcipher);

0 commit comments

Comments
 (0)