ASN1

Kohteesta DigiWiki
Siirry navigaatioon Siirry hakuun

Abstract Syntax Notation One (ASN.1) on määrittelykieli jolla voidaan määritellä tieto-objectin rakenne. ASN.1 ei suoraan määrittele objektin rakennetta vaan sen määrittelee ASN.1 määrityksen pohjalta koodausmenetelmä. Erilaisia koodausmenetelmiä on useita ja eri protokollissa käytetään erilaisia koodauksia.

ASN.1 rakenne

Esimerkki ASN.1 kielestä on esim pala X.509 varmenteen kuvausta RFC5280:stä[1]

   Certificate  ::=  SEQUENCE  {
        tbsCertificate       TBSCertificate,
        signatureAlgorithm   AlgorithmIdentifier,
        signatureValue       BIT STRING  }

   TBSCertificate  ::=  SEQUENCE  {
        version         [0]  EXPLICIT Version DEFAULT v1,
        serialNumber         CertificateSerialNumber,
        signature            AlgorithmIdentifier,
        issuer               Name,
        validity             Validity,
        subject              Name,
        subjectPublicKeyInfo SubjectPublicKeyInfo,
        issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version MUST be v2 or v3
        subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version MUST be v2 or v3
        extensions      [3]  EXPLICIT Extensions OPTIONAL
                             -- If present, version MUST be v3
        }

   Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }

   CertificateSerialNumber  ::=  INTEGER

   AlgorithmIdentifier  ::=  SEQUENCE  {
        algorithm               OBJECT IDENTIFIER,
        parameters              ANY DEFINED BY algorithm OPTIONAL  }

   Validity ::= SEQUENCE {
        notBefore      Time,
        notAfter       Time  }

   Time ::= CHOICE {
        utcTime        UTCTime,
        generalTime    GeneralizedTime }

Tämä kertoo että Certificate objekti koostuu kolmesta osasta, joista ensimmäinen on nimeltään tbsCertificate ja se on kuvattu TBSCertificate määrittelyssä. Toinen osa on nimeltään signatureAlgoritm ja sen määrittely on kuvattu AlgorithmIdentifier määrittelyssä. Viimeisenä tulee itse allekirjoitus signatureValue kentässä ja sen kenttä on muodoltaan BIT STRING.

