Initial.
						commit
						aec0e2a7c1
					
				| @ -0,0 +1,9 @@ | ||||
| (defpackage :cl-password-system (:use :asdf :cl)) | ||||
| 
 | ||||
| (in-package :cl-password-system) | ||||
| 
 | ||||
| (defsystem :cl-password | ||||
|   :version "0.1" | ||||
|   :depends-on (ironclad) | ||||
|   :components ((:file "packages") | ||||
|                (:file "cl-password" :depends-on ("packages")))) | ||||
| @ -0,0 +1,47 @@ | ||||
| (in-package :cl-password) | ||||
| 
 | ||||
| (defparameter *prng* (make-prng :fortuna :seed :random)) | ||||
| 
 | ||||
| (defun make-random-salt (&optional (size 16)) | ||||
|   (random-data size *prng*)) | ||||
| 
 | ||||
| (defun generate-password-hash-scrypt (password salt hash-length n r p) | ||||
|   (byte-array-to-hex-string | ||||
|    (derive-key | ||||
|     (make-kdf 'scrypt-kdf :n n :r r :p p) | ||||
|     (ascii-string-to-byte-array password) | ||||
|     salt | ||||
|     0 ; ignored for scrypt | ||||
|     hash-length))) | ||||
| 
 | ||||
| (define-condition unsupported-hash-error (error) | ||||
|     ((name :initarg :name :reader name))) | ||||
| 
 | ||||
| (defun hash-password | ||||
|     (password type | ||||
|      &key (hash-length 40) | ||||
|           (n 2048) (r 1) (p 1) | ||||
|           (salt (make-random-salt))) | ||||
|   (when (typep salt 'string) (setf salt (hex-string-to-byte-array salt))) | ||||
|   (cond ((eq type :scrypt) | ||||
|          (list :type type | ||||
|                :salt (byte-array-to-hex-string salt) | ||||
|                :n n | ||||
|                :r r | ||||
|                :p p | ||||
|                :hash-length hash-length | ||||
|                :hash (generate-password-hash-scrypt password salt hash-length n r p))) | ||||
|         (t (error 'unsupported-hash-error :name type)))) | ||||
| 
 | ||||
| (defun check-password (password hashed-password-plist) | ||||
|   (equalp | ||||
|    (getf | ||||
|     (hash-password password | ||||
|                    (getf hashed-password-plist :type) | ||||
|                    :hash-length (getf hashed-password-plist :hash-length) | ||||
|                    :n (getf hashed-password-plist :n) | ||||
|                    :r (getf hashed-password-plist :r) | ||||
|                    :p (getf hashed-password-plist :p) | ||||
|                    :salt (getf hashed-password-plist :salt)) | ||||
|     :hash) | ||||
|    (getf hashed-password-plist :hash))) | ||||
| @ -0,0 +1,9 @@ | ||||
| (in-package :cl-user) | ||||
| 
 | ||||
| (defpackage #:cl-password | ||||
|   (:use :cl :ironclad) | ||||
|   (:shadow :null) | ||||
|   (:export #:make-random-salt | ||||
|            #:unsupported-hash-error | ||||
|            #:hash-password | ||||
|            #:check-password)) | ||||
					Loading…
					
					
				
		Reference in New Issue