|
64 | 64 | (make-vimcrypt-cfb
|
65 | 65 | :cypher (blowfish-init (derive-key key)) :iv iv
|
66 | 66 | :test (lambda (i) (and (>= i 64) (zerop (mod i 8))))
|
67 |
| - :update (lambda (bf data i) |
68 |
| - (vimcrypt-swapped-encrypt (vimcrypt-cfb-cipher bf) |
| 67 | + :update (lambda (cfb data i) |
| 68 | + (vimcrypt-swapped-encrypt (vimcrypt-cfb-cipher cfb) |
69 | 69 | (substring data (- i 64) (+ 8 (- i 64)))))))
|
70 | 70 |
|
71 | 71 | (defun vimcrypt-fixed-cfb (key iv)
|
72 | 72 | (make-vimcrypt-cfb
|
73 | 73 | :cypher (blowfish-init (derive-key key)) :iv iv
|
74 | 74 | :test (lambda (i) (zerop (mod i 8)))
|
75 |
| - :update (lambda (bf data i) |
76 |
| - (let ((xor (vimcrypt-swapped-encrypt (vimcrypt-cfb-cipher bf) |
77 |
| - (vimcrypt-cfb-iv bf)))) |
78 |
| - (setf (vimcrypt-cfb-iv bf) (substring data i (+ i 8))) |
| 75 | + :update (lambda (cfb data i) |
| 76 | + (let ((xor (vimcrypt-swapped-encrypt (vimcrypt-cfb-cipher cfb) |
| 77 | + (vimcrypt-cfb-iv cfb)))) |
| 78 | + (setf (vimcrypt-cfb-iv cfb) (substring data i (+ i 8))) |
79 | 79 | xor))))
|
80 | 80 |
|
81 |
| -(defmethod vimcrypt-decrypt ((bf vimcrypt-cbf) data) |
| 81 | +(defun vimcrypt-cfb-decrypt (cfb data) |
82 | 82 | (loop with plain = nil
|
83 |
| - with xor = (vimcrypt-swapped-encrypt (vimcrypt-cfb-cipher bf) |
84 |
| - (vimcrypt-cbf-iv bf)) |
| 83 | + with xor = (vimcrypt-swapped-encrypt (vimcrypt-cfb-cipher cfb) |
| 84 | + (vimcrypt-cbf-iv cfb)) |
85 | 85 | for i from 0 to (length data)
|
86 |
| - if (funcall (vimcrypt-cfb-test bf)) |
87 |
| - do (setf xor (funcall (vimcrypt-cfb-update bf data i))) |
| 86 | + if (funcall (vimcrypt-cfb-test cfb)) |
| 87 | + do (setf xor (funcall (vimcrypt-cfb-update cfb data i))) |
88 | 88 | collecting (logxor (aref xor (mod i 8)) (aref data i)) into plain
|
89 | 89 | finally (return (apply #'string plain))))
|
90 | 90 |
|
| 91 | + |
| 92 | +(cl-defun vimcrypt-bf-decrypt (passwd data &key (version 'bf2)) |
| 93 | + (let* ((salt (substring data 0 8)) |
| 94 | + (iv (substring data 8 16)) |
| 95 | + (ciphertext (substring data 16)) |
| 96 | + (key (derive-key passwd salt)) |
| 97 | + (cfb (case version |
| 98 | + ((bf1) (vimcrypt-bad-cfb key iv)) |
| 99 | + ((bf2) (vimcrypt-fixed-cfb key iv)) |
| 100 | + (t (error "Invalid BF version!"))))) |
| 101 | + (vimcrypt-cfb-decrypt cfb ciphertext))) |
| 102 | + |
| 103 | + |
91 | 104 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
92 | 105 | ;; TEST
|
93 | 106 |
|
|
0 commit comments