private Set<KeyStore.Entry.Attribute> getAttributes(Entry entry) { if (entry.attributes == null) { entry.attributes = new HashSet<>(); } // friendlyName entry.attributes.add(new PKCS12Attribute( PKCS9FriendlyName_OID.toString(), entry.alias)); // localKeyID byte[] keyIdValue = entry.keyId; if (keyIdValue != null) { entry.attributes.add(new PKCS12Attribute( PKCS9LocalKeyId_OID.toString(), Debug.toString(keyIdValue))); } // trustedKeyUsage if (entry instanceof CertEntry) { ObjectIdentifier[] trustedKeyUsageValue = ((CertEntry) entry).trustedKeyUsage; if (trustedKeyUsageValue != null) { if (trustedKeyUsageValue.length == 1) { // omit brackets entry.attributes.add(new PKCS12Attribute( TrustedKeyUsage_OID.toString(), trustedKeyUsageValue[0].toString())); } else { // multi-valued entry.attributes.add(new PKCS12Attribute( TrustedKeyUsage_OID.toString(), Arrays.toString(trustedKeyUsageValue))); } } } return entry.attributes; }
private byte[] getBagAttributes(String alias, byte[] keyId, ObjectIdentifier[] trustedUsage, Set<KeyStore.Entry.Attribute> attributes) throws IOException { byte[] localKeyID = null; byte[] friendlyName = null; byte[] trustedKeyUsage = null; // return null if all three attributes are null if ((alias == null) && (keyId == null) && (trustedKeyUsage == null)) { return null; } // SafeBag Attributes DerOutputStream bagAttrs = new DerOutputStream(); // Encode the friendlyname oid. if (alias != null) { DerOutputStream bagAttr1 = new DerOutputStream(); bagAttr1.putOID(PKCS9FriendlyName_OID); DerOutputStream bagAttrContent1 = new DerOutputStream(); DerOutputStream bagAttrValue1 = new DerOutputStream(); bagAttrContent1.putBMPString(alias); bagAttr1.write(DerValue.tag_Set, bagAttrContent1); bagAttrValue1.write(DerValue.tag_Sequence, bagAttr1); friendlyName = bagAttrValue1.toByteArray(); } // Encode the localkeyId oid. if (keyId != null) { DerOutputStream bagAttr2 = new DerOutputStream(); bagAttr2.putOID(PKCS9LocalKeyId_OID); DerOutputStream bagAttrContent2 = new DerOutputStream(); DerOutputStream bagAttrValue2 = new DerOutputStream(); bagAttrContent2.putOctetString(keyId); bagAttr2.write(DerValue.tag_Set, bagAttrContent2); bagAttrValue2.write(DerValue.tag_Sequence, bagAttr2); localKeyID = bagAttrValue2.toByteArray(); } // Encode the trustedKeyUsage oid. if (trustedUsage != null) { DerOutputStream bagAttr3 = new DerOutputStream(); bagAttr3.putOID(TrustedKeyUsage_OID); DerOutputStream bagAttrContent3 = new DerOutputStream(); DerOutputStream bagAttrValue3 = new DerOutputStream(); for (ObjectIdentifier usage : trustedUsage) { bagAttrContent3.putOID(usage); } bagAttr3.write(DerValue.tag_Set, bagAttrContent3); bagAttrValue3.write(DerValue.tag_Sequence, bagAttr3); trustedKeyUsage = bagAttrValue3.toByteArray(); } DerOutputStream attrs = new DerOutputStream(); if (friendlyName != null) { attrs.write(friendlyName); } if (localKeyID != null) { attrs.write(localKeyID); } if (trustedKeyUsage != null) { attrs.write(trustedKeyUsage); } if (attributes != null) { for (KeyStore.Entry.Attribute attribute : attributes) { String attributeName = attribute.getName(); // skip friendlyName, localKeyId and trustedKeyUsage if (CORE_ATTRIBUTES[0].equals(attributeName) || CORE_ATTRIBUTES[1].equals(attributeName) || CORE_ATTRIBUTES[2].equals(attributeName)) { continue; } attrs.write(((PKCS12Attribute) attribute).getEncoded()); } } bagAttrs.write(DerValue.tag_Set, attrs); return bagAttrs.toByteArray(); }