Add blowfish task

This commit is contained in:
Fedor Korotkiy 2021-04-15 11:26:56 +03:00
parent 8c0112889f
commit 32f01223e4
4 changed files with 87 additions and 1 deletions

23
blowfish/README.md Normal file
View file

@ -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/)

14
blowfish/blowfish.go Normal file
View file

@ -0,0 +1,14 @@
// +build !solution
package blowfish
// #cgo LDFLAGS: -lcrypto
// #include <openssl/blowfish.h>
import "C"
type Blowfish struct {
}
func New(key []byte) *Blowfish {
panic("implement me")
}

49
blowfish/blowfish_test.go Normal file
View file

@ -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)
})
}
}

View file

@ -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