diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2020-09-04 23:57:27 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2020-09-04 23:57:27 +0700 |
commit | 86a4479929bd5f3fa5ce2cabfe6a4ebb53944df4 (patch) | |
tree | 2610425aacd90c6153402495afa3ea84077c741c /crypto/src/util/Integers.cs | |
parent | Remove unnecessary locking (diff) | |
download | BouncyCastle.NET-ed25519-86a4479929bd5f3fa5ce2cabfe6a4ebb53944df4.tar.xz |
'safegcd' modular inversion
Diffstat (limited to 'crypto/src/util/Integers.cs')
-rw-r--r-- | crypto/src/util/Integers.cs | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/crypto/src/util/Integers.cs b/crypto/src/util/Integers.cs index afb4b827f..7d98de586 100644 --- a/crypto/src/util/Integers.cs +++ b/crypto/src/util/Integers.cs @@ -4,6 +4,11 @@ namespace Org.BouncyCastle.Utilities { public abstract class Integers { + private static readonly byte[] DeBruijnTZ = { + 0x00, 0x01, 0x02, 0x18, 0x03, 0x13, 0x06, 0x19, 0x16, 0x04, 0x14, 0x0A, + 0x10, 0x07, 0x0C, 0x1A, 0x1F, 0x17, 0x12, 0x05, 0x15, 0x09, 0x0F, 0x0B, + 0x1E, 0x11, 0x08, 0x0E, 0x1D, 0x0D, 0x1C, 0x1B }; + public static int NumberOfLeadingZeros(int i) { if (i <= 0) @@ -21,16 +26,7 @@ namespace Org.BouncyCastle.Utilities public static int NumberOfTrailingZeros(int i) { - if (i == 0) - return 32; - - int count = 0; - while ((i & 1) == 0) - { - i >>= 1; - ++count; - } - return count; + return DeBruijnTZ[(uint)((i & -i) * 0x04D7651F) >> 27]; } public static int RotateLeft(int i, int distance) |