;; -*- Mode: Irken -*-

(define (make-x25519-kex)
  (let ((key {sk="" pk=""}))
    (define (gen)
      (set! key (x25519-gen-key)))
    (define (get-pub) key.pk)
    (define (gen-shared pk1)
      (x25519-gen-shared-key key.sk pk1))
    {gen=gen get-pub=get-pub gen-shared=gen-shared size=32 group=(named-group:x25519)}
    ))

(define (make-x448-kex)
  (let ((key {sk="" pk=""}))
    (define (gen)
      (set! key (x448-gen-key)))
    (define (get-pub) key.pk)
    (define (gen-shared pk1)
      (x448-gen-shared-key key.sk pk1))
    {gen=gen get-pub=get-pub gen-shared=gen-shared size=56 group=(named-group:x448)}
    ))

(define make-kex
  (named-group:x25519) -> (make-x25519-kex)
  (named-group:x448)   -> (make-x448-kex)
  group                -> (raise (:TLS/Fatal (tls-alert-desc:hsk-failure) "no shared kex"))
  )