~edwargix/tallyard

f172a5dcee37fb24e699193281f14a7b4e6447e9 — David Florness 5 years ago add37b8
Create endpoint to retrieve server's key
3 files changed, 30 insertions(+), 17 deletions(-)

M crypto.rkt
M main.rkt
M server.rkt
M crypto.rkt => crypto.rkt +16 -14
@@ 1,22 1,24 @@
#lang racket
(require math/number-theory)

(provide keylen e p q d n)
(provide keylen e gen-key)

(define keylen 1024)
(define e 65537)

(define (gen)
  (let* ([p (random-prime (expt 2 (/ keylen 2)))]
         [q (random-prime (expt 2 (/ keylen 2)))]
         [λn (lcm (sub1 p) (sub1 q))])
    (if (and (eq? (gcd e λn) 1)
             (not (eq? (arithmetic-shift (abs (- p q))
                                         (- (- (/ keylen 2) 100)))
                       0)))
        (values p q λn)
        (gen))))
(define (gen-key)
  (define (gen)
    (let* ([p (random-prime (expt 2 (/ keylen 2)))]
           [q (random-prime (expt 2 (/ keylen 2)))]
           [λn (lcm (sub1 p) (sub1 q))])
      (if (and (eq? (gcd e λn) 1)
               (not (eq? (arithmetic-shift (abs (- p q))
                                           (- (- (/ keylen 2) 100)))
                         0)))
          (values p q λn)
          (gen))))

(define-values (p q λn) (gen))
(define n (* p q))
(define d (modular-inverse e λn))
  (let-values ([(p q λn) (gen)])
    (list (* p q) ; n
          (modular-inverse e λn) ; d
          )))

M main.rkt => main.rkt +5 -3
@@ 1,9 1,9 @@
#lang racket
(require binaryio)
(require "crypto.rkt")
(require racket/random)
(require net/url)
(require json)
(require "crypto.rkt")

(define/contract (vohea-url path)
  (-> string? url?)


@@ 31,6 31,8 @@
(display "Your ranking: ")
(define ranking (string-split (read-line)))

(define n (bytes->integer (port->bytes (get-pure-port (vohea-url "/key"))) #f))

(define m (bytes->integer (string->bytes/utf-8 (string-join ranking ":")) #f))

(define r


@@ 42,5 44,5 @@

(define M (modulo (* m (expt r e)) n))

(read (post-pure-port (vohea-url "/sign")
                      (integer->bytes M (/ keylen 8) #f)))
(define S (port->bytes (post-pure-port (vohea-url "/sign")
                                       (integer->bytes M (/ keylen 8) #f))))

M server.rkt => server.rkt +9 -0
@@ 4,8 4,11 @@
         web-server/servlet-env
         web-server/http)
(require json)
(require "crypto.rkt")
(require binaryio)

(define cands (list "ohea" "rtsn" "qfuy"))
(define k (gen-key))

; how this is not a provided function is beyond me
(define/contract (response/json jsexpr)


@@ 27,11 30,17 @@
  (response/xexpr
   '(html (body (p "hello there")))))

(define (key req)
  (response/full
   200 #f (current-seconds) #"application/octet-stream"
   empty (list (integer->bytes (car k) (/ keylen 8) #f))))

(define-values (dispatcher url-generator)
  (dispatch-rules
   [("candidates") candidates]
   [("vote") vote]
   [("sign") #:method "post" sign]
   [("key") key]
   [else candidates]))

(serve/servlet dispatcher