У меня есть следующие требования. У меня есть тип asn1, который должен быть инкапсулирован в созданную строку октетов (строка октетов, помеченная как 0x24). Затем эта структура подписывается в блоке со знаком CMS, и весь блок CMS должен быть закодирован с помощью DER.
Моя проблема заключается в том, что каждый раз, когда я DER кодирую блок CMS, созданная строка октетов становится (неконструктированной?) Строкой октетов. Я имею в виду его тег переключается с 0x24 (что мне нужно) на 0x04.
Это ошибка Bouncycastle или я делаю то, что не должен? Игнорируя блок CMS, кажется, что всякий раз, когда я пытаюсь закодировать 'BerConstructedOctetString', он больше не является составной строкой октетов:
BERConstructedOctetString constructed = new BERConstructedOctetString(new DERInteger(3));
ASN1Object nonConstructed= new DEROctetString(new DERInteger(3));
System.out.println(Util.toHex(constructed.getDEREncoded()));
System.out.println(Util.toHex(nonConstructed.getDEREncoded()));
System.out.println(Util.toHex(constructed.getEncoded()));
System.out.println(Util.toHex(nonConstructed.getEncoded()));
Со следующим выводом:
04:03:02:01:03
04:03:02:01:03
24:80:04:03:02:01:03:00:00
04:03:02:01:03
Редактировать: это вообще возможно? Есть ли причина, по которой bouncycastle и not-commons-ssl содержат ' Ber ConstructedOctetString', которые кодируют и маркируют как 0x04 при кодировании в DER? Мои два требования несовместимы?