Requirement
Build the following:
RMC.java
package com.jtech.security; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.*; import java.math.BigInteger; import java.security.KeyFactory; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.security.cert.*; import java.security.spec.RSAPrivateCrtKeySpec; import java.security.spec.RSAPublicKeySpec; import java.nio.charset.*; import java.util.Date; import java.util.Hashtable; import java.util.Vector; import org.bouncycastle.asn1.ASN1EncodableVector; import org.bouncycastle.asn1.DERObjectIdentifier; import org.bouncycastle.asn1.ASN1Sequence; import org.bouncycastle.asn1.DERBMPString; import org.bouncycastle.asn1.DERInputStream; import org.bouncycastle.asn1.DERSequence; import org.bouncycastle.asn1.misc.MiscObjectIdentifiers; import org.bouncycastle.asn1.misc.NetscapeCertType; import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; import org.bouncycastle.asn1.x509.AuthorityKeyIdentifier; import org.bouncycastle.asn1.x509.BasicConstraints; import org.bouncycastle.asn1.x509.GeneralName; import org.bouncycastle.asn1.x509.GeneralNames; import org.bouncycastle.asn1.x509.SubjectKeyIdentifier; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.asn1.x509.X509Extensions; import org.bouncycastle.asn1.x509.X509Name; import org.bouncycastle.jce.X509Principal; import org.bouncycastle.jce.X509V1CertificateGenerator; import org.bouncycastle.jce.X509V3CertificateGenerator; import org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier; import org.bouncycastle.jce.provider.BouncyCastleProvider; // // A class that will create a certificate and store it // public class RMC { static char[] passwd = { 'x', 'x', 'x', 'l', 'x', 'e', 'r', 'o', 'm', 'x', 'x' }; // // Constant used by CA cert // // signers name private static final String ISSUER = "C=RT, O=YourGroup, OU=RT Primary Certificate"; // subjects name - the same as we are self signed. private static final String SUBJECT = "C=RT, O=YourGroup, OU=RT Primary Certificate"; // Key private RSAPublicKeySpec _pubKeySpec; private RSAPrivateCrtKeySpec _privKeySpec; private RSAPublicKeySpec _intPubKeySpec; private RSAPrivateCrtKeySpec _intPrivKeySpec; private RSAPublicKeySpec _caPubKeySpec; private RSAPrivateCrtKeySpec _caPrivKeySpec; // Certificate private Certificate caCert; private Certificate interCert; private Certificate _targetCert; private X509V1CertificateGenerator _v1CertGen = new X509V1CertificateGenerator(); private X509V3CertificateGenerator _v3CertGen = new X509V3CertificateGenerator(); // // create the subject key identifier. // public SubjectKeyIdentifier createSubjectKeyId(PublicKey pubKey) { try { ByteArrayInputStream bIn = new ByteArrayInputStream(pubKey.getEncoded()); SubjectPublicKeyInfo info = new SubjectPublicKeyInfo( (ASN1Sequence)new DERInputStream(bIn).readObject()); return new SubjectKeyIdentifier(info); } catch (Exception e) { throw new RuntimeException("ERROR: Creating Subject Key ID"); } } // // create the authority key identifier. // public AuthorityKeyIdentifier createAuthorityKeyId( PublicKey pubKey, X509Name name, int sNumber) { try { ByteArrayInputStream bIn = new ByteArrayInputStream(pubKey.getEncoded()); SubjectPublicKeyInfo info = new SubjectPublicKeyInfo( (ASN1Sequence)new DERInputStream(bIn).readObject()); GeneralName genName = new GeneralName(name); ASN1EncodableVector v = new ASN1EncodableVector(); v.add(genName); return new AuthorityKeyIdentifier( info, new GeneralNames(new DERSequence(v)), BigInteger.valueOf(sNumber)); } catch (Exception e) { throw new RuntimeException("ERROR: Creating AuthorityKeyId"); } } public AuthorityKeyIdentifier createAuthorityKeyId(PublicKey pubKey) { try { ByteArrayInputStream bIn = new ByteArrayInputStream(pubKey.getEncoded()); SubjectPublicKeyInfo info = new SubjectPublicKeyInfo( (ASN1Sequence)new DERInputStream(bIn).readObject()); return new AuthorityKeyIdentifier(info); } catch (Exception e) { throw new RuntimeException("ERROR: Creating AuthorityKeyId"); } } /** * we generate the CA's certificate */ public Certificate createMasterCert( PublicKey pubKey, PrivateKey privKey, String caIssuer, String caSubject) throws Exception { // // create the certificate - version 1 // // // this is actually optional - but if you want to have control // over setting the friendly name this is the way to do it... // return cert; } /** * we generate an intermediate certificate signed by our CA */ public Certificate createIntermediateCert( PublicKey pubKey, PrivateKey caPrivKey, PublicKey caPubKey) throws Exception { // // signers name table - another way of doing it. // // // subject name table. // // // create the certificate - version 3 // // // extensions // // // this is actually optional - but if you want to have control // over setting the friendly name this is the way to do it... // return cert; } public String readFile(String fileName) { String curLine = ""; String totalLine = ""; try { // Build the String } catch (Exception exception) { exception.printStackTrace(); } return totalLine; } // readCert - Reads in a certificate file and returns the certificate // object public Certificate readCert(String fileName) { Certificate cert = null; try { // Build the String FileInputStream fis = new FileInputStream(fileName); BufferedInputStream bis = new BufferedInputStream(fis); CertificateFactory cf = CertificateFactory.getInstance("X.509"); while (bis.available() > 0) { cert = cf.generateCertificate(bis); //System.out.println(cert.toString()); } } catch (Exception exception) { exception.printStackTrace(); } return cert; } /** * we generate a certificate signed by our CA's intermediate certficate */ public Certificate createCert( PublicKey pubKey, PrivateKey caPrivKey, PublicKey caPubKey, String cn, String cnEmail) throws Exception { // // signers name table. // // // subjects name table. // // // create the certificate - version 3 // // // add the extensions // // OID (Object Identifier) Extension Name // 2.5.29.14 SubjectKeyIdentifier // 2.5.29.15 KeyUsage // 2.5.29.16 PrivateKeyUsage // 2.5.29.17 SubjectAlternativeName // 2.5.29.18 IssuerAlternativeName // 2.5.29.19 BasicConstraints // 2.5.29.30 NameConstraints // 2.5.29.33 PolicyMappings // 2.5.29.35 AuthorityKeyIdentifier // 2.5.29.36 PolicyConstraints // // this is also optional - in the sense that if you leave this // out the keystore will add it automatically, note though that // for the browser to recognise the associated private key this // you should at least use the pkcs_9_localKeyId OID and set it // to the same as you do for the private key's localKeyId. // return _targetCert; } // // This method writes a certificate to a file. // public static void export2File(java.security.cert.Certificate cert, File file, boolean binary) { try { // Get the encoded form which is suitable for exporting byte[] buf = cert.getEncoded(); os.close(); } catch (CertificateEncodingException e) { // Catch certificate info e.printStackTrace(); } catch (IOException e) { // Catch other exception e.printStackTrace(); } } private void initKeys() { // // personal keys // // // intermediate keys. // // // ca keys // return; } // // Constructor that reads from a file // public RMC(String fileName) { String cert = new String (); _targetCert = readCert(fileName); } // // Constructor to build a certificate // public RMC(String caIssuer, String caSubject, String cn, String cnEmail) { try { // Add the security provider // Initialize all the keys // set up the keys // Create the certificate chain } catch (Exception e) { // Handle exception e.printStackTrace(); } return; } // // Return the target cert // All the Java Certificate API could then be used upon // public Certificate getTargetCert() { return _targetCert; } public String getRoleInfo() { byte[] roleValue = ((X509Certificate)_targetCert).getExtensionValue("2.5.29.40"); return (new String(roleValue)); } // // Export Base 64 format certificate // public void exportB64Cert(String fileName) { export2File(_targetCert, new File(fileName), false); } // // Export binary format certificate public void exportBINCert(String fileName) { export2File(_targetCert, new File(fileName), true); } }
NsCTestDriver
A test driver program that uses all the functionalities in RMC. Implement:
Copyright 1996-2003 OpenLoop Computing. All rights reserved.