jdkpkcs12keystore.java

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

JAVA
1,502
字号
                for (int i = 0; i != res.length; i++)                {                    if (res[i] != dig[i])                    {                        if (password.length != 0)  // may be dodgey zero password                        {                            throw new IOException("PKCS12 key store mac invalid - wrong password or corrupted file.");                        }                        else                        {                            okay = false;                            break;                        }                    }                }                                //                // may be incorrect zero length password                //                if (!okay)                {                    SecretKey k = keyFact.generateSecret(pbeSpec);                                        ((JCEPBEKey)k).setTryWrongPKCS12Zero(true);                                        mac.init(k, defParams);                        mac.update(data);                        res = mac.doFinal();                    dig = dInfo.getDigest();                                        for (int i = 0; i != res.length; i++)                    {                        if (res[i] != dig[i])                        {                           throw new IOException("PKCS12 key store mac invalid - wrong password or corrupted file.");                        }                    }                                        wrongPKCS12Zero = true;                }            }            catch (IOException e)            {                throw e;            }            catch (Exception e)            {                throw new IOException("error constructing MAC: " + e.toString());            }        }        keys = new Hashtable();        localIds = new Hashtable();        if (info.getContentType().equals(data))        {            bIn = new ASN1InputStream(new ByteArrayInputStream(((ASN1OctetString)info.getContent()).getOctets()));            AuthenticatedSafe   authSafe = new AuthenticatedSafe((ASN1Sequence)bIn.readObject());            ContentInfo[]       c = authSafe.getContentInfo();            for (int i = 0; i != c.length; i++)            {                if (c[i].getContentType().equals(data))                {                    ASN1InputStream dIn = new ASN1InputStream(new ByteArrayInputStream(((ASN1OctetString)c[i].getContent()).getOctets()));                    ASN1Sequence    seq = (ASN1Sequence)dIn.readObject();                    for (int j = 0; j != seq.size(); j++)                    {                        SafeBag b = new SafeBag((ASN1Sequence)seq.getObjectAt(j));                        if (b.getBagId().equals(pkcs8ShroudedKeyBag))                        {                            org.bouncycastle.asn1.pkcs.EncryptedPrivateKeyInfo eIn = new org.bouncycastle.asn1.pkcs.EncryptedPrivateKeyInfo((ASN1Sequence)b.getBagValue());                            PrivateKey              privKey = unwrapKey(eIn.getEncryptionAlgorithm(), eIn.getEncryptedData(), password, wrongPKCS12Zero);                            //                            // set the attributes on the key                            //                            PKCS12BagAttributeCarrier   bagAttr = (PKCS12BagAttributeCarrier)privKey;                            String                                   alias = null;                            ASN1OctetString                   localId = null;                            if (b.getBagAttributes() != null)                            {                                Enumeration e = b.getBagAttributes().getObjects();                                while (e.hasMoreElements())                                {                                    ASN1Sequence  sq = (ASN1Sequence)e.nextElement();                                    DERObjectIdentifier     aOid = (DERObjectIdentifier)sq.getObjectAt(0);                                    ASN1Set                 attrSet = (ASN1Set)sq.getObjectAt(1);                                    DERObject               attr = null;                                        if (attrSet.size() > 0)                                    {                                        attr = (DERObject)attrSet.getObjectAt(0);                                            bagAttr.setBagAttribute(aOid, attr);                                    }                                        if (aOid.equals(pkcs_9_at_friendlyName))                                    {                                        alias = ((DERBMPString)attr).getString();                                        keys.put(alias, privKey);                                    }                                    else if (aOid.equals(pkcs_9_at_localKeyId))                                    {                                        localId = (ASN1OctetString)attr;                                    }                                }                            }                                                    if (localId != null)                            {                                String name = new String(Hex.encode(localId.getOctets()));                                    if (alias == null)                                {                                    keys.put(name, privKey);                                }                                else                                {                                    localIds.put(alias, name);                                }                             }                             else                             {                                 unmarkedKey = true;                                 keys.put("unmarked", privKey);                             }                        }                        else if (b.getBagId().equals(certBag))                        {                            chain.addElement(b);                        }                        else                        {                            System.out.println("extra in data " + b.getBagId());                            System.out.println(ASN1Dump.dumpAsString(b));                        }                    }                }                else if (c[i].getContentType().equals(encryptedData))                {                    EncryptedData d = new EncryptedData((ASN1Sequence)c[i].getContent());                    ASN1Sequence seq = decryptData(d.getEncryptionAlgorithm(), d.getContent().getOctets(), password, wrongPKCS12Zero);                    for (int j = 0; j != seq.size(); j++)                    {                        SafeBag b = new SafeBag((ASN1Sequence)seq.getObjectAt(j));                                                if (b.getBagId().equals(certBag))                        {                            chain.addElement(b);                        }                        else if (b.getBagId().equals(pkcs8ShroudedKeyBag))                        {                            org.bouncycastle.asn1.pkcs.EncryptedPrivateKeyInfo eIn = new org.bouncycastle.asn1.pkcs.EncryptedPrivateKeyInfo((ASN1Sequence)b.getBagValue());                            PrivateKey              privKey = unwrapKey(eIn.getEncryptionAlgorithm(), eIn.getEncryptedData(), password, wrongPKCS12Zero);                            //                            // set the attributes on the key                            //                            PKCS12BagAttributeCarrier   bagAttr = (PKCS12BagAttributeCarrier)privKey;                            String                      alias = null;                            ASN1OctetString              localId = null;                            Enumeration e = b.getBagAttributes().getObjects();                            while (e.hasMoreElements())                            {                                ASN1Sequence  sq = (ASN1Sequence)e.nextElement();                                DERObjectIdentifier     aOid = (DERObjectIdentifier)sq.getObjectAt(0);                                ASN1Set                 attrSet= (ASN1Set)sq.getObjectAt(1);                                DERObject               attr = null;                                if (attrSet.size() > 0)                                {                                    attr = (DERObject)attrSet.getObjectAt(0);                                    bagAttr.setBagAttribute(aOid, attr);                                }                                if (aOid.equals(pkcs_9_at_friendlyName))                                {                                    alias = ((DERBMPString)attr).getString();                                    keys.put(alias, privKey);                                }                                else if (aOid.equals(pkcs_9_at_localKeyId))                                {                                    localId = (ASN1OctetString)attr;                                }                            }                            String name = new String(Hex.encode(localId.getOctets()));                            if (alias == null)                            {                                keys.put(name, privKey);                            }                            else                            {                                localIds.put(alias, name);                            }                        }                        else if (b.getBagId().equals(keyBag))                        {                            org.bouncycastle.asn1.pkcs.PrivateKeyInfo pIn = new org.bouncycastle.asn1.pkcs.PrivateKeyInfo((ASN1Sequence)b.getBagValue());                            PrivateKey              privKey = JDKKeyFactory.createPrivateKeyFromPrivateKeyInfo(pIn);                            //                            // set the attributes on the key                            //                            PKCS12BagAttributeCarrier   bagAttr = (PKCS12BagAttributeCarrier)privKey;                            String                      alias = null;                            ASN1OctetString             localId = null;                            Enumeration e = b.getBagAttributes().getObjects();                            while (e.hasMoreElements())                            {                                ASN1Sequence  sq = (ASN1Sequence)e.nextElement();                                DERObjectIdentifier     aOid = (DERObjectIdentifier)sq.getObjectAt(0);                                ASN1Set                 attrSet = (ASN1Set)sq.getObjectAt(1);                                DERObject   attr = null;                                if (attrSet.size() > 0)                                {                                    attr = (DERObject)attrSet.getObjectAt(0);                                    bagAttr.setBagAttribute(aOid, attr);                                }                                if (aOid.equals(pkcs_9_at_friendlyName))                                {                                    alias = ((DERBMPString)attr).getString();                                    keys.put(alias, privKey);                                }                                else if (aOid.equals(pkcs_9_at_localKeyId))                                {                                    localId = (ASN1OctetString)attr;                                }                            }                            String name = new String(Hex.encode(localId.getOctets()));                            if (alias == null)                            {                                keys.put(name, privKey);                            }                            else                            {                                localIds.put(alias, name);                            }                        }                        else                        {                            System.out.println("extra in encryptedData " + b.getBagId());                            System.out.println(ASN1Dump.dumpAsString(b));                        }                    }                }                else                {                    System.out.println("extra " + c[i].getContentType().getId());                    System.out.println("extra " + ASN1Dump.dumpAsString(c[i].getContent()));                }            }        }        certs = new Hashtable();        chainCerts = new Hashtable();        keyCerts = new Hashtable();        for (int i = 0; i != chain.size(); i++)        {            SafeBag     b = (SafeBag)chain.elementAt(i);            CertBag     cb = new CertBag((ASN1Sequence)b.getBagValue());            Certificate cert = null;            try            {                ByteArrayInputStream  cIn = new ByteArrayInputStream(                                ((ASN1OctetString)cb.getCertValue()).getOctets());                cert = certFact.generateCertificate(cIn);            }            catch (Exception e)            {                throw new RuntimeException(e.toString());            }            //            // set the attributes            //            ASN1OctetString              localId = null;            String                      alias = null;            if (b.getBagAttributes() != null)            {                Enumeration e = b.getBagAttributes().getObjects();                while (e.hasMoreElements())                {                    ASN1Sequence  sq = (ASN1Sequence)e.nextElement();                    DERObjectIdentifier     oid = (DERObjectIdentifier)sq.getObjectAt(0);                    DERObject               attr = (DERObject)((ASN1Set)sq.getObjectAt(1)).getObjectAt(0);                    if (cert instanceof PKCS12BagAttributeCarrier)                    {                        PKCS12BagAttributeCarrier   bagAttr = (PKCS12BagAttributeCarrier)cert;                        bagAttr.setBagAttribute(oid, attr);                    }                    if (oid.equals(pkcs_9_at_friendlyName))                    {                        alias = ((DERBMPString)attr).getString();                    }                    else if (oid.equals(pkcs_9_at_localKeyId))                    {                        localId = (ASN1OctetString)attr;                    }                }            }            chainCerts.put(new CertId(cert.getPublicKey()), cert);            if (unmarkedKey)            {                if (keyCerts.isEmpty())                {                    String    name = new String(Hex.encode(createSubjectKeyId(cert.getPublicKey()).getKeyIdentifier()));                                        keyCerts.put(name, cert);                    keys.put(name, keys.remove("unmarked"));                }            }            else            {                //                // the local key id needs to override the friendly name                //                if (localId != null)                {                    String name = new String(Hex.encode(localId.getOctets()));                    keyCerts.put(name, cert);                }                if (alias != null)                {                    certs.put(alias, cert);                }            }        }    }    public void engineStore(OutputStream stream, char[] password)         throws IOException    {        if (password == null)        {            throw new NullPointerException("No password supplied for PKCS#12 KeyStore.");        }        ContentInfo[]   c = new ContentInfo[2];        //        // handle the key        //        ASN1EncodableVector  keyS = new ASN1EncodableVector();        Enumeration ks = keys.keys();        while (ks.hasMoreElements())        {

⌨️ 快捷键说明

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