/
schemes.go
66 lines (59 loc) · 1.67 KB
/
schemes.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// Package schemes contains a register of KEM schemes.
//
// # Schemes Implemented
//
// Based on standard elliptic curves:
//
// HPKE_KEM_P256_HKDF_SHA256, HPKE_KEM_P384_HKDF_SHA384, HPKE_KEM_P521_HKDF_SHA512
//
// Based on standard Diffie-Hellman functions:
//
// HPKE_KEM_X25519_HKDF_SHA256, HPKE_KEM_X448_HKDF_SHA512
//
// Post-quantum kems:
//
// FrodoKEM-640-SHAKE
// Kyber512, Kyber768, Kyber1024
package schemes
import (
"strings"
"github.com/cloudflare/circl/hpke"
"github.com/cloudflare/circl/kem"
"github.com/cloudflare/circl/kem/frodo/frodo640shake"
"github.com/cloudflare/circl/kem/hybrid"
"github.com/cloudflare/circl/kem/kyber/kyber1024"
"github.com/cloudflare/circl/kem/kyber/kyber512"
"github.com/cloudflare/circl/kem/kyber/kyber768"
)
var allSchemes = [...]kem.Scheme{
hpke.KEM_P256_HKDF_SHA256.Scheme(),
hpke.KEM_P384_HKDF_SHA384.Scheme(),
hpke.KEM_P521_HKDF_SHA512.Scheme(),
hpke.KEM_X25519_HKDF_SHA256.Scheme(),
hpke.KEM_X448_HKDF_SHA512.Scheme(),
frodo640shake.Scheme(),
kyber512.Scheme(),
kyber768.Scheme(),
kyber1024.Scheme(),
hybrid.Kyber512X25519(),
hybrid.Kyber768X25519(),
hybrid.Kyber768X448(),
hybrid.Kyber1024X448(),
hybrid.P256Kyber768Draft00(),
}
var allSchemeNames map[string]kem.Scheme
func init() {
allSchemeNames = make(map[string]kem.Scheme)
for _, scheme := range allSchemes {
allSchemeNames[strings.ToLower(scheme.Name())] = scheme
}
}
// ByName returns the scheme with the given name and nil if it is not
// supported.
//
// Names are case insensitive.
func ByName(name string) kem.Scheme {
return allSchemeNames[strings.ToLower(name)]
}
// All returns all KEM schemes supported.
func All() []kem.Scheme { a := allSchemes; return a[:] }