asn.1 berデコーダーへの入力の非宣言されていないタグ

StackOverflow https://stackoverflow.com/questions/2344217

  •  23-09-2019
  •  | 
  •  

質問

いくつかのフィールドを追加して変更したいASN.1構文の仕様があります。新しいフィールドを使用してBERを使用してエンコードされた文字列を作成し、これらの追加フィールドを知らないデコーダーを使用してその文字列をデコードしようとする場合、結果はどうなりますか?デコーダーが認識していないフィールドがあるため、デコードは失敗しますか?デコーダーは、認識できるフィールドのみをデコードし、そうでないフィールドを完全に無視しますか?これは完全にデコーダーと実装の問題であるため、デコーダーの実装方法に応じて、いずれかの結果が可能ですか?

現在、私はオープンソースASN.1コンパイラ/デコーダーを使用していますが、完全に失敗しているようですが、これが実装のためか、ASN.1のルールがその種の結果を決定するかどうかはわかりません。

正しい解決策はありません

他のヒント

確かに実装に依存しません。つまり、異なる実装が異なる方法でそれを処理している場合、そのうちの1つはそれを誤って行っています。不明なフィールドを予想しないデコーダーを使用して不明なフィールドをデコードする場合、デコードは失敗するはずです。不明なフィールドをスキップしません。

ただし、追加のフィールドが既知の前であっても、追加のフィールドを提供する方法があります。拡張マーカー( "...")を使用することです。 ASN.1仕様のさまざまなバージョンを開発するとします。それらをV1、V2、V3などと呼びましょう。V1は元の仕様ですが、V1を設計したとき、ある時点で変更する必要がある可能性が高いことを理解しています。これを許可するために、ようなものではなく

Z ::= SEQUENCE { a INTEGER,
                 b OCTET STRING,
                 c Message1
}

Zをこのように拡張可能であると宣言します

Z ::= SEQUENCE { a INTEGER,
                 b OCTET STRING,
                 c Message1,
                 ...
}

拡張マーカーは、Cに続いて、まだ未知のフィールドが増える可能性があると述べています。デコーダーは、そのようなフィールドを含むメッセージがColdに従う限り、有効である限り扱う必要があります。デコーダーは、それらがどうあるべきかわからないため、それらをデコードすることはできませんが、それらが許容されることを知っています。

このような2つの新しいフィールドを挿入することにより、V1をV2に更新するとしましょう。

Z ::= SEQUENCE { a INTEGER,            -- V1
                 b OCTET STRING,       -- V1
                 c Message1,           -- V1
                 ...,
             [[  d PrintableString,    -- V2
                 e BOOLEAN          ]] -- V2
}

この場合、V1バージョンはV2バージョンと相互操作できます。 V1エンコーダーにはDまたはEが含まれませんが、V2エンコーダーにはそれらが含まれます。デコーダーの視点から、V1デコーダーはDとEを受け入れます(ただし、デコードしません)。V2デコーダーが見つかった場合はDとEをデコードします。したがって、V1デコーダーは、V1とV2の両方のエンコーディングを受け入れ、DとEが見つかったときはいつでも無視します。 V2デコーダーは、V1とV2の両方のエンコーディングも受け入れ、V1エンコーディングにはDまたはEが含まれないが、有効なままであることに注意してください。

たとえば、追加のバージョンを通じてこれを続けることができます。

Z ::= SEQUENCE { a INTEGER,            -- V1
                 b OCTET STRING,       -- V1
                 c Message1,           -- V1
                 ...,
             [[  d PrintableString,    -- V2
                 e BOOLEAN         ]], -- V2
             [[  f PrintableString,    -- V3
                 g ExtensionMessage]]  -- V3
}

ここで、V1、V2、およびV3はすべて相互運用できます。

ただし、シーケンスを扱っているため、順序を保持する必要があることに注意してください。 DなしでEを持つことも、D、E、FなしでもGを持つことはできませんでした。

したがって、タイプ定義に拡張マーカーが含まれている場合、新しいフィールドを追加できますが、そうでない場合はそうでない場合があります。

これはすべて、仕様と実装に依存します。要するに、伝える方法はありません。そして、それは実装次第です。 ASN.1を使用している特定のプロトコル/形式の一部の仕様は、未知の要素を無視する必要があることを明示的に述べています。その場合、デコードは失敗しないでください。

より一般的なことは、デコーダーがASN.1構文に厳密に適合しない入力を拒否します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top