afk11 / phpasn1
一个PHP框架,允许您使用ITU-T X.690编码规则对任意ASN.1结构进行编码和解码。
Requires
- php: >=5.3.0
- ext-gmp: *
Requires (Dev)
- phpunit/phpunit: ~4.5
- dev-master / 2.0.x-dev
- 1.3.1
- 1.3.0
- 1.2.0
- 1.1.0
- 1.0.0
- 0.9.0
- dev-changelog-2.2.0
- dev-wycheproof-2.0.1-len2
- dev-wycheproof-1.5.3-len2
- dev-wycheproof-1.5.3-len2-rebased
- dev-wycheproof-rebased-len2
- dev-fixup-generalized-length-fix
- dev-fix-wycheproof-1.5.3
- dev-wycheproof-2.0.1
- dev-wycheproof-rebased
- dev-wycheproof
- dev-fixup-bitstring
- dev-fixup-content-length-bigint
- dev-fixup-overflow-in-content-length
- dev-fixup-integer-check-sufficient-length
- dev-fixup-integer-parsing
- dev-fixup-sequence-enforce-length
- dev-fixup-integer-minimal-encoding
- dev-debugging-integer
- dev-extend-cert-extensions
- dev-with-bigints2
- dev-latest-arb-int-base128
- dev-issue/36-base64-encode-big-values
- dev-develop
This package is auto-updated.
Last update: 2024-08-24 07:46:48 UTC
README
一个PHP框架,允许您使用ASN.1结构进行编码和解码,使用ITU-T X.690编码规则。这种编码在X.509 PKI环境或异构计算机系统之间的通信中非常常用。
API允许您将ASN.1结构编码为创建二进制数据,例如证书签名请求(CSR)、X.509证书或证书吊销列表(CRL)。PHPASN1还可以将BER编码的二进制数据读取到单独的PHP对象中,用户可以对这些对象进行操作并在之后重新编码。
现在可以在CHANGELOG.md中找到变更日志。
依赖关系
PHPASN1需要至少PHP 7.0
以及gmp
或bcmath
扩展。从v2.0
开始,已放弃对旧版PHP版本(即PHP 5.6)的支持。如果必须使用旧版PHP版本,请考虑使用PHPASN v1.5。
为了直接从网络加载对象标识符名称,使用curl。
安装
安装此库的首选方式是依靠Composer。
$ composer require fgrosse/phpasn1
用法
编码ASN.1结构
PHPASN1为每个实现的ASN.1通用类型提供了一个类。构造函数应该是相当直观的,所以您应该没有太大困难开始使用。所有数据都将使用DER编码进行编码。
use FG\ASN1\OID; use FG\ASN1\Universal\Integer; use FG\ASN1\Universal\Boolean; use FG\ASN1\Universal\Enumerated; use FG\ASN1\Universal\IA5String; use FG\ASN1\Universal\ObjectIdentifier; use FG\ASN1\Universal\PrintableString; use FG\ASN1\Universal\Sequence; use FG\ASN1\Universal\Set; use FG\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 FG\ASN1\ASNObject; $base64String = ... $binaryData = base64_decode($base64String); $asnObject = ASNObject::fromBinary($binaryData); // do stuff
如果您已经确切知道预期的数据应该是什么样子,可以使用FG\ASN1\TemplateParser
。
use FG\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);
您可以使用此功能确保您的数据具有您期望的格式。
导航解码数据
所有构造的类(即Sequence
和Set
)都可以通过数组访问或使用迭代器进行导航。您可以在这里、这里和这里找到示例。
给我更多示例!
要查看API类的示例用法或生成的输出,请查看示例。
如何贡献?
如果您发现了一个问题或有疑问,请提交一个包含详细信息的github问题。
如果您已经知道导致问题的原因并且有心情修复它,您的代码贡献总是受欢迎的。只需fork仓库,实现您的更改,并确保您已经用测试覆盖了所有内容。之后,通过github提交pull request,请稍等片刻 :) 我通常会尽快评论和/或合并。
邮件列表
关于新功能或问题可以在这个Google群组/邮件列表中进行讨论。
感谢
迄今为止的所有贡献者!
许可协议
此库采用MIT许可协议分发。