2020
2121namespace TW {
2222
23- static constexpr size_t kEcdsaMinDigestSize = 32 ;
24-
25- bool validateSignatureLength (TWPublicKeyType type, const Data& signature) {
23+ static bool validateSignatureLength (TWPublicKeyType type, const Data& signature) {
2624 switch (type) {
2725 case TWPublicKeyTypeSECP256k1:
2826 case TWPublicKeyTypeSECP256k1Extended:
@@ -37,6 +35,27 @@ bool validateSignatureLength(TWPublicKeyType type, const Data& signature) {
3735 }
3836}
3937
38+ static bool validateMessageLength (TWPublicKeyType type, const Data& message) {
39+ switch (type) {
40+ case TWPublicKeyTypeED25519:
41+ case TWPublicKeyTypeCURVE25519:
42+ case TWPublicKeyTypeED25519Blake2b:
43+ case TWPublicKeyTypeED25519Cardano:
44+ // Allow any message size for ed25519.
45+ return true ;
46+ case TWPublicKeyTypeSECP256k1:
47+ case TWPublicKeyTypeNIST256p1:
48+ case TWPublicKeyTypeSECP256k1Extended:
49+ case TWPublicKeyTypeNIST256p1Extended:
50+ return message.size () == PublicKey::ecdsaMessageSize;
51+ case TWPublicKeyTypeStarkex:
52+ // Digest shorter than 32 bytes will be left-padded with zeros before verification.
53+ return message.size () <= PublicKey::starkexMessageMaxSize;
54+ default :
55+ return false ;
56+ }
57+ }
58+
4059// / Determines if a collection of bytes makes a valid public key of the
4160// / given type.
4261bool PublicKey::isValid (const Data& data, enum TWPublicKeyType type) {
@@ -167,15 +186,16 @@ bool PublicKey::verify(const Data& signature, const Data& message) const {
167186 if (!validateSignatureLength (type, signature)) {
168187 return false ;
169188 }
189+ if (!validateMessageLength (type, message)) {
190+ return false ;
191+ }
170192
171193 switch (type) {
172194 case TWPublicKeyTypeSECP256k1:
173195 case TWPublicKeyTypeSECP256k1Extended:
174- if (message.size () < kEcdsaMinDigestSize ) { return false ; }
175196 return ecdsa_verify_digest (&secp256k1, bytes.data (), signature.data (), message.data ()) == 0 ;
176197 case TWPublicKeyTypeNIST256p1:
177198 case TWPublicKeyTypeNIST256p1Extended:
178- if (message.size () < kEcdsaMinDigestSize ) { return false ; }
179199 return ecdsa_verify_digest (&nist256p1, bytes.data (), signature.data (), message.data ()) == 0 ;
180200 case TWPublicKeyTypeED25519:
181201 return ed25519_sign_open (message.data (), message.size (), bytes.data (), signature.data ()) == 0 ;
@@ -187,7 +207,7 @@ bool PublicKey::verify(const Data& signature, const Data& message) const {
187207 }
188208 case TWPublicKeyTypeCURVE25519: {
189209 auto ed25519PublicKey = Data ();
190- ed25519PublicKey.resize (PublicKey:: ed25519Size);
210+ ed25519PublicKey.resize (ed25519Size);
191211 curve25519_pk_to_ed25519 (ed25519PublicKey.data (), bytes.data ());
192212
193213 ed25519PublicKey[31 ] &= 0x7F ;
@@ -207,10 +227,13 @@ bool PublicKey::verify(const Data& signature, const Data& message) const {
207227}
208228
209229bool PublicKey::verifyAsDER (const Data& signature, const Data& message) const {
230+ if (message.size () != ecdsaMessageSize) {
231+ return false ;
232+ }
233+
210234 switch (type) {
211235 case TWPublicKeyTypeSECP256k1:
212236 case TWPublicKeyTypeSECP256k1Extended: {
213- if (message.size () < kEcdsaMinDigestSize ) { return false ; }
214237 Data sig (64 );
215238 int ret = ecdsa_sig_from_der (signature.data (), signature.size (), sig.data ());
216239 if (ret) {
0 commit comments