структура кодирования phpseclib asn1

Я пытаюсь использовать phpseclib ASN1.php, и у меня есть карта, как показано ниже;

$IdentityObjectMap = array('type' =>FILE_ASN1_TYPE_SEQUENCE,
'children'=> array(
'identityIdentificationData' => array('type'=>FILE_ASN1_TYPE_SEQUENCE,
'children'=> array(
'version' => array('type' => FILE_ASN1_TYPE_IA5_STRING),
'staticData' =>array('type' => FILE_ASN1_TYPE_SEQUENCE,
'children'=> array(
'acceptedPolicyVersion' => array('type' =>FILE_ASN1_TYPE_IA5_STRING),
'cardHolderID' => array('type' =>FILE_ASN1_TYPE_INTEGER),
'deviceSerialNumber' => array('type' => FILE_ASN1_TYPE_SEQUENCE,
'children'=> array(
'deviceType' => array('type' =>FILE_ASN1_TYPE_INTEGER),
'deviceUniqueID' => array('type' =>FILE_ASN1_TYPE_OCTET_STRING)
),
),
'appLabel' => array('type' =>FILE_ASN1_TYPE_UTF8_STRING),
'requestorRole' => array('type' => FILE_ASN1_TYPE_ENUMERATED,
'roleClient'=> array('mapping' =>0),
'roleParticipant' =>array('mapping' =>1)
),
'creationTime' => array('type' =>FILE_ASN1_TYPE_UTC_TIME)
)
)
)
)
)
);

И у меня есть JSON и использование json_decode (IdentityObject, true) для этой карты, как показано ниже;

JSON:

{
\"identityIdentificationData\":{
\"version\":\"2.0\",
\"staticData\":{
\"acceptedPolicyVersion\":\"2\",
\"cardHolderID\":11111111111,
\"deviceSerialNumber\":{
\"deviceType\":3,
\"deviceUniqueID\":\"11111111\"},
\"appLabel\":\"examination\",
\"requestorRole\": \"roleClient\",
\"creationTime\": \"180319141236Z\"}
}
}";

И этот выходной массив jsons:

array
'identityIdentificationData' =>
array
'version' => '2.0'
'staticData' =>
array
'acceptedPolicyVersion' => '2'
'cardHolderID' => 11111111111
'deviceSerialNumber' =>
array
'deviceType' => 3
'deviceUniqueID' => '11111111'
'appLabel' => 'examination'
'requestorRole' => 'roleClient'
'creationTime' => '180319141236Z'

Какова структура этого массива, чтобы я мог успешно скомпилировать.

Окончательный код, который дает эту ошибку

Undefined index: children .../ASN1.php on line 950.

Финальный код:

$asn1->encodeDER($IdentityObject,$IdentityObjectMap);

1

Решение

В файле / X509.php есть только один перечислимый тип, и он определен так:

    $this->CRLReason = array('type' => FILE_ASN1_TYPE_ENUMERATED,
'mapping' => array(
'unspecified',
'keyCompromise',
'cACompromise',
'affiliationChanged',
'superseded',
'cessationOfOperation',
'certificateHold',
// Value 7 is not used.
8 => 'removeFromCRL',
'privilegeWithdrawn',
'aACompromise'
)
);

Ваше перечисляемое определение типа не включает ключ сопоставления. Это, вероятно, то, что вам нужно. например.

                        'requestorRole' => array('type' => FILE_ASN1_TYPE_ENUMERATED,
'mapping' => array(
'roleClient',
'roleParticipant'
)
),

Тем не менее, какую версию phpseclib вы используете? Я попробовал ваш код с 1.0.10 (я думаю) и получил ошибку, отличную от той, о которой вы сообщили:

Fatal error: Uncaught Error: Call to a member function toBytes() on string

Когда я использовал свое альтернативно определенное определение requestorRole, я получил это сообщение об ошибке:

Fatal error: Uncaught Exception: DateTime::__construct(): Failed to parse time string (180319141236Z) at position 11 (6)

Я смог исправить эту последнюю ошибку, заменив 'creationTime' => '180319141236Z' с 'creationTime': 'January 1, 2018', 180319141236Z ближе к формату, который используют сертификаты X.509, но phpseclib генерирует это значение самостоятельно после его запуска DateTime или же strtotimehttps://github.com/phpseclib/phpseclib/blob/1.0.10/phpseclib/File/X509.php#L3420), а затем отформатировать его соответствующим образом. Если вы хотите установить его самостоятельно, проверьте это:

https://github.com/phpseclib/phpseclib/blob/1.0.10/phpseclib/File/X509.php#L3952

Вот мой код:

https://pastebin.com/cmmSf6S6

0

Другие решения

Других решений пока нет …