Skip to content

Commit ecd57f4

Browse files
committed
add crypto.rkt
1 parent 974b67c commit ecd57f4

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

crypto.rkt

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#lang typed/racket/base
2+
3+
(require typed/racket/unsafe)
4+
5+
(module unsafe racket/base
6+
(provide (all-defined-out))
7+
(provide (rename-out [EVP_MD_CTX_new evp-digest-context-create]
8+
[EVP_MD_CTX_reset evp-digest-context-reset]))
9+
(provide (rename-out [EVP_get_digestbyname evp-digest-fetch]
10+
[EVP_DigestUpdate evp-digest-update]
11+
[EVP_MD_size evp-digest-size]
12+
[EVP_MD_block_size evp-digest-block-size]))
13+
14+
(require openssl/libcrypto)
15+
16+
(require "ffi.rkt")
17+
18+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19+
(define-cpointer-type _EVP_MD_CTX*)
20+
(define-cpointer-type _ENGINE*)
21+
(define-cpointer-type _EVP_MD*)
22+
23+
(define-ffi-definer define-crypto libcrypto)
24+
25+
(define-crypto EVP_MD_CTX_free (_fun _EVP_MD_CTX* -> _void) #:wrap (deallocator))
26+
(define-crypto EVP_MD_CTX_new (_fun -> _EVP_MD_CTX*) #:wrap (allocator EVP_MD_CTX_free))
27+
(define-crypto EVP_MD_CTX_reset (_fun _EVP_MD_CTX* -> _int))
28+
(define-crypto EVP_get_digestbyname (_fun _symbol -> _EVP_MD*/null))
29+
(define-crypto EVP_MD_size (_fun _EVP_MD* -> _int))
30+
(define-crypto EVP_MD_block_size (_fun _EVP_MD* -> _int))
31+
32+
(define-crypto EVP_DigestInit_ex
33+
(_fun _EVP_MD_CTX* _EVP_MD* _ENGINE*/null
34+
-> [r : _int]
35+
-> (= r 1)))
36+
37+
(define-crypto EVP_DigestUpdate
38+
(_fun _EVP_MD_CTX*
39+
[msg : _pointer]
40+
[_size = (bytes-length msg)]
41+
-> [r : _int] -> (= r 1)))
42+
43+
(define-crypto EVP_DigestFinal_ex
44+
(_fun _EVP_MD_CTX*
45+
[msg : _pointer]
46+
[size : (_box _uint)]
47+
-> [r : _int]
48+
-> (= r 1)))
49+
50+
; this one will cleanup the CTX
51+
(define-crypto EVP_DigestFinal
52+
(_fun _EVP_MD_CTX*
53+
[msg : _pointer]
54+
[size : (_box _uint)]
55+
-> [r : _int]
56+
-> (= r 1)))
57+
58+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
59+
(define evp-digest
60+
(lambda [msg-digest messages digest [&size (box 0)]]
61+
(define mdctx (EVP_MD_CTX_new))
62+
63+
(EVP_DigestInit_ex mdctx msg-digest #false)
64+
(evp-digest-update* mdctx messages)
65+
(EVP_DigestFinal_ex mdctx digest &size)
66+
67+
(EVP_MD_CTX_free mdctx)))
68+
69+
(define evp-digest-init
70+
(lambda [mdctx msg-digest [engine #false]]
71+
(EVP_DigestInit_ex mdctx msg-digest #false)))
72+
73+
(define evp-digest-update*
74+
(lambda [mdctx messages]
75+
(for ([message (in-list messages)])
76+
(EVP_DigestUpdate mdctx message))))
77+
78+
(define evp-digest-final
79+
(lambda [mdctx digest [&size (box 0)]]
80+
(EVP_DigestFinal mdctx digest &size))))
81+
82+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
83+
(unsafe-require/typed/provide
84+
(submod "." unsafe)
85+
[#:opaque EVP-MD* EVP_MD*?]
86+
[#:opaque EVP-MD-CTX* EVP_MD_CTX*?]
87+
[evp-digest-context-create (-> EVP-MD-CTX*)]
88+
[evp-digest-context-reset (-> EVP-MD-CTX* Integer)]
89+
[evp-digest-fetch (-> Symbol (Option EVP-MD*))]
90+
[evp-digest-init (-> EVP-MD-CTX* EVP-MD* Boolean)]
91+
[evp-digest-update (-> EVP-MD-CTX* Bytes Boolean)]
92+
[evp-digest-update* (-> EVP-MD-CTX* (Listof Bytes) Void)]
93+
[evp-digest-final (->* (EVP-MD-CTX* Bytes) ((Boxof Index)) Boolean)]
94+
[evp-digest (->* (EVP-MD* (Listof Bytes) Bytes) ((Boxof Index)) Void)]
95+
[evp-digest-size (-> EVP-MD* Index)]
96+
[evp-digest-block-size (-> EVP-MD* Index)])

0 commit comments

Comments
 (0)