github.com/cloudflare/circl@v1.5.0/kem/schemes/schemes_test.go (about) 1 package schemes_test 2 3 import ( 4 "bytes" 5 "fmt" 6 "testing" 7 8 "github.com/cloudflare/circl/kem/schemes" 9 ) 10 11 func TestCaseSensitivity(t *testing.T) { 12 if schemes.ByName("kyber512") != schemes.ByName("Kyber512") { 13 t.Fatal() 14 } 15 } 16 17 func BenchmarkGenerateKeyPair(b *testing.B) { 18 allSchemes := schemes.All() 19 for _, scheme := range allSchemes { 20 b.Run(scheme.Name(), func(b *testing.B) { 21 for i := 0; i < b.N; i++ { 22 _, _, _ = scheme.GenerateKeyPair() 23 } 24 }) 25 } 26 } 27 28 func BenchmarkEncapsulate(b *testing.B) { 29 allSchemes := schemes.All() 30 for _, scheme := range allSchemes { 31 pk, _, _ := scheme.GenerateKeyPair() 32 b.Run(scheme.Name(), func(b *testing.B) { 33 for i := 0; i < b.N; i++ { 34 _, _, _ = scheme.Encapsulate(pk) 35 } 36 }) 37 } 38 } 39 40 func BenchmarkDecapsulate(b *testing.B) { 41 allSchemes := schemes.All() 42 for _, scheme := range allSchemes { 43 pk, sk, _ := scheme.GenerateKeyPair() 44 ct, _, _ := scheme.Encapsulate(pk) 45 b.Run(scheme.Name(), func(b *testing.B) { 46 for i := 0; i < b.N; i++ { 47 _, _ = scheme.Decapsulate(sk, ct) 48 } 49 }) 50 } 51 } 52 53 func TestApi(t *testing.T) { 54 allSchemes := schemes.All() 55 for _, scheme := range allSchemes { 56 t.Run(scheme.Name(), func(t *testing.T) { 57 if scheme == nil { 58 t.Fatal() 59 } 60 61 _ = scheme.SeedSize() 62 _ = scheme.EncapsulationSeedSize() 63 64 pk, sk, err := scheme.GenerateKeyPair() 65 if err != nil { 66 t.Fatal() 67 } 68 69 packedPk, err := pk.MarshalBinary() 70 if err != nil { 71 t.Fatal() 72 } 73 74 if len(packedPk) != scheme.PublicKeySize() { 75 t.Fatal() 76 } 77 78 packedSk, err := sk.MarshalBinary() 79 if err != nil { 80 t.Fatal() 81 } 82 83 if len(packedSk) != scheme.PrivateKeySize() { 84 t.Fatal() 85 } 86 87 pk2, err := scheme.UnmarshalBinaryPublicKey(packedPk) 88 if err != nil { 89 t.Fatal() 90 } 91 92 sk2, err := scheme.UnmarshalBinaryPrivateKey(packedSk) 93 if err != nil { 94 t.Fatal() 95 } 96 97 if !sk.Equal(sk2) { 98 t.Fatal() 99 } 100 101 if !pk.Equal(pk2) { 102 t.Fatal() 103 } 104 105 ct, ss, err := scheme.Encapsulate(pk2) 106 if err != nil { 107 t.Fatal(err) 108 } 109 if len(ct) != scheme.CiphertextSize() { 110 t.Fatal() 111 } 112 if len(ss) != scheme.SharedKeySize() { 113 t.Fatal() 114 } 115 116 ct3, ss3, err := scheme.Encapsulate(pk2) 117 if err != nil { 118 t.Fatal(err) 119 } 120 if bytes.Equal(ss3, ss) { 121 t.Fatal() 122 } 123 if bytes.Equal(ct3, ct) { 124 t.Fatal() 125 } 126 127 ss2, err := scheme.Decapsulate(sk2, ct) 128 if err != nil { 129 t.Fatal(err) 130 } 131 if !bytes.Equal(ss, ss2) { 132 t.Fatal() 133 } 134 }) 135 } 136 } 137 138 func Example_schemes() { 139 // import "github.com/cloudflare/circl/kem/schemes" 140 141 for _, sch := range schemes.All() { 142 fmt.Println(sch.Name()) 143 } 144 // Output: 145 // HPKE_KEM_P256_HKDF_SHA256 146 // HPKE_KEM_P384_HKDF_SHA384 147 // HPKE_KEM_P521_HKDF_SHA512 148 // HPKE_KEM_X25519_HKDF_SHA256 149 // HPKE_KEM_X448_HKDF_SHA512 150 // FrodoKEM-640-SHAKE 151 // Kyber512 152 // Kyber768 153 // Kyber1024 154 // ML-KEM-512 155 // ML-KEM-768 156 // ML-KEM-1024 157 // Kyber512-X25519 158 // Kyber768-X25519 159 // Kyber768-X448 160 // Kyber1024-X448 161 // P256Kyber768Draft00 162 // X25519MLKEM768 163 }