diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2022-11-27 23:03:19 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2022-11-27 23:03:19 +0700 |
commit | 739c0024b2677dcf16cac9c268a2124de47e8efb (patch) | |
tree | b8308ef9185ed1442a824c94313eed1fb3b1cea8 | |
parent | Refactoring in Math.EC.Rfc8032 (diff) | |
download | BouncyCastle.NET-ed25519-739c0024b2677dcf16cac9c268a2124de47e8efb.tar.xz |
EdDSA: match API to bc-java
-rw-r--r-- | crypto/src/crypto/parameters/Ed25519PrivateKeyParameters.cs | 5 | ||||
-rw-r--r-- | crypto/src/crypto/parameters/Ed25519PublicKeyParameters.cs | 26 | ||||
-rw-r--r-- | crypto/src/crypto/parameters/Ed448PrivateKeyParameters.cs | 5 | ||||
-rw-r--r-- | crypto/src/crypto/parameters/Ed448PublicKeyParameters.cs | 26 | ||||
-rw-r--r-- | crypto/src/math/ec/rfc8032/Ed25519.cs | 110 | ||||
-rw-r--r-- | crypto/src/math/ec/rfc8032/Ed448.cs | 110 | ||||
-rw-r--r-- | crypto/test/src/math/ec/rfc8032/test/Ed25519Test.cs | 6 | ||||
-rw-r--r-- | crypto/test/src/math/ec/rfc8032/test/Ed448Test.cs | 4 |
8 files changed, 139 insertions, 153 deletions
diff --git a/crypto/src/crypto/parameters/Ed25519PrivateKeyParameters.cs b/crypto/src/crypto/parameters/Ed25519PrivateKeyParameters.cs index 161dedb6d..6d2e44937 100644 --- a/crypto/src/crypto/parameters/Ed25519PrivateKeyParameters.cs +++ b/crypto/src/crypto/parameters/Ed25519PrivateKeyParameters.cs @@ -77,11 +77,10 @@ namespace Org.BouncyCastle.Crypto.Parameters if (null == cachedPublicKey) { #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - Ed25519.GeneratePublicKey(data, out var publicPoint); + cachedPublicKey = new Ed25519PublicKeyParameters(Ed25519.GeneratePublicKey(data)); #else - Ed25519.GeneratePublicKey(data, 0, out var publicPoint); + cachedPublicKey = new Ed25519PublicKeyParameters(Ed25519.GeneratePublicKey(data, 0)); #endif - cachedPublicKey = new Ed25519PublicKeyParameters(publicPoint); } return cachedPublicKey; diff --git a/crypto/src/crypto/parameters/Ed25519PublicKeyParameters.cs b/crypto/src/crypto/parameters/Ed25519PublicKeyParameters.cs index 57c63e624..8a89a2db2 100644 --- a/crypto/src/crypto/parameters/Ed25519PublicKeyParameters.cs +++ b/crypto/src/crypto/parameters/Ed25519PublicKeyParameters.cs @@ -21,8 +21,7 @@ namespace Org.BouncyCastle.Crypto.Parameters public Ed25519PublicKeyParameters(byte[] buf, int off) : base(false) { - if (!Ed25519.ValidatePublicKeyPartial(buf, off, out m_publicPoint)) - throw new ArgumentException("invalid public key"); + m_publicPoint = Parse(buf, off); } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER @@ -32,8 +31,7 @@ namespace Org.BouncyCastle.Crypto.Parameters if (buf.Length != KeySize) throw new ArgumentException("must have length " + KeySize, nameof(buf)); - if (!Ed25519.ValidatePublicKeyPartial(buf, out m_publicPoint)) - throw new ArgumentException("invalid public key"); + m_publicPoint = Parse(buf); } #endif @@ -50,11 +48,9 @@ namespace Org.BouncyCastle.Crypto.Parameters throw new EndOfStreamException("EOF encountered in middle of Ed25519 public key"); #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - if (!Ed25519.ValidatePublicKeyPartial(data, out m_publicPoint)) - throw new ArgumentException("invalid public key"); + m_publicPoint = Parse(data); #else - if (!Ed25519.ValidatePublicKeyPartial(data, 0, out m_publicPoint)) - throw new ArgumentException("invalid public key"); + m_publicPoint = Parse(data, 0); #endif } @@ -122,6 +118,20 @@ namespace Org.BouncyCastle.Crypto.Parameters } } + private static Ed25519.PublicPoint Parse(byte[] buf, int off) + { + return Ed25519.ValidatePublicKeyPartialExport(buf, off) + ?? throw new ArgumentException("invalid public key"); + } + +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + private static Ed25519.PublicPoint Parse(ReadOnlySpan<byte> buf) + { + return Ed25519.ValidatePublicKeyPartialExport(buf) + ?? throw new ArgumentException("invalid public key"); + } +#endif + private static byte[] Validate(byte[] buf) { if (buf.Length != KeySize) diff --git a/crypto/src/crypto/parameters/Ed448PrivateKeyParameters.cs b/crypto/src/crypto/parameters/Ed448PrivateKeyParameters.cs index b80b68529..a9d1d0e93 100644 --- a/crypto/src/crypto/parameters/Ed448PrivateKeyParameters.cs +++ b/crypto/src/crypto/parameters/Ed448PrivateKeyParameters.cs @@ -77,11 +77,10 @@ namespace Org.BouncyCastle.Crypto.Parameters if (null == cachedPublicKey) { #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - Ed448.GeneratePublicKey(data, out var publicPoint); + cachedPublicKey = new Ed448PublicKeyParameters(Ed448.GeneratePublicKey(data)); #else - Ed448.GeneratePublicKey(data, 0, out var publicPoint); + cachedPublicKey = new Ed448PublicKeyParameters(Ed448.GeneratePublicKey(data, 0)); #endif - cachedPublicKey = new Ed448PublicKeyParameters(publicPoint); } return cachedPublicKey; diff --git a/crypto/src/crypto/parameters/Ed448PublicKeyParameters.cs b/crypto/src/crypto/parameters/Ed448PublicKeyParameters.cs index 0f07fa783..cf165751a 100644 --- a/crypto/src/crypto/parameters/Ed448PublicKeyParameters.cs +++ b/crypto/src/crypto/parameters/Ed448PublicKeyParameters.cs @@ -21,8 +21,7 @@ namespace Org.BouncyCastle.Crypto.Parameters public Ed448PublicKeyParameters(byte[] buf, int off) : base(false) { - if (!Ed448.ValidatePublicKeyPartial(buf, off, out m_publicPoint)) - throw new ArgumentException("invalid public key"); + m_publicPoint = Parse(buf, off); } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER @@ -32,8 +31,7 @@ namespace Org.BouncyCastle.Crypto.Parameters if (buf.Length != KeySize) throw new ArgumentException("must have length " + KeySize, nameof(buf)); - if (!Ed448.ValidatePublicKeyPartial(buf, out m_publicPoint)) - throw new ArgumentException("invalid public key"); + m_publicPoint = Parse(buf); } #endif @@ -50,11 +48,9 @@ namespace Org.BouncyCastle.Crypto.Parameters throw new EndOfStreamException("EOF encountered in middle of Ed448 public key"); #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - if (!Ed448.ValidatePublicKeyPartial(data, out m_publicPoint)) - throw new ArgumentException("invalid public key"); + m_publicPoint = Parse(data); #else - if (!Ed448.ValidatePublicKeyPartial(data, 0, out m_publicPoint)) - throw new ArgumentException("invalid public key"); + m_publicPoint = Parse(data, 0); #endif } @@ -115,6 +111,20 @@ namespace Org.BouncyCastle.Crypto.Parameters } } + private static Ed448.PublicPoint Parse(byte[] buf, int off) + { + return Ed448.ValidatePublicKeyPartialExport(buf, off) + ?? throw new ArgumentException("invalid public key"); + } + +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + private static Ed448.PublicPoint Parse(ReadOnlySpan<byte> buf) + { + return Ed448.ValidatePublicKeyPartialExport(buf) + ?? throw new ArgumentException("invalid public key"); + } +#endif + private static byte[] Validate(byte[] buf) { if (buf.Length != KeySize) diff --git a/crypto/src/math/ec/rfc8032/Ed25519.cs b/crypto/src/math/ec/rfc8032/Ed25519.cs index cde61b621..d5b035734 100644 --- a/crypto/src/math/ec/rfc8032/Ed25519.cs +++ b/crypto/src/math/ec/rfc8032/Ed25519.cs @@ -442,13 +442,13 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 } #endif - private static void ExportPoint(ref PointAffine p, out PublicPoint publicPoint) + private static PublicPoint ExportPoint(ref PointAffine p) { int[] data = new int[F.Size * 2]; F.Copy(p.x, 0, data, 0); F.Copy(p.y, 0, data, F.Size); - publicPoint = new PublicPoint(data); + return new PublicPoint(data); } public static void GeneratePrivateKey(SecureRandom random, byte[] k) @@ -503,10 +503,10 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 } #endif - public static void GeneratePublicKey(byte[] sk, int skOff, out PublicPoint publicPoint) + public static PublicPoint GeneratePublicKey(byte[] sk, int skOff) { #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - GeneratePublicKey(sk.AsSpan(skOff), out publicPoint); + return GeneratePublicKey(sk.AsSpan(skOff)); #else IDigest d = CreateDigest(); byte[] h = new byte[64]; @@ -526,12 +526,12 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 if (0 == CheckPoint(ref q)) throw new InvalidOperationException(); - ExportPoint(ref q, out publicPoint); + return ExportPoint(ref q); #endif } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - public static void GeneratePublicKey(ReadOnlySpan<byte> sk, out PublicPoint publicPoint) + public static PublicPoint GeneratePublicKey(ReadOnlySpan<byte> sk) { IDigest d = CreateDigest(); Span<byte> h = stackalloc byte[64]; @@ -551,7 +551,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 if (0 == CheckPoint(ref q)) throw new InvalidOperationException(); - ExportPoint(ref q, out publicPoint); + return ExportPoint(ref q); } #endif @@ -1865,52 +1865,44 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 } #endif - public static bool ValidatePublicKeyFull(byte[] pk, int pkOff, out PublicPoint publicPoint) + public static PublicPoint ValidatePublicKeyFullExport(byte[] pk, int pkOff) { #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - return ValidatePublicKeyFull(pk.AsSpan(pkOff), out publicPoint); + return ValidatePublicKeyFullExport(pk.AsSpan(pkOff)); #else byte[] A = Copy(pk, pkOff, PublicKeySize); - if (CheckPointFullVar(A)) - { - Init(out PointAffine pA); - if (DecodePointVar(A, false, ref pA)) - { - if (CheckPointOrderVar(ref pA)) - { - ExportPoint(ref pA, out publicPoint); - return true; - } - } - } + if (!CheckPointFullVar(A)) + return null; - publicPoint = null; - return false; + Init(out PointAffine pA); + if (!DecodePointVar(A, false, ref pA)) + return null; + + if (!CheckPointOrderVar(ref pA)) + return null; + + return ExportPoint(ref pA); #endif } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - public static bool ValidatePublicKeyFull(ReadOnlySpan<byte> pk, out PublicPoint publicPoint) + public static PublicPoint ValidatePublicKeyFullExport(ReadOnlySpan<byte> pk) { Span<byte> A = stackalloc byte[PublicKeySize]; A.CopyFrom(pk); - if (CheckPointFullVar(A)) - { - Init(out PointAffine pA); - if (DecodePointVar(A, false, ref pA)) - { - if (CheckPointOrderVar(ref pA)) - { - ExportPoint(ref pA, out publicPoint); - return true; - } - } - } + if (!CheckPointFullVar(A)) + return null; - publicPoint = null; - return false; + Init(out PointAffine pA); + if (!DecodePointVar(A, false, ref pA)) + return null; + + if (!CheckPointOrderVar(ref pA)) + return null; + + return ExportPoint(ref pA); } #endif @@ -1943,46 +1935,38 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 } #endif - public static bool ValidatePublicKeyPartial(byte[] pk, int pkOff, out PublicPoint publicPoint) + public static PublicPoint ValidatePublicKeyPartialExport(byte[] pk, int pkOff) { #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - return ValidatePublicKeyPartial(pk.AsSpan(pkOff), out publicPoint); + return ValidatePublicKeyPartialExport(pk.AsSpan(pkOff)); #else byte[] A = Copy(pk, pkOff, PublicKeySize); - if (CheckPointFullVar(A)) - { - Init(out PointAffine pA); - if (DecodePointVar(A, false, ref pA)) - { - ExportPoint(ref pA, out publicPoint); - return true; - } - } + if (!CheckPointFullVar(A)) + return null; - publicPoint = null; - return false; + Init(out PointAffine pA); + if (!DecodePointVar(A, false, ref pA)) + return null; + + return ExportPoint(ref pA); #endif } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - public static bool ValidatePublicKeyPartial(ReadOnlySpan<byte> pk, out PublicPoint publicPoint) + public static PublicPoint ValidatePublicKeyPartialExport(ReadOnlySpan<byte> pk) { Span<byte> A = stackalloc byte[PublicKeySize]; A.CopyFrom(pk); - if (CheckPointFullVar(A)) - { - Init(out PointAffine pA); - if (DecodePointVar(A, false, ref pA)) - { - ExportPoint(ref pA, out publicPoint); - return true; - } - } + if (!CheckPointFullVar(A)) + return null; - publicPoint = null; - return false; + Init(out PointAffine pA); + if (!DecodePointVar(A, false, ref pA)) + return null; + + return ExportPoint(ref pA); } #endif diff --git a/crypto/src/math/ec/rfc8032/Ed448.cs b/crypto/src/math/ec/rfc8032/Ed448.cs index c592fcdcc..22fe79960 100644 --- a/crypto/src/math/ec/rfc8032/Ed448.cs +++ b/crypto/src/math/ec/rfc8032/Ed448.cs @@ -414,13 +414,13 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 } #endif - private static void ExportPoint(ref PointAffine p, out PublicPoint publicPoint) + private static PublicPoint ExportPoint(ref PointAffine p) { uint[] data = new uint[F.Size * 2]; F.Copy(p.x, 0, data, 0); F.Copy(p.y, 0, data, F.Size); - publicPoint = new PublicPoint(data); + return new PublicPoint(data); } public static void GeneratePrivateKey(SecureRandom random, byte[] k) @@ -475,10 +475,10 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 } #endif - public static void GeneratePublicKey(byte[] sk, int skOff, out PublicPoint publicPoint) + public static PublicPoint GeneratePublicKey(byte[] sk, int skOff) { #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - GeneratePublicKey(sk.AsSpan(skOff), out publicPoint); + return GeneratePublicKey(sk.AsSpan(skOff)); #else IXof d = CreateXof(); byte[] h = new byte[ScalarBytes * 2]; @@ -498,12 +498,12 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 if (0 == CheckPoint(ref q)) throw new InvalidOperationException(); - ExportPoint(ref q, out publicPoint); + return ExportPoint(ref q); #endif } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - public static void GeneratePublicKey(ReadOnlySpan<byte> sk, out PublicPoint publicPoint) + public static PublicPoint GeneratePublicKey(ReadOnlySpan<byte> sk) { IXof d = CreateXof(); Span<byte> h = stackalloc byte[ScalarBytes * 2]; @@ -523,7 +523,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 if (0 == CheckPoint(ref q)) throw new InvalidOperationException(); - ExportPoint(ref q, out publicPoint); + return ExportPoint(ref q); } #endif @@ -1714,52 +1714,44 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 } #endif - public static bool ValidatePublicKeyFull(byte[] pk, int pkOff, out PublicPoint publicPoint) + public static PublicPoint ValidatePublicKeyFullExport(byte[] pk, int pkOff) { #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - return ValidatePublicKeyFull(pk.AsSpan(pkOff), out publicPoint); + return ValidatePublicKeyFullExport(pk.AsSpan(pkOff)); #else byte[] A = Copy(pk, pkOff, PublicKeySize); - if (CheckPointFullVar(A)) - { - Init(out PointAffine pA); - if (DecodePointVar(A, false, ref pA)) - { - if (CheckPointOrderVar(ref pA)) - { - ExportPoint(ref pA, out publicPoint); - return true; - } - } - } + if (!CheckPointFullVar(A)) + return null; - publicPoint = null; - return false; + Init(out PointAffine pA); + if (!DecodePointVar(A, false, ref pA)) + return null; + + if (!CheckPointOrderVar(ref pA)) + return null; + + return ExportPoint(ref pA); #endif } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - public static bool ValidatePublicKeyFull(ReadOnlySpan<byte> pk, out PublicPoint publicPoint) + public static PublicPoint ValidatePublicKeyFullExport(ReadOnlySpan<byte> pk) { Span<byte> A = stackalloc byte[PublicKeySize]; A.CopyFrom(pk); - if (CheckPointFullVar(A)) - { - Init(out PointAffine pA); - if (DecodePointVar(A, false, ref pA)) - { - if (CheckPointOrderVar(ref pA)) - { - ExportPoint(ref pA, out publicPoint); - return true; - } - } - } + if (!CheckPointFullVar(A)) + return null; - publicPoint = null; - return false; + Init(out PointAffine pA); + if (!DecodePointVar(A, false, ref pA)) + return null; + + if (!CheckPointOrderVar(ref pA)) + return null; + + return ExportPoint(ref pA); } #endif @@ -1792,46 +1784,38 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032 } #endif - public static bool ValidatePublicKeyPartial(byte[] pk, int pkOff, out PublicPoint publicPoint) + public static PublicPoint ValidatePublicKeyPartialExport(byte[] pk, int pkOff) { #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - return ValidatePublicKeyPartial(pk.AsSpan(pkOff), out publicPoint); + return ValidatePublicKeyPartialExport(pk.AsSpan(pkOff)); #else byte[] A = Copy(pk, pkOff, PublicKeySize); - if (CheckPointFullVar(A)) - { - Init(out PointAffine pA); - if (DecodePointVar(A, false, ref pA)) - { - ExportPoint(ref pA, out publicPoint); - return true; - } - } + if (!CheckPointFullVar(A)) + return null; - publicPoint = null; - return false; + Init(out PointAffine pA); + if (!DecodePointVar(A, false, ref pA)) + return null; + + return ExportPoint(ref pA); #endif } #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - public static bool ValidatePublicKeyPartial(ReadOnlySpan<byte> pk, out PublicPoint publicPoint) + public static PublicPoint ValidatePublicKeyPartialExport(ReadOnlySpan<byte> pk) { Span<byte> A = stackalloc byte[PublicKeySize]; A.CopyFrom(pk); - if (CheckPointFullVar(A)) - { - Init(out PointAffine pA); - if (DecodePointVar(A, false, ref pA)) - { - ExportPoint(ref pA, out publicPoint); - return true; - } - } + if (!CheckPointFullVar(A)) + return null; - publicPoint = null; - return false; + Init(out PointAffine pA); + if (!DecodePointVar(A, false, ref pA)) + return null; + + return ExportPoint(ref pA); } #endif diff --git a/crypto/test/src/math/ec/rfc8032/test/Ed25519Test.cs b/crypto/test/src/math/ec/rfc8032/test/Ed25519Test.cs index 4155d4a0f..e298ef2e1 100644 --- a/crypto/test/src/math/ec/rfc8032/test/Ed25519Test.cs +++ b/crypto/test/src/math/ec/rfc8032/test/Ed25519Test.cs @@ -36,7 +36,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032.Tests for (int i = 0; i < 10; ++i) { Random.NextBytes(sk); - Ed25519.GeneratePublicKey(sk, 0, out var publicPoint); + var publicPoint = Ed25519.GeneratePublicKey(sk, 0); Ed25519.EncodePublicPoint(publicPoint, pk, 0); { @@ -95,7 +95,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032.Tests for (int i = 0; i < 10; ++i) { Random.NextBytes(sk); - Ed25519.GeneratePublicKey(sk, 0, out var publicPoint); + var publicPoint = Ed25519.GeneratePublicKey(sk, 0); Ed25519.EncodePublicPoint(publicPoint, pk, 0); { @@ -155,7 +155,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032.Tests for (int i = 0; i < 10; ++i) { Random.NextBytes(sk); - Ed25519.GeneratePublicKey(sk, 0, out var publicPoint); + var publicPoint = Ed25519.GeneratePublicKey(sk, 0); Ed25519.EncodePublicPoint(publicPoint, pk, 0); { diff --git a/crypto/test/src/math/ec/rfc8032/test/Ed448Test.cs b/crypto/test/src/math/ec/rfc8032/test/Ed448Test.cs index 38cde3b01..406325951 100644 --- a/crypto/test/src/math/ec/rfc8032/test/Ed448Test.cs +++ b/crypto/test/src/math/ec/rfc8032/test/Ed448Test.cs @@ -35,7 +35,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032.Tests for (int i = 0; i < 10; ++i) { Random.NextBytes(sk); - Ed448.GeneratePublicKey(sk, 0, out var publicPoint); + var publicPoint = Ed448.GeneratePublicKey(sk, 0); Ed448.EncodePublicPoint(publicPoint, pk, 0); { @@ -95,7 +95,7 @@ namespace Org.BouncyCastle.Math.EC.Rfc8032.Tests for (int i = 0; i < 10; ++i) { Random.NextBytes(sk); - Ed448.GeneratePublicKey(sk, 0, out var publicPoint); + var publicPoint = Ed448.GeneratePublicKey(sk, 0); Ed448.EncodePublicPoint(publicPoint, pk, 0); { |