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

David Hook <dgh-rTAZ0PM/[email protected]> Sat, 25 May 2019 15:47:58 +1000
Newsgroups gmane.comp.encryption.bouncy-castle.devel
Message-ID <[email protected]>
I'm not sure I understand this one. The object's correct - it's just
implicitly tagged. Can you expand on what you think the problem is?

Thanks,

David

On 24/5/19 3:43 am, Matti Aarnio wrote:
> 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();
>         }
>     }
> }