Comments (4)
Hey @paulmillr , should have elaborated apologies! Thanks for the clear example on the verification working above. I think this corner case is seen whenever secp.recoverPublicKey
comes into the mix...
const secp = require('@noble/secp256k1');
const priv = secp.utils.randomPrivateKey();
const SHA256 = require('crypto-js/sha256');
(async () => {
const message = JSON.stringify({
to: "0xbeef",
amount: parseInt(40)
});
const message2 = JSON.stringify({
to: "0xdead",
amount: parseInt(50)
});
// different message hashes
const msg1Hash = SHA256(message).toString();
const msg2Hash = SHA256(message2).toString();
// msg is SIGNED here!
const signatureArray = await secp.sign(msg1Hash, priv, {
recovered: true
});
// get signature + rBit
const signature = signatureArray[0];
const rBit = signatureArray[1];
// recover public key using signed message hash + sig + rBit
const recoveredPublicKey1 = secp.recoverPublicKey("beef", signature, rBit).toString('hex');
// verify
// yields false
console.log('verify', msg1Hash);
console.log(secp.verify(signature, msg1Hash, recoveredPublicKey1));
// verify message passed in to secp.recoverPublicKey but never signed!
// yields true when should yield false
console.log('verify msg2Hash but corner case!', msg2Hash);
console.log(secp.verify(signature, "beef", recoveredPublicKey1));
})()
from noble-secp256k1.
const secp = require('@noble/secp256k1');
const priv = secp.utils.randomPrivateKey();
const pub = secp.getPublicKey(priv);
const msg = 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
const msg2 = msg.replace(/d/g, '3');
(async () => {
const signed = await secp.sign(msg, priv);
console.log('verify', msg);
console.log(secp.verify(signed, msg, pub));
console.log('verify', msg2)
console.log(secp.verify(signed, msg2, pub));
})()
verify deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
true
verify 3ea3beef3ea3beef3ea3beef3ea3beef3ea3beef3ea3beef3ea3beef3ea3beef
false
from noble-secp256k1.
Still seeing correct behavior with your code, on my machine:
verify 305d43b0105f8bace8654dbc838e65e4ddfde377f82141719ecc60895a8d6124
false
verify msg2Hash but corner case! b592da96de07d6f1b2ec6ef53a5c48a9d36213e944a705d2caebebe0097f6009
false
BTW, this line is invalid:
const recoveredPublicKey1 = secp.recoverPublicKey("beef", signature, rBit).toString('hex');
It should have prob been:
const recoveredPublicKey1 = secp.recoverPublicKey(msg1Hash, signature, rBit).toString('hex');
BTW 2: I suggest to use noble-hashes instead of crypto-js
from noble-secp256k1.
@AlvaroLuken can you try using the most recent release?
from noble-secp256k1.
Related Issues (20)
- Hex private keys should be more permissive. HOT 3
- Need a new function for a recovery(v) for HSM
- Upgrade to v2 causes etc.hmacSha256Sync not set HOT 1
- How do I initialize a Signature with the v2? HOT 3
- Non-https website don't have subtle property in window.crypto HOT 1
- 33bytes PK? (Migrating from curves => secp256k1) HOT 4
- Got Error [ERR_REQUIRE_ESM] on import HOT 1
- why secp256k1.utils.randomPrivateKey() produce a 32 bytes key? HOT 1
- Is it possible to use sha3_256 for secp256k1 HOT 2
- SyntaxError with @noble/secp256k1 in React Native 0.67.4 HOT 1
- What `xOnlyPointFromPoint()` equivalent would look like? HOT 1
- Signatures will randomly return as invalid. HOT 1
- nodeCrypto is truthy when disabled HOT 6
- Backwards compatbility with secp256k1-node HOT 3
- 1.7.1: `Point.add` is not throwing for "1 + -1 == 0/Infinity" HOT 3
- Removed v2 code snippets HOT 4
- Is this compatible with the elliptic package? HOT 4
- [doc] privateKeyTweakAdd and publicKeyTweakAdd for HD Wallets HOT 3
- Suggestion: Use globalThis.crypto instead of node crypto for cross-platform compatibility. HOT 2
- Generate seed phrase from private key HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from noble-secp256k1.