Incorrect encoding of PKCS12 bag attributes
Osipov, Michael (LDA IT PLM)
michael.osipov at siemens.com
Mon Aug 2 06:26:30 UTC 2021
Max,
indeed! I was looking too low-level while analyzing how stuff works.
friendlyName is handled as expected. Thank you for the clarification and
apoligies for the noise.
Regards,
Michael
Am 2021-08-01 um 03:54 schrieb Wei-Jun Wang:
> Hi Michael,
>
> I’m not sure what exact problem you ran into, but looking at the implementation of PKCS12KeyStore at [1] the friendly name is hardcoded to be encoded in BMPString:
>
> bagAttr1.putOID(PKCS9FriendlyName_OID);
> DerOutputStream bagAttrContent1 = new DerOutputStream();
> DerOutputStream bagAttrValue1 = new DerOutputStream();
> bagAttrContent1.putBMPString(alias);
>
> On line 2523 of the same file, it’s also always decoded as BMPString:
>
> if (attrId.equals(PKCS9FriendlyName_OID)) {
> alias = valSet[0].getBMPString();
>
> I did try to create a PKCS12 keystore with `-alias acéü`, and the result is indeed BMPString:
>
> 0000: 1E 08 00 61 00 63 00 E9 00 FC ...a.c....
>
> —Max
>
> [1] https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjdk%2Fblob%2F6765f902505fbdd02f25b599f942437cd805cad1%2Fsrc%2Fjava.base%2Fshare%2Fclasses%2Fsun%2Fsecurity%2Fpkcs12%2FPKCS12KeyStore.java%23L1646&data=04%7C01%7C9d76b566-97f1-4355-9dbf-6dcc0e8868d3%40ad011.siemens.com%7C1747436d78464899aa7d08d9548f4e5b%7C38ae3bcd95794fd4addab42e1495d55a%7C1%7C0%7C637633796747677305%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=JZcwDAqmzCbNmMSAaZiagdUpMNCCZxH59bs4a4avERo%3D&reserved=0
>
>
>
>> On Jul 30, 2021, at 11:26 AM, Osipov, Michael (LDA IT PLM) <michael.osipov at siemens.com> wrote:
>>
>> Am 2021-07-29 um 16:05 schrieb Sean Mullan:
>>> Are you calling the PKCS12Attribute(String, String) constructor from your code? That API currently specifies that String values are encoded as UTF-8, so we could not change the behavior without a specification change. Can you use the PKCS12Attribute(byte[]) constructor instead which takes a DER-encoded value?
>>
>> Hi Sean,
>>
>> I don't use this API. I interact with
>>> KeyStore javaTrustStore = KeyStore.getInstance("PKCS12");
>>> javaTrustStore.load(null, null);
>>
>>> for (Rdn rdn : ldapName.getRdns()) {
>>> if (rdn.getType().equalsIgnoreCase("CN"))
>>> alias = (String) rdn.getValue();
>>> }
>>
>>> javaTrustStore .setCertificateEntry(alias, cert);
>>
>> only. So I am using a high level API. But even if I'd use this API and pass the UCS-2 encoded byte array of that cert
>>> CN=NetLock Arany (Class Gold) Főtanúsítvány,OU=Tanúsítványkiadók (Certification Services),O=NetLock Kft.,L=Budapest,C=HU
>>
>> The ASN.1 tag would still be incorrect for friendlyName (1.2.840.113549.1.9.20) because it would OctetString and not BMPString.
>>
>> It seems to be that the API, or ObjectIdentifier and KnownOIDs classes miss to carry the ASN.1 tag for the actual value. Don't they?
>>
>> Michael
>>
>> PS: This CA
>>> CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.,L=Ankara,C=TR
>> was smart enough to stick with US-ASCII only in the CN, but still single-byte != two-byte UCS-2
>>
>>
>>> On 6/14/21 3:21 PM, Osipov, Michael (LDA IT PLM) wrote:
>>>> Folks,
>>>>
>>>> can someone confirm the following bug or tell me I am too stupid to read
>>>> the RFCs:
>>>>
>>>> I have recently created a PKCS12-based trust store and had one CA from
>>>> Hungary with non-ASCII chars in the subject's CN RDN.
>>>>
>>>> RFC 7292 for friendlyName refers to RFC 2985, section 5.5.1:
>>>>>
>>>>> friendlyName ATTRIBUTE ::= {
>>>>> WITH SYNTAX BMPString (SIZE(1..pkcs-9-ub-friendlyName))
>>>>> EQUALITY MATCHING RULE caseIgnoreMatch
>>>>> SINGLE VALUE TRUE
>>>>> ID pkcs-9-at-friendlyName
>>>>> }
>>>>
>>>> So a BMPString -- which is UCS-2 encoding. Looking at [1] shows that
>>>> Java ignores the RFC and always creates an UTF8String regardless of the
>>>> attribute OID, thus breaking the semantics of friendlyName.
>>>>
>>>> Who's wrong here?
>>>>
>>>> For some strange reason OpenSSL does it in a similar fashion:
>>>> In pkcs12.h.in:
>>>> > # define PKCS12_add_friendlyname PKCS12_add_friendlyname_utf8
>>>> where the function contains:
>>>>> if (X509at_add1_attr_by_NID(&bag->attrib, NID_friendlyName,
>>>>> MBSTRING_UTF8, (unsigned char *)name, namelen) != NULL)
>>>>
>>>>
>>>> [1]
>>>> https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fopenjdk%2Fjdk%2Fblob%2F739769c8fc4b496f08a92225a12d07414537b6c0%2Fsrc%2Fjava.base%2Fshare%2Fclasses%2Fjava%2Fsecurity%2FPKCS12Attribute.java%23L230-L245&data=04%7C01%7C9d76b566-97f1-4355-9dbf-6dcc0e8868d3%40ad011.siemens.com%7C1747436d78464899aa7d08d9548f4e5b%7C38ae3bcd95794fd4addab42e1495d55a%7C1%7C0%7C637633796747677305%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=90U%2BMTFtF5WrEIYQGSK0AR3cc92J%2Bd1QZtHAmfvyii8%3D&reserved=0
>>>>
>>>> Regards,
>>>>
>>>> Michael
>>>>
>>
>
More information about the security-dev
mailing list