Merci pour l’idée Document the authentication formats (#271) · Issues · clients / python / silkaj · GitLab
De ce que je comprends, tu encode la clef privée en base58 :
g1priv=$(echo $ssbpriv | base64 -d | base58)
Je suppose que :
- soit c’est possible de sauver ta clef privée dans un fichier et de passer ce fichier à Duniterpy, car duniterpy sait générer un trousseau de clefs depuis la clef privée
echo $ssbpriv | base64 -d > prikey.file
# puis en python
from_private_key(privkey.file)
- soit ce n’est pas possible, et alors tu peux t’en sortir en générant un fichier pubsec, qui contient les clefs pub et priv en base58. Duniterpy sait les utiliser, silkaj et Cesium également.
print "Type: PubSec\nVersion: 1\npub: $g1pub\nsec: $g1priv\n" > PubSecFile.dunikey
# (ou un truc du genre)
Ce sont uniquement des suppositions que je fais, pas des certitudes.
C’est ça, je crois exactement ce qui me préoccupe… Mais nous n’utilisons pas tout à fait le même langage
Il semble que ce soit une “feature” attendue dans silkaj
Qui me fait un devis pour ça?
en fait je transforme une clef au format de scuttlebot dans un format silkaj/duniter… De mon espace relatif Tous les 2 ont la même crypto… je veux expérimenter l’entité qui émerge de l’assemblage des 2… J’ai l’impression qu’elle est marrante.
essaie déjà le fichier pubsec, et on en recause Si ça marche, c’est prix libre (et je le veux bien en planche de Ğ1Billet, je m’occuperai du scotch à gratter)
edit : hum… Je viens d’essayer avec un fichier pubsec créé par Cesium, et Silkaj refuse… à fouiller.
ouais mais quand je tape python, il me vire du bash… et j’ai tout un espace inconnu et immense qui me fait penser à l’océan… Un peu comme j’ose pas plonger du bateau au milieu de l’Océan (si je l’ai fait une fois), ça me fait le même effet…
là, tout est en bash.
# créer le fichier pubsec (un truc du genre, tu peux essayer echo aussi au lieu de print)
print "Type: PubSec\nVersion: 1\npub: $g1pub\nsec: $g1priv\n" > PubSecFile.dunikey
# utiliser le fichier pubsec dans Silkaj :
silkaj -af --file PubSecFile.dunikey balance
Ah merde ouais… Euh et bien on en revient à cette “issue” alors?
J’ai les moyens de payer
Le keyring.yml
de Duniter, qu’on peut trouver dans $HOME/.config/duniter/duniter_default/keyring.yml
est également au format PubSec, mais le format n’est pas compatible avec celui de DuniterPy. Il faut adapter les cotes ou un truc du genre.
« pas compatible » dans quel sens ? lecture ou écriture ? Je viens d’essayer en sautant le regexp de vérification du fichier pubsec :
code python trafiqué:
@pass_context
def auth_by_auth_file(ctx):
file = ctx.obj["AUTH_FILE_PATH"]
authfile = Path(file)
if not authfile.is_file():
message_exit('Error: the file "' + file + '" does not exist')
filetxt = authfile.open("r").read()
regex_seed = compile("^[0-9a-fA-F]{64}$")
regex_gannonce = compile(
"^pub: [1-9A-HJ-NP-Za-km-z]{43,44}\nsec: [1-9A-HJ-NP-Za-km-z]{88,90}.*$"
)
# Seed Format
if search(regex_seed, filetxt):
return SigningKey.from_seedhex_file(file)
# gannonce.duniter.org Format
# elif search(regex_gannonce, filetxt):
# return SigningKey.from_pubsec_file(file)
# just testing
return SigningKey.from_pubsec_file(file)
# else:
# message_exit("Error: the format of the file is invalid")
et ça marche :
bin/silkaj -af --file trousseau-BdanxHdw-g1-PubSec.dunikey --gtest tx --output CvrMiUhAJpNyX5sdAyZqPE6yEFfSsf6j9EpMmeKvMCWW --amount 100
╒══════════════════════════════╤══════════════════════════════════════════════╕
│ pubkey’s balance before tx │ 490.0 ĞTest │
├──────────────────────────────┼──────────────────────────────────────────────┤
│ total amount (unit|relative) │ 100.0 ĞTest | 0.0225 UD ĞTest │
├──────────────────────────────┼──────────────────────────────────────────────┤
│ pubkey’s balance after tx │ 390.0 ĞTest │
├──────────────────────────────┼──────────────────────────────────────────────┤
│ from (pubkey) │ BdanxHdwRRzCXZpiqvTVTX4gyyh6qFTYjeCWCkLwDifx │
├──────────────────────────────┼──────────────────────────────────────────────┤
│ to (pubkey) │ CvrMiUhAJpNyX5sdAyZqPE6yEFfSsf6j9EpMmeKvMCWW │
├──────────────────────────────┼──────────────────────────────────────────────┤
│ amount (unit|relative) │ 100.0 ĞTest | 0.0225 UD ĞTest │
├──────────────────────────────┼──────────────────────────────────────────────┤
│ comment │ │
╘══════════════════════════════╧══════════════════════════════════════════════╛
Do you confirm sending this transaction? [yes/no]: yes
Generate Transaction:
- From: BdanxHdwRRzCXZpiqvTVTX4gyyh6qFTYjeCWCkLwDifx
- To: CvrMiUhAJpNyX5sdAyZqPE6yEFfSsf6j9EpMmeKvMCWW
- Amount: 100.0
Transaction successfully sent.
Donc Duniterpy sait utiliser un fichier pubsec généré par Cesium, en quoi n’est-ce pas compatible ? Pour moi, ça ressemble plutôt à un problème de regexp… domaine dans lequel je dois monter en compétence.
Voici à quoi ressemble le fichier PubSec (vous enflammez pas, y’a que des GTest dessus):
Type: PubSec
Version: 1
pub: BdanxHdwRRzCXZpiqvTVTX4gyyh6qFTYjeCWCkLwDifx
sec: 2CNFWPJEi9oy9RQYpDYmPvFsRbaQQBzi6n4McqQsJmYQ336NL8nsewG7p49SVa6bgEwKzmB1pMtD7SmnxD2EM5LA
Lecture du moins. Après, DuniterPy, je l’espère génère le même format et sais lire le format généré. Sinon, c’est incohérent.
La regex n’a pas matché sur le format PubSec de Césium.
C’est pas le même formatage tout simplement.
Clairement, c’était un chantier pour la 0.8, mais y’a toujours des nouvelles choses à gérer qui prennent la priorité, qui fait que la gestion correcte des méthodes d’authentification est passé après.
Le format de Duniter :
pub: XX
sec: XX
proche de celui de DuniterPy :
Ça matche pas celui de Césium.
C’est à on avis la clef du crypto Web qui se crée:!!!
Allez je mets 240 DU sur le tapis (24.000 LOVE )
Bon, je crois qu’il y a un bug dans Silkaj, mais j’expliciterai plus tard, là dodo.
@Frederic_Renault teste ce code en bash, je pense avoir trouvé ta solution :
#!/bin/bash
g1pub="BdanxHdwRRzCXZpiqvTVTX4gyyh6qFTYjeCWCkLwDifx"
g1priv="2CNFWPJEi9oy9RQYpDYmPvFsRbaQQBzi6n4McqQsJmYQ336NL8nsewG7p49SVa6bgEwKzmB1pMtD7SmnxD2EM5LA"
# créer le fichier pubsec (un truc du genre)
file="PubSecFile.dunikey"
rm $file # c'est mieux pour vider les tests précédents
echo "pub: $g1pub" >> $file
echo "sec: $g1priv" >> $file
# utiliser le fichier pubsec dans Silkaj :
silkaj -af --file $file --gtest balance
normalement je pense qu’il devrait fonctionner avec Silkaj. Le fichier pubsec ne doit pas contenir de champs « Type » et « Version », il doit ressembler à :
pub: BdanxHdwRRzCXZpiqvTVTX4gyyh6qFTYjeCWCkLwDifx
sec: 2CNFWPJEi9oy9RQYpDYmPvFsRbaQQBzi6n4McqQsJmYQ336NL8nsewG7p49SVa6bgEwKzmB1pMtD7SmnxD2EM5LA
#PourMoiCaMarche
Attention cependant : Silkaj a une RE qui matche pour des clefs priv de longueur {88,90} alors que Duniterpy matche pour des privkey de longueur {87,90}, je ne sais pas qui a juste. Pas sûr que ça marche pour toutes les clefs priv rencontrées, donc.
Perso j’utilise https://regex101.com/
Merci @matograine tu as grandement fait avancer la compréhension du phénomène.
Par contre comme tu le craignais, j’ai du pas matcher la longueur?
ssbpub=$(cat .ssb/secret | grep public\" | cut -d ' ' -f 4 | cut -d '.' -f 1 | sed s/\"//g)
ssbpriv=$(cat .ssb/secret | grep private\" | cut -d ' ' -f 4 | cut -d '.' -f 1 | sed s/\"//g)
g1pub=$(echo $ssbpub | base64 -d | base58)
g1priv=$(echo $ssbpriv | base64 -d | base58)
# Qui donnent dans le cas de mon ssb
g1pub=SSytWZ4LpL9XtCYeaGXqsFDc16sk6hReCBWo2pXKDB9
g1priv=T8X5ZairryS6sfWt7dVHKzSL2oHrLaH7v42s8sJzeVEnPzA6aN7F7PikoGe5c3t372zLb9xcgnJkipwF8qbPWbu
# créer le fichier pubsec (un truc du genre, tu peux essayer echo aussi au lieu de print)
file="PubSecFile.dunikey"
rm $file # c'est mieux pour vider les tests précédents
echo "pub: $g1pub" >> $file
echo "sec: $g1priv" >> $file
# utiliser le fichier pubsec dans Silkaj :
silkaj -af --file $file --gtest balance
Error: the format of the file is invalid
Je dirai que 88 est plus juste?
Non c’est le contraire. Duniterpy accepte des privkey de longueur 87 comme celle que tu obtiens et qui est donc sans doute valide, mais Silkaj les refuse en-dessous de 88. C’est donc Duniterpy qui a raison, ta clef priv aurait dû être acceptée.
Spoiler : c’est un des éléments du bug que je crois avoir relevé.
Spotted!
Ca me fait penser au code que @tuxmain a créé :
https://git.p2p.legal/axiom-team/G1sms/src/master/shell/natools.py
Il me sert à chiffrer/déchiffrer les données inscritent dans ipfs… et discuter entre ipfs node
J’utilise cet outil avec le authfile (seed silkaj), il vaudrait mieux utiliser aussi pub/sec dans ce cas?
De mémoire, quand j’ai implémenté le support des fichiers d’authentification, j’ai copié le code de Silkaj.
Ça ne fonctionnait pas à cause du regexp, que j’ai modifié dans Duniterpy. J’ai évidemment complètement oublié de le signaler à @moul… My bad. Mais c’est dans l’historique des commits :