从Bouncy Castle的CMSAuthenticatedData [Java]中检索封装内容

时间:2012-03-06 20:03:31

标签: java bouncycastle

我正在使用Bouncy Castle库中的CMSAuthenticatedData,版本146.我可以正确创建它,通过检查ASN.1转储进行验证,但我似乎无法检索内容。

使用生成器创建经过身份验证的数据对象,如下所示:

CMSAuthenticatedDataGenerator generator = new CMSAuthenticatedDataGenerator();
CMSProcessableByteArray myContent = new CMSProcessableByteArray(myBytes);
CMSAuthenticatedData cmsData = generator.generate(myContent, myMacCalculator);

然后使用.getEncoded()序列化cmsData,将其发送到服务器,并使用byte []构造函数进行反序列化。从RFC,我看到myBytes应该在AuthenticatedData对象内的encapContentInfo字段中,但是我无法得到它。这是我到目前为止所尝试的内容:

// The original byte array I want to retrieve is 633 bytes long.

cmsData.getEncoded();
// returns ASN.1 for authData OID and AuthenticatedData object. Size: 724

cmsData.getContentInfo();
// Same as cmsData.getEncoded(). Size: 724

cmsData.getContentInfo().getContent().getDERObject().getEncoded();
// returns ASN.1 for AuthenticatedData object. Size: 703

那么,这是否可能,或者我应该推出自己的实现,解析ASN.1字节数组?

1 个答案:

答案 0 :(得分:0)

经过数周的研究,我找到了使用org.bouncycastle.asn1.cms.AuthenticatedData的解决方案:

CMSAuthenticatedData cmsData; // <- this is the object created.
byte[] cmsBytes = cmsData.getContentInfo().getContent().getDERObject().getEncoded();
ASN1Sequence byteSeq = (ASN1Sequence) ASN1Object.fromByteArray(rawAuthenticatedDataBytes)
AuthenticatedData authData = new AuthenticatedData(byteSeq);
byte[] contentBytes = authData.getEncapsulatedContentInfo().getContent().getDERObject().getEncoded()

我当然希望这不是最简单的方法,但它是我找到的唯一方法。