@@ -9,23 +9,6 @@ import secp256k1
9
9
import CryptoKit
10
10
import Foundation
11
11
12
- struct IncorrectByteCount : Swift . Error { }
13
- public func swapSignatureByteOrder< D> ( _ data: D ) throws -> Data where D: DataProtocol {
14
- guard data. count == 64 || data. count == 65 else {
15
- throw IncorrectByteCount ( )
16
- }
17
- let invalidByteOrder = Data ( data)
18
- let r = Data ( invalidByteOrder [ 0 ..< 32 ] . reversed ( ) )
19
- let s = Data ( invalidByteOrder [ 32 ..< 64 ] . reversed ( ) )
20
-
21
- var vDataOrEmpty = Data ( )
22
- if data. count > 64 {
23
- vDataOrEmpty = Data ( [ invalidByteOrder [ 64 ] ] )
24
- }
25
-
26
- return vDataOrEmpty + r + s
27
- }
28
-
29
12
extension Bridge {
30
13
31
14
/// Produces a **recoverable** ECDSA signature.
@@ -67,7 +50,7 @@ extension Bridge {
67
50
nonceFunctionArbitraryBytes
68
51
)
69
52
}
70
-
53
+
71
54
return Data (
72
55
bytes: & signatureRecoverableBridgedToC. data,
73
56
count: MemoryLayout . size ( ofValue: signatureRecoverableBridgedToC. data)
@@ -218,15 +201,10 @@ extension Bridge {
218
201
ecdsaSignature: ECDSASignatureRecoverable
219
202
) throws -> ECDSASignatureNonRecoverable {
220
203
var recoverableBridgedToC = secp256k1_ecdsa_recoverable_signature ( )
221
- let rs = [ UInt8] ( ecdsaSignature. rs ( ) )
222
- try Self . call (
223
- ifFailThrow: . failedToParseRecoverableSignatureFromECDSASignature
224
- ) { context in
225
- secp256k1_ecdsa_recoverable_signature_parse_compact (
226
- context,
227
- & recoverableBridgedToC,
228
- rs,
229
- Int32 ( ecdsaSignature. recoveryID)
204
+
205
+ withUnsafeMutableBytes ( of: & recoverableBridgedToC. data) { pointer in
206
+ pointer. copyBytes (
207
+ from: ecdsaSignature. rawRepresentation. prefix ( pointer. count)
230
208
)
231
209
}
232
210
@@ -257,7 +235,7 @@ extension Bridge {
257
235
message: [ UInt8 ]
258
236
) throws -> [ UInt8 ] {
259
237
try _recoverPublicKey (
260
- rs: ecdsaSignature. p1364 ( ) ,
238
+ rs: ecdsaSignature. compactRepresentation ( ) ,
261
239
recoveryID: recoveryID,
262
240
message: message
263
241
)
@@ -268,9 +246,16 @@ extension Bridge {
268
246
ecdsaSignature: ECDSASignatureRecoverable ,
269
247
message: [ UInt8 ]
270
248
) throws -> [ UInt8 ] {
271
- try _recoverPublicKey (
272
- rs: ecdsaSignature. rs ( ) ,
273
- recoveryID: Int32 ( ecdsaSignature. recoveryID) ,
249
+ var recoverableBridgedToC = secp256k1_ecdsa_recoverable_signature ( )
250
+
251
+ withUnsafeMutableBytes ( of: & recoverableBridgedToC. data) { pointer in
252
+ pointer. copyBytes (
253
+ from: ecdsaSignature. rawRepresentation. prefix ( pointer. count)
254
+ )
255
+ }
256
+
257
+ return try __recoverPubKeyFrom (
258
+ signatureBridgedToC: recoverableBridgedToC,
274
259
message: message
275
260
)
276
261
}
@@ -283,6 +268,7 @@ extension Bridge {
283
268
) throws -> [ UInt8 ] {
284
269
var signatureBridgedToC = secp256k1_ecdsa_recoverable_signature ( )
285
270
let rs = [ UInt8] ( rsData)
271
+
286
272
try Self . call (
287
273
ifFailThrow: . failedToParseRecoverableSignatureFromECDSASignature
288
274
) { context in
@@ -294,6 +280,17 @@ extension Bridge {
294
280
)
295
281
}
296
282
283
+ return try __recoverPubKeyFrom (
284
+ signatureBridgedToC: signatureBridgedToC,
285
+ message: message
286
+ )
287
+ }
288
+
289
+ static func __recoverPubKeyFrom(
290
+ signatureBridgedToC: secp256k1_ecdsa_recoverable_signature ,
291
+ message: [ UInt8 ]
292
+ ) throws -> [ UInt8 ] {
293
+ var signatureBridgedToC = signatureBridgedToC
297
294
var publicKeyBridgedToC = secp256k1_pubkey ( )
298
295
try Self . call (
299
296
ifFailThrow: . failedToRecoverPublicKeyFromSignature
@@ -378,9 +375,9 @@ public extension ECDSASignatureNonRecoverable {
378
375
wrapped: . init( uncompressedRaw: uncompressedPublicKeyBytes)
379
376
)
380
377
381
- // guard try publicKey.isValid(signature: self, hashed: messageThatWasSigned) else {
382
- // throw K1.Error.expectedPublicKeyToBeValidForSignatureAndMessage
383
- // }
378
+ guard try publicKey. isValid ( signature: self , hashed: messageThatWasSigned) else {
379
+ throw K1 . Error. expectedPublicKeyToBeValidForSignatureAndMessage
380
+ }
384
381
385
382
return publicKey
386
383
}
@@ -394,13 +391,11 @@ public extension K1.PrivateKey {
394
391
mode: ECDSASignatureNonRecoverable . SigningMode = . default
395
392
) throws -> ECDSASignatureRecoverable {
396
393
let messageBytes = [ UInt8] ( message)
397
- let signatureData = try withSecureBytes { ( secureBytes : SecureBytes ) -> Data in
398
- try Bridge . ecdsaSignRecoverable ( message: messageBytes, privateKey: secureBytes , mode: mode)
394
+ let raw = try withSecureBytes {
395
+ try Bridge . ecdsaSignRecoverable ( message: messageBytes, privateKey: $0 , mode: mode)
399
396
}
400
397
401
- return try ECDSASignatureRecoverable (
402
- rawRepresentation: signatureData
403
- )
398
+ return try ECDSASignatureRecoverable . init ( rawRepresentation: raw)
404
399
}
405
400
406
401
/// Produces a **non recoverable** ECDSA signature.
0 commit comments