---
title: "Dekodér ASN.1 / DER — Crypto for Laravel | Roundly"
description: "Striktný, ohraničený čítač X.690 DER pre surové bajty rozšírení certifikátov, ktoré vám openssl_x509_parse() nedá."
url: https://roundly-consulting.com/sk/open-source/navody/crypto-for-laravel/dekoder-asn1-der
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Crypto for Laravel](https://roundly-consulting.com/sk/open-source/navody/crypto-for-laravel.md)

# 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:

```php
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:

```php
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

| Č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 kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/crypto-for-laravel.md)
