Duniter/Silkaj/DuniterPy & Scuttlebot - comment partager les clefs de chiffrage des crypto-applications?

Merci pour l’idée https://git.duniter.org/clients/python/silkaj/issues/271

1 « J'aime »

De ce que je comprends, tu encode la clef privée en base58 :

g1priv=$(echo $ssbpriv | base64 -d | base58)

Je suppose que :

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.

1 « J'aime »

C’est ça, je crois exactement ce qui me préoccupe… Mais nous n’utilisons pas tout à fait le même langage :wink:

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 :wink: 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.

2 « J'aime »

essaie déjà le fichier pubsec, et on en recause :wink: 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 :wink:

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

2 « J'aime »

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.

1 « J'aime »

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.

1 « J'aime »

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 :heart:)

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/ :slight_smile:

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?

1 « J'aime »

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é.

1 « J'aime »

Spotted!
:heart_eyes_cat:

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 :

2 « J'aime »