Skip to content

Commit 9311e46

Browse files
committed
README added
1 parent d75c7c2 commit 9311e46

7 files changed

Lines changed: 292 additions & 33 deletions

File tree

.github/workflows/ci.yml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,16 @@ jobs:
2222
with:
2323
go-version: "1.22"
2424

25-
- name: Install cmake
26-
run: sudo apt-get install -y cmake
25+
- name: Install build dependencies
26+
run: |
27+
sudo apt-get update
28+
sudo apt-get install -y cmake make
2729
28-
- name: Build bee2 static library
29-
run: bash scripts/build_bee2.sh
30+
- name: Prepare project
31+
run: make setup
3032

3133
- name: go vet
3234
run: go vet ./...
3335

3436
- name: Run tests
35-
run: go test ./... -v -count=1
37+
run: make test

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.idea/
2+
.vscode/

Makefile

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
SHELL := /usr/bin/env bash
2+
3+
.PHONY: help setup deps build-bee2 test run clean
4+
5+
help:
6+
@echo "Available targets:"
7+
@echo " make setup - init submodules and build bee2 static library"
8+
@echo " make test - run full test suite"
9+
@echo " make run - run demo application"
10+
@echo " make clean - remove bee2 build artifacts"
11+
12+
deps:
13+
@command -v go >/dev/null || (echo "go not found" && exit 1)
14+
@command -v cmake >/dev/null || (echo "cmake not found" && exit 1)
15+
@command -v git >/dev/null || (echo "git not found" && exit 1)
16+
17+
setup: deps
18+
git submodule update --init --recursive
19+
bash scripts/build_bee2.sh
20+
21+
build-bee2:
22+
bash scripts/build_bee2.sh
23+
24+
test: build-bee2
25+
go test ./... -v -count=1
26+
27+
run: build-bee2
28+
go run ./cmd/demo
29+
30+
clean:
31+
rm -rf bee2/build

