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  }