Эллиптические Js несовместимы с ECDSA Python - PullRequest
0 голосов
/ 07 марта 2019

Для проверки подписей необходимо добавить «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.

...