Skip to content

Commit 975798f

Browse files
committed
Migrate to swift-secp256k1 v0.21.1 (P256K)
- Update KeyUtil to use P256K high-level API for key generation, signing, and recovery - Replace low-level C secp256k1 bindings with P256K.Signing and P256K.Recovery APIs - Fix HexExtensions to handle empty hex strings (return 0 instead of nil) - Update EthereumKeyStorageTests to use valid 32-byte private keys - Use HashDigest for message digests in signing and recovery operations - Maintain Ethereum signature format (64-byte signature + recovery ID)
1 parent a7b1b94 commit 975798f

File tree

6 files changed

+189
-145
lines changed

6 files changed

+189
-145
lines changed

Package.resolved

Lines changed: 76 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let package = Package(
1515
dependencies: [
1616
.package(url: "https://github.com/attaswift/BigInt", from: "5.3.0"),
1717
.package(url: "https://github.com/iwill/generic-json-swift", .upToNextMajor(from: "2.0.2")),
18-
.package(url: "https://github.com/GigaBitcoin/secp256k1.swift.git", .upToNextMajor(from: "0.6.0")),
18+
.package(url: "https://github.com/21-DOT-DEV/swift-secp256k1", from: "0.21.1"),
1919
.package(url: "https://github.com/vapor/websocket-kit.git", from: "2.16.1"),
2020
.package(url: "https://github.com/apple/swift-log.git", from: "1.6.4")
2121
],
@@ -29,7 +29,7 @@ let package = Package(
2929
.target(name: "Internal_CryptoSwift_PBDKF2"),
3030
"BigInt",
3131
.product(name: "GenericJSON", package: "generic-json-swift"),
32-
.product(name: "secp256k1", package: "secp256k1.swift"),
32+
.product(name: "P256K", package: "swift-secp256k1"),
3333
.product(name: "WebSocketKit", package: "websocket-kit"),
3434
.product(name: "Logging", package: "swift-log")
3535
],

Package@swift-6.1.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let package = Package(
1515
dependencies: [
1616
.package(url: "https://github.com/attaswift/BigInt", from: "5.3.0"),
1717
.package(url: "https://github.com/iwill/generic-json-swift", .upToNextMajor(from: "2.0.2")),
18-
.package(url: "https://github.com/GigaBitcoin/secp256k1.swift.git", .upToNextMajor(from: "0.6.0")),
18+
.package(url: "https://github.com/21-DOT-DEV/swift-secp256k1", from: "0.21.1"),
1919
.package(url: "https://github.com/vapor/websocket-kit.git", from: "2.16.1"),
2020
.package(url: "https://github.com/apple/swift-log.git", from: "1.6.4")
2121
],
@@ -29,7 +29,7 @@ let package = Package(
2929
.target(name: "Internal_CryptoSwift_PBDKF2"),
3030
"BigInt",
3131
.product(name: "GenericJSON", package: "generic-json-swift"),
32-
.product(name: "secp256k1", package: "secp256k1.swift"),
32+
.product(name: "P256K", package: "swift-secp256k1"),
3333
.product(name: "WebSocketKit", package: "websocket-kit"),
3434
.product(name: "Logging", package: "swift-log")
3535
],

web3sTests/Account/EthereumKeyStorageTests.swift

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,31 +42,30 @@ class EthereumKeyStorageTests: XCTestCase {
4242
}
4343

4444
func testEncryptAndStorePrivateKey() {
45-
let randomData = Data.randomOfLength(256)!
45+
let privateKey = Data.randomOfLength(32)!
4646
let keyStorage = EthereumKeyLocalStorage() as EthereumSingleKeyStorageProtocol
4747
let password = "myP4ssw0rD"
4848

4949
do {
50-
try keyStorage.encryptAndStorePrivateKey(key: randomData, keystorePassword: password)
50+
try keyStorage.encryptAndStorePrivateKey(key: privateKey, keystorePassword: password)
5151
let decrypted = try keyStorage.loadAndDecryptPrivateKey(keystorePassword: password)
52-
XCTAssertEqual(decrypted, randomData)
52+
XCTAssertEqual(decrypted, privateKey)
5353
} catch let error {
5454
XCTFail("Failed to encrypt and store private key with error: \(error)")
5555
}
5656
}
5757

5858
func testEncryptAndStorePrivateKeyMultiple() {
59-
let randomData = Data.randomOfLength(256)!
59+
let privateKey = Data.randomOfLength(32)!
6060
let keyStorage = EthereumKeyLocalStorage() as EthereumMultipleKeyStorageProtocol
6161
let password = "myP4ssw0rD"
6262

6363
do {
64-
_ = KeyUtil.generateAddress(from: randomData)
65-
try keyStorage.encryptAndStorePrivateKey(key: randomData, keystorePassword: password)
66-
let publicKey = try KeyUtil.generatePublicKey(from: randomData)
64+
let publicKey = try KeyUtil.generatePublicKey(from: privateKey)
6765
let address = KeyUtil.generateAddress(from: publicKey)
66+
try keyStorage.encryptAndStorePrivateKey(key: privateKey, keystorePassword: password)
6867
let decrypted = try keyStorage.loadAndDecryptPrivateKey(for: address, keystorePassword: password)
69-
XCTAssertEqual(decrypted, randomData)
68+
XCTAssertEqual(decrypted, privateKey)
7069
} catch let error {
7170
XCTFail("Failed to encrypt and store private key with error: \(error)")
7271
}

web3swift/src/Extensions/HexExtensions.swift

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import Foundation
88

99
public extension BigUInt {
1010
init?(hex: String) {
11-
self.init(hex.web3.noHexPrefix.lowercased(), radix: 16)
11+
let stripped = hex.web3.noHexPrefix.lowercased()
12+
if stripped.isEmpty {
13+
self.init(0)
14+
} else {
15+
self.init(stripped, radix: 16)
16+
}
1217
}
1318
}
1419

@@ -24,13 +29,23 @@ public extension Web3Extensions where Base == BigUInt {
2429

2530
public extension BigInt {
2631
init?(hex: String) {
27-
self.init(hex.web3.noHexPrefix.lowercased(), radix: 16)
32+
let stripped = hex.web3.noHexPrefix.lowercased()
33+
if stripped.isEmpty {
34+
self.init(0)
35+
} else {
36+
self.init(stripped, radix: 16)
37+
}
2838
}
2939
}
3040

3141
public extension Int {
3242
init?(hex: String) {
33-
self.init(hex.web3.noHexPrefix, radix: 16)
43+
let stripped = hex.web3.noHexPrefix
44+
if stripped.isEmpty {
45+
self.init(0)
46+
} else {
47+
self.init(stripped, radix: 16)
48+
}
3449
}
3550
}
3651

0 commit comments

Comments
 (0)