Skip to content

Commit b9d68e4

Browse files
committed
Secp256k1: allow string signature as well #9
1 parent 0cfc81c commit b9d68e4

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,13 @@ use kornrunner\Secp256k1;
5050

5151
$secp256k1 = new Secp256k1();
5252

53-
// signature was created by sign method
53+
// signature can be a SignatureInterface object created by sign method
5454
// hash and publicKey are hex strings
5555
$isVerified = $secp256k1->verify($hash, $signature, $publicKey);
56+
57+
// or signature can be a hex string directly
58+
$signatureString = 'f67118680df5993e8efca4d3ecc4172ca4ac5e3e007ea774293e37386480970347427f3633371c1a30abbb2b717dbd78ef63d5b19b5a951f9d681cccdd520320';
59+
$isVerified = $secp256k1->verify($hash, $signatureString, $publicKey);
5660
```
5761

5862
## License

src/Secp256k1.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use InvalidArgumentException;
66
use kornrunner\Serializer\HexPrivateKeySerializer;
7+
use kornrunner\Serializer\HexSignatureSerializer;
78
use kornrunner\Signature\Signer;
89
use Mdanter\Ecc\Crypto\Signature\SignatureInterface;
910
use Mdanter\Ecc\Curves\CurveFactory;
@@ -24,11 +25,14 @@ class Secp256k1
2425

2526
protected $algorithm;
2627

28+
protected $signatureSerializer;
29+
2730
public function __construct(string $hashAlgorithm='sha256') {
2831
$this->adapter = new ConstantTimeMath();
2932
$this->generator = CurveFactory::getGeneratorByName(SecgCurve::NAME_SECP_256K1);
3033
$this->curve = $this->generator->getCurve();
3134
$this->deserializer = new HexPrivateKeySerializer($this->generator);
35+
$this->signatureSerializer = new HexSignatureSerializer();
3236
$this->algorithm = $hashAlgorithm;
3337
}
3438

@@ -49,8 +53,12 @@ public function sign(string $hash, string $privateKey, array $options=[]): Signa
4953
return $signer->sign($key, $hex_hash, $randomK);
5054
}
5155

52-
public function verify(string $hash, SignatureInterface $signature, string $publicKey): bool
56+
public function verify(string $hash, SignatureInterface|string $signature, string $publicKey): bool
5357
{
58+
if (is_string($signature)) {
59+
$signature = $this->signatureSerializer->parse($signature);
60+
}
61+
5462
$gmpKey = $this->decodePoint($publicKey);
5563
$key = $this->generator->getPublickeyFrom($gmpKey->getX(), $gmpKey->getY());
5664
$hex_hash = gmp_init($hash, 16);

test/unit/Secp256k1Test.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,28 @@ public static function verify (): array {
6868
];
6969
}
7070

71+
/**
72+
* @dataProvider verifyWithStringSignature
73+
*/
74+
public function testVerifyWithStringSignature(string $message, string $signatureString, string $publicKey) {
75+
$this->assertTrue($this->secp256k1->verify($message, $signatureString, $publicKey));
76+
}
77+
78+
public static function verifyWithStringSignature(): array {
79+
return [
80+
['98d22cdb65bbf8a392180cd2ee892b0a971c47e7d29daf31a3286d006b9db4dc', 'f67118680df5993e8efca4d3ecc4172ca4ac5e3e007ea774293e37386480970347427f3633371c1a30abbb2b717dbd78ef63d5b19b5a951f9d681cccdd520320', '04cf60398ae73fd947ffe120fba68947ec741fe696438d68a2e52caca139613ff94f220cd0d3e886f95aa226f2ad2b86be1dd5cda2813fd505d1f6a8f552904864'],
81+
['710aee292b0f1749aaa0cfef67111e2f716afbdb475e7f250bdb80c6655b0a66', '8d8bfd01c48454b5b3fed2361cbd0e8c3282d5bd2e26762e4c9dfbe1ef35f3256d6a5dc397934b5544835f34ff24263cbc00bdd516b6f0df3f29cdf6c779ccfb', '04cf60398ae73fd947ffe120fba68947ec741fe696438d68a2e52caca139613ff94f220cd0d3e886f95aa226f2ad2b86be1dd5cda2813fd505d1f6a8f552904864'],
82+
// Test with 0x prefix
83+
['98d22cdb65bbf8a392180cd2ee892b0a971c47e7d29daf31a3286d006b9db4dc', '0xf67118680df5993e8efca4d3ecc4172ca4ac5e3e007ea774293e37386480970347427f3633371c1a30abbb2b717dbd78ef63d5b19b5a951f9d681cccdd520320', '04cf60398ae73fd947ffe120fba68947ec741fe696438d68a2e52caca139613ff94f220cd0d3e886f95aa226f2ad2b86be1dd5cda2813fd505d1f6a8f552904864'],
84+
];
85+
}
86+
87+
public function testVerifyWithInvalidStringSignature() {
88+
$message = '98d22cdb65bbf8a392180cd2ee892b0a971c47e7d29daf31a3286d006b9db4dc';
89+
$invalidSignature = 'aaaa18680df5993e8efca4d3ecc4172ca4ac5e3e007ea774293e37386480970347427f3633371c1a30abbb2b717dbd78ef63d5b19b5a951f9d681cccdd520320';
90+
$publicKey = '04cf60398ae73fd947ffe120fba68947ec741fe696438d68a2e52caca139613ff94f220cd0d3e886f95aa226f2ad2b86be1dd5cda2813fd505d1f6a8f552904864';
91+
92+
$this->assertFalse($this->secp256k1->verify($message, $invalidSignature, $publicKey));
93+
}
94+
7195
}

0 commit comments

Comments
 (0)