+package udpobfs
+
+import (
+ "crypto/cipher"
+ "crypto/rand"
+ "crypto/rc4"
+ "encoding/binary"
+ "io"
+ "sync"
+ "testing"
+
+ "github.com/dchest/threefish"
+ "golang.org/x/crypto/blowfish"
+ "golang.org/x/crypto/cast5"
+ "golang.org/x/crypto/chacha20"
+ "golang.org/x/crypto/chacha20poly1305"
+ "golang.org/x/crypto/xtea"
+ "lukechampine.com/blake3"
+)
+
+func BenchmarkChaCha20Poly1305(b *testing.B) {
+ var key [32]byte
+ rand.Read(key[:])
+ var nonce [12]byte
+ rand.Read(nonce[:])
+ dst := make([]byte, 1500)
+ src := make([]byte, 500)
+ rand.Read(src)
+ c, err := chacha20poly1305.New(key[:])
+ if err != nil {
+ panic(err)
+ }
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ c.Seal(dst[:0], nonce[:], src, nil)
+ }
+}
+
+func BenchmarkChaCha20(b *testing.B) {
+ var key [32]byte
+ rand.Read(key[:])
+ var nonce [12]byte
+ rand.Read(nonce[:])
+ dst := make([]byte, 1500)
+ src := make([]byte, 500)
+ rand.Read(src)
+ c, err := chacha20.NewUnauthenticatedCipher(key[:], nonce[:])
+ if err != nil {
+ panic(err)
+ }
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ c.XORKeyStream(dst, src)
+ }
+}
+
+func BenchmarkBLAKE3(b *testing.B) {
+ var key [32]byte
+ rand.Read(key[:])
+ h := blake3.New(32, key[:])
+ var nonce [8]byte
+ rand.Read(nonce[:])
+ dst := make([]byte, 500)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ h.Reset()
+ MustWrite(h, nonce[:])
+ if _, err := io.ReadFull(h.XOF(), dst); err != nil {
+ panic(err)
+ }
+ h.Reset()
+ MustWrite(h, dst)
+ }
+}
+
+func BenchmarkBLAKE3Seek(b *testing.B) {
+ var key [32]byte
+ rand.Read(key[:])
+ h := blake3.New(32, key[:])
+ var nonce [8]byte
+ rand.Read(nonce[:])
+ n := int64(binary.BigEndian.Uint64(nonce[:]))
+ if n < 0 {
+ n = -n
+ }
+ dst := make([]byte, 1500)
+ b.ResetTimer()
+ var xof *blake3.OutputReader
+ var err error
+ for i := 0; i < b.N; i++ {
+ h.Reset()
+ xof = h.XOF()
+ if _, err = xof.Seek(n, io.SeekStart); err != nil {
+ panic(err)
+ }
+ // MustWrite(h, nonce[:])
+ if _, err := io.ReadFull(h.XOF(), dst); err != nil {
+ panic(err)
+ }
+ h.Reset()
+ MustWrite(h, dst)
+ }
+}
+
+func BenchmarkBlowfish(b *testing.B) {
+ var key [32]byte
+ rand.Read(key[:])
+ dst := make([]byte, 8)
+ src := make([]byte, 8)
+ rand.Read(src)
+ c, err := blowfish.NewCipher(key[:])
+ if err != nil {
+ panic(err)
+ }
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ c.Encrypt(dst, src)
+ }
+}
+
+func BenchmarkXTEA(b *testing.B) {
+ var key [16]byte
+ rand.Read(key[:])
+ dst := make([]byte, 8)
+ src := make([]byte, 8)
+ rand.Read(src)
+ c, err := xtea.NewCipher(key[:])
+ if err != nil {
+ panic(err)
+ }
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ c.Encrypt(dst, src)
+ }
+}
+
+func BenchmarkCAST5(b *testing.B) {
+ var key [16]byte
+ rand.Read(key[:])
+ dst := make([]byte, 8)
+ src := make([]byte, 8)
+ rand.Read(src)
+ c, err := cast5.NewCipher(key[:])
+ if err != nil {
+ panic(err)
+ }
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ c.Encrypt(dst, src)
+ }
+}
+
+func BenchmarkRLock(b *testing.B) {
+ var l sync.RWMutex
+ b.ResetTimer()
+ a := 0
+ for i := 0; i < b.N; i++ {
+ l.RLock()
+ a++
+ l.RUnlock()
+ }
+}
+
+func BenchmarkBigBlow(b *testing.B) {
+ var key [32]byte
+ rand.Read(key[:])
+ dst := make([]byte, 1500)
+ src := make([]byte, 504)
+ rand.Read(src)
+ c, err := blowfish.NewCipher(key[:])
+ if err != nil {
+ panic(err)
+ }
+ for b.Loop() {
+ for i := 0; i < len(src); i += 8 {
+ c.Encrypt(dst[i:], src[i:])
+ }
+ }
+}
+
+func BenchmarkRC4(b *testing.B) {
+ var key [32]byte
+ rand.Read(key[:])
+ dst := make([]byte, 1500)
+ src := make([]byte, 504)
+ rand.Read(src)
+ c, err := rc4.NewCipher(key[:])
+ if err != nil {
+ panic(err)
+ }
+ for b.Loop() {
+ c.XORKeyStream(dst, src)
+ }
+}
+
+func BenchmarkThreefish(b *testing.B) {
+ var tweak [16]byte
+ var key [64]byte
+ rand.Read(key[:])
+ dst := make([]byte, 1500)
+ src := make([]byte, 512)
+ rand.Read(src)
+ c, err := threefish.NewCipher(key[:], tweak[:])
+ if err != nil {
+ panic(err)
+ }
+ for b.Loop() {
+ for i := 0; i < len(src); i += 64 {
+ c.Encrypt(dst[i:i+64], src[i:i+64])
+ }
+ }
+}
+
+func BenchmarkThreefishCFB(b *testing.B) {
+ var tweak [16]byte
+ var iv [64]byte
+ var key [64]byte
+ rand.Read(key[:])
+ rand.Read(iv[:])
+ dst := make([]byte, 1500)
+ src := make([]byte, 500)
+ rand.Read(src)
+ c, err := threefish.NewCipher(key[:], tweak[:])
+ if err != nil {
+ panic(err)
+ }
+ for b.Loop() {
+ s := cipher.NewCFBDecrypter(c, iv[:])
+ s.XORKeyStream(dst, src)
+ }
+}
+
+func BenchmarkThreefishCBC(b *testing.B) {
+ var tweak [16]byte
+ var iv [64]byte
+ var key [64]byte
+ rand.Read(key[:])
+ rand.Read(iv[:])
+ dst := make([]byte, 1500)
+ src := make([]byte, 512)
+ rand.Read(src)
+ c, err := threefish.NewCipher(key[:], tweak[:])
+ if err != nil {
+ panic(err)
+ }
+ for b.Loop() {
+ s := cipher.NewCBCDecrypter(c, iv[:])
+ s.CryptBlocks(dst, src)
+ }
+}
+
+
+func BenchmarkThreefishCBCE(b *testing.B) {
+ var tweak [16]byte
+ var iv [64]byte
+ var key [64]byte
+ rand.Read(key[:])
+ rand.Read(iv[:])
+ dst := make([]byte, 1500)
+ src := make([]byte, 512)
+ rand.Read(src)
+ c, err := threefish.NewCipher(key[:], tweak[:])
+ if err != nil {
+ panic(err)
+ }
+ for b.Loop() {
+ s := cipher.NewCBCEncrypter(c, iv[:])
+ s.CryptBlocks(dst, src)
+ }
+}