summaryrefslogtreecommitdiff
path: root/org/_posts/2022-12-29-on-peut-maintenant-hacher-des-données-avec-gnutls-et-guile.org
blob: 3584ed12405db6509e726d147ef98675096e485c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#+options: toc:nil

#+begin_export html
---
layout: default
title: On peut maintenant hacher des données avec GnuTLS + Guile !
excerpt: La cryptographie, c’est compliqué. En Guile Scheme, ça l’est encore plus ! Heureusement, on peut utiliser GnuTLS en Guile.
---
#+end_export

Chers amis des chats et du lisp, bonjour. Je me présente : Twinky. Je
reprends ce blog afin de continuer le travail de mon prédécesseur :
vous transmettre la passion des chats et du développement
informatique.

[[file:../../../code/images/twinky.jpg]]

Aujourd’hui, je vous informe que l’humain a agrémenté le code de
gnutls/guile [[https://gitlab.com/gnutls/guile/-/merge_requests/5][avec les fonctions de hachage]][fn::Notez que depuis
l’écriture de cet article, la nouvelle version 3.7.12 a été publiée
avec ces changements.]. Ou devrais-je dire, les fonctions de
chachage ? À vous de juger. Le programme [[exemple-hash]] montre ce qu’on
peut faire avec !  Sympa, non ?

#+name: exemple-hash
#+caption: Exemple d’utilisation de la fonction de hachage
#+begin_src scheme :eval no
  (use-modules (gnutls) (ice-9 match) (rnrs bytevectors)
               (srfi srfi-26))

  (define chiffre->hex
    (cute string-ref "0123456789abcdef" <>))

  (define (chiffres->hex . chiffres)
    (list->string (map chiffre->hex chiffres)))

  (define (octet->hex octet)
    (call-with-values
        (cute euclidean/ octet 16)
      chiffres->hex))

  (define octets->hex
    (cute map octet->hex <>))

  (define (->hex octets)
    (string-join (octets->hex (bytevector->u8-list octets)) ""))

  (let* ((message "Bonjour les amis des chats !")
         (condensat (hash-direct digest/sha256 (string->utf8 message))))
    (format #t "Quand je hache « ~a », j’obtiens :
  ,#+begin_example
    ~a
  ,#+end_example"
            message (->hex condensat)))
#+end_src

#+begin_src shell :eval yes :exports results :results output drawer :noweb yes
  guile -s <(cat <<EOF
  <<exemple-hash>>
  EOF
             )
#+end_src