diff --git a/blowfish/README.md b/blowfish/README.md new file mode 100644 index 0000000..54a9a72 --- /dev/null +++ b/blowfish/README.md @@ -0,0 +1,23 @@ +# blowfish + +Реализуйте cgo wrapper для реализации blowfish из пакета openssl. + +- Вам нужно использовать две функции: + + ```c + // BF_set_key инициализирует BF_KEY + void BF_set_key(BF_KEY *key, int len, const unsigned char *data); + + // BF_ecb_encrypt шифрует или дешифрует блок размером в 8 байт. + void BF_ecb_encrypt(const unsigned char *in, unsigned char *out, BF_KEY *key, int enc); + ``` + +- Реализация не должна делать динамического выделения памяти. +- Для сборки этой задачи, на вашей системе должен быть установлен dev пакет openssl. На ubuntu установить пакет можно командой `sudo apt-get install libssl-dev`. Сборка под другие платформы не гарантируется. + +**Disclaimer:** Эта задача дана в учебных целях. Помните, что (1) нельзя реализовывать собственную криптографию, (2) шифр blowfish устарел, (3) в стандартной библиотеке есть pure go реализция для большинства криптографических приминивов. + +## Ссылки + +1. [openssl](https://www.openssl.org/docs/man1.0.2/man3/blowfish.html) +2. [cgo](https://golang.org/cmd/cgo/) diff --git a/blowfish/blowfish.go b/blowfish/blowfish.go new file mode 100644 index 0000000..5584c18 --- /dev/null +++ b/blowfish/blowfish.go @@ -0,0 +1,14 @@ +// +build !solution + +package blowfish + +// #cgo LDFLAGS: -lcrypto +// #include +import "C" + +type Blowfish struct { +} + +func New(key []byte) *Blowfish { + panic("implement me") +} diff --git a/blowfish/blowfish_test.go b/blowfish/blowfish_test.go new file mode 100644 index 0000000..f2ca83f --- /dev/null +++ b/blowfish/blowfish_test.go @@ -0,0 +1,49 @@ +package blowfish_test + +import ( + "crypto/cipher" + "encoding/binary" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "gitlab.com/slon/shad-go/blowfish" +) + +var _ cipher.Block = (*blowfish.Blowfish)(nil) + +func TestBlowfish(t *testing.T) { + b := blowfish.New([]byte("kek")) + + for i, testCase := range []struct { + in uint64 + enc uint64 + dec uint64 + }{ + { + in: 0x0, + enc: 0x03e009b8123919ea, + dec: 0xc5b3bba65042b0bf, + }, + { + in: 0x0123456789abcdef, + enc: 0x1c7879d650892fe0, + dec: 0xf714799fdf68637c, + }, + } { + + var in, out, expected [8]byte + + t.Run(fmt.Sprint(i), func(t *testing.T) { + binary.BigEndian.PutUint64(in[:], testCase.in) + + b.Encrypt(out[:], in[:]) + binary.BigEndian.PutUint64(expected[:], testCase.enc) + require.Equal(t, out, expected) + + b.Decrypt(out[:], in[:]) + binary.BigEndian.PutUint64(expected[:], testCase.dec) + require.Equal(t, out, expected) + }) + } +} diff --git a/build.docker b/build.docker index 5b54d7d..9c9ead5 100644 --- a/build.docker +++ b/build.docker @@ -1,7 +1,7 @@ FROM golang:1.16 RUN apt-get update && apt-get install -y \ - rsync \ + rsync libssl-dev \ && rm -rf /var/lib/apt/lists/* RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.23.6