Для проверки подписей необходимо добавить «04» к открытому ключу, что делает эллиптический элемент несовместимым с экдсой python.
Пример:
Veryfing подпись в Typescript:
async isSignatureValid(
signerPubKey: string,
payload: string,
signature: any,
): Promise<boolean> {
const pubKey = this.elliptic.keyFromPublic('04' + signerPubKey, 'hex');
var m = signature.match(/([a-f\d]{64})/gi);
const sign = {
r: m[0],
s: m[1],
};
const key = this.elliptic.keyFromPublic(pubKey, 'hex');
const isValid = key.verify(payload, sign);
return isValid;
}
Генерация подписи в Python:
import ecdsa
import json
import hashlib
payload = {
"deviceModel": "test",
"sensorIds": [0, 1, 2],
"subAssembliesIds": [],
"actionsIds": [],
"sensorsDescriptions": [{"0": ""}, {"1": ""}, {"2": ""}],
"subAssembliesDescriptions": [],
"actionsDescriptions": []
}
payload_to_string = "0" # json.dumps(payload).encode('utf8')
paylaod_hash = hashlib.sha256(payload_to_string.encode('utf8')).hexdigest()
public = "ae5de5fbd3d9fb849ed4ecf239fb6ce2f3c4499fb770f61bf18e2d59a7ca734a562cad0bf0d26e9db2bae4a6662df88c4b0395ff30a58fb8b0121e0bb14a1571"
priv = "67ab1d04e6ba7b39c3796213bc965a380e7815407d3d7fd8ad1649d4fc650599"
pv = ecdsa.SigningKey.from_string(bytes.fromhex(priv), curve=ecdsa.SECP256k1)
pb = ecdsa.VerifyingKey.from_string(
bytes.fromhex(public), curve=ecdsa.SECP256k1)
payload_signed = pv.sign(bytes.fromhex(paylaod_hash))
print(paylaod_hash)
print(payload_signed.hex())
print(pb.verify(payload_signed, bytes.fromhex(paylaod_hash))) # True
В обеих ситуациях открытый ключ один и тот же, но в Typescript isSignatureValid возвращает false, а python возвращает True.