Skip to content

Commit e8f804c

Browse files
committed
Enhance DerValue::getOctetString to be able to read multi-level constructed value.
1 parent 6f63d1a commit e8f804c

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

src/java.base/share/classes/sun/security/util/DerValue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ public byte[] getOctetString() throws IOException {
505505
ByteArrayOutputStream bout = new ByteArrayOutputStream();
506506
DerInputStream dis = new DerInputStream(this);
507507
while (dis.available() > 0) {
508-
bout.write(dis.getOctetString());
508+
bout.write(dis.getDerValue().getOctetString());
509509
}
510510
return bout.toByteArray();
511511
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
24+
/*
25+
* @test
26+
* @bug 8249783
27+
* @summary read very deep constructed OCTET STRING
28+
* @modules java.base/sun.security.util
29+
* @library /test/lib
30+
*/
31+
32+
import jdk.test.lib.Asserts;
33+
import jdk.test.lib.Utils;
34+
import sun.security.util.DerInputStream;
35+
import sun.security.util.DerValue;
36+
37+
import java.io.IOException;
38+
39+
public class DeepOctets {
40+
41+
public static void main(String[] args) throws Exception {
42+
byte[] input = {
43+
0x24, 24,
44+
0x24, 8, 4, 2, 'a', 'b', 4, 2, 'c', 'd',
45+
0x24, 8, 4, 2, 'e', 'f', 4, 2, 'g', 'h',
46+
4, 2, 'i', 'j'
47+
};
48+
49+
// DerValue::getOctetString supports constructed BER
50+
byte[] s = new DerValue(input).getOctetString();
51+
Asserts.assertEQ(new String(s), "abcdefghij");
52+
53+
// DerInputStream::getOctetString does not
54+
Utils.runAndCheckException(
55+
() -> new DerInputStream(input).getOctetString(),
56+
IOException.class);
57+
}
58+
}

0 commit comments

Comments
 (0)