diff options
author | Eneas U de Queiroz <cotequeiroz@gmail.com> | 2019-08-05 14:45:41 -0300 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2019-08-17 17:23:17 +0200 |
commit | 2df2b75208dce06dee02508c8d589fc5f540023d (patch) | |
tree | 6ffd3d40a1af5a5f4cd19e2d3b8dda5739714864 /package/libs/wolfssl/patches/020-Improve-nonce-use-in-ECC-mulmod.patch | |
parent | 09bdc144197fe656f16d691d649ae08b36b4b126 (diff) | |
download | upstream-2df2b75208dce06dee02508c8d589fc5f540023d.tar.gz upstream-2df2b75208dce06dee02508c8d589fc5f540023d.tar.bz2 upstream-2df2b75208dce06dee02508c8d589fc5f540023d.zip |
wolfssl: fixes for CVE-2018-16870 & CVE-2019-13628
CVE-2018-16870: medium-severity, new variant of the Bleichenbacher
attack to perform downgrade attacks against TLS, which may lead to
leakage of sensible data. Backported from 3.15.7.
CVE-2019-13628 (currently assigned-only): potential leak of nonce sizes
when performing ECDSA signing operations. The leak is considered to be
difficult to exploit but it could potentially be used maliciously to
perform a lattice based timing attack. Backported from 4.1.0.
Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
Diffstat (limited to 'package/libs/wolfssl/patches/020-Improve-nonce-use-in-ECC-mulmod.patch')
-rw-r--r-- | package/libs/wolfssl/patches/020-Improve-nonce-use-in-ECC-mulmod.patch | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/package/libs/wolfssl/patches/020-Improve-nonce-use-in-ECC-mulmod.patch b/package/libs/wolfssl/patches/020-Improve-nonce-use-in-ECC-mulmod.patch new file mode 100644 index 0000000000..28ef4e48ad --- /dev/null +++ b/package/libs/wolfssl/patches/020-Improve-nonce-use-in-ECC-mulmod.patch @@ -0,0 +1,98 @@ +From ba4d612892bf6e3aae9cca7edce2a6d6b43e3e22 Mon Sep 17 00:00:00 2001 +From: Sean Parkinson <sean@wolfssl.com> +Date: Wed, 17 Jul 2019 08:26:02 +1000 +Subject: [PATCH] Improve nonce use in ECC mulmod + +(cherry picked from commit 483f6a5acd9808b405306661c121aa6407464dc2) + +--- a/wolfcrypt/src/ecc.c ++++ b/wolfcrypt/src/ecc.c +@@ -2039,7 +2039,7 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_poin + #define M_POINTS 8 + int first = 1, bitbuf = 0, bitcpy = 0, j; + #else +- #define M_POINTS 3 ++ #define M_POINTS 4 + #endif + + ecc_point *tG, *M[M_POINTS]; +@@ -2253,7 +2253,9 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_poin + mode = 0; + bitcnt = 1; + buf = 0; +- digidx = get_digit_count(k) - 1; ++ digidx = get_digit_count(modulus) - 1; ++ /* The order MAY be 1 bit longer than the modulus. */ ++ digidx += (modulus->dp[digidx] >> (DIGIT_BIT-1)); + + /* perform ops */ + if (err == MP_OKAY) { +@@ -2272,25 +2274,53 @@ int wc_ecc_mulmod_ex(mp_int* k, ecc_poin + i = (buf >> (DIGIT_BIT - 1)) & 1; + buf <<= 1; + +- if (mode == 0 && i == 0) { ++ if (mode == 0) { ++ mode = i; + /* timing resistant - dummy operations */ + if (err == MP_OKAY) +- err = ecc_projective_add_point(M[0], M[1], M[2], a, modulus, ++ err = ecc_projective_add_point(M[1], M[2], M[2], a, modulus, + mp); ++#ifdef WC_NO_CACHE_RESISTANT + if (err == MP_OKAY) +- err = ecc_projective_dbl_point(M[1], M[2], a, modulus, mp); +- if (err == MP_OKAY) +- continue; +- } +- +- if (mode == 0 && i == 1) { +- mode = 1; +- /* timing resistant - dummy operations */ +- if (err == MP_OKAY) +- err = ecc_projective_add_point(M[0], M[1], M[2], a, modulus, +- mp); +- if (err == MP_OKAY) +- err = ecc_projective_dbl_point(M[1], M[2], a, modulus, mp); ++ err = ecc_projective_dbl_point(M[2], M[3], a, modulus, mp); ++#else ++ /* instead of using M[i] for double, which leaks key bit to cache ++ * monitor, use M[2] as temp, make sure address calc is constant, ++ * keep M[0] and M[1] in cache */ ++ if (err == MP_OKAY) ++ err = mp_copy((mp_int*) ++ ( ((wolfssl_word)M[0]->x & wc_off_on_addr[i^1]) + ++ ((wolfssl_word)M[1]->x & wc_off_on_addr[i])), ++ M[2]->x); ++ if (err == MP_OKAY) ++ err = mp_copy((mp_int*) ++ ( ((wolfssl_word)M[0]->y & wc_off_on_addr[i^1]) + ++ ((wolfssl_word)M[1]->y & wc_off_on_addr[i])), ++ M[2]->y); ++ if (err == MP_OKAY) ++ err = mp_copy((mp_int*) ++ ( ((wolfssl_word)M[0]->z & wc_off_on_addr[i^1]) + ++ ((wolfssl_word)M[1]->z & wc_off_on_addr[i])), ++ M[2]->z); ++ if (err == MP_OKAY) ++ err = ecc_projective_dbl_point(M[2], M[3], a, modulus, mp); ++ /* copy M[2] back to M[i] */ ++ if (err == MP_OKAY) ++ err = mp_copy(M[2]->x, ++ (mp_int*) ++ ( ((wolfssl_word)M[0]->x & wc_off_on_addr[i^1]) + ++ ((wolfssl_word)M[1]->x & wc_off_on_addr[i])) ); ++ if (err == MP_OKAY) ++ err = mp_copy(M[2]->y, ++ (mp_int*) ++ ( ((wolfssl_word)M[0]->y & wc_off_on_addr[i^1]) + ++ ((wolfssl_word)M[1]->y & wc_off_on_addr[i])) ); ++ if (err == MP_OKAY) ++ err = mp_copy(M[2]->z, ++ (mp_int*) ++ ( ((wolfssl_word)M[0]->z & wc_off_on_addr[i^1]) + ++ ((wolfssl_word)M[1]->z & wc_off_on_addr[i])) ); ++#endif + if (err == MP_OKAY) + continue; + } |