DIRKRB-493. Fixed a CMS signed data encoding issue
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Any.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Any.java
index 0debce1..daff598 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Any.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Any.java
@@ -21,6 +21,7 @@
import org.apache.kerby.asn1.Asn1Binder;
import org.apache.kerby.asn1.Asn1FieldInfo;
+import org.apache.kerby.asn1.Tag;
import org.apache.kerby.asn1.UniversalTag;
import org.apache.kerby.asn1.parse.Asn1ParseResult;
@@ -56,8 +57,24 @@
}
@Override
+ public Tag tag() {
+ if (getValue() != null) {
+ return getValue().tag();
+ } else if (field != null) {
+ return field.tag();
+ }
+ return super.tag();
+ }
+
+ @Override
protected int encodingBodyLength() {
- return ((Asn1Encodeable) getValue()).encodingBodyLength();
+ if (getValue() != null) {
+ return ((Asn1Encodeable) getValue()).encodingBodyLength();
+ } else if (field != null) {
+ return field.getBodyLength();
+ }
+
+ return -1;
}
@Override
@@ -67,7 +84,12 @@
@Override
protected void encodeBody(ByteBuffer buffer) {
- ((Asn1Encodeable) getValue()).encodeBody(buffer);
+ if (getValue() != null) {
+ ((Asn1Encodeable) getValue()).encodeBody(buffer);
+ } else if (field != null) {
+ buffer.put(field.getBodyBuffer());
+ }
+
}
protected <T extends Asn1Type> T getValueAs(Class<T> t) {
diff --git a/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java b/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
index 55c1646..bd2cef1 100644
--- a/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
@@ -32,7 +32,7 @@
public class TestSignedData extends CmsTestBase {
@Test
- public void testDump1WithSignedData() throws IOException {
+ public void testDecoding() throws IOException {
byte[] data = readDataFile("/signed-data.txt");
try {
Asn1.dump(data, true);
@@ -44,6 +44,9 @@
SignedData signedData =
contentInfo.getContentAs(SignedData.class);
Asn1.dump(signedData);
+
+ byte[] encodedData = contentInfo.encode();
+ Asn1.dump(encodedData, true);
} catch (Exception e) {
e.printStackTrace();
Assert.fail();
@@ -51,7 +54,7 @@
}
@Test
- public void testDecodeSignedData() throws IOException {
+ public void testEncoding() throws IOException {
ContentInfo contentInfo = new ContentInfo();
contentInfo.setContentType(new Asn1ObjectIdentifier("1.2.840.113549.1.7.2"));
SignedData signedData = new SignedData();
@@ -61,15 +64,15 @@
signedData.setEncapContentInfo(eContentInfo);
contentInfo.setContent(signedData);
Asn1.dump(contentInfo);
- Asn1.dump(contentInfo.encode(), true);
+ byte[] encodedData = contentInfo.encode();
+ Asn1.dump(encodedData, true);
- ContentInfo actualContentInfo = new ContentInfo();
- actualContentInfo.decode(contentInfo.encode());
- Asn1.dump(actualContentInfo);
+ ContentInfo decodedContentInfo = new ContentInfo();
+ decodedContentInfo.decode(encodedData);
+ Asn1.dump(decodedContentInfo);
- /* Fail
- SignedData actualSignedData =
- actualContentInfo.getContentAs(SignedData.class);
- */
+ SignedData decodedSignedData =
+ decodedContentInfo.getContentAs(SignedData.class);
+ Asn1.dump(decodedSignedData);
}
}