Openssl Asn1parse неправильно извлекает данные

Проблема в декодировании данных openssl с помощью asn1parse. После использования команды asn1parse файл out.pem не соответствует ожидаемому результату. Как фактический, так и ожидаемый результат показаны ниже. Пожалуйста, помогите мне в этом вопросе.

openssl asn1parse -inform PEM -in base64.pem -out out.pem

cat base64.pem MIIDmQYLKoZIhvcNAQkQASugggOIBIIDhHsKICAgICJpZXRmLXN6dHAtY29udmV5ZWQtaW5mbzpvbmJvYXJkaW5nLWluZm9ybWF0aW9uIjogewogICAgICAgICJib290LWltYWdlIjogewogICAgICAgICAgICAiZG93bmxvYWQtdXJpIjogWwogICAgICAgICAgICAgICAgImh0dHBzOi8vZXhhbXBsZS5jb20vbXktYm9vdC1pbWFnZS5pbWciCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbWFnZS12ZXJpZmljYXRpb24iOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImhhc2gtYWxnb3JpdGhtIjogImlldGYtc3p0cC1jb252ZXllZC1pbmZvOnNoYS0yNTYiLAogICAgICAgICAgICAgICAgICAgICJoYXNoLXZhbHVlIjogImYwOmY3OjVlOjM0OjUzOmMwOjExOjcyOmUzOmNmOmUxOmQ5OjNhOmRjOmM3OmJmOmI1OmM2OjdmOjE3OjZmOjdlOjMwOjc1OjBhOjEzOjQyOjE2OjM0OjI0OjljOjJkIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAicHJlLWNvbmZpZ3VyYXRpb24tc2NyaXB0IjogIkl5OWlhVzR2WW1GemFBcGxZMmh2SUNKcGJuTnBaR1VnZEdobElIQnlaUzFqYjI1bWFXZDFjbUYwYVc5dUxYTmpjbWx3ZEM0dUxpSUsiLAogICAgICAgICJjb25maWd1cmF0aW9uLWhhbmRsaW5nIjogIm1lcmdlIiwKICAgICAgICAiY29uZmlndXJhdGlvbiI6ICJQSFJ2Y0NCNGJXeHVjejBpYUhSMGNITTZMMlY0WVcxd2JHVXVZMjl0TDJOd mJtWnBaeUkrQ2lBZ1BHRnVlUzE0Yld3dFkyOXVkR1Z1ZEMxdmEyRjVMejRLUEM5MGIzQStDZz09IiwKICAgICAgICAicG9zdC1jb25maWd1cmF0aW9uLXNjcmlwdCI6ICJJeTlpYVc0dlltRnphQXBsWTJodklDSnBibk5wWkdVZ2RHaGxJSEJ2YzNRdFkyOXVabWxuZFhKaGRHbHZiaTF6WTNKcGNIUXVMaTRpQ2c9PSIKICAgIH0KfQ==

0:d=0  hl=2 l=  86 prim: appl [ 7 ]        

88:d=0 hl=2 l= 67 prim: appl [ 9 ]

cat out.pem GVudC1va2F5Lz4KPC90b3A+Cg==, скрипт постконфигурации: Iy9iaW4vYmFzaAplY2hvICJpbnNpZGUgdGhlIHBvc3QtY29uZmlndXJhdGlvbi1zY3JpcHQuLi4iCg== } }

Ожидаемый выход.pem b'0\x82\x03\x99\x06\x0b*\x86H\x86\xf7\r\x01\t\x10\x01+\xa0\x82\x03\x88\x04\x82\x03\x84 {\n ietf-sztp-conveyed-info: onboarding-information: {\n boot-image: {\n download-uri: [\n https://example.com/my-boot-image.img\n] ,\n проверка изображения: [\n {\n хэш-алгоритм: ietf-sztp-conveyed-info:sha-256,\n хэш-значение: d8:56:8d:d2:10:5e:dc:75 :4c:c7:87:ae:f1:27:97:65:e0:65:17:6c:04:61:22:fa:3e:82:cf:9d:0f:ae:1a:3d\n }\n ]\n },\n pre-configuration-script: Iy9iaW4vYmFzaAplY2hvICJpbnNpZGUgdGhlIHByZS1jb25maWd1cmF0aW9uLXNjcmlwdC4uLiIK,\n configuration-handling: merge,\n configuration: PHRvcCB4bWxucz0iaHR0cHM6L2V4YW1wbGUuY29tL2NvbmZpZyI+CiAgPGFueS14bWwtY29udGVudC1va2F5Lz4KPC90b3A+Cg==,\n post-configuration-script: Iy9iaW4vYmFzaAplY2hvICJpbnNpZGUgdGhlIHBvc3QtY29uZmlndXJhdGlvbi1zY3JpcHQuLi4iCg==\ п }\n}'


person user3820915    schedule 16.10.2020    source источник


Ответы (1)


Ваш входной файл содержит одну длинную строку base64. OpenSSL ожидает, что входные данные в формате base64 будут содержать строки, заключенные в 64 символа.

