8264864: Multiple byte tag not supported by ASN.1 encoding

Reviewed-by: xuelei
This commit is contained in:
Weijun Wang 2021-04-08 21:26:05 +00:00
parent ccefa5e378
commit 3d2b4cc567
2 changed files with 83 additions and 1 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1996, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -221,6 +221,9 @@ public class DerValue {
* Creates a new DerValue by specifying all its fields.
*/
DerValue(byte tag, byte[] buffer, int start, int end, boolean allowBER) {
if ((tag & 0x1f) == 0x1f) {
throw new IllegalArgumentException("Tag number over 30 is not supported");
}
this.tag = tag;
this.buffer = buffer;
this.start = start;
@ -315,6 +318,9 @@ public class DerValue {
}
int pos = offset;
tag = buf[pos++];
if ((tag & 0x1f) == 0x1f) {
throw new IOException("Tag number over 30 at " + offset + " is not supported");
}
int lenByte = buf[pos++];
int length;
@ -388,6 +394,9 @@ public class DerValue {
// arg to control whether DER checks are enforced.
DerValue(InputStream in, boolean allowBER) throws IOException {
this.tag = (byte)in.read();
if ((tag & 0x1f) == 0x1f) {
throw new IOException("Tag number over 30 is not supported");
}
int length = DerInputStream.getLength(in);
if (length == -1) { // indefinite length encoding found
if (!allowBER) {
@ -1140,6 +1149,9 @@ public class DerValue {
* @param val the tag value
*/
public static byte createTag(byte tagClass, boolean form, byte val) {
if (val < 0 || val > 30) {
throw new IllegalArgumentException("Tag number over 30 is not supported");
}
byte tag = (byte)(tagClass | val);
if (form) {
tag |= (byte)0x20;