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?
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).
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.