Несмотря на то, что я пробовал много вещей, мне не удалось это сделать. создать подпись, которая будет принята целевым API.
Справочный код Java:
Код: Выделить всё
private byte[] signChallenge(final byte[] challenge) {
X509Certificate sigCert = ...;
PrivateKey sigKey = ...;
ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSAandMGF1").setProvider("BC").build(sigKey);
CMSTypedData cmsData = new CMSProcessableByteArray(challenge);
CMSSignedDataGenerator cmsGenerator = new CMSSignedDataGenerator();
cmsGenerator.addSignerInfoGenerator(
new JcaSignerInfoGeneratorBuilder(
new JcaDigestCalculatorProviderBuilder().build()
).build(signer, sigCert)
);
Store certs = new JcaCertStore(Collections.singletonList(sigCert));
cmsGenerator.addCertificates(certs);
CMSSignedData cms = cmsGenerator.generate(cmsData, false);
byte[] signedMessage = cms.getEncoded();
return signedMessage;
}
Код: Выделить всё
private byte[] SignChallenge(byte[] challenge)
{
var sigCert = DotNetUtilities.FromX509Certificate(Cert);
var sigKey = DotNetUtilities.GetRsaKeyPair(Cert.GetRSAPrivateKey()).Private;
var signer = SignerUtilities.InitSigner("SHA256withRSAandMGF1", true, sigKey, new());
var cmsData = new CmsProcessableByteArray(challenge);
var cmsGenerator = new CmsSignedDataGenerator();
var factory = new Asn1SignatureFactory("SHA256withRSAandMGF1", sigKey);
cmsGenerator.AddSignerInfoGenerator(new SignerInfoGeneratorBuilder().Build(factory, sigCert));
cmsGenerator.AddCertificate(sigCert);
var cms = cmsGenerator.Generate(cmsData, false);
var signedMessage = cms.GetEncoded();
return signedMessage;
}
Моя вторая попытка заключалась в использовании System.Security.Cryptography.Pkcs:
Код: Выделить всё
private byte[] SignChallenge(byte[] challenge)
{
var contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(challenge);
var signedCms = new SignedCms(contentInfo, true);
var signer = new CmsSigner(Cert);
signer.DigestAlgorithm = Oid.FromFriendlyName("SHA256", OidGroup.HashAlgorithm);
signer.SignaturePadding = RSASignaturePadding.Pss;
signedCms.ComputeSignature(signer);
var signedMessage = signedCms.Encode();
return signedMessage;
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... th-c-sharp
Мобильная версия