Re: Re: Re: why publickey sequence use DLSequence in CMP cr-CertTemplate entity ?

Matti Aarnio <[email protected]> Thu, 23 May 2019 20:43:49 +0300
Newsgroups gmane.comp.encryption.bouncy-castle.devel
Message-ID <[email protected]>
Hi David,

The code below shows this bad request generation formatting.
The same badness happens for RSA key too.
( KeyPairgenerator.getInstance("RSA","BC"); kpg.initialize(1024); )

Therefore the problem is probably in the CertTemplateBuilder.build() method.
Or more precisely the addOptional() method inside it:
    DERTaggedObject dto = new DERTaggedObject(false, 6, keyInfo);

Why does that encode the tagged thing incorrectly?

BR, Matti Aarnio


import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PublicKey;
import java.security.Security;
import java.security.spec.ECGenParameterSpec;

import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.crmf.CertTemplate;
import org.bouncycastle.asn1.crmf.CertTemplateBuilder;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.cert.crmf.CertificateRequestMessage;
import org.bouncycastle.cert.crmf.CertificateRequestMessageBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

public class TestSM2Keygen {

    public static void main(String[]args) {
        try {
            Security.addProvider(new BouncyCastleProvider());
           
            final ECGenParameterSpec ecGenSpec = new ECGenParameterSpec("sm2p256v1");
            final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC","BC");
            kpg.initialize(ecGenSpec);
            final KeyPair kp = kpg.generateKeyPair();
            final PublicKey pubKey = kp.getPublic();
            final byte[] pubKeyDer = pubKey.getEncoded();
            final SubjectPublicKeyInfo keyInfo = SubjectPublicKeyInfo.getInstance(pubKeyDer);
            final byte[] spkiDer = keyInfo.getEncoded();
           
            System.out.println("pubkey = "+Hex.toHexString(pubKeyDer));
            System.out.println("spki = "+Hex.toHexString(spkiDer));

            final CertificateRequestMessageBuilder msgBuilder = new CertificateRequestMessageBuilder(BigInteger.ONE);
            msgBuilder.setPublicKey(keyInfo);

            CertificateRequestMessage crm = msgBuilder.build();
            System.out.println("CRM = "+Hex.toHexString(crm.getEncoded()));
           
            final DERTaggedObject dto = new DERTaggedObject(false, 6, keyInfo);
            System.out.println("DTO = "+Hex.toHexString(dto.getEncoded()));
           
            final CertTemplateBuilder ctb = new CertTemplateBuilder();
            ctb.setPublicKey(keyInfo);
            final CertTemplate ct = ctb.build();
            System.out.println("CT = "+Hex.toHexString(ct.getEncoded()));
           
        }
        catch (Throwable e) {
            e.printStackTrace();
        }
    }
}