Capturar atributos autenticados de uma assinatura no formato pkcs#7 ou #9

6 respostas
A

Boa tarde a todos

Na verdade minha dúvida é sobre como trabalhar com DERObjects

No Código abaixo eu pego os atributos autenticados da assinatura

CMSSignedData signedDoc = new CMSSignedData(new FileInputStream("c:/arquivoassinado.txt"));

Collection signatures = = signedDoc.getSignerInfos().getSigners();

SignerInformation element = (SignerInformation) signatures.iterator().next();

HashTable ht = element.getSignedAttributes().toHashTable();

(...)

ASN1InputStream asn = new ASN1InputStream(new ByteArrayInputStream(attribute.getEncoded()));
			
DERSequence d = (DERSequence) asn.readObject();
			
DERSet d2 = (DERSet) d.getObjectAt(1);//pego o indice 1 pq o 0 é o OID

/*
Na linha abaixo pego o índice 0 pq em tese é o primeiro ítem da lista que não necessáriamente é um DEROctetString pode ser um DERObjectIdentifier ou o que for.
*/			
DEROctetString doct = (DEROctetString) d2.getObjectAt(0);
(...)

mas quando eu tento criar uma DERString do DEROctetString o getString traz um valor sem sentido.

na verdade o único valor que consigo pegar é o digest que é uma string simples e não precisa vazer sentido mesmo.

quando é o conteúdo do arquivo assinado, ele gera um arquivo corrompido

DERString ds = new DERGeneralString(doct.getDEREncoded());

//ou 

DERString ds = new DERGeneralString(doct.getOctets());
			
sysout(ds.getString());

Como eu faço pra pegar os valores dos atributos.

Existe alguma bibliografia sobre como trabalhar com padrões ASN1?

Não é possível que seja um padrão tão ilógico.
Para cada objeto de um certificado ou assinatura é uma maneira diferente de captura o valor?

Obrigado
Arturo Garcia

6 Respostas

T

Primeiramente, você está usando o BouncyCastle, não?
Você imprimiu a codificação ASN.1 dos dados que você está tentando usar? Use um programa, como o DumpASN1 (do Peter Gutmann), para poder ver o que realmente está posto nos dados que você quer usar. Por exemplo, já tive um problema em que eu achava que havia um OctetString, mas o cara codificou as coisas como uma PrintString (fora do padrão definido, mas não dá para notar isso só de carregar o certificado e visualizar com o Internet Explorer).

A

Sim estou usando a bouncycastle.

e sim tentei gravar em disco o arquivo sem as assinaturas mas gerou uma arquivo corrompido.

mas vou conferir os tipos que recebo com esse DumpASN1.

mas uma questão continua.

Para cada objeto de um certificado ou assinatura é uma maneira diferente de captura o valor?

Obrigado

A

Digo. Nào não imprimi.
vc fala “codificação ASN.1” aquela estrutura tipo isso abaixo

256 30 159: SEQUENCE { 259 30 13: SEQUENCE { 261 06 9: OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) 272 05 0: NULL : } 274 03 141: BIT STRING, encapsulates { 278 30 137: SEQUENCE { 281 02 129: INTEGER : 00 E5 19 BF 6D A3 56 61 2D 99 48 71 F6 67 DE B9 [...] : 8F 413 02 3: INTEGER 65537 : } : } : }

nem sabia que isso podia ser extraído de algum objeto.

pensava que fosse só modelo especificação dos objetos

T

Mais ou menos; é necessário checar a sua definição, e conferir com a saída do DumpASN1, conforme você mesmo está vendo.

A

Pro meu entendimento esse padrão ASN1 é meio ilógico, mas… fazer o que né.

Enfim é isso . . .
Obrigado pela Luz.

T

O ASN.1 não é nem um pouco ilógico.
É o pessoal que define os padrões que não chega a um acordo sobre que tipo usar - por exemplo, há seis ou sete tipos diferentes de String (BMPString, PrintString, OctetString, etc.), sem contar o BitString, que não é para codificar caracteres ou bytes, e sim bits.

Criado 2 de outubro de 2006
Ultima resposta 2 de out. de 2006
Respostas 6
Participantes 2