2017-12-18 6 views
3

Meine ASN.1-Bibliothek [1] [2] unterstützt in Java und Squeak/Pharo Sequenzen, Sequenz- und Mapped-Sequenzen sowie Set-, Set-Of- und Mapped-Sets. Der fehlende Sammlungstyp, den ich zuordnen möchte, ist das Wörterbuch oder die Karte.Wie kann ASN.1 eine Karte/ein Wörterbuch codieren?

Gibt es eine Standardmethode für die Zuordnung eines Wörterbuchs von Schlüssel/Wert-Paaren zu einer robusten ASN.1-Codierung? Gibt es Links zu diesem allgemeinen Standard und/oder Beispiele für die Zuordnung einer Karte/eines Wörterbuchs von Schlüssel/Wert-Paaren? Vielleicht könnte auf eine unentdeckte SO-Diskussion hingewiesen werden.

Ich glaube, ich möchte eine Schlüssel/Wert-Darstellung des Typs ANY, nicht die Verwendung einer MappedSequence. Das Problem ist eine Selbstbeschreibung, die MappedSequence hat einen vordefinierten Satz von Strukturelementen, daher ist die Reihenfolge wichtig, da die Schlüssel implizit verwendet werden. Ich möchte mehr von einem selbstbeschreibenden ANY-Typ, der ungeordnete Schlüssel/Wert-Paare enthält. Macht das irgendeinen Sinn? ;)

Ich versuche ein generisches Objekt-Mapping zu erstellen, eine Sorte eines ANY-Typs, aber es würde die Schlüssel/Wert-Paare der Instanzvariablen des besagten generischen Objekts benötigen. Ich möchte Sprachreflexion verwenden, basierend auf einem codierten Klassennamen, der einer Sprachklasse entspricht, und dann einen ASN.1 "ANY" -Typ mit der gleichen Struktur erzeugen, und dann diesen Typ, um das codierte Objekt zu dekodieren. Ich habe keinen robusten ANY-Typ implementiert, in beiden Sprachimplementierungen.

Vielen Dank.

[1] - https://github.com/CallistoHouseLtd/ASN1

[2] - http://www.squeaksource.com/Cryptography/Cryptography-HenryHouse.113.mcz

Antwort

2

AFAIK, gibt es eine direkte Äquivalent der Zuordnungsdatenstruktur unter dem eingebauten in ASN.1-Typ.

Können Sie den SET OF Containertyp verwenden, der einen aus zwei Elementen bestehenden SEQUENCE Typ enthält, der die Schlüssel/Wert-Paare repräsentiert? Dadurch werden Sie jedoch nicht automatisch vor Duplikaten geschützt. Sie müssen die Eindeutigkeit der Schlüssel in Ihrem Code sicherstellen. Oder Sie möchten die ASN.1-Einschränkungen betrachten, wenn Sie sie verwenden könnten, um die Eindeutigkeit der Elemente zu beschreiben.

Der Typ ANY wird normalerweise verwendet, um die Typdefinition bis zur Laufzeit zu verschieben. Damit das empfangende Ende woanders hinschauen kann (siehe ANY DEFINED BY) und herausfinden, was in diesem ANY Feld vorkommt. Dann könnte es seinen Inhalt basierend auf dem gerade erhaltenen Wissen über die Struktur des zu verarbeitenden Feldes dekodieren. Dies ist vor allem nützlich, wenn Sie zum Zeitpunkt des Protokollentwurfs nicht alle möglichen Datentypen kennen können (z. B. die Erweiterbarkeitsfunktion).

+0

Ich sehe Ihren Punkt über Duplikate aber das entspricht meiner Ansicht, dass die Encodierung die Einschränkungen nicht angeben muss, kann ich lassen Das System erzwingt dies außerhalb der Strukturdefinitionen. Ich weiß, dass dies zusätzliche Regeln außerhalb der Spezifikation bedeutet, aber hier sind wir nicht in der Lage, ein beliebiges Objekt in ASN.1, Jahrzehnte nach dem Erscheinen von OO, auszudrücken. Ich mag ASN.1 sehr, aber es gibt Schwächen, die dem Encapsulating-Programm mit dieser Codierung überlassen werden. Mein Gefühl. Funktioniert das dann wie funktioniert? Das Kapselungsprogramm spezifiziert zur Laufzeit. Als die Antwort, die ich gepostet habe, wird ANY eine ObjectStructure sein. –

+0

