3

Apache Harmony ASN.1/BER クラスを使用して LDAP バインド要求を解析しようとしています (別のライブラリを使用できますが、Apache ライセンスがあるため、それを選択しました)。

私の質問は、特に ASN.1 の「CHOICE」のエンコーディングに関するものです。LDAP ASN.1 スキーマ ( http://www.rfc-editor.org/rfc/rfc2251.txt ) を定義する RFC は、バインド要求の一部として次を提供します。

   BindRequest ::= [APPLICATION 0] SEQUENCE {
            version                 INTEGER (1 .. 127),
            name                    LDAPDN,
            authentication          AuthenticationChoice }

    AuthenticationChoice ::= CHOICE {
            simple                  [0] OCTET STRING,
                                     -- 1 and 2 reserved
            sasl                    [3] SaslCredentials }

    SaslCredentials ::= SEQUENCE {
            mechanism               LDAPString,
            credentials             OCTET STRING OPTIONAL }

そのCHOICEは実際にどのようにエンコードされていますか?

JXplorer を使用してサンプルのバインド要求を生成し、送信された生データをキャプチャしました。次のようになります。

00000000  30 31 02 01 01 60 2c 02  01 03 04 1b 75 69 64 3d  |01...`,.....uid=|
00000010  74 65 73 74 75 73 65 72  2c 64 63 3d 74 65 73 74  |testuser,dc=test|
00000020  2c 64 63 3d 63 6f 6d 80  0a 74 65 73 74 69 6e 67  |,dc=com..testing|
00000030  31 32 33                                          |123|

そこにある 80 (オフセット 0x27) は、その選択を表しているようです。十分に公平です-そして、(http://en.wikipedia.org/wiki/Basic_Encoding_Rules#BER_encodingごとに)「コンテキスト固有」であることを示すために最後のビットが設定されていることがわかります(つまり、このアプリケーション/プロトコルによって定義されます)しかしこれが「単純な」認証か「sasl」認証かはどうすればわかりますか? どのオプションが使用されているかを示すものは何ですか? この場合、次のバイト (0x0a) が文字列の長さのように見えます。つまり、これは OctetString か、そのようなものである可能性があります。 .

上記の CHOICE セクションの [0] と [3] が何を意味するかもわかりません。オプションは 4 つあるのに、番号 0 と 3 のオプションだけが使用されているということですか?

4

2 に答える 2

4

以下に、openssl asn1parse コマンドの出力を示します。メンバーは、CHOICEいわゆるコンテキスト固有のタグを使用してエンコードされます。つまり、通常のタグ値は、CHOICE. タグの値は 0 で、CHOICE の最初の項目が選択されていることを意味します。最初の選択項目のタイプはOCTET STRINGです。コンテキスト固有のタグの値 0 は、値のタイプに関する情報を提供します。コンテキスト タグがない場合は、通常のOCTET STRINGタグが使用されます。

 0:d=0  hl=2 l=  49 cons: SEQUENCE          
 2:d=1  hl=2 l=   1 prim:  INTEGER           :01
 5:d=1  hl=2 l=  44 cons:  appl [ 0 ]        
 7:d=2  hl=2 l=   1 prim:   INTEGER           :03
10:d=2  hl=2 l=  27 prim:   OCTET STRING      :uid=testuser,dc=test,dc=com
39:d=2  hl=2 l=  10 prim:   cont [ 0 ]        
于 2013-08-09T21:26:33.897 に答える