]> gitweb.factorcode.org Git - factor.git/blob - extra/checksums/sodium/sodium.factor
cbf124c45090740da56dfeb988676a0351b26ed5
[factor.git] / extra / checksums / sodium / sodium.factor
1 ! Copyright (C) 2017 Alexander Ilin.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien byte-arrays checksums checksums.common
4 destructors kernel math sequences sodium sodium.ffi ;
5 IN: checksums.sodium
6
7 TUPLE: sodium-checksum
8     { output-size fixnum }
9     { key maybe{ byte-array } } ;
10
11 INSTANCE: sodium-checksum block-checksum
12 C: <sodium-checksum> sodium-checksum
13
14 <PRIVATE
15
16 TUPLE: sodium-state < disposable
17     { state alien }
18     { output-size fixnum }
19     { output maybe{ byte-array } } ;
20
21 PRIVATE>
22
23 M: sodium-checksum initialize-checksum-state
24     [ key>> ] [ output-size>> ] bi
25     sodium-state new-disposable swap >>output-size
26     crypto_generichash_statebytes sodium_malloc >>state
27     [
28         [ state>> ] [ drop swap dup length ] [ output-size>> ] tri
29         crypto_generichash_init check0
30     ] keep ;
31
32 M: sodium-state dispose*
33     state>> [ sodium_free ] when* ;
34
35 M: sodium-state add-checksum-bytes
36     [ dup state>> ] dip dup length crypto_generichash_update check0 ;
37
38 M: sodium-state get-checksum
39     dup output>> [
40         dup state>> [
41             over output-size>> [ <byte-array> ] keep
42             [ crypto_generichash_final check0 ] 2keep drop
43         ] [ B{ } clone ] if*
44         [ >>output ] keep
45     ] unless* nip ;