Merge branch 'blowfish' into 'master'
Add blowfish task See merge request slon/shad-go-private!50
This commit is contained in:
commit
43e7bf08f2
4 changed files with 87 additions and 1 deletions
23
blowfish/README.md
Normal file
23
blowfish/README.md
Normal 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
14
blowfish/blowfish.go
Normal 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
49
blowfish/blowfish_test.go
Normal 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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
FROM golang:1.16
|
FROM golang:1.16
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
rsync \
|
rsync libssl-dev \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& 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
|
RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.23.6
|
||||||
|
|
Loading…
Reference in a new issue