Das Problem hier ist, dass ANY ist Teil der 1988 ASN.1, die im Jahr 1994 zurückgezogen wurde. Wenn Sie eine Version von ASN.1 von 1994 oder später anstelle der veralteten Version 1988 verwendet, würden Sie einen offenen Typ verwenden (die Ersatz für ANY), mit dem Sie explizit eine Tabelle von Objekten definieren können, durch die Sie den offenen Typ einschränken können. –

+0

@PaulThorpe Ist es nicht ASN.1 'INFORMATION OBJECT CLASS', dass 'ANY' rückwärtskompatibel ist? –

2

SNMP verwendet ASN.1-Codierung und Schlüssel-Wert-Paare, so dass ein guter Ausgangspunkt sein könnte. RFC 3416 definiert die Syntax als ein ASN.1-Modul mit dem Namen SNMPv2-PDU.

VarBind ist der Schlüssel-Wert-Paar:

VarBind ::= SEQUENCE { 
     name ObjectName, 

     CHOICE { 
      value   ObjectSyntax, 
      unSpecified NULL, -- in retrieval requests 

            -- exceptions in responses 
      noSuchObject [0] IMPLICIT NULL, 
      noSuchInstance [1] IMPLICIT NULL, 
      endOfMibView [2] IMPLICIT NULL 
     } 
    } 

mit ObjectName als Schlüssel:

ObjectName ::= OBJECT IDENTIFIER 

und ObjectSyntax als Wert:

ObjectSyntax ::= CHOICE { 
     simple   SimpleSyntax, 
     application-wide ApplicationSyntax } 

SimpleSyntax ::= CHOICE { 
     integer-value INTEGER (-2147483648..2147483647), 
     string-value OCTET STRING (SIZE (0..65535)), 
     objectID-value OBJECT IDENTIFIER } 

ApplicationSyntax ::= CHOICE { 
     ipAddress-value  IpAddress, 
     counter-value   Counter32, 
     timeticks-value  TimeTicks, 
     arbitrary-value  Opaque, 
     big-counter-value  Counter64, 
     unsigned-integer-value Unsigned32 } 

eine Sequenz von Schlüssel-Wert-Paare ist VarBindList:

VarBindList ::= SEQUENCE (SIZE (0..max-bindings)) OF VarBind 

Ein Beispiel für VarBindList in einem SNMP-Paket (BER-encoded):

30|36         [SEQUENCE] 
30|10         [SEQUENCE] 
    06|0a|2b 06 01 02 01 02 02 01 04 01 [OID] 1.3.6.1.2.1.2.2.1.4.1 
    02|02|05 dc       [INTEGER] 1500 
30|12         [SEQUENCE] 
    06|0a|2b 06 01 02 01 02 02 01 05 01 [OID] 1.3.6.1.2.1.2.2.1.5.1 
    42|04|05 f5 e1 00      [Gauge32] 100000000 
30|14         [SEQUENCE] 
    06|0a|2b 06 01 02 01 02 02 01 06 01 [OID] 1.3.6.1.2.1.2.2.1.6.1 
    04|06|53 74 72 69 6e 67    [OCTET STRING] "String" 
+0

Ich kannte die Details von SNMP nicht, obwohl ich MIBs in der Vergangenheit verarbeitet habe - danke für die Beleuchtung. Dies führt zu der Idee, dass ich eine ObjectStructure mit einer SEQUENCE of InstanceVariableStructure Schlüssel/Wert {Utf8String, ANY} SEQUENCES definieren könnte. Dann, in Bezug auf die folgende Antwort, verwenden Sie eine ANY in meinem Stamm Nachricht senden Strukturen (2 von 5 von ihnen), um das Argument Objekt Grafik, die codiert ist. Zur Laufzeit verwenden Sie den ObjectStructure-Typ, um alle gefundenen ANYs zu entschlüsseln. ObjectStructure :: = SEQUENCE { –

1

So etwas wie dies vielleicht ... `

DeliverMessage ::= SEQUENCE { 
    receiverID    INTEGER, 
    selector     UTF8STRING, 
    arguments    SEQUENCE-OF ObjectStructure, 
    answerID     INTEGER, 
    redirector    ObjectStructure } 

ObjectStructure ::= SEQUENCE { 
    className    UTF8STRING, 
    instanceVariables  SEQUENCE-OF InstanceVariable } 

InstanceVariable ::= SEQUENCE { 
    instanceVariableName  UTF8STRING, 
    value     ANY } 

`

Verwandte Themen