Каковы эти байты в OID, возвращенном X509Certificte.getExtensionValue ("2.5.29.32")? - PullRequest
0 голосов
/ 05 апреля 2019

Я извлекаю байты OID политики сертификатов 2.5.29.32 из сертификата X509.(Без использования BouncyCastle)

bytes = _cert.getExtensionValue ("2.5.29.32");

Полученные необработанные байты 4, 15, 48, 13, 48, 11, 6,9, 96, -122, 72, 1, 101, 2, 1, 11, 42

После декодирования DER (тип = 4, размер = 15), у меня есть: 48, 13, 48, 11,6, 9, 96, -122, 72, 1, 101, 2, 1, 11, 42

За мной следуют: 96, -122, 72, 1, 101, 2, 1,11, 42 (2.16.840.1.101.2.1.11.42)

Какие байты: 48, 13, 48, 11, 6, 9?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

На случай, если кто-нибудь заинтересуется кодом, который я написал для этого ...

private static byte CONSTRUCTED_SEQUENCE_TAG = 48;
private static byte OID_CODE = 6;

private static String extractPolicyOid(X509Certificate pCert) throws IOException {

    byte[] _bytes = pCert.getExtensionValue("2.5.29.32");
    if (_bytes == null) {
        return null;
    }

    DerValue _der = new DerValue(new ByteArrayInputStream(_bytes));
    _bytes = _der.getOctetString();

    /*
     * Skip header goo
     */
    int _idx = 0;
    while (_idx < _bytes.length) {
        if (_bytes[_idx] == CONSTRUCTED_SEQUENCE_TAG) {
            _idx += 2;
        } else if (_bytes[_idx] == OID_CODE) {
            _idx += 2;
        } else {
            break;
        }
    }

    /*
     * Create string version of OID
     */
    StringBuffer _sb = new StringBuffer();
    byte _byte = _bytes[_idx++];
    _sb.append(_byte / 40);
    _sb.append(".");
    _sb.append(_byte % 40);

    int _accum = 0;
    for (; _idx < _bytes.length; _idx++) {

        _byte = _bytes[_idx];

        if (_byte << ~7 < 0) {
            _accum = (_byte & 0x7f) << 7;
        } else {
            _accum += _byte;

            _sb.append(".");
            _sb.append(_accum);

            _accum = 0;
        }
    }

    return _sb.toString();

}
0 голосов
/ 05 апреля 2019

48 (он же 0x30) - это тег для ПОСТРОЕННОЙ ПОСЛЕДОВАТЕЛЬНОСТИ (все значения ПОСЛЕДОВАТЕЛЬНОСТИ СОСТАВЛЯЮТСЯ, но все же).

13 - это значение длины, как и 11 из двух байтов позже.

6 (он же 0x06) - это тег для ИДЕНТИФИКАТОРА ОБЪЕКТА (он же OID), а его длина равна 9.

То есть 30 0D 30 0B 06 09 ... равно SEQUENCE(SEQUENCE(OID(... [ 9 bytes ]))).

  • ITU-T X.680 -201508, язык ASN.1.
  • ITU-T X.690 -201508, BER(и CER) и кодировки DER для данных ASN.1.
...