Signature RSA PSS (pkcs1_pss)

Messages postés
1371
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
11 juin 2019
-
Salut salut,

Je suis en train d'écrire une fonction en python qui doit signer une donnée, puis qui envoie la signature à un programme en Javascript.

Voila le code que j'utilise pour la génération de la signature :
  age = 26
  jsonData = "{\"name\":\"Exileur\",\"age\":" + str(age) + "}"
    f = open('/tmp/key.pem', 'rb')  
    key = RSA.importKey(f.read())  
    h = SHA256.new(jsonData.encode('utf-8'))
    signature = PKCS1_PSS.new(key).sign(h)
    jd = {
      "json": jsonData,
      "signature": binascii.hexlify(signature),
    }
    return jsonify(jd)


Le probléme est que la signature n'est pas reconnu coté Javascript.
( alors que ça fonctionne avec le module de signature javascript ! )

Je pense que ça vient du salt que je ne défini pas en python mais j'en sais rien du tout !

Le code qui vérifie la signature est le suivant :

const kPublicKey = "data:application/octet-stream;base64,MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA10dTTR4pYa9iekWBw9gXdc+ll+f32Opqi2lNjwT4GXnMtI2dZn/+49ELBN01FurZJZiakfIgPLhuut9b3doVQdnK0S9DdTOGFJy8IVo8kFsmpt44dmFZRMTIuScGa13iPL8a7Que3E/XcYzla7CA2jv1qpZPyb8m6GrW8t9iUToWqgKY0II2cvi/ZjNH+I5vNKHicByIJcMIti1a/CdmzLjpIGmDYcSOUJMRfGQ5r6XNu55uSHOzmp68JOWSZxXPAuUGiVmeu2cKBnWYWLwyUyIcU2oAlaqj1XVggj1OHlhLpZOIYawKaSJbZFVb3JzOlKWlB4aWk6UWOGUKrNQHIQIDAQAB";

async function VerifyTicketSignature(aTicket)
{
  let ticket = JSON.parse(aTicket);
  if (typeof ticket.json != "string" || typeof ticket.signature != "string") {
    throw new Error("Required properties not found on ticket");
  }
  let algorithm = {
    name: "RSA-PSS",
    modulusLength: 1024,
    publicExponent: Uint8Array.from([1, 0, 1]),
    hash: { name: "SHA-256" },
    saltLength: 222,
  };
  if (!gKeyPromise) {
    let response = await fetch(kPublicKey);
    let keyArrayBuffer = await response.arrayBuffer();
    gKeyPromise = crypto.subtle.importKey("spki", keyArrayBuffer, algorithm, false, ["verify"]);
  }
  let signatureArrayBuffer = new Uint8Array(ticket.signature.length / 2);
  for (let i = 0; i < signatureArrayBuffer.length; i++) {
    signatureArrayBuffer[i] = parseInt(ticket.signature.substr(i * 2, 2), 16);
  }
  let key = await gKeyPromise;
  if (!await crypto.subtle.verify(algorithm, key, signatureArrayBuffer, (new TextEncoder).encode(ticket.json))) {
    throw new Error("Ticket signature verification failed");
  }
  ticket = JSON.parse(ticket.json);
  return ticket
}


Je dois vous avouez que je suis pas du tout a l'aise avec javascript et le dévelloper du projet n'est plus la pour m'expliquer son code :'(

Toute aide est la bienvenue !
Afficher la suite