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]))