implement bindings for sign and lock

This commit is contained in:
xenia 2020-11-08 18:13:56 -05:00
parent 05736756ec
commit 9bc5eece92
2 changed files with 62 additions and 3 deletions

View File

@ -16,9 +16,9 @@
;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
(require ffi/vector ffi/unsafe racket/random
(require ffi/vector ffi/unsafe racket/bool racket/random
"static-support.rkt"
(for-syntax racket/base racket/string racket/syntax)
(for-syntax racket/base racket/string)
(only-in racket/contract provide/contract)
;; MATTHIAS
;; WHY
@ -43,6 +43,65 @@
stx (string-replace (symbol->string (syntax->datum #'name)) "-" "_"))])
#'(define name (get-ffi-obj/runtime c-name monocypher type)))]))
;; public key signatures
(define/ffi crypto-sign-public-key
(_fun (pubkey : (_u8vector o 32)) (seckey : _u8vector) -> _void -> pubkey))
(provide/contract [crypto-sign-public-key (contract:-> (bytes-len/c 32) (bytes-len/c 32))])
(define/ffi crypto-sign
(_fun (signature : (_u8vector o 64)) (seckey : _u8vector) (pubkey : _u8vector)
(message : _u8vector) (msgsize : _size = (u8vector-length message))
-> _void -> signature))
(provide/contract [crypto-sign (contract:-> (bytes-len/c 32) (bytes-len/c 32) bytes?
(bytes-len/c 64))])
(define/ffi crypto-check
(_fun (signature : _u8vector) (pubkey : _u8vector) (message : _u8vector)
(msgsize : _size = (u8vector-length message))
-> (result : _int) -> (zero? result)))
(provide/contract [crypto-check (contract:-> (bytes-len/c 64) (bytes-len/c 32) bytes? boolean?)])
(define (crypto-sign-make-key)
(crypto-random-bytes 32))
(provide crypto-sign-make-key)
;; key exchange
;; XXX : in monocypher crypto_key_exchange_public_key is actually crypto_x25519_public_key
(define/ffi crypto-x25519-public-key
(_fun (pubkey : (_u8vector o 32)) (seckey : _u8vector) -> _void -> pubkey))
(define crypto-key-exchange-public-key crypto-x25519-public-key)
(provide/contract [crypto-key-exchange-public-key (contract:-> (bytes-len/c 32) (bytes-len/c 32))])
(define/ffi crypto-key-exchange
(_fun (outkey : (_u8vector o 32)) (yourseckey : _u8vector) (theirpubkey : _u8vector)
-> _void -> outkey))
(provide/contract [crypto-key-exchange (contract:-> (bytes-len/c 32) (bytes-len/c 32)
(bytes-len/c 32))])
(define (crypto-key-exchange-make-key)
(crypto-random-bytes 32))
(provide crypto-key-exchange-make-key)
;; authenticated encryption
(define/ffi crypto-lock
(_fun (mac : (_u8vector o 16)) (ct : (_u8vector o textsize)) (key : _u8vector) (nonce : _u8vector)
(pt : _u8vector) (textsize : _size = (u8vector-length pt))
-> _void -> (values ct mac)))
(provide/contract [crypto-lock (contract:-> (bytes-len/c 32) (bytes-len/c 24) bytes?
(values bytes? (bytes-len/c 16)))])
(define/ffi crypto-unlock
(_fun (pt : (_u8vector o textsize)) (key : _u8vector) (nonce : _u8vector) (mac : _u8vector)
(ct : _u8vector) (textsize : _size = (u8vector-length ct))
-> (res : _int) -> (if (zero? res) pt #f)))
(provide/contract [crypto-unlock (contract:-> (bytes-len/c 32) (bytes-len/c 24) (bytes-len/c 16)
bytes? (or/c false? bytes?))])
(define (crypto-lock-make-key)
(crypto-random-bytes 32))
(define (crypto-lock-make-nonce)
(crypto-random-bytes 24))
(provide crypto-lock-make-key crypto-lock-make-nonce)

View File

@ -16,7 +16,7 @@
;; You should have received a copy of the GNU Affero General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
(require ffi/unsafe racket/bool racket/string)
(require ffi/unsafe racket/bool)
(provide get-ffi-obj/static static-ffi-available?
ffi-lib/runtime get-ffi-obj/runtime)