From cb28a528e8378762cbaed901ac575477bb4fd4de Mon Sep 17 00:00:00 2001 From: David Florness Date: Sun, 10 Nov 2019 07:02:49 -0700 Subject: [PATCH] Endpoint to submit signed ballot --- main.rkt | 19 ++++++++++++++++--- server.rkt | 23 +++++++++++++++++------ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/main.rkt b/main.rkt index 994c648..9b42422 100644 --- a/main.rkt +++ b/main.rkt @@ -43,15 +43,28 @@ r (gen)))) +(displayln "creating blinded message...") + (define M (modulo (* m (expt r e)) n)) +(displayln "asking for blinded signature...") + (define S (bytes->integer (port->bytes (post-pure-port (vohea-url "/sign") (integer->bytes M (/ keylen 8) #f))) #f)) +(displayln "computing real signature") + (define s (modulo (* S (modular-inverse r n)) n)) -(displayln (list (equal? m (modular-expt s e n)) - m - (modular-expt s e n))) +(displayln "submitting signed ballot...") + +(define result (bytes->string/utf-8 + (port->bytes + (post-pure-port (vohea-url "/vote") + (bytes-append (integer->bytes m (/ keylen 8) #f) + (integer->bytes s (/ keylen 8) #f) + ))))) + +(displayln result) diff --git a/server.rkt b/server.rkt index d3a6c44..d8bde42 100644 --- a/server.rkt +++ b/server.rkt @@ -10,6 +10,8 @@ (define cands (list "ohea" "rtsn" "qfuy")) (define k (gen-key)) +(define n (car k)) +(define d (cdr k)) ; how this is not a provided function is beyond me (define/contract (response/json jsexpr) @@ -18,29 +20,38 @@ 200 #f (current-seconds) #"application/json" empty (list (jsexpr->bytes jsexpr)))) +(define/contract (response/text txt) + (-> string? response?) + (response/full + 200 #f (current-seconds) #"text/plain" + empty (list (string->bytes/utf-8 txt)))) + (define (candidates req) (response/json cands)) (define (vote req) - (response/xexpr - '(html (body (p "you're going to vote"))))) + (let* ([data (request-post-data/raw req)] + [m (bytes->integer (subbytes data 0 (/ keylen 8)) #f)] + [s (bytes->integer (subbytes data (/ keylen 8) (* 2 (/ keylen 8))) #f)]) + (if (equal? m (modular-expt s e n)) + (response/text "vote submitted") + (response/text "invalid signature")))) (define (sign req) - (println (request-post-data/raw req)) (let ([m (bytes->integer (request-post-data/raw req) #f)]) (response/full 200 #f (current-seconds) #"application/octet-stream" - empty (list (integer->bytes (modular-expt m (cdr k) (car k)) (/ keylen 8) #f))))) + empty (list (integer->bytes (modular-expt m d n) (/ keylen 8) #f))))) (define (key req) (response/full 200 #f (current-seconds) #"application/octet-stream" - empty (list (integer->bytes (car k) (/ keylen 8) #f)))) + empty (list (integer->bytes n (/ keylen 8) #f)))) (define-values (dispatcher url-generator) (dispatch-rules [("candidates") candidates] - [("vote") vote] + [("vote") #:method "post" vote] [("sign") #:method "post" sign] [("key") key] [else candidates])) -- 2.38.4