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