changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/cry/pkg.lisp

changeset 698: 96958d3eb5b0
parent: 7120877e0453
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 (defpackage :cry
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
   (:nicknames :cryptography)
495
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
3
   (:shadowing-import-from :ironclad :integer-to-octets :octets-to-integer :xor)
374
d1d64b856fae rm dexador dependency
Richard Westhaver <ellis@rwest.io>
parents: 362
diff changeset
4
   (:use :cl :std :sb-thread :sb-concurrency #+crypto :ironclad :obj/db :obj/id)
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
   (:export :crypto-error :crypto-token-expired :crypto-token-invalid
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
    :crypto-key :token :crypto-token :password
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
    :*default-password-db* :*default-password-hasher* :*default-password-store* :*default-password-pepper*
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
    :password-db))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
 (defpackage :cry/hotp
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
   (:nicknames :hotp)
239
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
12
   (:use :cl :std :cry)
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
13
   (:export *digits*
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
14
            *hmac-sha-mode*
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
15
            hotp))
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 (defpackage :cry/totp
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
   (:nicknames :totp)
239
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
19
   (:use :cl :std :cry/hotp)
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
20
   (:export *time-zero*
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
21
            *time-step-in-seconds* 
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
22
            totp))
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
 (defpackage :cry/crc64
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
   (:use :cl)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
   (:export :+polynomial+ :+improved-polynomial+
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
            :init-crc64 :crc64-stream
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
            :crc64-file :crc64-sequence))
495
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
29
 
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
30
 (defpackage :cry/jwt
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
31
   (:use :cl :std :dat/json :dat/proto :cry)
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
32
   (:export))
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
33
 
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
34
 (defpackage :cry/authinfo
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
35
   (:use :cl :std :cry)
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
36
   (:export))
7120877e0453 crypto updates
Richard Westhaver <ellis@rwest.io>
parents: 374
diff changeset
37
 
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
 (in-package :cry)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
 (defvar *password-db* nil
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
   "The default password database.")
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
 (defvar *password-hasher* nil
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
   "The default password hasher.")
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
 (defvar *password-store* nil
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
   "The default password store.")
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
 (defvar *password-pepper* nil
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
   "The default pepper value for password hashing. Make sure you change this.")
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
 (defclass token (id) ())
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
51
 (defun random-token () 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
52
   (let ((id (make-array 64 :element-type '(unsigned-byte 8) :fill-pointer 0)))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
53
     (dotimes (i 64)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
54
       (vector-push (random 128) id))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
55
     (make-instance 'token :id id)))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
56
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
57
 (defgeneric token-bytes (self)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
58
   (:method ((self token))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
59
     (id self)))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
60
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
61
 (defgeneric token-string (self)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
62
   (:method ((self token))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
63
     (sb-ext:octets-to-string (obj/id:id self))))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
64
 
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
65
 (defclass crypto-token (token) ())
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
66
 (defclass crypto-key (id) ())
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
67
 (defclass password () ())
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
68
 (defclass password-db (database) ())
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
69
 (defclass password-store () ())
239
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
70
 
2596311106ae img/cry init
Richard Westhaver <ellis@rwest.io>
parents: 234
diff changeset
71
 ;;; Proto
234
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
72
 (defgeneric register-user (user &key store password deadline)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
73
   (:documentation "Register user identified by TOKEN in store specified by STORE. Returns
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
74
 the user object and an optionally a confirmation token."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
75
 (defgeneric get-confirmation-token (user &key store duration)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
76
   (:documentation "Create a new user confirmation token which must be
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
77
   validated within DURATION if non-nil. Register it for USER in STORE."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
78
 (defgeneric confirm-registration (user confirmation &key store)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
79
   (:documentation "Confirm USER using CONFIRMATION in STORE."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
80
 (defgeneric user-pending-p (user &key store)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
81
   (:documentation "Return non-nil if USER isn't pending confirmation, else nil."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
82
 (defgeneric user-known-p (user &key store)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
83
   (:documentation "Return non-nil if USER is known in STORE."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
84
 (defgeneric authenticate-user (user password &key store)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
85
   (:documentation "Check whether USER successfully authenticates with PASSWORD in STORE. If user had a reset-token pending, clear it upon success."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
86
 (defgeneric get-reset-token (user &key store duration)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
87
   (:documentation "Create a new reset token, register it for USER in STORE for DURATION."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
88
 (defgeneric clear-reset-token (user &key store)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
89
   (:documentation "Clear reset token of USER."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
90
 (defgeneric reset-password (user reset new &key store)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
91
   (:documentation "Reset password of USER in STORE to NEW, authenticating with RESET."))
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
92
 (defgeneric delete-user (user &key store error-p)
d7aa08025537 cry, obj/meta, ffi/magick
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
93
   (:documentation "Delete user identified by USER in STORE. Signal an error if user can't be found and ERROR-P is non-nil."))