jdkpkcs12keystore.java

来自「bouncycastle 是一个JAVA安全提供者」· Java 代码 · 共 1,502 行 · 第 1/4 页

JAVA
1,502
字号
            byte[]                  kSalt = new byte[SALT_SIZE];            random.nextBytes(kSalt);            String                  name = (String)ks.nextElement();            PrivateKey              privKey = (PrivateKey)keys.get(name);            PKCS12PBEParams         kParams = new PKCS12PBEParams(kSalt, MIN_ITERATIONS);            byte[]                  kBytes = wrapKey(KEY_ALGORITHM, privKey, kParams, password);            AlgorithmIdentifier     kAlgId = new AlgorithmIdentifier(new DERObjectIdentifier(KEY_ALGORITHM), kParams.getDERObject());            org.bouncycastle.asn1.pkcs.EncryptedPrivateKeyInfo kInfo = new org.bouncycastle.asn1.pkcs.EncryptedPrivateKeyInfo(kAlgId, kBytes);            boolean                 attrSet = false;            ASN1EncodableVector     kName = new ASN1EncodableVector();            if (privKey instanceof PKCS12BagAttributeCarrier)            {                PKCS12BagAttributeCarrier   bagAttrs = (PKCS12BagAttributeCarrier)privKey;                //                // make sure we are using the local alias on store                //                DERBMPString    nm = (DERBMPString)bagAttrs.getBagAttribute(pkcs_9_at_friendlyName);                if (nm == null || !nm.getString().equals(name))                {                    bagAttrs.setBagAttribute(pkcs_9_at_friendlyName, new DERBMPString(name));                }                //                // make sure we have a local key-id                //                if (bagAttrs.getBagAttribute(pkcs_9_at_localKeyId) == null)                {                    Certificate             ct = engineGetCertificate(name);                    bagAttrs.setBagAttribute(pkcs_9_at_localKeyId, createSubjectKeyId(ct.getPublicKey()));                }                Enumeration e = bagAttrs.getBagAttributeKeys();                while (e.hasMoreElements())                {                    DERObjectIdentifier oid = (DERObjectIdentifier)e.nextElement();                    ASN1EncodableVector  kSeq = new ASN1EncodableVector();                    kSeq.add(oid);                    kSeq.add(new DERSet(bagAttrs.getBagAttribute(oid)));                    attrSet = true;                    kName.add(new DERSequence(kSeq));                }            }            if (!attrSet)            {                //                // set a default friendly name (from the key id) and local id                //                ASN1EncodableVector     kSeq = new ASN1EncodableVector();                Certificate             ct = engineGetCertificate(name);                kSeq.add(pkcs_9_at_localKeyId);                kSeq.add(new DERSet(createSubjectKeyId(ct.getPublicKey())));                kName.add(new DERSequence(kSeq));                kSeq = new ASN1EncodableVector();                kSeq.add(pkcs_9_at_friendlyName);                kSeq.add(new DERSet(new DERBMPString(name)));                kName.add(new DERSequence(kSeq));            }            SafeBag                 kBag = new SafeBag(pkcs8ShroudedKeyBag, kInfo.getDERObject(), new DERSet(kName));            keyS.add(kBag);        }        ByteArrayOutputStream   bOut = new ByteArrayOutputStream();        DEROutputStream         dOut = new DEROutputStream(bOut);        dOut.writeObject(new DERSequence(keyS));        BERConstructedOctetString          keyString = new BERConstructedOctetString(bOut.toByteArray());        //        // certficate processing        //        byte[]                  cSalt = new byte[SALT_SIZE];        random.nextBytes(cSalt);        ASN1EncodableVector  certSeq = new ASN1EncodableVector();        PKCS12PBEParams         cParams = new PKCS12PBEParams(cSalt, MIN_ITERATIONS);        AlgorithmIdentifier     cAlgId = new AlgorithmIdentifier(new DERObjectIdentifier(CERT_ALGORITHM), cParams.getDERObject());        Hashtable               doneCerts = new Hashtable();        Enumeration cs = keys.keys();        while (cs.hasMoreElements())        {            try            {                String              name = (String)cs.nextElement();                Certificate         cert = engineGetCertificate(name);                boolean             cAttrSet = false;                CertBag             cBag = new CertBag(                                        x509certType,                                        new DEROctetString(cert.getEncoded()));                ASN1EncodableVector fName = new ASN1EncodableVector();                if (cert instanceof PKCS12BagAttributeCarrier)                {                    PKCS12BagAttributeCarrier   bagAttrs = (PKCS12BagAttributeCarrier)cert;                    //                    // make sure we are using the local alias on store                    //                    DERBMPString    nm = (DERBMPString)bagAttrs.getBagAttribute(pkcs_9_at_friendlyName);                    if (nm == null || !nm.getString().equals(name))                    {                        bagAttrs.setBagAttribute(pkcs_9_at_friendlyName, new DERBMPString(name));                    }                    //                    // make sure we have a local key-id                    //                    if (bagAttrs.getBagAttribute(pkcs_9_at_localKeyId) == null)                    {                        bagAttrs.setBagAttribute(pkcs_9_at_localKeyId, createSubjectKeyId(cert.getPublicKey()));                    }                    Enumeration e = bagAttrs.getBagAttributeKeys();                    while (e.hasMoreElements())                    {                        DERObjectIdentifier oid = (DERObjectIdentifier)e.nextElement();                        ASN1EncodableVector fSeq = new ASN1EncodableVector();                        fSeq.add(oid);                        fSeq.add(new DERSet(bagAttrs.getBagAttribute(oid)));                        fName.add(new DERSequence(fSeq));                        cAttrSet = true;                    }                }                if (!cAttrSet)                {                    ASN1EncodableVector  fSeq = new ASN1EncodableVector();                    fSeq.add(pkcs_9_at_localKeyId);                    fSeq.add(new DERSet(createSubjectKeyId(cert.getPublicKey())));                    fName.add(new DERSequence(fSeq));                    fSeq = new ASN1EncodableVector();                    fSeq.add(pkcs_9_at_friendlyName);                    fSeq.add(new DERSet(new DERBMPString(name)));                    fName.add(new DERSequence(fSeq));                }                SafeBag sBag = new SafeBag(certBag, cBag.getDERObject(), new DERSet(fName));                certSeq.add(sBag);                doneCerts.put(cert, cert);            }            catch (CertificateEncodingException e)            {                throw new IOException("Error encoding certificate: " + e.toString());            }        }        cs = certs.keys();        while (cs.hasMoreElements())        {            try            {                String              certId = (String)cs.nextElement();                Certificate         cert = (Certificate)certs.get(certId);                boolean             cAttrSet = false;                if (keys.get(certId) != null)                {                    continue;                }                CertBag             cBag = new CertBag(                                        x509certType,                                        new DEROctetString(cert.getEncoded()));                ASN1EncodableVector fName = new ASN1EncodableVector();                if (cert instanceof PKCS12BagAttributeCarrier)                {                    PKCS12BagAttributeCarrier   bagAttrs = (PKCS12BagAttributeCarrier)cert;                    //                    // make sure we are using the local alias on store                    //                    DERBMPString    nm = (DERBMPString)bagAttrs.getBagAttribute(pkcs_9_at_friendlyName);                    if (nm == null || !nm.getString().equals(certId))                    {                        bagAttrs.setBagAttribute(pkcs_9_at_friendlyName, new DERBMPString(certId));                    }                    Enumeration e = bagAttrs.getBagAttributeKeys();                    while (e.hasMoreElements())                    {                        DERObjectIdentifier oid = (DERObjectIdentifier)e.nextElement();                        ASN1EncodableVector fSeq = new ASN1EncodableVector();                        fSeq.add(oid);                        fSeq.add(new DERSet(bagAttrs.getBagAttribute(oid)));                        fName.add(new DERSequence(fSeq));                        cAttrSet = true;                    }                }                if (!cAttrSet)                {                    ASN1EncodableVector  fSeq = new ASN1EncodableVector();                    fSeq.add(pkcs_9_at_friendlyName);                    fSeq.add(new DERSet(new DERBMPString(certId)));                    fName.add(new DERSequence(fSeq));                }                SafeBag sBag = new SafeBag(certBag, cBag.getDERObject(), new DERSet(fName));                certSeq.add(sBag);                doneCerts.put(cert, cert);            }            catch (CertificateEncodingException e)            {                throw new IOException("Error encoding certificate: " + e.toString());            }        }        cs = chainCerts.keys();        while (cs.hasMoreElements())        {            try            {                CertId              certId = (CertId)cs.nextElement();                Certificate         cert = (Certificate)chainCerts.get(certId);                if (doneCerts.get(cert) != null)                {                    continue;                }                CertBag             cBag = new CertBag(                                        x509certType,                                        new DEROctetString(cert.getEncoded()));                ASN1EncodableVector fName = new ASN1EncodableVector();                if (cert instanceof PKCS12BagAttributeCarrier)                {                    PKCS12BagAttributeCarrier   bagAttrs = (PKCS12BagAttributeCarrier)cert;                    Enumeration e = bagAttrs.getBagAttributeKeys();                    while (e.hasMoreElements())                    {                        DERObjectIdentifier oid = (DERObjectIdentifier)e.nextElement();                        ASN1EncodableVector fSeq = new ASN1EncodableVector();                        fSeq.add(oid);                        fSeq.add(new DERSet(bagAttrs.getBagAttribute(oid)));                        fName.add(new DERSequence(fSeq));                    }                }                SafeBag sBag = new SafeBag(certBag, cBag.getDERObject(), new DERSet(fName));                certSeq.add(sBag);            }            catch (CertificateEncodingException e)            {                throw new IOException("Error encoding certificate: " + e.toString());            }        }        bOut.reset();        dOut = new DEROutputStream(bOut);        dOut.writeObject(new DERSequence(certSeq));        dOut.close();        byte[]                  certBytes = encryptData(CERT_ALGORITHM, bOut.toByteArray(), cParams, password);        EncryptedData           cInfo = new EncryptedData(data, cAlgId, new BERConstructedOctetString(certBytes));        c[0] = new ContentInfo(data, keyString);        c[1] = new ContentInfo(encryptedData, cInfo.getDERObject());        AuthenticatedSafe   auth = new AuthenticatedSafe(c);        bOut.reset();        BEROutputStream         berOut = new BEROutputStream(bOut);        berOut.writeObject(auth);        byte[]              pkg = bOut.toByteArray();        ContentInfo         mainInfo = new ContentInfo(data, new BERConstructedOctetString(pkg));        //        // create the mac        //        byte[]                      mSalt = new byte[20];        int                         itCount = MIN_ITERATIONS;        random.nextBytes(mSalt);            byte[]  data = ((ASN1OctetString)mainInfo.getContent()).getOctets();        MacData                 mData = null;        try        {            Mac                 mac = Mac.getInstance(id_SHA1.getId(), "BC");            SecretKeyFactory    keyFact = SecretKeyFactory.getInstance(id_SHA1.getId(), "BC");            PBEParameterSpec    defParams = new PBEParameterSpec(mSalt, itCount);            PBEKeySpec          pbeSpec = new PBEKeySpec(password);            mac.init(keyFact.generateSecret(pbeSpec), defParams);            mac.update(data);            byte[]      res = mac.doFinal();            AlgorithmIdentifier     algId = new AlgorithmIdentifier(id_SHA1, new DERNull());            DigestInfo              dInfo = new DigestInfo(algId, res);            mData = new MacData(dInfo, mSalt, itCount);        }        catch (Exception e)        {            throw new IOException("error constructing MAC: " + e.toString());        }                //        // output the Pfx        //        Pfx                 pfx = new Pfx(mainInfo, mData);        berOut = new BEROutputStream(stream);        berOut.writeObject(pfx);    }    public static class BCPKCS12KeyStore        extends JDKPKCS12KeyStore    {        public BCPKCS12KeyStore()        {            super("BC");        }    }    public static class DefPKCS12KeyStore        extends JDKPKCS12KeyStore    {        public DefPKCS12KeyStore()        {            super(null);        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?