~edwargix/tallyard

cb28a528e8378762cbaed901ac575477bb4fd4de — David Florness 5 years ago 4132a22
Endpoint to submit signed ballot
2 files changed, 33 insertions(+), 9 deletions(-)

M main.rkt
M server.rkt
M main.rkt => main.rkt +16 -3
@@ 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)

M server.rkt => server.rkt +17 -6
@@ 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]))