Skip to content

Commit 769363b

Browse files
authored
Merge pull request #220 from yenom/fix-privkey-derivation-bytes
🐛 Fix Private key derivation bug
2 parents 739aaa2 + fea199d commit 769363b

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

Sources/BitcoinKitPrivate/BitcoinKit.Private.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ public class _HDKey {
180180
return nil
181181
}
182182

183-
var result: Data = Data()
183+
var result: Data
184184
if let privateKey = self.privateKey {
185185
let privateKeyNum = BN_new()!
186186
defer {
@@ -205,6 +205,9 @@ public class _HDKey {
205205
BN_bn2bin(privateKeyNum, ptr)
206206
return
207207
}
208+
if result.count < 32 {
209+
result = Data(repeating: 0, count: 32 - result.count) + result // 0 padding
210+
}
208211
} else {
209212
let publicKeyNum = BN_new()
210213
defer {

Tests/BitcoinKitTests/HDPrivateKeyTests.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,23 @@ class HDPrivateKeyTests: XCTestCase {
174174
let m011pub = try! m01prv.extendedPublicKey().derived(at: 1)
175175
XCTAssertEqual(m011pub.extended(), "xpub6D4BDPcEgbv6teFCGk7PMijta2aSGvRbvFX8dthHedYVVMM8QBf9xp9TF6TeuHYD9xiHGcuGNZQkKmD9jvojPj7YqnqtB3iYXv3f8s1JzwS")
176176
}
177+
178+
// https://github.com/yenom/BitcoinKit/issues/73
179+
func testDeriveProblem() {
180+
let seed = Data(hex: "f27fd395d30d00f1c11b7551a93961ca41c0a78bce21e9a618e83a99cf74aec159139ef3ef078bc0038557b7cb689933d0806ce33571df78bc4397e7f9976ff2")!
181+
182+
let key = try! HDPrivateKey(seed: seed, network: .mainnet)
183+
.derived(at: 44, hardened: true)
184+
.derived(at: 0, hardened: true)
185+
.derived(at: 0, hardened: true)
186+
.derived(at: 1)
187+
.derived(at: 19)
188+
189+
let privKey = key.privateKey()
190+
XCTAssertEqual(privKey.data.count, 32)
191+
XCTAssertEqual(privKey.data.hex, "00f2c37dad54d1d2be57b06653ea655c6fd8eb3ca3f0b9671e036d50061d265b")
192+
XCTAssertEqual(privKey.description, "KwFZ6jFtuvBu7w4R4x4WpzQgSSYTHLEw8Pr2PUkWjADkHJUPNDVg")
193+
XCTAssertEqual(privKey.publicKey().description, "02a712f894d58baef44e4fbbc26ed6ca89487db1f17e944f9b45ca2ae666e99d72")
194+
XCTAssertEqual(privKey.publicKey().toLegacy().description, "1DPUysR46jraybTwP3PfSbcBENeLScLxx")
195+
}
177196
}

0 commit comments

Comments
 (0)