From 299ec814654a7c363824d65fa8b55fb892079c3c Mon Sep 17 00:00:00 2001 From: darkfriend77 Date: Thu, 22 Feb 2024 18:46:49 +0100 Subject: [PATCH 1/5] removed array extension, replaced by memory span --- .../ArrayExtensionTest.cs | 29 -------------- .../Keyrings/KeypairSr25519Tests.cs | 7 +++- .../Extensions/ArrayExtension.cs | 36 ----------------- Substrate.NET.Wallet/Keyring/Keyring.cs | 2 +- Substrate.NET.Wallet/Keyring/Pair.cs | 21 +++++++--- Substrate.NET.Wallet/Keyring/Scrypt.cs | 13 +++++-- Substrate.NET.Wallet/Keyring/Uri.cs | 39 ++++++++++++------- 7 files changed, 55 insertions(+), 92 deletions(-) delete mode 100644 Substrate.NET.Wallet.Test/ArrayExtensionTest.cs delete mode 100644 Substrate.NET.Wallet/Extensions/ArrayExtension.cs diff --git a/Substrate.NET.Wallet.Test/ArrayExtensionTest.cs b/Substrate.NET.Wallet.Test/ArrayExtensionTest.cs deleted file mode 100644 index 1772ac0..0000000 --- a/Substrate.NET.Wallet.Test/ArrayExtensionTest.cs +++ /dev/null @@ -1,29 +0,0 @@ -using NUnit.Framework; -using Substrate.NET.Wallet.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Substrate.NET.Wallet.Test -{ - internal class ArrayExtensionTest - { - [Test] - public void SubArray_WithNullInput_ShouldFail() - { - byte[] input = null; - Assert.Throws(() => input.SubArray(0, 1)); - } - - [Test] - public void SubArray_WithIncoherentInputs_ShouldFail() { - byte[] input = { 0, 0, 0, 0 }; - Assert.Throws(() => input.SubArray(10)); - Assert.Throws(() => input.SubArray(-1)); - Assert.Throws(() => input.SubArray(3, 2)); - Assert.Throws(() => input.SubArray(3, 10)); - } - } -} diff --git a/Substrate.NET.Wallet.Test/Keyrings/KeypairSr25519Tests.cs b/Substrate.NET.Wallet.Test/Keyrings/KeypairSr25519Tests.cs index e2456aa..6ef24dc 100644 --- a/Substrate.NET.Wallet.Test/Keyrings/KeypairSr25519Tests.cs +++ b/Substrate.NET.Wallet.Test/Keyrings/KeypairSr25519Tests.cs @@ -7,6 +7,7 @@ using Substrate.NetApi.Extensions; using Substrate.NetApi.Model.Types; using Substrate.NetApi.Sign; +using System; using System.Collections.Generic; using System.Linq; @@ -88,8 +89,10 @@ public void Sr25519_SignsAndVerifiesBothMethods() // Just to check // -- var concatenated_2 = miniSecret_Ed25519Bytes.GetPair().ToHalfEd25519Bytes(); - var publicKey_2 = concatenated_2.SubArray(Keys.SECRET_KEY_LENGTH, Keys.SECRET_KEY_LENGTH + Keys.PUBLIC_KEY_LENGTH); - var secretKey_2 = concatenated_2.SubArray(0, Keys.SECRET_KEY_LENGTH); + Span concatenatedSpan = concatenated_2.AsSpan(); + var publicKey_2 = concatenatedSpan.Slice(Keys.SECRET_KEY_LENGTH, Keys.PUBLIC_KEY_LENGTH).ToArray(); + var secretKey_2 = concatenatedSpan.Slice(0, Keys.SECRET_KEY_LENGTH).ToArray(); + var edBytes = miniSecret_Ed25519Bytes.ExpandToSecret().ToEd25519Bytes(); Assert.That(edBytes, Is.EquivalentTo(secretKey_2)); Assert.That(edBytes, Is.EquivalentTo(account_Ed25519Bytes.PrivateKey)); diff --git a/Substrate.NET.Wallet/Extensions/ArrayExtension.cs b/Substrate.NET.Wallet/Extensions/ArrayExtension.cs deleted file mode 100644 index f843028..0000000 --- a/Substrate.NET.Wallet/Extensions/ArrayExtension.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace Substrate.NET.Wallet.Extensions -{ - public static class ArrayExtension - { - /// - /// Read an array from start index to end index - /// - /// - /// - /// - /// - /// - /// - public static T[] SubArray(this T[] array, int start, int end) - { - if (array == null) - throw new ArgumentNullException(nameof(array)); - - if (start < 0 || start >= array.Length) - throw new ArgumentOutOfRangeException(nameof(start), "Start index is out of bounds."); - - if (end < start || end > array.Length) - throw new ArgumentOutOfRangeException(nameof(end), "End index is out of bounds or less than start index."); - - int length = end - start; - - T[] result = new T[length]; - Array.Copy(array, start, result, 0, length); - return result; - } - - public static T[] SubArray(this T[] array, int start) => array.SubArray(start, array.Length); - } -} \ No newline at end of file diff --git a/Substrate.NET.Wallet/Keyring/Keyring.cs b/Substrate.NET.Wallet/Keyring/Keyring.cs index 5e8ec35..e49b3f4 100644 --- a/Substrate.NET.Wallet/Keyring/Keyring.cs +++ b/Substrate.NET.Wallet/Keyring/Keyring.cs @@ -222,7 +222,7 @@ public static byte[] JsonDecryptData(string password, byte[] encrypted, List + /// Decode a keypair from a JSON keypair + /// + /// + /// + /// + /// + /// public static PairInfo DecodePair(string password, byte[] encoded, List encryptionType) { var decrypted = Keyring.JsonDecryptData(password, encoded, encryptionType); - var header = decrypted.SubArray(0, PKCS8_HEADER.Length); + var decryptedSpan = new Span(decrypted); // Convert the decrypted byte array to a Span + + var header = decryptedSpan.Slice(0, PKCS8_HEADER.Length); if (!header.SequenceEqual(PKCS8_HEADER)) throw new InvalidOperationException("Invalid PKCS8 header"); var offset = SEED_OFFSET + SEC_LENGTH; - var secretKey = decrypted.SubArray(SEED_OFFSET, offset); - var divider = decrypted.SubArray(offset, offset + PKCS8_DIVIDER.Length); + var secretKey = decryptedSpan.Slice(SEED_OFFSET, SEC_LENGTH).ToArray(); // Convert span slice to array + var divider = decryptedSpan.Slice(offset, PKCS8_DIVIDER.Length); if (!divider.SequenceEqual(PKCS8_DIVIDER)) throw new InvalidOperationException("Invalid PKCS8 divider"); var publicOffset = offset + PKCS8_DIVIDER.Length; - var publicKey = decrypted.SubArray(publicOffset, publicOffset + PUB_LENGTH); + var publicKey = decryptedSpan.Slice(publicOffset, PUB_LENGTH).ToArray(); // Convert span slice to array return new PairInfo(publicKey, secretKey); } @@ -110,7 +120,8 @@ public static byte[] EncodePair(string password, Account pair) var scryptResult = Scrypt.ScryptEncode(password, ScryptParam.Default); byte[] message = encoded; - byte[] secret = scryptResult.Password.SubArray(0, 32); + Span secretSpan = new Span(scryptResult.Password).Slice(0, 32); + byte[] secret = secretSpan.ToArray(); byte[] nonce = new byte[24].Populate(); var naclResult = XSalsa20Poly1305.Encrypt(message, secret, nonce); diff --git a/Substrate.NET.Wallet/Keyring/Scrypt.cs b/Substrate.NET.Wallet/Keyring/Scrypt.cs index 44cf735..54df72b 100644 --- a/Substrate.NET.Wallet/Keyring/Scrypt.cs +++ b/Substrate.NET.Wallet/Keyring/Scrypt.cs @@ -20,10 +20,15 @@ public static class Scrypt /// public static ScryptResult FromBytes(byte[] data) { - var salt = data.SubArray(0, 32); - var N = new BigInteger(data.SubArray(32 + 0, 32 + 4)); - var p = new BigInteger(data.SubArray(32 + 4, 32 + 8)); - var r = new BigInteger(data.SubArray(32 + 8, 32 + 12)); + var dataSpan = new Span(data); + + // Extract salt directly using Span.Slice and convert to array + var salt = dataSpan.Slice(0, 32).ToArray(); + + // Convert slices for N, p, r directly to BigInteger using ReadOnlySpan + var N = new BigInteger(dataSpan.Slice(32 + 0, 4).ToArray()); + var p = new BigInteger(dataSpan.Slice(32 + 4, 4).ToArray()); + var r = new BigInteger(dataSpan.Slice(32 + 8, 4).ToArray()); if (N != ScryptParam.Default.IterationCount || p != ScryptParam.Default.ThreadCount || r != ScryptParam.Default.BlockSize) { diff --git a/Substrate.NET.Wallet/Keyring/Uri.cs b/Substrate.NET.Wallet/Keyring/Uri.cs index 17cb036..de5161d 100644 --- a/Substrate.NET.Wallet/Keyring/Uri.cs +++ b/Substrate.NET.Wallet/Keyring/Uri.cs @@ -127,33 +127,42 @@ public static Account KeyFromPath(Account pair, IList paths, Key /// private static Account CreateDerive(KeyType keyType, DeriveJunction path, Account pair) { - var keyPair = KeyPair.FromHalfEd25519Bytes(pair.PrivateKey.Concat(pair.Bytes).ToArray()); + // Construct a KeyPair from the concatenation of PrivateKey and Bytes, transformed into an array. + KeyPair keyPair = KeyPair.FromHalfEd25519Bytes(pair.PrivateKey.Concat(pair.Bytes).ToArray()); switch (keyType) { case KeyType.Sr25519: - var res = path.IsHard ? - Sr25519DeriveHard(keyPair, path.ChainCode) : - Sr25519DeriveSoft(keyPair, path.ChainCode); + // Derivation might return a byte array, assumed to be done here. + byte[] res = path.IsHard ? + Sr25519DeriveHard(keyPair, path.ChainCode) : + Sr25519DeriveSoft(keyPair, path.ChainCode); - return Account.Build(keyType, - res.SubArray(0, Keys.SECRET_KEY_LENGTH), - res.SubArray(Keys.SECRET_KEY_LENGTH, Keys.SECRET_KEY_LENGTH + Keys.PUBLIC_KEY_LENGTH)); + // Convert the result to Span for efficient slicing + Span resSpan = new Span(res); - case KeyType.Ed25519: + // Use Span.Slice for secret and public key portions + var secretKeySpan = resSpan.Slice(0, Keys.SECRET_KEY_LENGTH).ToArray(); + var publicKeySpan = resSpan.Slice(Keys.SECRET_KEY_LENGTH, Keys.PUBLIC_KEY_LENGTH).ToArray(); + + // Account.Build presumably accepts byte[] for keys, so .ToArray() conversion is used + return Account.Build(keyType, secretKeySpan, publicKeySpan); + case KeyType.Ed25519: if (!path.IsHard) { - throw new InvalidOperationException($"Soft derivation paths are not allowed on {keyType}"); + throw new InvalidOperationException($"Soft derivation paths are not allowed on {keyType}."); } - return Account.FromSeed(keyType, - Ed25519DeriveHard(pair.PrivateKey, path.ChainCode)); - } + // Assuming Ed25519DeriveHard returns a byte array suitable for Account.FromSeed + return Account.FromSeed(keyType, Ed25519DeriveHard(pair.PrivateKey, path.ChainCode)); - throw new NotImplementedException(); + default: + throw new NotImplementedException("This key type is not implemented."); + } } + /// /// Sr25519 derive hard /// @@ -213,14 +222,14 @@ public static byte[] Sr25519DeriveSoft(KeyPair pair, byte[] chainCode) } /// - /// + /// Ed25519 derive /// /// 64 bytes private key + nonce /// /// public static byte[] Ed25519DeriveHard(byte[] secretKey, byte[] chainCode) { - var seed = secretKey.SubArray(0, 32); + var seed = new Span(secretKey, 0, 32).ToArray(); var HDKS = DeriveJunction.CompactAddLength(System.Text.Encoding.UTF8.GetBytes("Ed25519HDKD")); var all = HDKS.Concat(seed).Concat(chainCode).ToArray(); From 1bc24aff771dd77bb6ead49e09c94fa7a87f0569 Mon Sep 17 00:00:00 2001 From: darkfriend77 Date: Thu, 22 Feb 2024 18:58:06 +0100 Subject: [PATCH 2/5] also removed account extensions --- .../Keyrings/KeypairSr25519Tests.cs | 1 - .../Extensions/AccountExtension.cs | 24 ------------------- Substrate.NET.Wallet/Keyring/Keyring.cs | 1 - Substrate.NET.Wallet/Keyring/Pair.cs | 1 - Substrate.NET.Wallet/Keyring/Scrypt.cs | 3 +-- Substrate.NET.Wallet/Keyring/Uri.cs | 1 - Substrate.NET.Wallet/Wallet.cs | 5 ++-- 7 files changed, 3 insertions(+), 33 deletions(-) delete mode 100644 Substrate.NET.Wallet/Extensions/AccountExtension.cs diff --git a/Substrate.NET.Wallet.Test/Keyrings/KeypairSr25519Tests.cs b/Substrate.NET.Wallet.Test/Keyrings/KeypairSr25519Tests.cs index 6ef24dc..b5b5078 100644 --- a/Substrate.NET.Wallet.Test/Keyrings/KeypairSr25519Tests.cs +++ b/Substrate.NET.Wallet.Test/Keyrings/KeypairSr25519Tests.cs @@ -1,7 +1,6 @@ using NUnit.Framework; using Substrate.NET.Schnorrkel; using Substrate.NET.Wallet.Derivation; -using Substrate.NET.Wallet.Extensions; using Substrate.NET.Wallet.Keyring; using Substrate.NetApi; using Substrate.NetApi.Extensions; diff --git a/Substrate.NET.Wallet/Extensions/AccountExtension.cs b/Substrate.NET.Wallet/Extensions/AccountExtension.cs deleted file mode 100644 index 7273d45..0000000 --- a/Substrate.NET.Wallet/Extensions/AccountExtension.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Substrate.NET.Wallet.Keyring; -using Substrate.NetApi.Model.Types; - -namespace Substrate.NET.Wallet.Extensions -{ - /// - /// Account extension methods - /// - public static class AccountExtension - { - /// - /// Clone an instance of an Account - /// - /// - /// - public static Account Clone(this Account account) - { - var clonedAccount = new Account(); - clonedAccount.Create(account.KeyType, account.PrivateKey, account.Bytes); - - return clonedAccount; - } - } -} \ No newline at end of file diff --git a/Substrate.NET.Wallet/Keyring/Keyring.cs b/Substrate.NET.Wallet/Keyring/Keyring.cs index e49b3f4..93b3039 100644 --- a/Substrate.NET.Wallet/Keyring/Keyring.cs +++ b/Substrate.NET.Wallet/Keyring/Keyring.cs @@ -1,6 +1,5 @@ using Substrate.NET.Schnorrkel.Keys; using Substrate.NET.Wallet.Derivation; -using Substrate.NET.Wallet.Extensions; using Substrate.NetApi; using Substrate.NetApi.Extensions; using Substrate.NetApi.Model.Types; diff --git a/Substrate.NET.Wallet/Keyring/Pair.cs b/Substrate.NET.Wallet/Keyring/Pair.cs index 40f9fa8..b7b0601 100644 --- a/Substrate.NET.Wallet/Keyring/Pair.cs +++ b/Substrate.NET.Wallet/Keyring/Pair.cs @@ -1,5 +1,4 @@ using Chaos.NaCl; -using Substrate.NET.Wallet.Extensions; using Substrate.NetApi.Extensions; using Substrate.NetApi.Model.Types; using System; diff --git a/Substrate.NET.Wallet/Keyring/Scrypt.cs b/Substrate.NET.Wallet/Keyring/Scrypt.cs index 54df72b..3079055 100644 --- a/Substrate.NET.Wallet/Keyring/Scrypt.cs +++ b/Substrate.NET.Wallet/Keyring/Scrypt.cs @@ -1,5 +1,4 @@ -using Substrate.NET.Wallet.Extensions; -using Substrate.NetApi.Extensions; +using Substrate.NetApi.Extensions; using System; using System.Linq; using System.Numerics; diff --git a/Substrate.NET.Wallet/Keyring/Uri.cs b/Substrate.NET.Wallet/Keyring/Uri.cs index de5161d..f284a86 100644 --- a/Substrate.NET.Wallet/Keyring/Uri.cs +++ b/Substrate.NET.Wallet/Keyring/Uri.cs @@ -1,7 +1,6 @@ using Substrate.NET.Schnorrkel; using Substrate.NET.Schnorrkel.Keys; using Substrate.NET.Wallet.Derivation; -using Substrate.NET.Wallet.Extensions; using Substrate.NetApi; using Substrate.NetApi.Model.Meta; using Substrate.NetApi.Model.Types; diff --git a/Substrate.NET.Wallet/Wallet.cs b/Substrate.NET.Wallet/Wallet.cs index 38ee47b..5469189 100644 --- a/Substrate.NET.Wallet/Wallet.cs +++ b/Substrate.NET.Wallet/Wallet.cs @@ -1,6 +1,5 @@ using Serilog; using Substrate.NET.Schnorrkel; -using Substrate.NET.Wallet.Extensions; using Substrate.NET.Wallet.Keyring; using Substrate.NetApi; using Substrate.NetApi.Extensions; @@ -227,7 +226,7 @@ public string ToJson(string walletName, string password) /// public byte[] Recode(string password) { - return Pair.EncodePair(password, Account.Clone()); + return Pair.EncodePair(password, Account); } /// @@ -257,7 +256,7 @@ public Wallet Derive(string sUri, Meta meta) throw new InvalidOperationException($"Soft derivation paths are not allowed on {KeyType}"); } - var derived = Keyring.Uri.KeyFromPath(Account.Clone(), res.Path, KeyType); + var derived = Keyring.Uri.KeyFromPath(Account, res.Path, KeyType); return Pair.CreatePair(new KeyringAddress(KeyType), derived, Meta, null, EncryptedEncoding, Keyring.Keyring.DEFAULT_SS58); } From f92b71b709a27a719001f6fe12250ef8f95bdf0c Mon Sep 17 00:00:00 2001 From: darkfriend77 Date: Fri, 23 Feb 2024 13:13:15 +0100 Subject: [PATCH 3/5] removed pairInfo --- Substrate.NET.Wallet.Test/KeyringTest.cs | 6 +-- Substrate.NET.Wallet/Keyring/Keyring.cs | 6 +-- Substrate.NET.Wallet/Keyring/Pair.cs | 57 +++++++++++------------- Substrate.NET.Wallet/Keyring/Pkcs8.cs | 12 +---- 4 files changed, 33 insertions(+), 48 deletions(-) diff --git a/Substrate.NET.Wallet.Test/KeyringTest.cs b/Substrate.NET.Wallet.Test/KeyringTest.cs index 48d18aa..087da6b 100644 --- a/Substrate.NET.Wallet.Test/KeyringTest.cs +++ b/Substrate.NET.Wallet.Test/KeyringTest.cs @@ -208,10 +208,10 @@ public void KeyPairFromSeed() var expected = Utils.HexToByteArray("46ebddef8cd9bb167dc30878d7113b7e168e6f0646beffd77d69d39bad76b47a"); var keyPair = Keyring.Keyring.KeyPairFromSeed(NetApi.Model.Types.KeyType.Sr25519, seed); - Assert.That(keyPair.PublicKey.Length, Is.EqualTo(Keys.PUBLIC_KEY_LENGTH)); - Assert.That(keyPair.SecretKey.Length, Is.EqualTo(Keys.SECRET_KEY_LENGTH)); + Assert.That(keyPair.Bytes.Length, Is.EqualTo(Keys.PUBLIC_KEY_LENGTH)); + Assert.That(keyPair.PrivateKey.Length, Is.EqualTo(Keys.SECRET_KEY_LENGTH)); - Assert.That(keyPair.PublicKey, Is.EqualTo(expected)); + Assert.That(keyPair.Bytes, Is.EqualTo(expected)); } } } \ No newline at end of file diff --git a/Substrate.NET.Wallet/Keyring/Keyring.cs b/Substrate.NET.Wallet/Keyring/Keyring.cs index 93b3039..cc73f2e 100644 --- a/Substrate.NET.Wallet/Keyring/Keyring.cs +++ b/Substrate.NET.Wallet/Keyring/Keyring.cs @@ -236,7 +236,7 @@ public static byte[] JsonDecryptData(string password, byte[] encrypted, List /// /// - public static PairInfo DecodePair(string password, byte[] encoded, List encryptionType) + public static Account DecodePair(string password, byte[] encoded, List encryptionType) { var decrypted = Keyring.JsonDecryptData(password, encoded, encryptionType); var decryptedSpan = new Span(decrypted); // Convert the decrypted byte array to a Span @@ -101,9 +72,24 @@ public static PairInfo DecodePair(string password, byte[] encoded, List + /// Encode a keypair into a byte array + /// + /// + /// + /// + /// public static byte[] EncodePair(string password, Account pair) { if (IsLocked(pair.PrivateKey)) @@ -131,6 +117,15 @@ public static byte[] EncodePair(string password, Account pair) .ToArray(); } + /// + /// Transform a keypair into a JSON representation + /// + /// + /// + /// + /// + /// + /// public static WalletFile ToJsonPair(KeyType keyType, string address, Meta meta, byte[] encoded, bool isEncrypted) { return new WalletFile() diff --git a/Substrate.NET.Wallet/Keyring/Pkcs8.cs b/Substrate.NET.Wallet/Keyring/Pkcs8.cs index 60b15dc..06d008f 100644 --- a/Substrate.NET.Wallet/Keyring/Pkcs8.cs +++ b/Substrate.NET.Wallet/Keyring/Pkcs8.cs @@ -18,17 +18,7 @@ public static class Pkcs8 /// public static Account Decode(string password, byte[] encoded, List encryptedEncoding) { - var decoded = Pair.DecodePair(password, encoded, encryptedEncoding); - - if (decoded.SecretKey.Length == 64) - { - return Account.Build(KeyType.Sr25519, decoded.SecretKey, decoded.PublicKey); - } - else - { - Chaos.NaCl.Ed25519.KeyPairFromSeed(out byte[] publicKey, out byte[] privateKey, encoded); - return Account.Build(KeyType.Ed25519, privateKey, publicKey); - } + return Pair.DecodePair(password, encoded, encryptedEncoding); } /// From 5aa6e8a476151c2d2d66ce4166635cb22219bf43 Mon Sep 17 00:00:00 2001 From: darkfriend77 Date: Fri, 23 Feb 2024 15:24:25 +0100 Subject: [PATCH 4/5] removed unneessary keyringaddress --- Substrate.NET.Wallet.Test/MainTests.cs | 1 - Substrate.NET.Wallet/Keyring/Keyring.cs | 26 +++---------------------- Substrate.NET.Wallet/Keyring/Pair.cs | 17 ++++++++-------- Substrate.NET.Wallet/Keyring/Uri.cs | 4 +--- Substrate.NET.Wallet/Wallet.cs | 2 +- 5 files changed, 14 insertions(+), 36 deletions(-) diff --git a/Substrate.NET.Wallet.Test/MainTests.cs b/Substrate.NET.Wallet.Test/MainTests.cs index fafd04b..ce3fd05 100644 --- a/Substrate.NET.Wallet.Test/MainTests.cs +++ b/Substrate.NET.Wallet.Test/MainTests.cs @@ -69,7 +69,6 @@ public Wallet GetWallet() { var keyType = KeyType.Sr25519; return Pair.CreatePair( - new KeyringAddress(keyType), Account.Build(keyType, Utils.HexToByteArray(SecretKey), Utils.HexToByteArray(PublickKey))); diff --git a/Substrate.NET.Wallet/Keyring/Keyring.cs b/Substrate.NET.Wallet/Keyring/Keyring.cs index cc73f2e..d9ff5f7 100644 --- a/Substrate.NET.Wallet/Keyring/Keyring.cs +++ b/Substrate.NET.Wallet/Keyring/Keyring.cs @@ -12,24 +12,6 @@ namespace Substrate.NET.Wallet.Keyring { - public class KeyringAddress - { - public KeyType KeyType { get; set; } - public Func ToSS58 { get; set; } - - public KeyringAddress(KeyType keyType) - { - KeyType = keyType; - ToSS58 = Utils.GetAddressFrom; - } - - public KeyringAddress(KeyType keyType, Func toSS58) - { - KeyType = keyType; - ToSS58 = toSS58; - } - } - /// /// Keyring is a cryptographic key management tool or library used to manage cryptographic keys and perform key-related operations, such as key generation, storage, and signing. /// @@ -79,8 +61,7 @@ public Wallet AddFromAddress(string address, Meta meta, byte[] encoded, KeyType var publicKey = Utils.GetPublicKeyFrom(address); var keyringPair = Pair.CreatePair( - new KeyringAddress(keyType), - Account.Build(keyType,null, publicKey), + Account.Build(keyType, null, publicKey), meta, encoded, encryptedEncoding, Ss58Format); AddWallet(keyringPair); @@ -117,7 +98,7 @@ public Wallet AddFromUri(string uri, Meta meta, KeyType keyType) public Wallet AddFromSeed(byte[] seed, Meta meta, KeyType keyType) { - var pair = Pair.CreatePair(new KeyringAddress(keyType), Account.FromSeed(keyType, seed), meta, null, null, Ss58Format); + var pair = Pair.CreatePair(Account.FromSeed(keyType, seed), meta, null, null, Ss58Format); AddWallet(pair); return pair; @@ -144,7 +125,6 @@ internal static Wallet CreateFromJson(WalletFile walletEncryption, short Ss58For Convert.FromBase64String(walletEncryption.Encoded); return Pair.CreatePair( - new KeyringAddress(keyType), Account.Build(keyType, null, publicKey), walletEncryption.Meta, encoded, encryptedEncoding, Ss58Format); } @@ -155,7 +135,7 @@ internal static Wallet CreateFromUri(string uri, Meta meta, KeyType keyType, sho var derivedPair = Uri.KeyFromPath(Account.FromSeed(keyType, seed), extract.Path, keyType); - return Pair.CreatePair(new KeyringAddress(keyType), derivedPair, meta, null, null, Ss58Format); + return Pair.CreatePair(derivedPair, meta, null, null, Ss58Format); } internal static (KeyExtractResult, byte[]) CreateSeedFromUri(string uri) diff --git a/Substrate.NET.Wallet/Keyring/Pair.cs b/Substrate.NET.Wallet/Keyring/Pair.cs index 5cd5e2a..c5f4f5e 100644 --- a/Substrate.NET.Wallet/Keyring/Pair.cs +++ b/Substrate.NET.Wallet/Keyring/Pair.cs @@ -1,4 +1,5 @@ using Chaos.NaCl; +using Substrate.NetApi; using Substrate.NetApi.Extensions; using Substrate.NetApi.Model.Types; using System; @@ -26,22 +27,22 @@ public static class Pair WalletJson.EncryptedToString(WalletJson.EncryptedJsonEncoding.Xsalsa20Poly1305), }; - public static Wallet CreatePair(KeyringAddress setup, Account account) - => CreatePair(setup, account, meta: null, encoded: null, encryptedEncoding: null, ss58Format: 42); + public static Wallet CreatePair(Account account) + => CreatePair(account, meta: null, encoded: null, encryptedEncoding: null, ss58Format: 42); /// - /// https://github.com/polkadot-js/common/blob/master/packages/keyring/src/pair/index.ts#L89 + /// Create a new keypair /// /// - /// - /// + /// /// - /// + /// /// + /// /// - public static Wallet CreatePair(KeyringAddress setup, Account account, Meta meta, byte[] encoded, List encryptedEncoding, short ss58Format) + public static Wallet CreatePair(Account account, Meta meta, byte[] encoded, List encryptedEncoding, short ss58Format) { - return new Wallet(setup.ToSS58(account.Bytes, ss58Format), encoded, meta, account.Bytes, account.PrivateKey, setup.KeyType, encryptedEncoding); + return new Wallet(Utils.GetAddressFrom(account.Bytes, ss58Format), encoded, meta, account.Bytes, account.PrivateKey, account.KeyType, encryptedEncoding); } /// diff --git a/Substrate.NET.Wallet/Keyring/Uri.cs b/Substrate.NET.Wallet/Keyring/Uri.cs index f284a86..5c25204 100644 --- a/Substrate.NET.Wallet/Keyring/Uri.cs +++ b/Substrate.NET.Wallet/Keyring/Uri.cs @@ -1,5 +1,4 @@ -using Substrate.NET.Schnorrkel; -using Substrate.NET.Schnorrkel.Keys; +using Substrate.NET.Schnorrkel.Keys; using Substrate.NET.Wallet.Derivation; using Substrate.NetApi; using Substrate.NetApi.Model.Meta; @@ -161,7 +160,6 @@ private static Account CreateDerive(KeyType keyType, DeriveJunction path, Accoun } } - /// /// Sr25519 derive hard /// diff --git a/Substrate.NET.Wallet/Wallet.cs b/Substrate.NET.Wallet/Wallet.cs index 5469189..50268fb 100644 --- a/Substrate.NET.Wallet/Wallet.cs +++ b/Substrate.NET.Wallet/Wallet.cs @@ -258,7 +258,7 @@ public Wallet Derive(string sUri, Meta meta) var derived = Keyring.Uri.KeyFromPath(Account, res.Path, KeyType); - return Pair.CreatePair(new KeyringAddress(KeyType), derived, Meta, null, EncryptedEncoding, Keyring.Keyring.DEFAULT_SS58); + return Pair.CreatePair(derived, Meta, null, EncryptedEncoding, Keyring.Keyring.DEFAULT_SS58); } /// From 67790ea2d96bab80a5430f277a272e8ace93fce3 Mon Sep 17 00:00:00 2001 From: darkfriend77 Date: Fri, 23 Feb 2024 15:34:49 +0100 Subject: [PATCH 5/5] removed wrapped functions --- Substrate.NET.Wallet.Test/KeyringTest.cs | 27 ------------------------ Substrate.NET.Wallet/Keyring/Keyring.cs | 14 +++--------- 2 files changed, 3 insertions(+), 38 deletions(-) diff --git a/Substrate.NET.Wallet.Test/KeyringTest.cs b/Substrate.NET.Wallet.Test/KeyringTest.cs index 087da6b..7085964 100644 --- a/Substrate.NET.Wallet.Test/KeyringTest.cs +++ b/Substrate.NET.Wallet.Test/KeyringTest.cs @@ -116,33 +116,6 @@ public void GenerateNewAccount_Ed25519AndSr25519_ShouldHaveDifferentPublicAndSec Assert.That(kp_Ed25519.Account.PrivateKey, Is.Not.EquivalentTo(kp_Sr25519.Account.PrivateKey)); } - [Test] - public void DecodeAddress() - { - var keyring = new Substrate.NET.Wallet.Keyring.Keyring(); - var publicKey = new byte[] { 16, 178, 46, 190, 137, 179, 33, 55, 11, 238, 141, 57, 213, 197, 212, 17, 218, 241, 232, 252, 145, 201, 209, 83, 64, 68, 89, 15, 31, 150, 110, 188 }; - - Assert.That(keyring.DecodeAddress("5CSbZ7wG456oty4WoiX6a1J88VUbrCXLhrKVJ9q95BsYH4TZ"), Is.EqualTo(publicKey)); - Assert.That(keyring.DecodeAddress("CxDDSH8gS7jecsxaRL9Txf8H5kqesLXAEAEgp76Yz632J9M"), Is.EqualTo(publicKey)); - Assert.That(keyring.DecodeAddress("1NthTCKurNHLW52mMa6iA8Gz7UFYW5UnM3yTSpVdGu4Th7h"), Is.EqualTo(publicKey)); - } - - [Test] - public void EncodeAddress() - { - var keyring = new Substrate.NET.Wallet.Keyring.Keyring(); - var publicKey = new byte[] { 16, 178, 46, 190, 137, 179, 33, 55, 11, 238, 141, 57, 213, 197, 212, 17, 218, 241, 232, 252, 145, 201, 209, 83, 64, 68, 89, 15, 31, 150, 110, 188 }; - - keyring.Ss58Format = 42; - Assert.That(keyring.EncodeAddress(publicKey), Is.EqualTo("5CSbZ7wG456oty4WoiX6a1J88VUbrCXLhrKVJ9q95BsYH4TZ")); - - keyring.Ss58Format = 2; - Assert.That(keyring.EncodeAddress(publicKey), Is.EqualTo("CxDDSH8gS7jecsxaRL9Txf8H5kqesLXAEAEgp76Yz632J9M")); - - keyring.Ss58Format = 0; - Assert.That(keyring.EncodeAddress(publicKey), Is.EqualTo("1NthTCKurNHLW52mMa6iA8Gz7UFYW5UnM3yTSpVdGu4Th7h")); - } - [Test] [TestCase(NetApi.Model.Types.KeyType.Ed25519)] [TestCase(NetApi.Model.Types.KeyType.Sr25519)] diff --git a/Substrate.NET.Wallet/Keyring/Keyring.cs b/Substrate.NET.Wallet/Keyring/Keyring.cs index d9ff5f7..d87442e 100644 --- a/Substrate.NET.Wallet/Keyring/Keyring.cs +++ b/Substrate.NET.Wallet/Keyring/Keyring.cs @@ -18,22 +18,14 @@ namespace Substrate.NET.Wallet.Keyring public class Keyring { public const int NONCE_LENGTH = 24; + public const int SCRYPT_LENGTH = 32 + 3 * 4; + public const short DEFAULT_SS58 = 42; public IList Wallets { get; private set; } = new List(); - public short Ss58Format { get; set; } = DEFAULT_SS58; - - public byte[] DecodeAddress(string address) - { - short network; - return Utils.GetPublicKeyFrom(address, out network); - } - public string EncodeAddress(byte[] publicKey) - { - return Utils.GetAddressFrom(publicKey, Ss58Format); - } + public short Ss58Format { get; set; } = DEFAULT_SS58; #region Get methods