Тип BIT STRING в ASN.1 представляет последовательность произвольного количества битов, не обязательно кратную байту. В отличие от OCTET STRING, который оперирует байтами, BIT STRING позволяет работать с битовой точностью, что критично для криптографических структур: ключевых параметров, масок прав, флагов и некоторых полей сертификатов X.509.
В DER-формате (Distinguished Encoding Rules) BIT STRING кодируется с обязательным указанием количества неиспользуемых битов в последнем октете. Это делает представление строгим и однозначным при декодировании.
Структура DER-энкодированного BIT STRING:
Tag: 0x03
Length: длина содержимого
Content:
Ключевой элемент — unused bits. Например, если передано 13 бит, последний байт будет содержать только 5 значимых бит, а 3 бита будут помечены как неиспользуемые.
KJUR.asn1.DERBitString — компонент библиотеки Jsrsasign,
предназначенный для создания ASN.1 структуры BIT STRING в
DER-формате.
Он используется внутри более высокоуровневых объектов (сертификаты, ключи, CMS), а также может применяться напрямую при построении ASN.1 деревьев.
Создание объекта выполняется через передачу параметров в виде объекта:
new KJUR.asn1.DERBitString(params)
Основные параметры:
Строка, содержащая битовое представление:
{
bin: "10101100"
}
Каждый символ интерпретируется как бит (0 или
1). Длина не обязана быть кратной 8.
Шестнадцатеричное представление:
{
hex: "ACF3"
}
Каждая пара символов соответствует одному байту.
Массив байтов:
{
array: [0xAC, 0xF3]
}
Используется, когда данные уже подготовлены в бинарной форме.
Количество неиспользуемых битов в последнем байте:
{
hex: "AF",
unused: 3
}
Если параметр не указан, библиотека вычисляет его автоматически на основе длины входных данных.
При вызове encode происходит формирование DER-структуры:
Вычисляется байтовое представление входных данных
Определяется количество лишних битов в последнем октете
Формируется payload:
Добавляется ASN.1 заголовок 0x03
var bs = new KJUR.asn1.DERBitString({
bin: "11010101"
});
Здесь:
0xD5var bs = new KJUR.asn1.DERBitString({
bin: "10101"
});
Разбор:
10101000Итоговая DER-структура:
Tag: 0x03
Length: 2
Content:
0x03 (unused bits)0xA8 (данные)var bs = new KJUR.asn1.DERBitString({
hex: "FF80"
});
Особенности:
var bs = new KJUR.asn1.DERBitString({
array: [0xDE, 0xAD, 0xBE, 0xEF]
});
Этот вариант удобен при работе с бинарными буферами, например при интеграции с WebCrypto или Node.js Buffer.
Если вход задан без явного параметра unused,
библиотека:
Пример:
| Длина бит | Последний байт | unused |
|---|---|---|
| 8 | полный | 0 |
| 9 | 1 бит в новом | 7 |
| 13 | частичный байт | 3 |
DERBitString часто используется как листовой
элемент:
var asn1 = new KJUR.asn1.DERSequence({
array: [
new KJUR.asn1.DERInteger({int: 3}),
new KJUR.asn1.DERBitString({bin: "1010"})
]
});
Так формируются структуры сертификатов, например расширения X.509.
Класс не поддерживает BER- или CER-варианты. Все данные кодируются строго.
Любой формат (bin, hex, array)
приводится к байтовому массиву перед кодированием.
Допустимы только 0 и 1 в бинарной строке.
Любые другие символы приводят к ошибке преобразования.
bin: "10201"
Недопустимо из-за символа 2.
Если явно задать unused, не соответствующий данным,
декодеры могут интерпретировать структуру неверно:
hex: "FF",
unused: 4
BIT STRING требует строгого понимания, что последний байт может быть неполным. Игнорирование этого приводит к ошибкам в криптографических структурах.
DERBitString применяется в:
Особенно часто используется для:
После вызова getEncodedHex() (через базовый ASN.1 API)
результат всегда включает:
0x03Это гарантирует совместимость с OpenSSL и другими ASN.1 реализациями.
DERBitString тесно связан с:
KJUR.asn1.DERSequenceKJUR.asn1.DERIntegerKJUR.asn1.DEROctetStringЧасто выступает как часть сложной структуры, где требуется компактное представление флагов.
Разные системы могут по-разному трактовать unused bits:
Поэтому в критичных системах часто задают unused: 0
явно, даже если это не обязательно.