Index: modules/security/src/main/java/common/org/apache/harmony/security/pkcs7/SignerInfo.java =================================================================== --- modules/security/src/main/java/common/org/apache/harmony/security/pkcs7/SignerInfo.java (revision 464897) +++ modules/security/src/main/java/common/org/apache/harmony/security/pkcs7/SignerInfo.java (working copy) @@ -21,6 +21,7 @@ */ package org.apache.harmony.security.pkcs7; +import java.io.IOException; import java.math.BigInteger; import java.util.List; @@ -33,6 +34,7 @@ import org.apache.harmony.security.asn1.ASN1SetOf; import org.apache.harmony.security.asn1.ASN1Type; import org.apache.harmony.security.asn1.BerInputStream; +import org.apache.harmony.security.internal.nls.Messages; import org.apache.harmony.security.x501.AttributeTypeAndValue; import org.apache.harmony.security.x501.Name; import org.apache.harmony.security.x509.AlgorithmIdentifier; @@ -150,14 +152,25 @@ return res.toString(); } + + public static final ASN1Sequence ISSUER_AND_SERIAL_NUMBER = + new ASN1Sequence(new ASN1Type[] { + Name.ASN1, // issuer + ASN1Integer.getInstance(), // serialNumber + }) + { + // method to encode + public void getValues(Object object, Object[] values) { + Object [] issAndSerial = (Object[])object; + values[0] = issAndSerial[0]; + values[1] = issAndSerial[1]; + } + }; + public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] { ASN1Integer.getInstance(), //version - new ASN1Sequence(new ASN1Type[] //issuerAndSerialNumber - {Name.ASN1, //issuer - ASN1Integer.getInstance() //serialNumber - } - ), + ISSUER_AND_SERIAL_NUMBER, AlgorithmIdentifier.ASN1, //digestAlgorithm new ASN1Implicit(0, AuthenticatedAttributes.ASN1),//authenticatedAttributes AlgorithmIdentifier.ASN1, //digestEncryptionAlgorithm @@ -170,6 +183,27 @@ setOptional(6); // unauthenticatedAttributes is optional } + protected void getValues(Object object, Object[] values) { + SignerInfo si = (SignerInfo) object; + values[0] = new byte[] {(byte)si.version}; + try { + values[1] = new Object[] { new Name(si.issuer.getName()), + si.serialNumber.toByteArray() }; + } catch (IOException e) { + // The exception is never thrown, because si.issuer + // is created using Name.getX500Principal(). + // Throw a RuntimeException just to be safe. + throw new RuntimeException( + // Msg: "Failed to encode issuer name + Messages.getString("security.1A2"), e); + } + values[2] = si.digestAlgorithm; + values[3] = si.authenticatedAttributes; + values[4] = si.digestEncryptionAlgorithm; + values[5] = si.encryptedDigest; + values[6] = si.unauthenticatedAttributes; + } + protected Object getDecodedObject(BerInputStream in) { Object[] values = (Object[]) in.content; return new SignerInfo( Index: modules/security/src/main/java/common/org/apache/harmony/security/internal/nls/messages.properties =================================================================== --- modules/security/src/main/java/common/org/apache/harmony/security/internal/nls/messages.properties (revision 464897) +++ modules/security/src/main/java/common/org/apache/harmony/security/internal/nls/messages.properties (working copy) @@ -341,4 +341,5 @@ security.19F='key' is neither DSAPublicKey nor DSAPrivateKey security.1A0=ATTENTION: InvalidKeySpecException in engineGeneratePrivate: {0} security.1A1=ATTENTION: InvalidKeySpecException in engineGeneratePublic: {0} +security.1A2=Failed to encode issuer name