tu le pré-prépares pas bien pour la key recovery là non ?
Non, j'attendais tes réponses avant de continuer. Parceque justement la key recovery c'est plus compliqué qu'une lecture de bit ;P (pas de key recovery dans FSV à la signature). Faire une key recovery alors qu'à un moment on a la clé, c'est un peu bete, il suffit juste d'extraire un bit de yR à la signature (cf point suivant et
pull-req Electrum)
- Le dongle pourra t-il fournir une information de parité de yR, comme expliqué dans SEC1-v2? Ca évite de refaire tout un tas de calculs try & guess pour trouver un simple bit.
- Un petit lien ? pour moi ils font une boucle (4.1.6 / 1.6)
SEC1-v2 §4.1.3 Signing Operations p45:
Optionally, output additional information needed to recover R efficiently from r.
The additional information needed to compute R can consist of the point R itself, in either compressed
or uncompressed form. However, since r provides considerable information about xR, it
is often sufficient to provide no extra information to determine xR. At worst, log2(h + 1) bits are
needed to find xR from r. In any case, information needed to recover yR can take the form of single
bit, or the full value of yR depending on whether compactness or speed is preferred.C'est d'ailleurs ce qui est fait dans la signature de message Bitcoin, le header contient un flag de parité de yR (LSB du premier char, 27 ou 28 en std).
Ca permet de rendre déterministe (sans boucle) le recovery de yR et ensuite de Q (=s.R-e.G /r ). Sans cette information, il y a 2 yR possibles, il faudrait les tester jusqu'à matcher Q.
Dans une transaction Bitcoin, on a la clé publique entière, on vérifie autrement. Mais là on vérifie une self-signature, et le document SEC indique que dans ce cas (§4.1.6) : "
Several candidate public keys can be recovered from a signature. At a small cost, the signer can generate the ECDSA signature in such a way that only one of the candidate public keys is viable, and such that the verifier has a very small additional cost of determining which is the correct public key."
- S est-il fourni dans le "lower part" du champ de Z(n), comme le spécifie la "norme Bitcoin" ? Cela réduit la malléabilité des signatures. Par exemple dans FSV c'est le cas à la génération, mais pas encore à la vérification (pour bien respecter RFC1958 §3.9 LOL)
- Je vote que non (et que je n'ai pas forcément la place pour corriger, après si le client officiel le vérifie, faudra probablement que je trouve la place)
Ce sont les utilisateurs qui votent, pas toi
. Par contre, au niveau de la vérification je ne sais pas. C'est vérifié pour les nouvelles transactions au moins? Je crois qu'effectivement ce n'est pas vérifié pour les messages (sinon risque de répudier les anciens). En tout cas dans FSV, j'essaye de coller au plus près du standard (reference client master). BIP62 NewRule #1 indique: "
We require that the S value inside ECDSA signatures is at most the curve order divided by 2 (essentially restricting this value to its lower half range)."
Tu devrais faire pareil, ca évite certains problèmes. D'un autre coté si c'est jamais vérifié, je ne vois même pas à quoi sert cette modification à la génération. Provisoirement, le retour en lower peut peut être fait dans le PC (le code existe dans FSV).
c'est codé comme spécifié dans la partie "DER encoding" de BIP 62
"R: arbitrary-length big-endian encoded R value. It cannot start with any 0x00 bytes, unless the first byte that follows is 0x80 or higher, in which case a single 0x00 is required." donc je ne vois pas le hic.
Ah OK, je pensais le DER plus simple. Autant pour moi... C'est bon alors, je vais juste devoir compléter un peu l'extraction de r et s.
Si tu as fait un setup normal (sans mode 'uncompressed keys'), tous les calculs internes sont réalisés à partir de la version compressée de la clé. Quand on fait un GET WALLET PUBLIC KEY, le dongle renvoie toujours la version non compressée, par contre, histoire de pouvoir rejouer les calculs / vérifier plus rapidement la signature. Donc pour savoir si tu es dans ce mode là ou pas, GET FIRMWARE VERSION effectivement.
Je récapitule pour bien comprendre:
- GET WALLET PUBLIC KEY retourne toujours la clé non-compr (même en mode compr)
- GET FIRMWARE VERSION permet de connaitre le mode compr or not
- Lors de l'écriture du message de confirmation (keyboard), la clé fournie est la clé selon le mode
(je me disais aussi, mince la clé get_pub_key et la clé fournie dans le message "keyboard" est différente.)