当前位置:首页 > 开发教程 > Web前端 >

ASN1.js是一个纯JavaScript库实现一个完整的BER ASN.1解码器

时间:2016-02-17 09:08 来源:互联网 作者:源码搜藏 收藏

抽象语法符号(ASN.1)是一种标准,符号描述来表示,编码,传输,以及电信和计算机网络解码数据的规则和结构。 ASN1js 是一个纯JavaScript库,实施这个标准。 ASN.1是在网络上使用的所有的X.509相关的数据结构和许多其他协议的基

抽象语法符号(ASN.1)是一种标准,符号描述来表示,编码,传输,以及电信和计算机网络解码数据的规则和结构。ASN1js是一个纯JavaScript库,实施这个标准。ASN.1是在网络上使用的所有的X.509相关的数据结构和许多其他协议的基础。

介绍

ASN1js是第一个库BER编码/ Javascript中设计的浏览器使用的解码。BER是基本编码规则的ASN.1,所有的人都是基于,DER是PKI应用程序使用的编码规则-它的一个子集BERASN1js库对测试免费提供ASN.1:2008测试套件,与相 关的JavaScript语言一定的局限性。

图书馆的特点

  • ASN1js是一个“基础层”的全功能的JS库PKIjs,这是使用Web加密API,并拥有所有类,neccessary与PKI相关的数据进行工作;
  • 完全面向对象的库。Inhiritence使用随处可见的lib里面;
  • 与HTML5数据对象(ArrayBuffer,Uint8Array等)工作;
  • 与所有ASN.1工作:2008类型;
  • 同工作的BER编码数据;
  • 图书馆内的所有类型的存储不断所有ASN.1子块(标签块,长度块或数据块)的信息;
  • 用户可以访问任何ASN.1子块内的任何字节;
  • 所有子块可以是无限长的,因为它在ASN.1标准(甚至“标记块”)中所描述;
  • 有能力ASN.1字符串类型的最新工作通过将本地JavaScript字符串转换为constuctors(intcluding像UniversalString,BMPString,UTF8字符串所有的“国际化”的字符串)。反之亦然 - 自动解码之后ASN.1字符串类型的所有初步分析数据转换为本地JavaScript字符串;
  • 同样的,ASN.1日期时间类型:主要类型,如UTCTime和GeneralizedTime之间有自动皈依“JS日期类型 - ASN.1日期时间型”+反之亦然;
  • 同样的,ASN.1对象标识符(OID)数据类型:您可以通过JavaScript的初始化字符串OID,可以通过调用“oid.value_block.toString()”获得字符串表示;
  • 与工作“易于理解”的ASN.1模式(由用户预定义或内置);
  • 有特殊类型的ASN.1模式工作:
    • 任何
    • CHOICE
    • 反复
  • 用户可以命名ASN.1架构内的任何模块,轻松地获得通过名字信息;
  • 能够解析内部数据的primitively编码数据类型里面,并自动验证它针对特殊的模式;
  • 库内所有类型是动态的;
  • 所有类型的可在静态或动态的方式进行初始化。

例子

    //#地区如何创建新的ASN。
     var sequence = new org.pkijs.asn1.SEQUENCE();
    sequence.value_block.value.push(new org.pkijs.asn1.INTEGER({ value: 1 }));

    var sequence_buffer = sequence.toBER(false); // Encode current sequence to BER (in ArrayBuffer)
    var current_size = sequence_buffer.byteLength;

    var integer_data = new ArrayBuffer(8);
    var integer_view = new Uint8Array(integer_data);
    integer_view[0] = 0x01;
    integer_view[1] = 0x01;
    integer_view[2] = 0x01;
    integer_view[3] = 0x01;
    integer_view[4] = 0x01;
    integer_view[5] = 0x01;
    integer_view[6] = 0x01;
    integer_view[7] = 0x01;

    sequence.value_block.value.push(new org.pkijs.asn1.INTEGER({
        is_hex_only: true,
        value_hex: integer_data
    })); // Put too long for decoding INTEGER value

    sequence_buffer = sequence.toBER(false);
    current_size = sequence_buffer.byteLength;
    // #endregion 
    // #region How to create new ASN.1 structures by calling constuctors with parameters 
    var sequence2 = new org.pkijs.asn1.SEQUENCE({
        value: [
            new org.pkijs.asn1.INTEGER({ value: 1 }),
            new org.pkijs.asn1.INTEGER({
                is_hex_only: true,
                value_hex: integer_data
            }),
        ]
    });
    // #endregion 
    // #region How to validate ASN.1 against pre-defined schema 
    var asn1_schema = new org.pkijs.asn1.SEQUENCE({
        name: "block1",
        value: [
            new org.pkijs.asn1.NULL({
                name: "block2"
            }),
            new org.pkijs.asn1.INTEGER({
                name: "block3",
                optional: true // This block is absent inside data, but it's "optional". Hence verification against the schema will be passed.
            })
        ]
    });
    // #endregion

    var variant1 = org.pkijs.verifySchema(encoded_sequence, asn1_schema); // Verify schema together with decoding of raw data
    var variant1_verified = variant1.verified;
    var variant1_result = variant1.result; // Verified decoded data with all block names inside
    // #region How to use "internal schemas" for primitevely encoded data types 
    var primitive_octetstring = new org.pkijs.asn1.OCTETSTRING({ value_hex: encoded_sequence }); // Create a primitively encoded OCTETSTRING where internal data is an encoded SEQUENCE

    var asn1_schema_internal = new org.pkijs.asn1.OCTETSTRING({
        name: "outer_block",
        primitive_schema: new org.pkijs.asn1.SEQUENCE({
            name: "block1",
            value: [
                    new org.pkijs.asn1.NULL({
                        name: "block2"
                    })
            ]
        })
    });

    var variant6 = org.pkijs.compareSchema(primitive_octetstring, primitive_octetstring, asn1_schema_internal);
    var variant6_verified = variant4.verified;
    var variant6_block1_tag_num = variant6.result.block1.id_block.tag_number;
    var variant6_block2_tag_num = variant6.result.block2.id_block.tag_number;
    // #endregion 

更多的例子可以在“示例”目录或内部找到PKIjs库。

下载地址https://github.com/GlobalSign/ASN1.js/archive/master.zip


Web前端阅读排行

最新文章