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
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue