Как преобразовать отдельную подпись CAdES в конвертированную с помощью BC?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как преобразовать отдельную подпись CAdES в конвертированную с помощью BC?

Сообщение Anonymous »

Мой Java-апплет может генерировать CMSSignedData с использованием Bouncy Castle 1.4.9 типа «отсоединенный». Затем массив байтов sigData.getEncoded() сохраняется в таблице на сервере (который имеет доступ к невложенным данным содержимого). Теперь я хотел бы создать оболочку CMSSignedData на сервере, чтобы пользователь мог загрузить файл .p7m.

Функция, которую мне нужно разработать, имеет массив байтов отделенную подпись и массив байтов данных контента и должен возвращать массив байтов подписи в оболочке CaDES, которая будет использоваться для загрузки файла .p7m.

проблема в том, что я был не удалось преобразовать отдельное подписывающее лицо в конвертированное.

Вот код, который я использовал в своем апплете:
signCAdeS знаки документ с использованием отдельной подписи, затем вызывает attach (только для тестирования) для преобразования отдельной подписи в конверт, но безуспешно: при открытии созданного файла .p7m с помощью Dike невозможно просмотреть данные содержимого.

private byte[] signCAdES(byte[] aDocument, PrivateKey aPrivateKey, Certificate[] certChain)
throws GeneralSecurityException {
byte[] digitalSignature = null;
try {

Security.addProvider(new BouncyCastleProvider());
ArrayList certsin = new ArrayList();
for (int i = 0; i < certChain.length; i++) {
certsin.add((X509Certificate) certChain);
}
X509Certificate cert = certsin.get(0);
//Nel nuovo standard di firma digitale e' richiesto l'hash del certificato di sottoscrizione:
String digestAlgorithm = "SHA-256";
String digitalSignatureAlgorithmName = "SHA256withRSA";
MessageDigest sha = MessageDigest.getInstance(digestAlgorithm);
byte[] digestedCert = sha.digest(cert.getEncoded());

//Viene ora create l'attributo ESSCertID versione 2 cosi come richiesto nel nuovo standard:
AlgorithmIdentifier aiSha256 = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256);
ESSCertIDv2 essCert1 = new ESSCertIDv2(aiSha256, digestedCert);
ESSCertIDv2[] essCert1Arr = {essCert1};
SigningCertificateV2 scv2 = new SigningCertificateV2(essCert1Arr);
Attribute certHAttribute = new Attribute(PKCSObjectIdentifiers.id_aa_signingCertificateV2, new DERSet(scv2));

//Aggiungiamo l'attributo al vettore degli attributi da firmare:
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(certHAttribute);
AttributeTable at = new AttributeTable(v);
CMSAttributeTableGenerator attrGen = new DefaultSignedAttributeTableGenerator(at);

//Creaiamo l'oggetto che firma e crea l'involucro attraverso le librerie di Bouncy Castle:
SignerInfoGeneratorBuilder genBuild = new SignerInfoGeneratorBuilder(new BcDigestCalculatorProvider());
genBuild.setSignedAttributeGenerator(attrGen);

//Si effettua la firma con l'algoritmo SHA256withRSA che crea l'hash e lo firma con l'algoritmo RSA:
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner shaSigner = new JcaContentSignerBuilder("SHA256withRSA").build(aPrivateKey);
SignerInfoGenerator sifGen = genBuild.build(shaSigner, new X509CertificateHolder(cert.getEncoded()));
gen.addSignerInfoGenerator(sifGen);
X509CollectionStoreParameters x509CollectionStoreParameters = new X509CollectionStoreParameters(certsin);
JcaCertStore jcaCertStore = new JcaCertStore(certsin);
gen.addCertificates(jcaCertStore);

CMSTypedData msg = new CMSProcessableByteArray(aDocument);
CMSSignedData sigData = gen.generate(msg, false); // false=detached

byte[] encoded = sigData.getEncoded();

FileOutputStream fos = new FileOutputStream("H:\\prova2.txt.p7m");
fos.write(attach(aDocument, encoded));
fos.flush();
fos.close();
digitalSignature = encoded;

} catch (CMSException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (OperatorCreationException ex) {
ex.printStackTrace();
}
return digitalSignature;
}


Вот функция attach:

public static byte[] attach(byte[] originalData, byte[] detached) {
try {
ASN1InputStream in = new ASN1InputStream(detached);

CMSSignedData sigData = new CMSSignedData(new CMSProcessableByteArray(originalData), in);

return sigData.getEncoded();
} catch (Exception e) {
return null;
}
}


Подробнее здесь: https://stackoverflow.com/questions/185 ... d-using-bc
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Проверьте файл TimestampResponse с помощью подписанного файла CADES.
    Anonymous » » в форуме JAVA
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Получить конвертированную цену на рынке Steam
    Anonymous » » в форуме Javascript
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Подписать отдельную подпись, используя OpenSAML
    Anonymous » » в форуме JAVA
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Торговец C# Binance получает неправильную подпись C2B {"status":"FAIL","code":"400002","errorMessage":"Подпись для этого
    Гость » » в форуме C#
    0 Ответы
    92 Просмотры
    Последнее сообщение Гость
  • Цифровая подпись eBay для Restful API/подпись базы подписи с заданным закрытым ключом на C#
    Anonymous » » в форуме C#
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»