mock.go 3.1 KB
Newer Older
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
// Copyright 2020 The Swarm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package mock

import (
	"errors"

	"github.com/ethersphere/bee/pkg/encryption"
)

var _ encryption.Interface = (*Encryptor)(nil)

var (
	// ErrNotImplemented is returned when a required Encryptor function is not set.
	ErrNotImplemented = errors.New("not implemented")
	// ErrInvalidXORKey is returned when the key for XOR encryption is not valid.
	ErrInvalidXORKey = errors.New("invalid xor key")
)

// Encryptor implements encryption Interface in order to mock it in tests.
type Encryptor struct {
	encryptFunc func(data []byte) ([]byte, error)
	decryptFunc func(data []byte) ([]byte, error)
	resetFunc   func()
27
	keyFunc     func() encryption.Key
28 29 30 31 32 33 34 35 36 37 38
}

// New returns a new Encryptor configured with provided options.
func New(opts ...Option) *Encryptor {
	e := new(Encryptor)
	for _, o := range opts {
		o(e)
	}
	return e
}

39 40 41 42 43 44 45 46
// Key has only bogus
func (e *Encryptor) Key() encryption.Key {
	if e.keyFunc == nil {
		return nil
	}
	return e.keyFunc()
}

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
// Encrypt calls the configured encrypt function, or returns ErrNotImplemented
// if it is not set.
func (e *Encryptor) Encrypt(data []byte) ([]byte, error) {
	if e.encryptFunc == nil {
		return nil, ErrNotImplemented
	}
	return e.encryptFunc(data)
}

// Decrypt calls the configured decrypt function, or returns ErrNotImplemented
// if it is not set.
func (e *Encryptor) Decrypt(data []byte) ([]byte, error) {
	if e.decryptFunc == nil {
		return nil, ErrNotImplemented
	}
	return e.decryptFunc(data)
}

// Reset calls the configured reset function, if it is set.
func (e *Encryptor) Reset() {
	if e.resetFunc == nil {
		return
	}
	e.resetFunc()
}

// Option represents configures the Encryptor instance.
type Option func(*Encryptor)

// WithEncryptFunc sets the Encryptor Encrypt function.
func WithEncryptFunc(f func([]byte) ([]byte, error)) Option {
	return func(e *Encryptor) {
		e.encryptFunc = f
	}
}

// WithDecryptFunc sets the Encryptor Decrypt function.
func WithDecryptFunc(f func([]byte) ([]byte, error)) Option {
	return func(e *Encryptor) {
		e.decryptFunc = f
	}
}

// WithResetFunc sets the Encryptor Reset function.
func WithResetFunc(f func()) Option {
	return func(e *Encryptor) {
		e.resetFunc = f
	}
}

97 98 99 100 101 102 103
// WithKeyFunc sets the Encryptor Key function.
func WithKeyFunc(f func() encryption.Key) Option {
	return func(e *Encryptor) {
		e.keyFunc = f
	}
}

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
// WithXOREncryption sets Encryptor Encrypt and Decrypt functions with XOR
// encryption function that uses the provided key for encryption.
func WithXOREncryption(key []byte) Option {
	f := newXORFunc(key)
	return func(e *Encryptor) {
		e.encryptFunc = f
		e.decryptFunc = f
	}
}

func newXORFunc(key []byte) func([]byte) ([]byte, error) {
	return func(data []byte) ([]byte, error) {
		return xor(data, key)
	}
}

func xor(input, key []byte) ([]byte, error) {
	keyLen := len(key)
	if keyLen == 0 {
		return nil, ErrInvalidXORKey
	}
	inputLen := len(input)
	output := make([]byte, inputLen)
	for i := 0; i < inputLen; i++ {
		output[i] = input[i] ^ key[i%keyLen]
	}
	return output, nil
}