# HG changeset patch # User Carl Byington # Date 1405709992 25200 # Node ID e0da430260463befe32efc41ee8f94e5cb4831c0 # Parent 3a1deb1040f652a9afc025a33df2e180e1e08678 start conversion from trilead to ganymed diff -r 3a1deb1040f6 -r e0da43026046 src/ch/ethz/ssh2/crypto/SimpleDERReader.java --- a/src/ch/ethz/ssh2/crypto/SimpleDERReader.java Fri Jul 18 11:57:12 2014 -0700 +++ b/src/ch/ethz/ssh2/crypto/SimpleDERReader.java Fri Jul 18 11:59:52 2014 -0700 @@ -1,7 +1,3 @@ -/* - * Copyright (c) 2006-2011 Christian Plattner. All rights reserved. - * Please refer to the LICENSE.txt for licensing details. - */ package ch.ethz.ssh2.crypto; import java.io.IOException; @@ -10,149 +6,200 @@ /** * SimpleDERReader. - * - * @author Christian Plattner - * @version 2.50, 03/15/10 + * + * @author Christian Plattner, plattner@trilead.com + * @version $Id: SimpleDERReader.java,v 1.1 2007/10/15 12:49:56 cplattne Exp $ */ -public class SimpleDERReader -{ - byte[] buffer; - int pos; - int count; +public class SimpleDERReader { + private static final int CONSTRUCTED = 0x20; + + byte[] buffer; + int pos; + int count; + + public SimpleDERReader(byte[] b) { + resetInput(b); + } + + public SimpleDERReader(byte[] b, int off, int len) { + resetInput(b, off, len); + } + + public void resetInput(byte[] b) { + resetInput(b, 0, b.length); + } - public SimpleDERReader(byte[] b) - { - resetInput(b); - } - - public SimpleDERReader(byte[] b, int off, int len) - { - resetInput(b, off, len); - } + public void resetInput(byte[] b, int off, int len) { + buffer = b; + pos = off; + count = len; + } + + private byte readByte() throws IOException { + if (count <= 0) + throw new IOException("DER byte array: out of data"); - public void resetInput(byte[] b) - { - resetInput(b, 0, b.length); - } - - public void resetInput(byte[] b, int off, int len) - { - buffer = b; - pos = off; - count = len; - } + count--; + return buffer[pos++]; + } + + private byte[] readBytes(int len) throws IOException { + if (len > count) + throw new IOException("DER byte array: out of data"); + + byte[] b = new byte[len]; + System.arraycopy(buffer, pos, b, 0, len); + pos += len; + count -= len; + return b; + } - private byte readByte() throws IOException - { - if (count <= 0) - throw new IOException("DER byte array: out of data"); - count--; - return buffer[pos++]; - } + public int available() { + return count; + } + + private int readLength() throws IOException { + int len = readByte() & 0xff; + + if ((len & 0x80) == 0) + return len; - private byte[] readBytes(int len) throws IOException - { - if (len > count) - throw new IOException("DER byte array: out of data"); + int remain = len & 0x7F; + + if (remain == 0) + return -1; - byte[] b = new byte[len]; + len = 0; - System.arraycopy(buffer, pos, b, 0, len); - - pos += len; - count -= len; + while (remain > 0) { + len = len << 8; + len = len | (readByte() & 0xff); + remain--; + } - return b; - } + return len; + } - public int available() - { - return count; - } + public int ignoreNextObject() throws IOException { + int type = readByte() & 0xff; + int len = readLength(); + + if ((len < 0) || len > available()) + throw new IOException("Illegal len in DER object (" + len + ")"); - private int readLength() throws IOException - { - int len = readByte() & 0xff; + readBytes(len); + return type; + } + + public BigInteger readInt() throws IOException { + int type = readByte() & 0xff; - if ((len & 0x80) == 0) - return len; + if (type != 0x02) + throw new IOException("Expected DER Integer, but found type " + type); - int remain = len & 0x7F; + int len = readLength(); - if (remain == 0) - return -1; + if ((len < 0) || len > available()) + throw new IOException("Illegal len in DER object (" + len + ")"); - len = 0; - - while (remain > 0) - { - len = len << 8; - len = len | (readByte() & 0xff); - remain--; - } + byte[] b = readBytes(len); + BigInteger bi = new BigInteger(b); + return bi; + } + + public int readConstructedType() throws IOException { + int type = readByte() & 0xff; - return len; - } + if ((type & CONSTRUCTED) != CONSTRUCTED) + throw new IOException("Expected constructed type, but was " + type); + + return type & 0x1f; + } - public int ignoreNextObject() throws IOException - { - int type = readByte() & 0xff; + public SimpleDERReader readConstructed() throws IOException { + int len = readLength(); + + if ((len < 0) || len > available()) + throw new IOException("Illegal len in DER object (" + len + ")"); - int len = readLength(); + SimpleDERReader cr = new SimpleDERReader(buffer, pos, len); + pos += len; + count -= len; + return cr; + } - if ((len < 0) || len > available()) - throw new IOException("Illegal len in DER object (" + len + ")"); + public byte[] readSequenceAsByteArray() throws IOException { + int type = readByte() & 0xff; + + if (type != 0x30) + throw new IOException("Expected DER Sequence, but found type " + type); + + int len = readLength(); - readBytes(len); - - return type; - } - - public BigInteger readInt() throws IOException - { - int type = readByte() & 0xff; - - if (type != 0x02) - throw new IOException("Expected DER Integer, but found type " + type); - - int len = readLength(); + if ((len < 0) || len > available()) + throw new IOException("Illegal len in DER object (" + len + ")"); + + byte[] b = readBytes(len); + return b; + } + + public String readOid() throws IOException { + int type = readByte() & 0xff; + + if (type != 0x06) + throw new IOException("Expected DER OID, but found type " + type); + + int len = readLength(); - if ((len < 0) || len > available()) - throw new IOException("Illegal len in DER object (" + len + ")"); + if ((len < 1) || len > available()) + throw new IOException("Illegal len in DER object (" + len + ")"); - byte[] b = readBytes(len); - - return new BigInteger(b); - } + byte[] b = readBytes(len); + long value = 0; + StringBuilder sb = new StringBuilder(64); - public byte[] readSequenceAsByteArray() throws IOException - { - int type = readByte() & 0xff; - - if (type != 0x30) - throw new IOException("Expected DER Sequence, but found type " + type); - - int len = readLength(); + switch (b[0] / 40) { + case 0: + sb.append('0'); + break; + + case 1: + sb.append('1'); + b[0] -= 40; + break; + + default: + sb.append('2'); + b[0] -= 80; + break; + } - if ((len < 0) || len > available()) - throw new IOException("Illegal len in DER object (" + len + ")"); + for (int i = 0; i < len; i++) { + value = (value << 7) + (b[i] & 0x7F); + + if ((b[i] & 0x80) == 0) { + sb.append('.'); + sb.append(value); + value = 0; + } + } + + return sb.toString(); + } - return readBytes(len); - } - - public byte[] readOctetString() throws IOException - { - int type = readByte() & 0xff; - - if (type != 0x04) - throw new IOException("Expected DER Octetstring, but found type " + type); - - int len = readLength(); + public byte[] readOctetString() throws IOException { + int type = readByte() & 0xff; + + if (type != 0x04 && type != 0x03) + throw new IOException("Expected DER Octetstring, but found type " + type); - if ((len < 0) || len > available()) - throw new IOException("Illegal len in DER object (" + len + ")"); + int len = readLength(); - return readBytes(len); - } + if ((len < 0) || len > available()) + throw new IOException("Illegal len in DER object (" + len + ")"); + + byte[] b = readBytes(len); + return b; + } }