Dekodér ASN.1 / DER
Asn1\DerDecoder je striktný čítač X.690. Existuje preto, lebo openssl_x509_parse() prevádza neznáme rozšírenia na stratový text, takže všetko, čo potrebuje skutočné bajty rozšírenia — napríklad nonce z Apple WebAuthn — potrebuje skutočný prechod DER:
use RoundlyConsulting\Crypto\Facades\Crypto;
// The Apple WebAuthn nonce extension: SEQUENCE { [1] { OCTET STRING nonce } }
$element = Crypto::derDecoder()->decode($certificate->extension('1.2.840.113635.100.8.2')?->der ?? '');
$nonce = $element->tagged(1)?->children()[0]->octetString();Alebo volajte priamo triedy, ktoré fasáda sprístupňuje:
use RoundlyConsulting\Crypto\Asn1\DerDecoder;
// The Apple WebAuthn nonce extension: SEQUENCE { [1] { OCTET STRING nonce } }
$element = (new DerDecoder)->decode($certificate->extension('1.2.840.113635.100.8.2')?->der ?? '');
$nonce = $element->tagged(1)?->children()[0]->octetString();
$element->children(); // list<DerElement>, in encoding order
$element->oid(); // '1.2.840.113635.100.8.2' — dotted decimal
$element->integer(); // int, or raw bytes when wider than 64 bits
$element->boolean(); // DER's 0x00 / 0xFF only
$element->isNull();
(new DerDecoder)->decodeFirst($bytes); // element + bytesRead, for walking a run of TLVsdecode() prečíta presne jeden prvok a zvyšné bajty považuje za chybu; decodeFirst() vráti DerResult s prvkom a bytesRead na prechádzanie série TLV. Dekodér je singleton v kontajneri a je dostupný aj cez Crypto::derDecoder().
Čítače DerElement
| Člen | Poznámky |
|---|---|
class / tag / constructed / contents | TagClass (Universal, Application, ContextSpecific, Private), číslo tagu (podporuje aj viacbajtovú formu), forma a surové bajty obsahu. |
children() | Podradené prvky zloženého prvku v poradí zakódovania; na primitívnom prvku vyhodí výnimku. |
tagged($tag) | Prvý podradený prvok s daným kontextovým tagom — takto sa nájde voliteľné pole [n]. |
oid() | OBJECT IDENTIFIER v bodkovanom desiatkovom zápise. |
integer() | int, alebo surové bajty v dvojkovom doplnku, ak je hodnota širšia než 64 bitov. |
octetString() | Obsah OCTET STRING doslovne. |
boolean() | Iba 0x00 / 0xFF podľa DER. |
isNull() | Či je prvok NULL — predikát, ktorý hlási, nevyhadzuje. |
Zložené prvky sa parsujú okamžite a každý typovaný čítač odmietne tag, ktorý nepripúšťa (MalformedDerException::unexpectedTag), namiesto hádania.
Striktnosť a limity
- Neurčité dĺžky (to je BER), neminimálne kódovanie dĺžky či tagu a rezervovaná forma dĺžky 0xFF sa odmietnu.
- INTEGERy a subidentifikátory OID s paddingom, voľné BER BOOLEANy a NULL s obsahom sa odmietnu.
- Deklarovaná dĺžka za koncom bufferu sa odmietne — nikdy nedôjde k čítaniu mimo.
- Bajty za prvkom najvyššej úrovne a nesúlad zloženej/primitívnej formy sa odmietnu.
- Práca je ohraničená trojako: 64 KiB vstupu, 16 úrovní vnorenia a 4096 prvkov.
Všetko nepriateľské je MalformedDerException, nikdy PHP warning, a dekodér je otestovaný fuzzingom. Je to parser, nikdy nie úložisko dôvery — čo obsah rozšírenia znamená, rozhodujete vy vo svojom kóde.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.