@@ -55,6 +55,7 @@ public function __construct(array $certificates)
5555 */
5656 public function verify ($ serialNumber , $ message , $ signature )
5757 {
58+ $ serialNumber = \strtoupper (\ltrim ($ serialNumber , '0 ' )); // trim leading 0 and uppercase
5859 if (!isset ($ this ->publicKeys [$ serialNumber ])) {
5960 return false ;
6061 }
@@ -77,21 +78,31 @@ public function verify($serialNumber, $message, $signature)
7778 protected function parseSerialNo ($ certificate )
7879 {
7980 $ info = \openssl_x509_parse ($ certificate );
80- if (!isset ($ info ['serialNumber ' ])) {
81+ if (!isset ($ info ['serialNumber ' ]) && ! isset ( $ info [ ' serialNumberHex ' ]) ) {
8182 throw new \InvalidArgumentException ('证书格式错误 ' );
8283 }
8384
84- $ serialNo = $ info ['serialNumber ' ];
85- if (\is_int ($ serialNo )) {
86- return \strtoupper (\dechex ($ serialNo ));
85+ $ serialNo = '' ;
86+ // PHP 7.0+ provides serialNumberHex field
87+ if (isset ($ info ['serialNumberHex ' ])) {
88+ $ serialNo = $ info ['serialNumberHex ' ];
89+ } else {
90+ // PHP use i2s_ASN1_INTEGER in openssl to convert serial number to string,
91+ // i2s_ASN1_INTEGER may produce decimal or hexadecimal format,
92+ // depending on the version of openssl and length of data.
93+ if (\strtolower (\substr ($ info ['serialNumber ' ], 0 , 2 )) == '0x ' ) { // HEX format
94+ $ serialNo = \substr ($ info ['serialNumber ' ], 2 );
95+ } else { // DEC format
96+ $ value = $ info ['serialNumber ' ];
97+ $ hexvalues = ['0 ' ,'1 ' ,'2 ' ,'3 ' ,'4 ' ,'5 ' ,'6 ' ,'7 ' ,
98+ '8 ' ,'9 ' ,'A ' ,'B ' ,'C ' ,'D ' ,'E ' ,'F ' ];
99+ while ($ value != '0 ' ) {
100+ $ serialNo = $ hexvalues [\bcmod ($ value , '16 ' )].$ serialNo ;
101+ $ value = \bcdiv ($ value , '16 ' , 0 );
102+ }
103+ }
87104 }
88- $ hexvalues = ['0 ' ,'1 ' ,'2 ' ,'3 ' ,'4 ' ,'5 ' ,'6 ' ,'7 ' ,
89- '8 ' ,'9 ' ,'A ' ,'B ' ,'C ' ,'D ' ,'E ' ,'F ' ];
90- $ hexval = '' ;
91- while ($ serialNo != '0 ' ) {
92- $ hexval = $ hexvalues [\bcmod ($ serialNo , '16 ' )].$ hexval ;
93- $ serialNo = \bcdiv ($ serialNo , '16 ' , 0 );
94- }
95- return $ hexval ;
105+
106+ return \strtoupper ($ serialNo );
96107 }
97108}
0 commit comments