Skip to content

Commit d468b85

Browse files
authored
Merge pull request #187 from keefertaylor/wallet-derivation
Fix bug where `signingCurve` wasn't respected
2 parents 7ce6911 + b4627a0 commit d468b85

File tree

7 files changed

+75
-39
lines changed

7 files changed

+75
-39
lines changed

Tests/UnitTests/TezosKit/SecretKeyTests.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,21 @@ final class SecretKeyTests: XCTestCase {
8585

8686
XCTAssertEqual(
8787
secretKey.base58CheckRepresentation,
88-
"edskS4pbuA7rwMjsZGmHU18aMP96VmjegxBzwMZs3DrcXHcMV7VyfQLkD5pqEE84wAMHzi8oVZF6wbgxv3FKzg7cLqzURjaXUp"
88+
"spsk2yoh33fRH4nt95Xf3BySX5pR5Zok2adQxsb9P9koj3A4xAsAfk"
8989
)
9090
}
9191

9292
func testInitFromBase58CheckRepresntation_ValidString_secp256k1() {
93-
let base58Representation = "spsk2rBDDeUqakQ42nBHDGQTtP3GErb6AahHPwF9bhca3Q5KA5HESE"
94-
let secretKeyFromString =
95-
SecretKey(base58Representation, signingCurve: .secp256k1)
96-
XCTAssertNotNil(secretKeyFromString)
97-
XCTAssertEqual(secretKeyFromString?.base58CheckRepresentation, base58Representation)
93+
let base58Representation = "spsk1fYtbGsvDEeb4NGanSiYQYcLFNZYNZ9F7jSvmCbT55DHcbtWjL"
94+
guard let secretKey = SecretKey(base58Representation, signingCurve: .secp256k1) else {
95+
XCTFail("Could not derive a secret key")
96+
return
97+
}
98+
XCTAssertNotNil(secretKey)
99+
XCTAssertEqual(secretKey.base58CheckRepresentation, base58Representation)
100+
101+
let publicKey = PublicKey(secretKey: secretKey)
102+
XCTAssertEqual(publicKey?.publicKeyHash, "tz2D3CdkJsR3X5zvvdvsbeGN2NMWoByLs1kM")
98103
}
99104

100105
func testInitFromBase58CheckRepresentation_InvalidBase58_secp256k1() {

Tests/UnitTests/TezosKit/WalletTests.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,35 @@ class WalletTests: XCTestCase {
156156
]
157157
)
158158
}
159+
160+
func testWalletGenerationCurvesWithMnemonic() {
161+
let passphrase = "tezoskit"
162+
guard
163+
let tz1Wallet = Wallet(passphrase: passphrase, signingCurve: .ed25519),
164+
let tz2Wallet = Wallet(passphrase: passphrase, signingCurve: .secp256k1)
165+
else {
166+
XCTFail("Failed to generate wallets.")
167+
return
168+
}
169+
170+
XCTAssertEqual(tz1Wallet.publicKey.signingCurve, .ed25519)
171+
XCTAssertEqual(tz2Wallet.publicKey.signingCurve, .secp256k1)
172+
}
173+
174+
func testWalletGenerationCurvesWithSeed() {
175+
let tz1SecretKey =
176+
"edskRw8ZJM3P3f81VnfChULCLh7KwhZMvp6rniDHNeEcQiNBevrTkwtzYwtqmEvbf5HJTQeb1WvTL5UUcsMjVh5RZArcRdXbQC"
177+
let tz2SecretKey =
178+
"spsk1fYtbGsvDEeb4NGanSiYQYcLFNZYNZ9F7jSvmCbT55DHcbtWjL"
179+
guard
180+
let tz1Wallet = Wallet(secretKey: tz1SecretKey, signingCurve: .ed25519),
181+
let tz2Wallet = Wallet(secretKey: tz2SecretKey, signingCurve: .secp256k1)
182+
else {
183+
XCTFail("Failed to generate wallets.")
184+
return
185+
}
186+
187+
XCTAssertEqual(tz1Wallet.publicKey.signingCurve, .ed25519)
188+
XCTAssertEqual(tz2Wallet.publicKey.signingCurve, .secp256k1)
189+
}
159190
}

TezosKit.xcodeproj/project.pbxproj

Lines changed: 19 additions & 19 deletions
Large diffs are not rendered by default.

TezosKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

TezosKit.xcodeproj/xcshareddata/xcschemes/TezosKit_iOS.xcscheme

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@
5252
</MacroExpansion>
5353
<CommandLineArguments>
5454
</CommandLineArguments>
55-
<AdditionalOptions>
56-
</AdditionalOptions>
57-
<CodeCoverageTargets>
58-
</CodeCoverageTargets>
5955
</TestAction>
6056
<LaunchAction
6157
buildConfiguration = "Debug"
@@ -78,8 +74,6 @@
7874
</MacroExpansion>
7975
<CommandLineArguments>
8076
</CommandLineArguments>
81-
<AdditionalOptions>
82-
</AdditionalOptions>
8377
</LaunchAction>
8478
<ProfileAction
8579
buildConfiguration = "Release"

TezosKit.xcodeproj/xcshareddata/xcschemes/TezosKit_macOS.xcscheme

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@
5252
</MacroExpansion>
5353
<CommandLineArguments>
5454
</CommandLineArguments>
55-
<AdditionalOptions>
56-
</AdditionalOptions>
57-
<CodeCoverageTargets>
58-
</CodeCoverageTargets>
5955
</TestAction>
6056
<LaunchAction
6157
buildConfiguration = "Debug"
@@ -78,8 +74,6 @@
7874
</MacroExpansion>
7975
<CommandLineArguments>
8076
</CommandLineArguments>
81-
<AdditionalOptions>
82-
</AdditionalOptions>
8377
</LaunchAction>
8478
<ProfileAction
8579
buildConfiguration = "Release"

TezosKit/Crypto/SecretKey.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,19 @@ public struct SecretKey {
5757
return nil
5858
}
5959

60-
self.init(keyPair.secretKey, signingCurve: .ed25519)
60+
// Key is 64 bytes long. The first 32 bytes are the private key. Sodium, the ed25519 library expects extended
61+
// private keys, so pass down the full 64 bytes.
62+
let secretKeyBytes = keyPair.secretKey
63+
switch signingCurve {
64+
case .ed25519:
65+
self.init(secretKeyBytes, signingCurve: signingCurve)
66+
case .secp256k1:
67+
let privateKeyBytes = Array(secretKeyBytes[..<32])
68+
self.init(privateKeyBytes, signingCurve: signingCurve)
69+
case .p256:
70+
fatalError("unimplemented")
71+
}
72+
6173
}
6274

6375
/// Initialize a secret key with the given base58check encoded string.

0 commit comments

Comments
 (0)