Hi,

I think the problem is this line : sDigestAlg.addElement(new
PrintableString("SHA1")); //algoritmo
and the object to transfer must be(I think) a contentInfo.

By the way, you don't know how to find the path to the configdir of the
current user(with netscape and
mozilla, I want to do an applet which will access the keystore of the user)?

Here is a portion code(sorry but all this code was a trial so it's not clean
:-) ), if it can help you :

    //TRY TO CONSTRUCT A PKCS7 OBJECT
//BonCertificat is a certificate that I get from the keystore
   byte[] derCert = BonCertificat.getEncoded();//obtient l'encodage DER
   org.mozilla.jss.pkix.cert.Certificate cert
=(org.mozilla.jss.pkix.cert.Certificate)ASN1Util.decode(org.mozilla.jss.pkix
.cert.Certificate.getTemplate(),derCert);
   Name issuerName = cert.getInfo().getIssuer();
   byte[] derIssuer = ASN1Util.encode(issuerName);

  MessageDigest md =
MessageDigest.getInstance(DigestAlgorithm.SHA1.toString());
  byte[] messageDigest = md.digest(data);

   ContentInfo ci = new ContentInfo(data);

   IssuerAndSerialNumber iasn=new IssuerAndSerialNumber(issuerName,new
INTEGER(BonCertificat.getSerialNumber()));

   SET authenticatedAttributes = null;
   SET unauthenticatedAttributes = null;

   OBJECT_IDENTIFIER contentType = ContentInfo.DATA;
   SignatureAlgorithm signingAlg
=SignatureAlgorithm.RSASignatureWithSHA1Digest;
   SignerInfo si = new SignerInfo(iasn,
                      authenticatedAttributes,
                       unauthenticatedAttributes, contentType,
                       messageDigest,
                       signingAlg,(org.mozilla.jss.crypto.PrivateKey) pk);


     SET digestAlgorithms = null;
    digestAlgorithms = new SET();
    digestAlgorithms.addElement(new
AlgorithmIdentifier(DigestAlgorithm.SHA1.toOID()));

    SET certificates = null;

    SET signers = null;

    SET crls = null;

    certificates = new SET();
    certificates.addElement( new ANY(BonCertificat.getEncoded()) );
    X509Certificate[] certChain=ksh.getCertificateChain(BonCertificat);
    certificates.addElement(new ANY(certChain[1].getEncoded()));
    //for(int i=certChain.length;i>0;--i){
     // System.out.println(i);
     // certificates.addElement(new ANY(certChain[i-1].getEncoded()));
    //}

    signers = new SET();
    signers.addElement(si);
    SignedData sd = new SignedData(digestAlgorithms, ci,certificates, crls,
signers);


   ContentInfo cisd=new ContentInfo(sd);// the final object





"G. Rodr�guez" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> I got quite the same problem. My source code is the following:
>
>   private byte[] signData(byte[] abIn, X509Certificate x5cCert)
>     throws Exception{
>
>     SignedData sdDataOut = null;
>     SET sDigestAlg = new SET();
>     ContentInfo ciData = null;
>     SET sCerts = new SET();
>     SET sCRLs = null;
>     SET sSignerList = new SET();
>     SignerInfo siSigner = null;
>     MessageDigest md = null;
>     Name nName = new Name();
>
>     sDigestAlg.addElement(new PrintableString("SHA1")); //algoritmo
>     ciData = new ContentInfo(abIn); //datos a firmar
>
>     X509Certificate[] xCerts = this.m_cmManager.buildCertificateChain(
> x5cCert );
>     for(int i=0; i<xCerts.length;i++){
>       sCerts.addElement(new ANY(xCerts[i].getEncoded())); //cert
> firmador
>     }
>
>     nName.addCommonName(x5cCert.getIssuerDN().getName());
>     nName.addCommonName(getSubStrDN(x5cCert.getIssuerDN().toString(),
> "CN="));
>     nName.addCountryName(getSubStrDN(x5cCert.getIssuerDN().toString(),
> "C="));
>
nName.addOrganizationName(getSubStrDN(x5cCert.getIssuerDN().toString(),
> "O="));
>
nName.addOrganizationalUnitName(getSubStrDN(x5cCert.getIssuerDN().toString()
,
> "OU="));
>     nName.addLocalityName(getSubStrDN(x5cCert.getIssuerDN().toString(),
> "L="));
>
nName.addStateOrProvinceName(getSubStrDN(x5cCert.getIssuerDN().toString(),
> "ST="));
>
>     md = MessageDigest.getInstance("SHA1");
>     siSigner = new SignerInfo(new IssuerAndSerialNumber(nName, new
> INTEGER(x5cCert.getSerialNumber())), //issuerAndSerialNumber
>                               null, //authenticatedAttributes
>                               null, //unauthenticatedAttributes
>                               ContentInfo.DATA, //content type
>                               md.digest(abIn), //digest del mensaje
>
> SignatureAlgorithm.RSASignatureWithSHA1Digest, //algoritmo
>
> this.m_cmManager.findPrivKeyByCert(x5cCert)); //clave privada
>     sSignerList.addElement(siSigner); //info del firmador
>     sdDataOut = new SignedData(sDigestAlg, ciData, sCerts, sCRLs,
> sSignerList);
>
>     ByteArrayOutputStream baos = new ByteArrayOutputStream();
>     sdDataOut.encode(baos);
>
>     /* i've tried the following too:
>     ContentInfo ci = new ContentInfo(sdDataOut);
>     ci.encode(baos);
>     */
>
>     return baos.toByteArray();
>   }
>
>   Any difference with your code, can anyone find out what i'm doing
> wrong?
>
> Ivan Brozovic <[EMAIL PROTECTED]> wrote in message
news:<[EMAIL PROTECTED]>...
> > Does anybody have working example of creating pkcs7 digital signature
> > in java using JSS ?
> >
> > Please send it on my email or on this newsgroup.
> >
> > I just can't create valid pkcs7 file. Program finish successfuly but
> > pkcs7 parsing using openssl fails.
> >
> > asn1parse shows different structure comparing to pkcs7 file generated by
> > openssl utility.
> >
> > I don't know what I'm doing wrong.
> >
> > Thanks



Reply via email to