ricco381/phpasn1

一个PHP框架,允许您使用ITU-T X.690编码规则对任意的ASN.1结构进行编码和解码。

0.2 2019-04-19 17:44 UTC

This package is auto-updated.

Last update: 2024-09-21 21:21:59 UTC


README

Build Status PHP 7 ready Coverage Status

Latest Stable Version Total Downloads Latest Unstable Version License

一个PHP框架,允许您使用ASN.1结构编码规则进行编码和解码。这种编码在X.509 PKI环境或异构计算机系统之间的通信中被频繁使用。

API允许您将ASN.1结构编码为创建二进制数据,例如证书签名请求(CSR)、X.509证书或证书吊销列表(CRL)。PHPASN1还可以读取BER编码的二进制数据到独立的PHP对象中,用户可以对这些对象进行操作,并在之后重新编码。

现在可以在CHANGELOG.md中找到变更日志。

依赖关系

PHPASN1需要至少PHP 7.0gmpbcmath扩展。从v2.0开始不再支持旧版本的PHP(即PHP 5.6)。如果您必须使用过时的PHP版本,请考虑使用PHPASN v1.5

为了从网络中直接加载对象标识符名称,使用curl

安装

安装此库的首选方法是依赖Composer

$ composer require fgrosse/phpasn1

用法

编码ASN.1结构

PHPASN1为每个实现的ASN.1通用类型提供了一个类。构造函数应该相当直观,因此您应该没有太大困难开始。所有数据都将使用DER编码进行编码。

use FGR\ASN1\OID;
use FGR\ASN1\Universal\Integer;
use FGR\ASN1\Universal\Boolean;
use FGR\ASN1\Universal\Enumerated;
use FGR\ASN1\Universal\IA5String;
use FGR\ASN1\Universal\ObjectIdentifier;
use FGR\ASN1\Universal\PrintableString;
use FGR\ASN1\Universal\Sequence;
use FGR\ASN1\Universal\Set;
use FGR\ASN1\Universal\NullObject;

$integer = new Integer(123456);        
$boolean = new Boolean(true);
$enum = new Enumerated(1);
$ia5String = new IA5String('Hello world');

$asnNull = new NullObject();
$objectIdentifier1 = new ObjectIdentifier('1.2.250.1.16.9');
$objectIdentifier2 = new ObjectIdentifier(OID::RSA_ENCRYPTION);
$printableString = new PrintableString('Foo bar');

$sequence = new Sequence($integer, $boolean, $enum, $ia5String);
$set = new Set($sequence, $asnNull, $objectIdentifier1, $objectIdentifier2, $printableString);

$myBinary  = $sequence->getBinary();
$myBinary .= $set->getBinary();

echo base64_encode($myBinary);

解码二进制数据

解码BER编码的二进制数据与编码一样简单

use FGR\ASN1\ASNObject;

$base64String = ...
$binaryData = base64_decode($base64String);        
$asnObject = ASNObject::fromBinary($binaryData);


// do stuff

如果您已经确切知道预期的数据应该是什么样子,您可以使用FGR\ASN1\TemplateParser

use FGR\ASN1\TemplateParser;

// first define your template
$template = [
    Identifier::SEQUENCE => [
        Identifier::SET => [
            Identifier::OBJECT_IDENTIFIER,
            Identifier::SEQUENCE => [
                Identifier::INTEGER,
                Identifier::BITSTRING,
            ]
        ]
    ]
];

// if your binary data is not matching the template you provided this will throw an `\Exception`:
$parser = new TemplateParser();
$object = $parser->parseBinary($data, $template);

// there is also a convenience function if you parse binary data from base64:
$object = $parser->parseBase64($data, $template);

您可以使用此函数来确保数据确实具有您期望的格式。

导航解码数据

所有构造的类(即SequenceSet)都可以通过数组访问或使用迭代器进行导航。您可以在这里这里这里找到示例。

给我更多示例!

要查看API类的示例用法或生成的输出,请查看示例

如何贡献?

如果您发现了一个问题或有一个问题,请提交一个包含详细信息的github问题。

如果您已经知道问题的原因,并想修复它,您的代码贡献总是受欢迎的。只需fork存储库,实现您的更改,并确保您已经测试了所有内容。之后,通过github提交拉取请求,并稍加耐心:我通常会尽快评论和/或合并。

邮件列表

新特性或问题可以在本谷歌群组/邮件列表中讨论。

感谢

迄今为止的所有贡献者

许可证

本库在MIT许可证下分发。