asn.1 - 当导入 ASN 文件中的模块时,我们如何获取这些模块或将其设置为导入?

标签 asn.1

我试图将其与 python 联系起来。在Python中,如果我们使用一些与绘图库matplotlib相关的命令,它会告诉我们导入matplotlib,我们通过使用import语句来完成它>。在 ASN 文件中,我们如何做同样的事情?任何与此相关的资源或指示都会非常有帮助。

最佳答案

IMPORTS 子句用于指示您想要引用另一个模块中定义的某些赋值(类型、值等)。 ITU-T X.680 包含所有详细信息。请注意,ASN.1 标准没有说明如何在文件中组织 ASN.1 模块,或者工具应如何定位引用的模块的定义(即要查找哪个文件)——这留给各个工具来解决决定。

不幸的是,有关模块、导入和导出的规则很复杂。以下是引用 X.680 的摘要。有关完整语法,请参阅 spec .

模块独特性

模块名称必须是唯一的 (13.7),但 X.680 预计它们不是唯一的 (13.10)。 OID 应该唯一地标识一个模块 (13.8)。

导出声明

EXPORTS 语句有 3 种可能性:

  1. 导出符号导出“;”
    • 导出所有列出的符号。
    • 您可以导出您定义的任何符号或导入到当前模块中。导出的名称在(本地)定义和导入的符号中必须是唯一的。
    • 如果列表为空,则不会导出任何内容。
  2. 导出所有“;”
    • 导出所有可以显式导出的符号(即一组唯一名称)
    • 与上述相同;存在是为了向后兼容

进口声明

IMPORTS 语句有 2 种可能性:

  1. 导入符号导入“;”
    • 基本上,您会列出要从中导入的模块,以及要为每个模块导入的符号。
    • 如果 OID 匹配 (13.10),则此处使用的模块名称可能与模块的声明名称不同。当给出 OID 时,它就是确定的(13.11)。当引用的模块具有 OID 时,引用必须使用它 (13.12)。
    • 您导入的符号可以在引用的模块中定义或导入。如果引用的模块导入该符号,则它必须具有唯一的名称(不能同时定义或导入多次)。
    • 如果引用的模块显式导出符号,则只能导入这些符号。
    • 列出的符号是唯一可以作为导入模块的外部引用 (module.id) 进行引用的符号。
    • 如果 SymbolsImported 为空,则此模块中不能使用外部引用 (module.id)。
    • 可以在没有模块限定的情况下使用导入的符号 (13.19)。但是,在引用时,如果存在任何歧义,则导入的符号必须是限定的(符号也在当前模块中定义或多次导入),否则必须是不限定的(13.20)。
  2. 空(无 IMPORTS 语句)
    • 允许外部引用 (module.id)。
    • 提供向后兼容性。

可以按照上面的描述进行引用。如果存在 IMPORTS 语句,则合格的引用必须使用 IMPORTS 语句中给定的模块名称(该名称可以与引用模块中的声明不同,但不建议这样做)。如果没有 IMPORTS 语句,则限定引用必须与引用模块中给出的名称匹配(在这种情况下,OID 显然不相关)。

在最新版本的X.680(2/21)中,使用OID导入模块时,可以添加WITH SUCCESSORS或WITH DESCENDANTS子句。重点是允许使用 OID 来版本模块。基本上,这使得对导入模块的 OID 进行某些更改不需要更新任何导入模块的 IMPORTS 语句中的 OID。

关于asn.1 - 当导入 ASN 文件中的模块时,我们如何获取这些模块或将其设置为导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67894357/

相关文章:

certificate - 证书主题的OID表?

c++ - 是否有一个好的 C++ 库来读取、创建和修改 BER 编码文件?

java - DER 在 Java 中解码 ECDSA 签名

c# - C# SignedCms 的 Java 实现

cryptography - 给定一个 PEM 文档,是否有可能从中知道字节的格式,或者是否需要先验信息?

go - 无法在 golang 中为 asn 解码定义正确的结构

c - ANSI C - 使用动态数组创建的嵌套 BER TLV 元素的释放

java - 实现 ASN.1 描述

c++ - 如何简单地创建一个 ASN.1 DER 编码的 blob

c# - 如何解析X509 ssl证书自定义扩展 "certificate policy"?