O XAdES é construído em torno de certificados X.509 e formatos relacionados, portanto, os "dados encapsulados" provavelmente contêm algum tipo de dados DER ASN.1, codificados em Base64. Mas é não necessariamente criptografado de qualquer forma - apenas uma camada espessa de formatos binários.
(Na verdade, o prefixo MII…
é um sinal revelador de uma marca SEQUENCE ASN.1 escondida dentro de Base64.)
Eu não tenho a descrição do formato XAdES, mas depois de executar o valor da tag através de um decodificador Base64 e, em seguida, um dumper ASN.1 ( isto ou isto ou < um href="https://lapo.it/asn1js/"> isso ), eu recebo:
$ base64 --decode <data.txt >data.raw
$ dumpasn1 data.raw
0 2114: SEQUENCE {
4 9: OBJECT IDENTIFIER signedData (1 2 840 113549 1 7 2)
15 2099: [0] {
19 2095: SEQUENCE {
23 1: INTEGER 3
26 11: SET {
28 9: SEQUENCE {
...
Convenientemente, o arquivo começa com seu próprio "tipo de conteúdo" (como tipos MIME, mas para X.500) e afirma ser uma estrutura PKCS # 7 (CMS) SignedData , essencialmente a mesma usada para S / MIME. O OpenSSL pode analisá-lo com sucesso:
$ openssl cms -in data.raw -inform DER -cmsout -print
CMS_ContentInfo:
contentType: pkcs7-signedData (1.2.840.113549.1.7.2)
d.signedData:
version: 3
digestAlgorithms:
algorithm: sha1 (1.3.14.3.2.26)
parameter: NULL
encapContentInfo:
eContentType: id-smime-ct-TSTInfo (1.2.840.113549.1.9.16.1.4)
eContent:
0000 - 30 81 99 02 01 01 06 02-29 02 30 21 30 09 06 0.......).0!0..
000f - 05 2b 0e 03 02 1a 05 00-04 14 d1 24 6b 80 8b .+.........$k..
001e - ae 11 fe bb 52 d1 59 7f-8a 04 aa 40 b1 bf df ....R.Y....@...
002d - 02 04 12 82 6c b2 18 0f-32 30 31 33 30 39 33 ....l...2013093
003c - 30 31 31 33 31 32 34 5a-30 03 02 01 3c a0 51 0113124Z0...<.Q
004b - a4 4f 30 4d 31 0b 30 09-06 03 55 04 06 13 02 .O0M1.0...U....
005a - 55 53 31 15 30 13 06 03-55 04 0a 13 0c 47 65 US1.0...U....Ge
0069 - 6f 54 72 75 73 74 20 49-6e 63 31 27 30 25 06 oTrust Inc1'0%.
0078 - 03 55 04 03 13 1e 47 65-6f 54 72 75 73 74 20 .U....GeoTrust
0087 - 54 69 6d 65 73 74 61 6d-70 69 6e 67 20 53 69 Timestamping Si
0096 - 67 6e 65 72 20 31 gner 1
certificates:
d.certificate:
cert_info:
version: 2
...
Aqui você pode ver os dados assinados encapsulados - que, novamente, são prefixados com um identificador de tipo e afirmam ser um "timestamp assinado" da RFC 3161. A seguir estão os certificados que foram usados para assinar a camada externa (não mostrada aqui por brevidade).
Se precisar apenas dos certificados, você pode usar:
$ openssl pkcs7 -in data.raw -inform DER -print_certs > signer.pem
Se você precisar dos dados assinados, existem várias maneiras de extraí-los. Claro que você pode copiar diretamente & cole os bytes necessários em um novo arquivo. Mas o método "adequado" seria fazer a verificação completa da assinatura e tudo mais:
$ wget -q https://www.thawte.com/roots/Thawte_Timestamping_CA.pem
$ openssl cms -in data.raw -inform DER \
-verify -CAfile Thawte_Timestamping_CA.pem \
-purpose any -attime $(date -d "1 year ago" +%s) \
-out inner_data.raw -binary
O certificado de CA é apenas para verificação, mas openssl cms
não tem a opção de ignorar as verificações de assinatura. -purpose
é necessário porque o certificado de assinatura não era um certificado S / MIME. -attime
é necessário porque o certificado já expirou.
Por fim, recebemos este RFC 3161 "TSTInfo" assinado no bloco de dados de data e hora. Infelizmente, ele parece estar malformado e o analisador ASN.1 do OpenSSL não o aceitará.
$ openssl ts -reply -in inner_data.raw -text
:error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag:crypto/asn1/tasn_dec.c:1112:
:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:274:Type=TS_STATUS_INFO
:error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:609:Field=status_info, Type=TS_RESP
Mas pelo menos seu conteúdo bruto pode ser descartado:
$ dumpasn1 inner_data.raw
0 153: SEQUENCE {
3 1: INTEGER 1
6 2: OBJECT IDENTIFIER.
: Error: OBJECT IDENTIFIER has invalid length 2.
10 33: SEQUENCE {
12 9: SEQUENCE {
14 5: OBJECT IDENTIFIER sha1 (1 3 14 3 2 26)
21 0: NULL
: }
23 20: OCTET STRING D1 24 6B 80 8B AE 11 FE BB 52 D1 59 7F 8A 04 AA 40 B1 BF DF
: }
45 4: INTEGER 310537394
51 15: GeneralizedTime 30/09/2013 11:31:24 GMT
68 3: SEQUENCE {
70 1: INTEGER 60
: }
73 81: [0] {
75 79: [4] {
77 77: SEQUENCE {
79 11: SET {
81 9: SEQUENCE {
83 3: OBJECT IDENTIFIER countryName (2 5 4 6)
88 2: PrintableString 'US'
: }
: }
92 21: SET {
94 19: SEQUENCE {
96 3: OBJECT IDENTIFIER organizationName (2 5 4 10)
101 12: PrintableString 'GeoTrust Inc'
: }
: }
115 39: SET {
117 37: SEQUENCE {
119 3: OBJECT IDENTIFIER commonName (2 5 4 3)
124 30: PrintableString 'GeoTrust Timestamping Signer 1'
: }
: }
: }
: }
: }
: }
Alternativamente:
$ openssl asn1parse -in inner_data.raw -inform DER -i