README.md

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# bee2go
2+
3+
Go-обертки для [bee2](https://github.com/agievich/bee2) — C-реализации белорусских криптографических стандартов.
4+
5+
Пакет предоставляет высокоуровневые обертки для:
6+
- `bash`: хеш и псевдослучайный генератор
7+
- `belt`: хеш, блочные режимы, MAC, AEAD, HMAC, PBKDF2 и обертка ключей
8+
- `bign`: параметры, генерация ключей, DH, подписи, транспорт ключей и подписи на основе идентичности
9+
- `bake`: аутентифицированная выработка ключа BSTS
10+
- `brng`: детерминированные генераторы случайных данных
11+
12+
## Требования
13+
14+
- Go 1.22+
15+
- Тулчейн C-компилятора
16+
- CMake
17+
- Исходники `bee2` доступны как git submodule в `./bee2`
18+
19+
## Быстрый старт
20+
21+
### 1. Клонирование
22+
23+
```bash
24+
git clone --recurse-submodules https://github.com/miniusercoder/bee2go.git
25+
cd bee2go
26+
```
27+
28+
Если репозиторий уже был клонирован без submodule:
29+
30+
```bash
31+
git submodule update --init --recursive
32+
```
33+
34+
### 2. Установил-запустил (одной командой)
35+
36+
```bash
37+
make setup
38+
make run
39+
```
40+
41+
Это:
42+
- подтянет submodule,
43+
- соберет статическую библиотеку `bee2`,
44+
- запустит демонстрационное приложение `cmd/demo`.
45+
46+
### 3. Запуск тестов
47+
48+
```bash
49+
make test
50+
```
51+
52+
### 4. Ручной режим (без Makefile)
53+
54+
Сборка статической библиотеки bee2:
55+
56+
```bash
57+
bash scripts/build_bee2.sh
58+
```
59+
60+
Запуск тестов:
61+
62+
```bash
63+
go test ./... -v
64+
```
65+
66+
## Установка
67+
68+
Текущий поддерживаемый формат установки: работа из исходников репозитория с локальной сборкой `bee2`.
69+
70+
Используйте шаги из раздела «Быстрый старт»:
71+
- `make setup`
72+
- `make run`
73+
- `make test`
74+
75+
## Команды Makefile
76+
77+
- `make setup` — подготовить проект к работе
78+
- `make run` — запустить demo (`cmd/demo`)
79+
- `make test` — запустить все тесты
80+
- `make clean` — удалить артефакты сборки `bee2/build`
81+
82+
## Использование
83+
84+
### Рекомендуемый UX для сторонних разработчиков: Go Workspace (`go work`)
85+
86+
Этот вариант не требует правок `go.mod` вашего приложения и удобен для локальной разработки.
87+
88+
1. Разместите ваш проект и `bee2go` рядом:
89+
90+
```text
91+
workspace/
92+
my-app/
93+
bee2go/
94+
```
95+
96+
2. Подготовьте `bee2go`:
97+
98+
```bash
99+
cd bee2go
100+
make setup
101+
```
102+
103+
3. Создайте workspace из каталога приложения:
104+
105+
```bash
106+
cd ../my-app
107+
go work init . ../bee2go
108+
```
109+
110+
4. Добавьте импорт в коде приложения:
111+
112+
```go
113+
import "github.com/miniusercoder/bee2go"
114+
```
115+
116+
5. Минимальный пример использования (belt-hash):
117+
118+
```go
119+
package main
120+
121+
import (
122+
"fmt"
123+
"log"
124+
125+
"github.com/miniusercoder/bee2go"
126+
)
127+
128+
func main() {
129+
digest, err := bee2go.BeltHash([]byte("hello"))
130+
if err != nil {
131+
log.Fatal(err)
132+
}
133+
fmt.Printf("belt-hash: %X\n", digest)
134+
}
135+
```
136+
137+
6. Запустите приложение обычной командой `go run` или `go build`.
138+
139+
## Стратегия тестирования
140+
141+
В репозитории есть:
142+
- тесты с известными ответами (KAT), полученные из векторов upstream `bee2`
143+
- round-trip тесты для API шифрования/дешифрования и wrap/unwrap
144+
- тесты порчи данных и негативных сценариев для проверки аутентичности и подписей
145+
- тесты валидации аргументов: nil, размерные и форматные ограничения
146+
- интеграционные тесты для выработки ключа BSTS
147+
148+
## CI
149+
150+
Workflow GitHub Actions:
151+
- выполняет checkout репозитория с submodule
152+
- собирает статическую библиотеку `bee2`
153+
- запускает `go vet ./...`
154+
- запускает `make test`
155+
156+
См. `.github/workflows/ci.yml`.
157+
158+
## Замечания по безопасности
159+
160+
- Большинство объектов-оберток хранят нативное C-состояние и небезопасны для конкурентного использования из нескольких goroutine.
161+
- Всегда вызывайте `Free()` для долгоживущих объектов, выделяющих память в C.
162+
- Не используйте демонстрационные ключи из примеров в production.
163+
164+
## Лицензия
165+
166+
Проект распространяется по лицензии, указанной в `LICENCE`.

bake_test.go

Lines changed: 68 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package bee2go
22

33
import (
44
"bytes"
5+
"fmt"
6+
"sync"
57
"testing"
68
)
79

@@ -75,39 +77,78 @@ func TestBakeBSTSRoundTrip(t *testing.T) {
7577
}
7678
defer stB.Free()
7779

78-
// ── Protocol flow ──────────────────────────────────────────────────────
79-
// B → A: M1 (B's ephemeral point)
80-
// A → B: M2 (A's ephemeral point + A's cert + A's key confirm)
81-
// B → A: M3 (B's cert + B's key confirm, validates A's cert)
82-
// A: validates B's cert (Step5)
80+
// ── Protocol flow with two concurrent parties ──────────────────────────
81+
// B goroutine: Step2 -> recv M2 -> Step4 -> StepG
82+
// A goroutine: recv M1 -> Step3 -> recv M3 -> Step5 -> StepG
83+
m1Ch := make(chan []byte, 1)
84+
m2Ch := make(chan []byte, 1)
85+
m3Ch := make(chan []byte, 1)
86+
keyACh := make(chan []byte, 1)
87+
keyBCh := make(chan []byte, 1)
88+
errCh := make(chan error, 2)
89+
90+
var wg sync.WaitGroup
91+
wg.Add(2)
92+
93+
go func() {
94+
defer wg.Done()
95+
m1, err := stB.Step2()
96+
if err != nil {
97+
errCh <- fmt.Errorf("Step2: %w", err)
98+
return
99+
}
100+
m1Ch <- m1
83101

84-
m1, err := stB.Step2()
85-
if err != nil {
86-
t.Fatal("Step2:", err)
87-
}
102+
m2 := <-m2Ch
103+
m3, err := stB.Step4(m2, valFn)
104+
if err != nil {
105+
errCh <- fmt.Errorf("Step4: %w", err)
106+
return
107+
}
108+
m3Ch <- m3
88109

89-
m2, err := stA.Step3(m1)
90-
if err != nil {
91-
t.Fatal("Step3:", err)
92-
}
110+
keyB, err := stB.StepG()
111+
if err != nil {
112+
errCh <- fmt.Errorf("StepG B: %w", err)
113+
return
114+
}
115+
keyBCh <- keyB
116+
}()
117+
118+
go func() {
119+
defer wg.Done()
120+
m1 := <-m1Ch
121+
m2, err := stA.Step3(m1)
122+
if err != nil {
123+
errCh <- fmt.Errorf("Step3: %w", err)
124+
return
125+
}
126+
m2Ch <- m2
93127

94-
m3, err := stB.Step4(m2, valFn)
95-
if err != nil {
96-
t.Fatal("Step4:", err)
97-
}
128+
m3 := <-m3Ch
129+
if err := stA.Step5(m3, valFn); err != nil {
130+
errCh <- fmt.Errorf("Step5: %w", err)
131+
return
132+
}
98133

99-
if err := stA.Step5(m3, valFn); err != nil {
100-
t.Fatal("Step5:", err)
134+
keyA, err := stA.StepG()
135+
if err != nil {
136+
errCh <- fmt.Errorf("StepG A: %w", err)
137+
return
138+
}
139+
keyACh <- keyA
140+
}()
141+
142+
wg.Wait()
143+
close(errCh)
144+
for err := range errCh {
145+
if err != nil {
146+
t.Fatal(err)
147+
}
101148
}
102149

103-
keyA, err := stA.StepG()
104-
if err != nil {
105-
t.Fatal("StepG A:", err)
106-
}
107-
keyB, err := stB.StepG()
108-
if err != nil {
109-
t.Fatal("StepG B:", err)
110-
}
150+
keyA := <-keyACh
151+
keyB := <-keyBCh
111152

112153
if !bytes.Equal(keyA, keyB) {
113154
t.Fatalf("session keys differ:\nA: %X\nB: %X", keyA, keyB)

cmd/demo/main.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"log"
6+
7+
"github.com/miniusercoder/bee2go"
8+
)
9+
10+
func main() {
11+
digest, err := bee2go.BeltHash([]byte("hello bee2go"))
12+
if err != nil {
13+
log.Fatalf("belt hash failed: %v", err)
14+
}
15+
16+
fmt.Printf("belt-hash(\"hello bee2go\") = %X\n", digest)
17+
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
module github.com/bee2-go/bee2go
1+
module github.com/miniusercoder/bee2go
22

33
go 1.22

0 commit comments

Comments
 (0)