|
55 | 55 | * Key data is assigned into Dilithium key rather than copied. |
56 | 56 | * Life of key data passed in is tightly coupled to life of Dilithium key. |
57 | 57 | * Cannot be used when make key is enabled. |
| 58 | + * WOLFSSL_DILITHIUM_DYNAMIC_KEYS Default: OFF |
| 59 | + * Key buffers (public and private) are dynamically allocated on the heap |
| 60 | + * instead of being static arrays in the key struct. Buffers are right-sized |
| 61 | + * for the key's ML-DSA level and only allocated when needed (e.g. no private |
| 62 | + * key buffer for verify-only keys). Reduces memory footprint significantly. |
| 63 | + * Cannot be used with WOLFSSL_DILITHIUM_ASSIGN_KEY. |
58 | 64 | * WOLFSSL_DILITHIUM_SIGN_SMALL_MEM Default: OFF |
59 | 65 | * Compiles signature implementation that uses smaller amounts of memory but |
60 | 66 | * is considerably slower. |
@@ -218,6 +224,11 @@ void print_data(const char* name, const byte* d, int len) |
218 | 224 | #error "Cannot use assign key when making keys" |
219 | 225 | #endif |
220 | 226 |
|
| 227 | +#if defined(WOLFSSL_DILITHIUM_DYNAMIC_KEYS) && \ |
| 228 | + defined(WOLFSSL_DILITHIUM_ASSIGN_KEY) |
| 229 | + #error "Cannot use both WOLFSSL_DILITHIUM_DYNAMIC_KEYS and WOLFSSL_DILITHIUM_ASSIGN_KEY" |
| 230 | +#endif |
| 231 | + |
221 | 232 |
|
222 | 233 | /* Number of bytes from first block to use for sign. */ |
223 | 234 | #define DILITHIUM_SIGN_BYTES 8 |
@@ -7654,9 +7665,40 @@ static int dilithium_make_key_from_seed(dilithium_key* key, const byte* seed) |
7654 | 7665 | sword32* s1 = NULL; |
7655 | 7666 | sword32* s2 = NULL; |
7656 | 7667 | sword32* t = NULL; |
7657 | | - byte* pub_seed = key->k; |
| 7668 | + byte* pub_seed; |
7658 | 7669 | byte kl[2]; |
7659 | 7670 |
|
| 7671 | +#ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS |
| 7672 | + if (key->k == NULL) { |
| 7673 | + int secSz = wc_dilithium_size(key); |
| 7674 | + #ifdef USE_INTEL_SPEEDUP |
| 7675 | + key->k = (byte*)XMALLOC((word32)secSz + 8, key->heap, |
| 7676 | + DYNAMIC_TYPE_DILITHIUM); |
| 7677 | + #else |
| 7678 | + key->k = (byte*)XMALLOC((word32)secSz, key->heap, |
| 7679 | + DYNAMIC_TYPE_DILITHIUM); |
| 7680 | + #endif |
| 7681 | + if (key->k == NULL) { |
| 7682 | + ret = MEMORY_E; |
| 7683 | + } |
| 7684 | + } |
| 7685 | + if ((ret == 0) && (key->p == NULL)) { |
| 7686 | + int pubSz = wc_dilithium_pub_size(key); |
| 7687 | + #ifdef USE_INTEL_SPEEDUP |
| 7688 | + key->p = (byte*)XMALLOC((word32)pubSz + 8, key->heap, |
| 7689 | + DYNAMIC_TYPE_DILITHIUM); |
| 7690 | + #else |
| 7691 | + key->p = (byte*)XMALLOC((word32)pubSz, key->heap, |
| 7692 | + DYNAMIC_TYPE_DILITHIUM); |
| 7693 | + #endif |
| 7694 | + if (key->p == NULL) { |
| 7695 | + ret = MEMORY_E; |
| 7696 | + } |
| 7697 | + } |
| 7698 | +#endif |
| 7699 | + |
| 7700 | + pub_seed = key->k; |
| 7701 | + |
7660 | 7702 | /* Allocate memory for large intermediates. */ |
7661 | 7703 | #ifdef WC_DILITHIUM_CACHE_MATRIX_A |
7662 | 7704 | #ifndef WC_DILITHIUM_FIXED_ARRAY |
@@ -7818,11 +7860,42 @@ static int dilithium_make_key_from_seed(dilithium_key* key, const byte* seed) |
7818 | 7860 | sword64* t64 = NULL; |
7819 | 7861 | #endif |
7820 | 7862 | byte* h = NULL; |
7821 | | - byte* pub_seed = key->k; |
| 7863 | + byte* pub_seed; |
7822 | 7864 | unsigned int r; |
7823 | 7865 | unsigned int s; |
7824 | 7866 | byte kl[2]; |
7825 | 7867 |
|
| 7868 | +#ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS |
| 7869 | + if (key->k == NULL) { |
| 7870 | + int secSz = wc_dilithium_size(key); |
| 7871 | + #ifdef USE_INTEL_SPEEDUP |
| 7872 | + key->k = (byte*)XMALLOC((word32)secSz + 8, key->heap, |
| 7873 | + DYNAMIC_TYPE_DILITHIUM); |
| 7874 | + #else |
| 7875 | + key->k = (byte*)XMALLOC((word32)secSz, key->heap, |
| 7876 | + DYNAMIC_TYPE_DILITHIUM); |
| 7877 | + #endif |
| 7878 | + if (key->k == NULL) { |
| 7879 | + ret = MEMORY_E; |
| 7880 | + } |
| 7881 | + } |
| 7882 | + if ((ret == 0) && (key->p == NULL)) { |
| 7883 | + int pubSz = wc_dilithium_pub_size(key); |
| 7884 | + #ifdef USE_INTEL_SPEEDUP |
| 7885 | + key->p = (byte*)XMALLOC((word32)pubSz + 8, key->heap, |
| 7886 | + DYNAMIC_TYPE_DILITHIUM); |
| 7887 | + #else |
| 7888 | + key->p = (byte*)XMALLOC((word32)pubSz, key->heap, |
| 7889 | + DYNAMIC_TYPE_DILITHIUM); |
| 7890 | + #endif |
| 7891 | + if (key->p == NULL) { |
| 7892 | + ret = MEMORY_E; |
| 7893 | + } |
| 7894 | + } |
| 7895 | +#endif |
| 7896 | + |
| 7897 | + pub_seed = key->k; |
| 7898 | + |
7826 | 7899 | /* Allocate memory for large intermediates. */ |
7827 | 7900 | if (ret == 0) { |
7828 | 7901 | unsigned int allocSz; |
@@ -10000,6 +10073,26 @@ static int oqs_dilithium_make_key(dilithium_key* key, WC_RNG* rng) |
10000 | 10073 | ret = SIG_TYPE_E; |
10001 | 10074 | } |
10002 | 10075 |
|
| 10076 | + |
| 10077 | +#ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS |
| 10078 | + if ((ret == 0) && (key->k == NULL)) { |
| 10079 | + int secSz = wc_dilithium_size(key); |
| 10080 | + key->k = (byte*)XMALLOC((word32)secSz, key->heap, |
| 10081 | + DYNAMIC_TYPE_DILITHIUM); |
| 10082 | + if (key->k == NULL) { |
| 10083 | + ret = MEMORY_E; |
| 10084 | + } |
| 10085 | + } |
| 10086 | + if ((ret == 0) && (key->p == NULL)) { |
| 10087 | + int pubSz = wc_dilithium_pub_size(key); |
| 10088 | + key->p = (byte*)XMALLOC((word32)pubSz, key->heap, |
| 10089 | + DYNAMIC_TYPE_DILITHIUM); |
| 10090 | + if (key->p == NULL) { |
| 10091 | + ret = MEMORY_E; |
| 10092 | + } |
| 10093 | + } |
| 10094 | +#endif |
| 10095 | + |
10003 | 10096 | if (ret == 0) { |
10004 | 10097 | ret = wolfSSL_liboqsRngMutexLock(rng); |
10005 | 10098 | if (ret == 0) { |
@@ -10921,6 +11014,18 @@ int wc_dilithium_set_level(dilithium_key* key, byte level) |
10921 | 11014 | #endif |
10922 | 11015 | #endif /* WOLFSSL_WC_DILITHIUM */ |
10923 | 11016 |
|
| 11017 | +#ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS |
| 11018 | + if (key->k != NULL) { |
| 11019 | + ForceZero(key->k, (word32)wc_dilithium_size(key)); |
| 11020 | + XFREE(key->k, key->heap, DYNAMIC_TYPE_DILITHIUM); |
| 11021 | + key->k = NULL; |
| 11022 | + } |
| 11023 | + if (key->p != NULL) { |
| 11024 | + XFREE(key->p, key->heap, DYNAMIC_TYPE_DILITHIUM); |
| 11025 | + key->p = NULL; |
| 11026 | + } |
| 11027 | +#endif |
| 11028 | + |
10924 | 11029 | /* Store level and indicate public and private key are not set. */ |
10925 | 11030 | key->level = level % WC_ML_DSA_DRAFT; |
10926 | 11031 | key->pubKeySet = 0; |
@@ -10998,6 +11103,15 @@ void wc_dilithium_free(dilithium_key* key) |
10998 | 11103 | /* Free the SHAKE-128/256 object. */ |
10999 | 11104 | wc_Shake256_Free(&key->shake); |
11000 | 11105 | #endif |
| 11106 | +#endif |
| 11107 | +#ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS |
| 11108 | + if (key->k != NULL) { |
| 11109 | + ForceZero(key->k, (word32)wc_dilithium_size(key)); |
| 11110 | + XFREE(key->k, key->heap, DYNAMIC_TYPE_DILITHIUM); |
| 11111 | + } |
| 11112 | + if (key->p != NULL) { |
| 11113 | + XFREE(key->p, key->heap, DYNAMIC_TYPE_DILITHIUM); |
| 11114 | + } |
11001 | 11115 | #endif |
11002 | 11116 | /* Ensure all private data is zeroized. */ |
11003 | 11117 | ForceZero(key, sizeof(*key)); |
@@ -11560,12 +11674,28 @@ int wc_dilithium_import_public(const byte* in, word32 inLen, dilithium_key* key) |
11560 | 11674 | } |
11561 | 11675 | } |
11562 | 11676 |
|
| 11677 | + |
| 11678 | +#ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS |
| 11679 | + if ((ret == 0) && (key->p == NULL)) { |
| 11680 | + #ifdef USE_INTEL_SPEEDUP |
| 11681 | + key->p = (byte*)XMALLOC((word32)inLen + 8, key->heap, |
| 11682 | + DYNAMIC_TYPE_DILITHIUM); |
| 11683 | + #else |
| 11684 | + key->p = (byte*)XMALLOC((word32)inLen, key->heap, |
| 11685 | + DYNAMIC_TYPE_DILITHIUM); |
| 11686 | + #endif |
| 11687 | + if (key->p == NULL) { |
| 11688 | + ret = MEMORY_E; |
| 11689 | + } |
| 11690 | + } |
| 11691 | +#endif |
| 11692 | + |
11563 | 11693 | if (ret == 0) { |
11564 | 11694 | /* Copy the private key data in or copy pointer. */ |
11565 | | - #ifndef WOLFSSL_DILITHIUM_ASSIGN_KEY |
11566 | | - XMEMCPY(key->p, in, inLen); |
11567 | | - #else |
| 11695 | + #ifdef WOLFSSL_DILITHIUM_ASSIGN_KEY |
11568 | 11696 | key->p = in; |
| 11697 | + #else |
| 11698 | + XMEMCPY(key->p, in, inLen); |
11569 | 11699 | #endif |
11570 | 11700 |
|
11571 | 11701 | #ifdef WC_DILITHIUM_CACHE_PUB_VECTORS |
@@ -11648,12 +11778,27 @@ static int dilithium_set_priv_key(const byte* priv, word32 privSz, |
11648 | 11778 | ret = BAD_FUNC_ARG; |
11649 | 11779 | } |
11650 | 11780 |
|
| 11781 | + |
| 11782 | +#ifdef WOLFSSL_DILITHIUM_DYNAMIC_KEYS |
| 11783 | + if ((ret == 0) && (key->k == NULL)) { |
| 11784 | + #ifdef USE_INTEL_SPEEDUP |
| 11785 | + key->k = (byte*)XMALLOC(privSz + 8, key->heap, |
| 11786 | + DYNAMIC_TYPE_DILITHIUM); |
| 11787 | + #else |
| 11788 | + key->k = (byte*)XMALLOC(privSz, key->heap, DYNAMIC_TYPE_DILITHIUM); |
| 11789 | + #endif |
| 11790 | + if (key->k == NULL) { |
| 11791 | + ret = MEMORY_E; |
| 11792 | + } |
| 11793 | + } |
| 11794 | +#endif |
| 11795 | + |
11651 | 11796 | if (ret == 0) { |
11652 | 11797 | /* Copy the private key data in or copy pointer. */ |
11653 | | - #ifndef WOLFSSL_DILITHIUM_ASSIGN_KEY |
11654 | | - XMEMCPY(key->k, priv, privSz); |
11655 | | - #else |
| 11798 | + #ifdef WOLFSSL_DILITHIUM_ASSIGN_KEY |
11656 | 11799 | key->k = priv; |
| 11800 | + #else |
| 11801 | + XMEMCPY(key->k, priv, privSz); |
11657 | 11802 | #endif |
11658 | 11803 | } |
11659 | 11804 |
|
|
0 commit comments