package service import ( "strings" "hy2xs-admin/dao" "hy2xs-admin/util" ) // Криптоматериал пиров берётся из dao, а не создаётся здесь заново. // // Что было. В этом файле лежали СОБСТВЕННЫЕ getOrCreateConfigKey и // getPeerSecretEncryptionKey — построчные копии одноимённых функций из // dao/sqlite.go. Две реализации, порождающие один и тот же материал шифрования, // в двух пакетах: bootstrap-пир получал ключ через dao, а всё остальное — через // service. Пока обе читали один ключ из таблицы `config`, поведение совпадало, // но любое расхождение означало бы, что секреты пиров шифруются одним ключом, а // расшифровываются другим, и проявилось бы это на живых пирах. // // Копия в service несла ещё и порядок «сначала INSERT, при ошибке UPDATE», // из-за которого каждая первая загрузка печатала в журнал // `duplicated key not allowed` уровня error на здоровом старте. // GetPeerSecretKey — HMAC-ключ, которым считается secret_digest пира. func GetPeerSecretKey() (string, error) { return dao.GetOrCreatePeerSecretDigestKey() } func PeerSecretDigest(rawSecret string) (string, error) { secretKey, err := GetPeerSecretKey() if err != nil { return "", err } return util.HmacSHA256Hex(rawSecret, secretKey), nil } func EncryptPeerSecret(rawSecret string) (string, error) { key, err := dao.GetOrCreatePeerSecretEncryptionKey() if err != nil { return "", err } return util.EncryptAESGCM(rawSecret, key) } func DecryptPeerSecret(stored string) (string, error) { if !strings.HasPrefix(stored, "v1:") { return stored, nil } key, err := dao.GetOrCreatePeerSecretEncryptionKey() if err != nil { return "", err } return util.DecryptAESGCM(stored, key) }