Если вы работаете в среде *nix, в вашем распоряжении есть инструмент fold для переноса строк. Вы можете либо создать другую версию входного файла с переносом строк, либо сделать это за один проход с помощью Процесс замены, например:

$ openssl asn1parse -in <(fold -w 64 base64.pem)
    0:d=0  hl=4 l= 921 cons: SEQUENCE          
    4:d=1  hl=2 l=  11 prim: OBJECT            :1.2.840.113549.1.9.16.1.43
   17:d=1  hl=4 l= 904 cons: cont [ 0 ]        
   21:d=2  hl=4 l= 900 prim: OCTET STRING      :{
    "ietf-sztp-conveyed-info:onboarding-information": {
        "boot-image": {
            "download-uri": [
                "https://example.com/my-boot-image.img"
            ],
            "image-verification": [
                {
                    "hash-algorithm": "ietf-sztp-conveyed-info:sha-256",
                    "hash-value": "f0:f7:5e:34:53:c0:11:72:e3:cf:e1:d9:3a:dc:c7:bf:b5:c6:7f:17:6f:7e:30:75:0a:13:42:16:34:24:9c:2d"
                }
            ]
        },
        "pre-configuration-script": "Iy9iaW4vYmFzaAplY2hvICJpbnNpZGUgdGhlIHByZS1jb25maWd1cmF0aW9uLXNjcmlwdC4uLiIK",
        "configuration-handling": "merge",
        "configuration": "PHRvcCB4bWxucz0iaHR0cHM6L2V4YW1wbGUuY29tL2NvbmZpZyI+CiAgPGFueS14bWwtY29udGVudC1va2F5Lz4KPC90b3A+Cg==",
        "post-configuration-script": "Iy9iaW4vYmFzaAplY2hvICJpbnNpZGUgdGhlIHBvc3QtY29uZmlndXJhdGlvbi1zY3JpcHQuLi4iCg=="
    }
}
person Reinier Torenbeek    schedule 17.10.2020
comment
0:d=0 hl=4 l= 921 cons: ПОСЛЕДОВАТЕЛЬНОСТЬ 4:d=1 hl=2 l= 11 prim: ОБЪЕКТ :1.2.840.113549.1.9.16.1.43 17:d=1 hl=4 l= 904 cons : cont [ 0 ] 21:d=2 hl=4 l= 900 prim: OCTET STRING :{ Выше показан ОБЪЕКТ :1.2.840.113549.1.9.16.1.43 , каково значение ОБЪЕКТА и как получить 1.2.840.113549 .1.9.16.1.43 - person user3820915; 18.10.2020
comment
0:d=0 hl=4 l= 921 cons: ПОСЛЕДОВАТЕЛЬНОСТЬ 4:d=1 hl=2 l= 11 prim: ОБЪЕКТ :1.2.840.113549.1.9.16.1.43 17:d=1 hl=4 l= 904 cons : cont [ 0 ] 21:d=2 hl=4 l= 900 prim: OCTET STRING :{ Выше показан ОБЪЕКТ :1.2.840.113549.1.9.16.1.43 , каково значение ОБЪЕКТА и как получить 1.2.840.113549 .1.9.16.1.43 - person user3820915; 18.10.2020
comment
Содержимое ASN.1 в вашем файле является самоописываемым, а десятичное число с точками определяет тип содержимого, в данном случае id-ct-sztpConveyedInfoJSON. Вы можете запросить его значение из реестра идентификаторов через такой веб-сайт: oid-info.com/get/1.2.840.113549.1.9.16.1.43 - person Reinier Torenbeek; 18.10.2020
comment
Мне нужно реализовать приведенную выше логику asn1parse на языке C, используя openssl. Можете ли вы указать мне API Openssl C, который извлекает/декодирует, как это делается в openssl asn1parse -in ‹(fold -w 64 base64.pem) - person user3820915; 19.10.2020
comment
Вы можете посмотреть, как это делает инструмент asn1parse, в apps/asn1pars.c или задать новый вопрос, потому что ответ на него не помещается в комментарий. - person Reinier Torenbeek; 19.10.2020
comment
Я опубликовал еще один вопрос для реализации той же команды с использованием API языка C openssl. Можете ли вы помочь мне, как это можно сделать? stackoverflow.com/ вопросы/64420669/ - person user3820915; 19.10.2020
comment
OpenSSL записывает base64, свернутый в 64 в соответствии с RFC 1421 (и 7468) для PEM, но более старые версии могли читать любое число, кратное 4, вплоть до 76 в соответствии с RFC 1341 et seq для MIME, а версия 1.0.1 в 2012 году увеличила лимит чтения до 1020. Значение OP равно 1236. Но вам не нужна замена процесса; простой старый конвейер fold -w76 file | openssl asn1parse отлично работает на хромых оболочках и (даже?) Windows, если вы добавите fold или что-то, что может делать то же самое, например perl или awk - person dave_thompson_085; 09.12.2020