Я пытаюсь преобразовать следующий код (который использует встроенные библиотеки криптографии .NET) в BouncyCastle. К сожалению, из-за отсутствия документации, путаницы со всеми вопросами по Java BC и необычности работы с отсоединенными подписями я не могу понять, как это сделать.
.NET code:
1) Код, который мне нужно преобразовать:
var data = Encoding.ASCII.GetBytes("Hi!");
var signature = File.ReadAllText("Signature.p7s");
byte[] hashedDocument = HashAlgorithm.Create("SHA256").ComputeHash(data);
var cms = new SignedCms(new ContentInfo(hashedDocument), true);
cms.Decode(Convert.FromBase64String(signature));
cms.CheckSignature(true);
2) Код для генерации p7s:
var data = File.ReadAllBytes(fileToSign);
var hash = SHA256.Create().ComputeHash(data);
ContentInfo ci = new ContentInfo(hash);
SignedCms cms = new SignedCms(ci, true);
CmsSigner signer = new CmsSigner(new X509Certificate2(cert, pw));
signer.IncludeOption = X509IncludeOption.WholeChain;
signer.DigestAlgorithm = new Oid("sha256RSA");
signer.SignedAttributes.Add(new Pkcs9DocumentName(cert.SubjectName.Name));
signer.SignedAttributes.Add(new Pkcs9SigningTime());
cms.ComputeSignature(signer);
var enc = Convert.ToBase64String(cms.Encode());
File.WriteAllText(sigFile, enc);
Я пробовал BouncyCastle's RsaDigestSigner
, CmsSignedData
,CmsSignedDataParser
и SignerUtilities.GetSigner("SHA-256withRSA")
(который просто возвращает RsaDigestSigner
), но ни один из них, похоже, не имеет способа понять файл p7s и фактически убедиться, что он применяется к указанным данным.