using System.Security.Cryptography; using System.Text; namespace MoShiro.Backend.Application; /// /// 发布清单的签名校验:用 Backend 内嵌的 CI 发布公钥(packaging/update/release-key.pub.pem)验 ECDSA P-256 / SHA-256(DER)签名,签名对象是清单的原始字节。 /// 登记清单因此不需要任何令牌:能被登记的只有 CI 签过的清单,节点的更新器之后还会用本机的公钥再验一遍。 /// public static class ReleaseSignature { public static bool Verify(string publicKeyPem, string manifest, string signatureBase64) { try { using var key = ECDsa.Create(); key.ImportFromPem(publicKeyPem); return key.VerifyData(Encoding.UTF8.GetBytes(manifest), Convert.FromBase64String(signatureBase64), HashAlgorithmName.SHA256, DSASignatureFormat.Rfc3279DerSequence); } catch (Exception ex) when (ex is FormatException or CryptographicException or ArgumentException) { return false; } } }