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

J Gsealy <[email protected]> Fri, 24 May 2019 01:03:00 +0000
Newsgroups gmane.comp.encryption.bouncy-castle.devel
Message-ID <BYAPR07MB59734E19C7E718B938763601B3020@BYAPR07MB5973.namprd07.prod.outlook.com>
Hi Team, Matti,

Thanks for Matti reproduce it.
When I test msgBuilder.setSerialNumber(BigInteger.ONE);  It was encode to a OctetString, not a Integer.

(just add setSerialNumber()  to Matti 's code)

Thanks,
Gsealy
------------------------------------------------
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.ASN1Integer;
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 TestBCCertTemplate {

    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.setSerialNumber(BigInteger.ONE);
            msgBuilder.setPublicKey(keyInfo);

            CertificateRequestMessage crm = msgBuilder.build();
            System.out.println("CRM = "+Hex.toHexString(crm.getEncoded()));

            final DERTaggedObject snDto = new DERTaggedObject(false, 1, new ASN1Integer(BigInteger.ONE));
            System.out.println("SN DTO = "+Hex.toHexString(snDto.getEncoded()));

            final DERTaggedObject keyInfoDto = new DERTaggedObject(false, 6, keyInfo);
            System.out.println("PUB KEY DTO = "+Hex.toHexString(keyInfoDto.getEncoded()));

            final CertTemplateBuilder ctb = new CertTemplateBuilder();
            ctb.setSerialNumber(new ASN1Integer(BigInteger.ONE));
            ctb.setPublicKey(keyInfo);
            final CertTemplate ct = ctb.build();
            System.out.println("CT = "+Hex.toHexString(ct.getEncoded()));

        }
        catch (Throwable e) {
            e.printStackTrace();
        }
    }
}

From: Matti Aarnio<mailto:[email protected]>
Date: 2019-05-24 01:43
To: [email protected]<mailto:[email protected]>; dev-crypto<mailto:[email protected]>
Subject: Re: [dev-crypto] Re: Re: why publickey sequence use DLSequence in CMP cr-CertTemplate entity ?
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();
        }
    }
}