2015-03-23 2 views
0

мне кажется, что Надувной замок изменил API и следующий код не работает больше в 1,52:Надувной замок отделённая подпись изменилась апи

/** 
    * SignatureInterface implementation. Creates detached signature of stream 
    * using SHA-256. 
    * 
    * @param content 
    *   original content stream to sign 
    * @throws SignatureException 
    *   in case of signature error 
    * @throws IOException 
    *   in case of I/O error 
    * @return signed byte content 
    */ 
    @Override 
    public byte[] sign(final InputStream content) throws SignatureException, 
     IOException { 
    try { 

     CMSProcessableInputStream input = new CMSProcessableInputStream(content); 
     List<Certificate> certList = Arrays.asList(keystore 
      .getCertificateChain(alias)); 
     CertStore certStore = CertStore.getInstance("Collection", 
      new CollectionCertStoreParameters(certList), provider); 

     CMSSignedDataGenerator gen = new CMSSignedDataGenerator();  
     gen.addSigner((PrivateKey) keystore.getKey(alias, pin), 
      (X509Certificate) keystore.getCertificate(alias), 
      CMSSignedGenerator.DIGEST_SHA256); 
     gen.addCertificatesAndCRLs(certStore); 

     return gen.generate(input, false, provider).getEncoded(); 
    } catch (Exception e) { 
     throw new SignatureException(
      "Problem while preparing signature. Wrong certificate or alias."); 
    } 
    } 

Кто-нибудь знает, как добиться такого же поведения в новых API? Я не нашел никакой важной информации в руководстве по переносу.

редактируется (добавлено определение переменных):

/** 
    * Size of the read buffer for signing. 
    */ 
    private static final int BUFSIZE = 8192; 

    /** 
    * Stored instance of BC. 
    */ 
    private BouncyCastleProvider provider; 

    /** 
    * PKCS#12 key store. 
    */ 
    private KeyStore keystore; 

    /** 
    * Alias for certificate to sign. 
    */ 
    private String alias; 

    /** 
    * Password to private key. 
    */ 
    private char[] pin; 

ответ

1

Я был в состоянии изменить код к следующему, который, кажется, работает для меня с версии 1.51 (версия 1,52 глючит под OSGi):

public byte[] sign(final InputStream content) throws SignatureException, 
     IOException { 
    try { 
     CMSTypedData input = new CMSProcessableByteArray(
      IOUtils.toByteArray(content)); 
     List<Certificate> certList = Arrays.asList(keystore 
      .getCertificateChain(alias)); 
     Store certs = new JcaCertStore(certList); 
     CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); 
     ContentSigner shaSigner = new JcaContentSignerBuilder("SHA256withRSA") 
      .setProvider("BC").build((PrivateKey) keystore.getKey(alias, pin)); 
     gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
      new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()) 
      .build(shaSigner, (X509Certificate) keystore.getCertificate(alias))); 
     gen.addCertificates(certs); 
     return gen.generate(input, false).getEncoded(); 
    } catch (Exception e) { 
     throw new SignatureException(
      "Problem while preparing signature. Wrong certificate or alias."); 
    } 
    } 
Смежные вопросы