9737c787f9
Инфраструктура M2M (живой обмен с НРД через ИШ): - обработка M2MTransferResponse: ERROR(M2Mxx) → заявка Отклонена, сохранение ответа; INFO → ждём Decision; идемпотентность поллера - fallback-корреляция ответов с нулевым GUID (M2M14/M2M17) по FIFO - сырой XML ответа НРД в карточке заявки (для пересылки в ТП) - тестовый пакет роботу приведён к эталону m2m_robot_samples (CostInfo=Yes, 4 бумаги, IsolationStatus, DocumentSeries=сценарий); override паспорта - редирект из теста сразу в карточку заявки Мастер установки ключа Валидаты на флешку (admin/setup/keywizard): - пошаговый: загрузка .7z+пароль → выбор флешки → запись → справочник сертификатов (CRL) → перезапуск+проверка ИШ → готово - привилегированный воркер (bj-keymedia) в host-namespace через файл-обмен, bj-server остаётся в песочнице - сохранение структуры профиля архива (spr<N>), перечисление съёмных USB Прочее: - пакет-доказательство для ТП НРД + форма регистрации участника M2M - эталонные образцы робота (DOC/m2m_robot_samples) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
62 lines
1.9 KiB
Go
62 lines
1.9 KiB
Go
package release
|
|
|
|
import (
|
|
"crypto/ed25519"
|
|
"crypto/rand"
|
|
"encoding/base64"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestSignVerifyRoundTrip(t *testing.T) {
|
|
pub, priv, err := ed25519.GenerateKey(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m := &Manifest{
|
|
Version: "1.2.3",
|
|
Channel: "stable",
|
|
ReleasedAt: time.Now().UTC().Truncate(time.Second),
|
|
Artifacts: []Artifact{
|
|
{Name: "bj-server", File: "bj-server", SHA256: "abc", Size: 100, Exec: true},
|
|
},
|
|
}
|
|
sm, err := Sign(m, priv, "main")
|
|
if err != nil {
|
|
t.Fatalf("Sign: %v", err)
|
|
}
|
|
got, err := Verify(sm, pub)
|
|
if err != nil {
|
|
t.Fatalf("Verify: %v", err)
|
|
}
|
|
if got.Version != m.Version || got.Channel != m.Channel || len(got.Artifacts) != 1 {
|
|
t.Fatalf("manifest mismatch: %+v", got)
|
|
}
|
|
if got.Schema != CurrentSchema {
|
|
t.Fatalf("schema = %d, want %d", got.Schema, CurrentSchema)
|
|
}
|
|
}
|
|
|
|
func TestVerifyRejectsTamper(t *testing.T) {
|
|
pub, priv, _ := ed25519.GenerateKey(rand.Reader)
|
|
m := &Manifest{Version: "1.0.0", Channel: "stable", Artifacts: []Artifact{{Name: "x"}}}
|
|
sm, _ := Sign(m, priv, "main")
|
|
// Подменяем payload на другой манифест — подпись не должна сойтись.
|
|
other := &Manifest{Version: "9.9.9", Channel: "stable", Artifacts: []Artifact{{Name: "evil"}}}
|
|
bad, _ := other.Canonical()
|
|
sm.Payload = base64.StdEncoding.EncodeToString(bad)
|
|
if _, err := Verify(sm, pub); err == nil {
|
|
t.Fatal("Verify принял подделанный payload")
|
|
}
|
|
}
|
|
|
|
func TestVerifyRejectsWrongKey(t *testing.T) {
|
|
_, priv, _ := ed25519.GenerateKey(rand.Reader)
|
|
other, _, _ := ed25519.GenerateKey(rand.Reader) // чужой публичный ключ
|
|
m := &Manifest{Version: "1.0.0", Channel: "stable", Artifacts: []Artifact{{Name: "x"}}}
|
|
sm, _ := Sign(m, priv, "main")
|
|
if _, err := Verify(sm, other); err == nil {
|
|
t.Fatal("Verify принял подпись чужим ключом")
|
|
}
|
|
}
|