Coverage report: /home/ellis/comp/ext/ironclad/src/kdf/kdf.lisp

KindCoveredAll%
expression098 0.0
branch016 0.0
Key
Not instrumented
Conditionalized out
Executed
Not executed
 
Both branches taken
One branch taken
Neither branch taken
1
 ;;;; -*- mode: lisp; indent-tabs-mode: nil -*-
2
 (in-package :crypto)
3
 
4
 (defun list-all-kdfs ()
5
   (copy-list '(:argon2i :argon2d :bcrypt :bcrypt-pbkdf
6
                :hmac-kdf :pbkdf1 :pbkdf2 :scrypt-kdf)))
7
 
8
 (defun make-kdf (kind &key digest
9
                       (n 4096) (r 8) (p 2)
10
                       (block-count 10000) additional-key additional-data)
11
   ;; PBKDF1, at least, will do stricter checking; this is good enough for now.
12
   "digest is used for pbkdf1 and pbkdf2.
13
 N, p, and r are cost factors for scrypt.
14
 block-count, additional-key and additional-data are parameters for
15
 argon2"
16
   (case (massage-symbol kind)
17
     (pbkdf1
18
      (let ((digest-name (massage-symbol digest)))
19
        (unless (digestp digest-name)
20
          (error 'unsupported-digest :name digest))
21
        (make-instance 'pbkdf1 :digest digest-name)))
22
     (pbkdf2
23
      (let ((digest-name (massage-symbol digest)))
24
        (unless (digestp digest-name)
25
          (error 'unsupported-digest :name digest))
26
        (make-instance 'pbkdf2 :digest digest-name)))
27
     (hmac-kdf
28
      (let ((digest-name (massage-symbol digest)))
29
        (unless (digestp digest-name)
30
          (error 'unsupported-digest :name digest))
31
        (make-instance 'hmac-kdf :digest digest-name :info additional-data)))
32
     (scrypt-kdf
33
      (when (or (<= n 1)
34
                (not (zerop (logand n (1- n))))
35
                (>= (* r p) (expt 2 30)))
36
        (error 'unsupported-scrypt-cost-factors :n n :r r :p p))
37
      (make-instance 'scrypt-kdf :n n :r r :p p))
38
     (argon2i
39
      (when (< block-count 8)
40
        (error 'unsupported-argon2-parameters))
41
      (make-instance 'argon2i
42
                     :block-count block-count
43
                     :additional-key additional-key
44
                     :additional-data additional-data))
45
     (argon2d
46
      (when (< block-count 8)
47
        (error 'unsupported-argon2-parameters))
48
      (make-instance 'argon2d
49
                     :block-count block-count
50
                     :additional-key additional-key
51
                     :additional-data additional-data))
52
     (argon2id
53
      (when (< block-count 8)
54
        (error 'unsupported-argon2-parameters))
55
      (make-instance 'argon2id
56
                     :block-count block-count
57
                     :additional-key additional-key
58
                     :additional-data additional-data))
59
     (bcrypt
60
      (make-instance 'bcrypt))
61
     (bcrypt-pbkdf
62
      (make-instance 'bcrypt-pbkdf))
63
     (t
64
      (error 'unsupported-kdf :kdf kind))))