Skip to content

Commit 9d89bf5

Browse files
committed
TDD ru
1 parent 289d493 commit 9d89bf5

5 files changed

Lines changed: 239 additions & 0 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Требования: tdd-https-vpn-ciphersuite-ru (Российский криптостек ГОСТ)
2+
3+
> Версия: 1.0
4+
> Статус: APPROVED
5+
> Последнее обновление: 2026-05-11
6+
7+
## Проблема
8+
9+
Для работы в регулируемых секторах Российской Федерации (банки, государственные структуры, крупные предприятия) требуется поддержка национальных стандартов криптографии (ГОСТ). Использование стандартных алгоритмов (AES, ECDSA) в этих сценариях может быть ограничено или запрещено регуляторами.
10+
11+
## Пользовательские истории
12+
13+
### Основная
14+
15+
**Как** администратор безопасности российской организации
16+
**Я хочу** использовать национальные алгоритмы ГОСТ в HTTPS VPN
17+
**Чтобы** соответствовать требованиям регуляторов (ФСБ, ФСТЭК) и обеспечить защиту данных по государственным стандартам.
18+
19+
## Критерии приемки
20+
21+
### Обязательные (Must Have)
22+
23+
1. **Given** Конфигурация VPN сервера
24+
**When** Параметр `cipherSuites` установлен в значение `ru`
25+
**Then** Система должна использовать провайдер ГОСТ.
26+
27+
2. **Given** Установление TLS соединения
28+
**When** Используется российский криптостек
29+
**Then** Должны поддерживаться шифры Кузнечик (Kuznyechik) и Магма (Magma) согласно ГОСТ Р 34.12-2015.
30+
31+
3. **Given** Процесс хеширования и подписи
32+
**When** Работает ГОСТ провайдер
33+
**Then** Должен использоваться Стрибог (Streebog) ГОСТ Р 34.11-2012 и ЭЦП ГОСТ Р 34.10-2012.
34+
35+
4. **Given** Обмен ключами
36+
**When** Выполняется TLS Handshake
37+
**Then** Должен поддерживаться механизм VKO (Vesterman-Kuznetsov-Oshkin) для выработки общих ключей.
38+
39+
### Желательные (Should Have)
40+
41+
- Поддержка различных наборов параметров (ID-tc26-gost-3410-2012-256-paramSetA и т.д.).
42+
- Совместимость с сертификатами, выданными российскими удостоверяющими центрами.
43+
44+
## Ограничения
45+
46+
- **Технические**: Go standard library `crypto/tls` не поддерживает ГОСТ нативно, требуется кастомная реализация TLS или использование специализированных библиотек.
47+
- **Платформенные**: Решение должно работать на Linux и Darwin.
48+
49+
## Ссылки
50+
51+
- RFC 9189: GOST Algorithms with TLS 1.2
52+
- ГОСТ Р 34.10-2012, 34.11-2012, 34.12-2015
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Анализ поведения (Тесты): tdd-https-vpn-ciphersuite-ru
2+
3+
> Версия: 1.0
4+
> Статус: DRAFT
5+
> Последнее обновление: 2026-05-11
6+
7+
Этот документ описывает ожидаемое поведение системы через набор тестовых сценариев. Дизайн системы вытекает из этих случаев.
8+
9+
## Сценарии поведения
10+
11+
### 1. Регистрация провайдера
12+
**Описание**: Провайдер "ru" должен быть доступен в глобальном реестре после импорта.
13+
14+
- **Case 1.1: Успешное получение провайдера**
15+
- **Given**: Пакет `crypto/ru` импортирован.
16+
- **When**: Вызывается `crypto.Get("ru")`.
17+
- **Then**: Возвращается объект провайдера и `ok == true`.
18+
- **Success Criteria**: Провайдер не nil, имя соответствует "ru".
19+
20+
### 2. Конфигурация TLS
21+
**Описание**: Провайдер должен корректно настраивать `tls.Config` для использования алгоритмов ГОСТ.
22+
23+
- **Case 2.1: Установка версии TLS**
24+
- **Given**: Новый `tls.Config`.
25+
- **When**: Вызывается `provider.ConfigureTLS(cfg)`.
26+
- **Then**: `MinVersion` должна быть не ниже TLS 1.2 (согласно RFC 9189).
27+
28+
- **Case 2.2: Настройка Cipher Suites**
29+
- **Given**: `tls.Config`.
30+
- **When**: Вызывается `provider.ConfigureTLS(cfg)`.
31+
- **Then**: В списке `CipherSuites` должны присутствовать идентификаторы ГОСТ (например, `0xC100`).
32+
33+
### 3. Криптографические примитивы (ГОСТ)
34+
**Описание**: Алгоритмы должны выдавать корректные результаты согласно тестовым векторам стандартов.
35+
36+
- **Case 3.1: Хеширование Стрибог (256/512)**
37+
- **Given**: Известная входная строка.
38+
- **When**: Вычисляется хеш.
39+
- **Then**: Результат совпадает с контрольным значением из ГОСТ Р 34.11-2012.
40+
41+
- **Case 3.2: Шифрование Кузнечик/Магма**
42+
- **Given**: Открытый текст и ключ.
43+
- **When**: Выполняется шифрование в режиме MGM или CTR.
44+
- **Then**: Зашифрованный текст совпадает с тестовым вектором ГОСТ Р 34.12-2015.
45+
46+
### 4. Обработка сертификатов
47+
**Описание**: Система должна правильно определять тип сертификата для выбора провайдера.
48+
49+
- **Case 4.1: Детекция ГОСТ сертификата**
50+
- **Given**: Сертификат с алгоритмом подписи ГОСТ.
51+
- **When**: Вызывается функция детекции провайдера.
52+
- **Then**: Возвращается строка "ru".
53+
54+
## Граничные условия и ошибки
55+
56+
- **Case E.1: Неподдерживаемый Cipher Suite**
57+
- **When**: В конфиге указан несуществующий ГОСТ-набор.
58+
- **Then**: Система должна выдать ошибку при инициализации.
59+
60+
- **Case E.2: Невалидный ключ ГОСТ**
61+
- **When**: Попытка загрузки поврежденного приватного ключа ГОСТ.
62+
- **Then**: Ошибка `failed to load certificate`.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Спецификации: tdd-https-vpn-ciphersuite-ru
2+
3+
> Версия: 1.0
4+
> Статус: DRAFT
5+
> Последнее обновление: 2026-05-11
6+
> Требования: [01-requirements.md](01-requirements.md)
7+
> Тесты: [02-tests.md](02-tests.md)
8+
9+
## Архитектура (на основе тестов)
10+
11+
Для удовлетворения требований по регистрации (Case 1.1) и настройке TLS (Case 2.1, 2.2), система разделена на слои:
12+
13+
### 1. Слой провайдера (`crypto/ru`)
14+
- **Компонент**: `Provider`
15+
- **Интерфейс**: `crypto.Provider`
16+
- **Функция**: Точка входа для регистрации "ru" и конфигурации TLS.
17+
18+
### 2. Слой TLS (`crypto/ru/tls`)
19+
- **Компонент**: `GostTLS`
20+
- **Функция**: Реализация специфичных для ГОСТ протокольных обменов (VKO), не поддерживаемых стандартным `crypto/tls`.
21+
22+
### 3. Слой примитивов (`crypto/ru/gost`)
23+
- **Компоненты**: `Kuznyechik`, `Magma`, `Streebog`, `Gost3410`
24+
- **Функция**: Математическая реализация алгоритмов (удовлетворяет Case 3.1, 3.2).
25+
26+
## Проектирование интерфейсов
27+
28+
### Провайдер ГОСТ
29+
```go
30+
type Provider struct{}
31+
32+
func (p *Provider) Name() string { return "ru" }
33+
func (p *Provider) ConfigureTLS(cfg *tls.Config) error
34+
func (p *Provider) SupportedCipherSuites() []uint16
35+
```
36+
37+
## Модели данных
38+
39+
### Идентификаторы наборов шифров (RFC 9189)
40+
```go
41+
const (
42+
TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC uint16 = 0xC100
43+
TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_L uint16 = 0xC101
44+
TLS_GOSTR341112_256_WITH_MAGMA_CTR_OMAC uint16 = 0xC103
45+
)
46+
```
47+
48+
## Стратегия тестирования
49+
50+
### Модульные тесты (Unit)
51+
- `crypto/ru/gost/streebog_test.go`: Тестирование хеша на векторах.
52+
- `crypto/ru/gost/kuznyechik_test.go`: Тестирование блочного шифра.
53+
54+
### Интеграционные тесты
55+
- `crypto/ru/provider_test.go`: Проверка корректности заполнения `tls.Config`.
56+
- Эмуляция Handshake с использованием ГОСТ сертификатов для проверки VKO.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# План реализации: tdd-https-vpn-ciphersuite-ru
2+
3+
> Версия: 1.0
4+
> Статус: APPROVED
5+
> Последнее обновление: 2026-05-11
6+
> Спецификации: [03-specifications.md](03-specifications.md)
7+
8+
## График работ
9+
10+
### Фаза 1: Верификация примитивов (Тестовое покрытие)
11+
- [x] Запуск тестов для `crypto/ru/gost/streebog_test.go`
12+
- [x] Запуск тестов для `crypto/ru/gost/kuznyechik_test.go`
13+
- [x] Проверка соответствия векторам ГОСТ Р 34.12 и 34.11.
14+
15+
### Фаза 2: Реализация TLS уровня
16+
- [x] Реализация структуры `CipherSuites` в `crypto/ru/tls/cipher_suites.go`.
17+
- [x] Реализация механизмов VKO (Vesterman-Kuznetsov-Oshkin).
18+
- [x] Поддержка протоколов записи и рукопожатия.
19+
20+
### Фаза 3: Интеграция провайдера
21+
- [x] Создание `crypto/ru/provider.go`.
22+
- [x] Реализация метода `ConfigureTLS`.
23+
- [x] Регистрация провайдера через `init()`.
24+
- [x] Добавление импорта в `cmd/https-vpn/main.go`.
25+
26+
### Фаза 4: Сквозное тестирование
27+
- [ ] Интеграционный тест TLS Handshake с провайдером "ru".
28+
- [ ] Проверка детекции сертификатов ГОСТ.
29+
30+
## Сводка изменений файлов
31+
32+
| Файл | Действие | Причина |
33+
|------|----------|---------|
34+
| `crypto/ru/provider.go` | Создать | Точка входа провайдера ГОСТ |
35+
| `cmd/https-vpn/main.go` | Изменить | Регистрация провайдера |
36+
| `crypto/provider.go` | Изменить | Функции детекции ГОСТ suites |
37+
38+
## Оценка рисков
39+
40+
- **Производительность**: Алгоритмы ГОСТ могут работать медленнее стандартных AES. Требуется профилирование.
41+
- **Сертификаты**: Несовместимость с форматами нестандартных УЦ.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Журнал реализации: tdd-https-vpn-ciphersuite-ru
2+
3+
> Состояние на: 2026-05-11
4+
5+
## Прогресс
6+
7+
### 1. Тестирование примитивов (Фаза 1)
8+
- [x] Проверено: `crypto/ru/gost/streebog_test.go` — все тесты пройдены.
9+
- [x] Проверено: `crypto/ru/gost/kuznyechik_test.go` — векторы подтверждены.
10+
- [x] Проверено: `crypto/ru/gost/magma_test.go` — векторы подтверждены.
11+
12+
### 2. TLS Уровень (Фаза 2)
13+
- [x] Реализована поддержка наборов шифров RFC 9189.
14+
- [x] Проверена работа VKO обмена.
15+
16+
### 3. Интеграция провайдера (Фаза 3)
17+
- [x] Создан `crypto/ru/provider.go`.
18+
- [x] Провайдер "ru" зарегистрирован в `init()`.
19+
- [x] Добавлен импорт в `cmd/https-vpn/main.go` для авторегистрации.
20+
- [x] Реализована функция `crypto.IsTHCryptoSuite``IsUACryptoSuite` ранее).
21+
22+
## Заметки по реализации
23+
24+
В ходе перехода на TDD был сделан акцент на верификацию примитивов через тестовые векторы перед интеграцией в TLS. Это позволило гарантировать математическую точность реализации ГОСТ. Кастомный стек TLS необходим из-за отсутствия поддержки ГОСТ в стандартной библиотеке Go.
25+
26+
## Предстоящие задачи
27+
- [ ] Проведение нагрузочного тестирования.
28+
- [ ] Тестирование с реальными российскими сертификатами.

0 commit comments

Comments
 (0)