Clause
← All dokumentation

Översatt från det engelska originalet · 1e3a39c8-dirty · 2026-10-26 · Läs på engelska

ASN.1-specifikationer

Clau kompilerar ASN.1-specifikationer (.asn, .asn1 och modullistor i .set.asn) till Erlang-moduler som OTP:s asn1ct gör: Module.erl med encode/2, decode/2 och modulens värden, samt Module.hrl med dess records och makron. Den genererade modulen ingår i kompileringsomgången som vilken annan källkod som helst; dess kodning och avkodning körs i C++-motorn för BER, DER och PER i clause_runtime (ingen OpenSSL behövs). OTP:s specifikationer för public_key kommer att kompileras på samma sätt.

Indata

Positionsargument som slutar med .asn eller .asn1 är specifikationer:

clau --asn1-option der --asn1-outdir gen Kitchen.asn main.erl -o app
clau --generate-asn1 --asn1-outdir gen Kitchen.asn   # only write gen/Kitchen.erl and gen/Kitchen.hrl
AlternativBetydelse
--asn1-option <option>Ett asn1ct-alternativ för alla specifikationer i anropet; kan upprepas. Standard är ber.
--asn1-outdir <dir>Där Module.erl och Module.hrl skrivs (outdir i asn1ct); standard är aktuell katalog. Katalogen läggs till i inkluderingssökvägen, så -include("Module.hrl"). fungerar.
--generate-asn1Skriv bara genererade moduler och headerfiler; kompilera ingenting.
-I <dir>Genomsöks också efter importerade ASN.1-moduler (i i asn1ct), efter specifikationens egen katalog.

Ett projektmål listar specifikationer i [[targets.asn1]]-grupper, som var och en kompileras med egna alternativ:

[[targets]]
name = "app"
sources = ["src/*.erl"]

[[targets.asn1]]
sources = ["asn1/*.asn"]
options = ["per", "noobj"]
outdir = "build/gen"   # default: asn1/ in the target's build directory

sources (obligatoriskt) tar filer och jokerteckenmönster på samma sätt som målets källfiler och matchar .asn och .asn1; ett mönster utan träff är ett fel. Importer söks i katalogerna för gruppens specifikationer. En genererad modul som redan finns bland målets källfiler läggs inte till två gånger. outdir läggs till i målets inkluderingssökväg.

En .set.asn-fil listar en modulfil per rad (asn1ct:s sammanslagna kompilering); varje namn provas som det är, sedan med .asn1, .asn och .py tillagda. Den sammanslagna modulen får set-filens namn.

Alternativ

AlternativEffekt
berBasic Encoding Rules (standard).
derDistinguished Encoding Rules: ber med sorterade SET/SET OF, utelämnade DEFAULT-värden och DER-kontroller.
mapsSEQUENCE/SET-värden är maps; komponenter som saknas utelämnas.
undec_restdecode/2 returnerar {ok, Value, Rest} med byten efter värdet.
no_ok_wrapperencode/2 och decode/2 returnerar själva värdet och utlöser undantag vid fel.
legacy_erlang_typesBIT STRING- och OCTET STRING-värden som listor, {Unused, Binary} och heltal accepteras.
legacy_bit_string, compact_bit_stringÄldre BIT STRING-former (listor av 0 och 1, {Unused, Binary}); medför legacy_erlang_types.
noobj, asn1config, verbose, warnings, errors, deterministicAccepteras, ändrar ingenting.
per, uperPacked Encoding Rules, med och utan justering (PER).
no_final_paddingMed uper: encode/2 returnerar bitarna utan utfyllnad till en oktett (en bitstring).
jerAvvisas: jer (JSON encoding rules) is not supported.

Alla andra alternativ ger unknown ASN.1 option 'Name' (avslutningsstatus 2).

Täckning

De konstruktioner i X.680/X.681/X.682/X.683 som OTP:s PKIX- och PKCS-moduler och emqx:s specifikationer använder:

Stöds inte, och ger var sitt fel på sin position: EXTERNAL, EMBEDDED PDV och CHARACTER STRING (unsupported ASN.1 type), parametriserade värden, objekt extraherade från objektmängder, MACRO-definitioner och värdenotationer som OTP:s specifikationer inte använder (unsupported value notation).

Genererade moduler

Module.erl exporterar samma som asn1ct:s: encoding_rule/0, maps/0, bit_string_format/0, legacy_erlang_types/0, encode/2, decode/2, info/0 och en funktion per värdetilldelning. Records och deras namn följer asn1ct (inre typer namngivna efter sin sökväg, SEQOF/SETOF för samlingselement, parametriserade instanser), så Module.hrl är identisk med asn1ct:s förutom den första kommentarraden; värden skrivs ut som asn1ct skriver dem.

encode/2 och decode/2 returnerar {ok, Value} eller {error, {asn1, Reason}} med asn1ct:s felorsaker ({bad_range, ...}, {unexpected, ...}, {invalid_choice_type, ...}, {'Type not compatible with table constraint', ...}, TLV-felen från asn1rt_nif); avkodningen behåller asn1ct:s tolerans och egenheter (okända utökningskomponenter hoppas över, {asn1_OPENTYPE, Bytes} och {asn1_ExtAlt, Bytes} för okända öppna typer och CHOICE-värden, {asn1_enum, N}).

De genererade funktionerna anropar clause_asn1:encode/3 och clause_asn1:decode/3 med en schematerm: {asn1_schema, 1, Rule, Flags, #{Type => Node}, Nodes}. Varje nod är {Kind, Tags, Fields...} (typer i samma ordning som kompilatorns NodeKind, taggar som Number bsl 2 bor Class; gränser {Lower, Upper, Extensible} med rotvärdena för en utökningsbar lista av enstaka värden som fjärde element, begränsade strängar med sitt PER-alfabet, komponenter med sin flagga för tilläggsgrupp); formatet är internt för Clause och kan ändras.

PER

per (med justering) och uper (utan justering) följer koden som asn1ct genererar och asn1rtt_per/asn1rtt_uper/asn1rtt_per_common, byte för byte (X.691 som OTP implementerar den):

Diagnostik

Fel innehåller specifikationens sökväg, rad och kolumn och stoppar anropet (avslutningsstatus 1) före Erlang-kompileringen:

syntax.asn:4:1: error: expected '::=' near 'END'
undefined.asn:3:22: error: undefined reference Missing
import.asn:4:9: error: cannot find ASN.1 module Absent
empty.asn:1:1: error: no ASN.1 module found

Skillnader mot asn1ct listas i differences.md.