Seuraavana sitten siirrytään TBSCertificate rakenteen määrittelyyn. Kyseinen rakenne on peräkkäisrakenne jossa on monta kenttää peräkkäin, joista ensimmäinen on version niminen kenttä. Tuolla kenttä on oletuksena arvoltaan v1 ja sen määrittely on kuvattu Version määrittelyssä. Version määrittely puolestaan kertoo että kyseessä on numero jolla voi olla arvot 0, 1, tai 2 ja niistä käytetään nimiä v1, v2 tai v3. Jokaisella kentällä ASN.1:ssä voi olla joko IMPLICIT tai EXPLICIT tag ja tuo [0] EXPLICIT tarkoittaa että jos tuo kenttä on olemassa (eli siis ei käytetä oletus v1 arvoa, niin sen edessä pitää olla erikseen tag arvolla 0.

Seuraavana tulee serialNumber joka on määritelty CertificateSerialNumber määrittelyssä olemaan tyypiltään numero. Tämän jälkeen tulee signature kenttä joka kertoo allekirjoituksen muodon ja sen kentän muoto on määritelty AlgorithmIdentifier määrittelyssä. Huomaa että alun Certificate määrittelyssä määriteltiin myös kenttä nimeltä signatureAlgorithm joka oli tätä samaa muotoa. AlgorithmIdentifier määrittelee että se on sarjarakenne jossa on kaksi kenttää, ensimmäinen on algorithm joka on OBJECT IDENTIFIER tyyppinen ja toisena on parameters kenttä joka voi olla mitä tahansa ja se voi olla myös tyhjä. Tuon toisen kentän määrittely riippuu siitä mikä algorithm kentän arvo oli. Loppu ASN.1 määrittely jatkuu samalla tavalla.

Tuossa Time määrittelyssä oleva CHOICE kertoo että vain yksi noista kentistä siellä sisällä saa olla olemassa ja tässä tapauksessa se mikä siellä on tunnistetaan tyypistä. CHOICE:n kanssa pitää hyvin usein käyttää noita tagejä, koska jos sen sisällä on esim kaksi INTEGER kenttää niin ilman tagejä ei voi tietää kumpi niistä on annettu.

Perus tyypit

ASN.1:ssä on useita perustavaa laatua olevia tyyppejä:

  • INTEGER - mielivaltaisen numero
  • BIT STRING - bittijono, jonka pituus ei välttämättä ole kokonaisia tavuja
  • OCTET STRING - jono 8-bittisiä tavuja
  • NULL - tyhjä objekti
  • OBJECT IDENTIFIER - Objektin numero
  • SEQUENCE OF - Jono kenttiä annetussa järjestyksessä
  • SET OF - joukko kenttiä ilman järjestystä
  • PrintableString - merkkijono joka koostuu merkeistä a-zA-Z0-9 ja erikoismerkeistä välilyönti ' ( ) + , - . / : = ?
  • UTF8String - UTF8 merkkijono
  • UTCTime - Aika ja päivä muodossa YYMMDDHHMMSSZ, eli ilman vuosisataa
  • GeneralizedTime - Aika ja päivä muodossa YYYYMMDDHHMMSSZ.

OBJECT IDENTIFIER

ASN.1 mahdollistaa objectin numeron kuvaamisen hierarkkisena taulukkona kokonaislukuja, tyyliin 1.2.840.113549.1.1.13. Jokainen hierarkian taso kuvaa alitasoa hiearkian sisällä. Esim tuossa esimerkissä ensimmäinen 1 kertoo että tämän objectin päätaso on iso, seuraava 2 kertoo että se on member-body, seuraava 840 kertoo että kyseinen iso:n jäsenvaltio on us ja seuraava numero 113549 kuvaa että se on noin mones USA:n organisaatiolle antama tunnus ja viittaa tässä tapauksessa rsadsi nimiseen yritykseen. Tämä yritys on sitten varannut numeron 1 omasta hiearkiastaan kuvaamaan heidän omia pkcs standardejaan ja seuraava 1 kertoo että kyseessä on heidän ensimmäinen tällainen standardi eli pkcs-1 ja viimeinen numero 13 kertoo että kyseessä on kyseisessä standardissa määritelty alinumero 13, joka tarkoittaa tässä tapauksessa että algoritminä on sha512WithRSAEncryption [2]

Koodaukset

ASN.1 määrittelee siis vain tieto-objektin muodon, ei sitä miten se koodataan lähetystä tai talletusta varten. Tätä varten on olemassa useita erilaisia koodauksia, joilla on erilaisia käyttötarkoituksia. Yleisimpiä on:

  • BER - Basic Encoding Rules
  • DER - Distinguished Encoding Rules
  • CER - Canonical Encoding Rules
  • PER - Packed Encoding Rules
  • XER - Basic XML Encoding Rules
  • JER - JSON Encoding Rules

Näistä hyvin yleisesti käytetään DER muotoa sen takia että siinä jokaisella objectilla on vain yksi määritelty muoto ja näin ollen allekirjoitusten jne laskeminen ei muutu vaikka joku välissä purkaisi objectin johonkin muuhun muotoon ja sen jälkeen pakkaisi sen takaisin DER muotoon.

Käyttö

ASN.1 on hyvin laajassa käytössä, sekä tietoliikenteessä että internetissä. Sitä käyttää mm X509 varmenteet, LDAP, SNMP, jne.

Katso myös

Aiheesta muualla

Lähteet