NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Crypto for Laravel

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 TLVs

decode() 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

ČlenPoznámky
class / tag / constructed / contentsTagClass (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 kryptomien

Odoslaní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.