1 /* 2 * Copyright (c) 2000, 2005, 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * 28 * (C) Copyright IBM Corp. 1999 All Rights Reserved. 29 * Copyright 1997 The Open Group Research Institute. All rights reserved. 30 */ 31 32 package sun.security.krb5.internal.util; 33 34 import java.io.BufferedInputStream; 35 import java.io.InputStream; 36 import java.io.IOException; 37 38 /** 39 * This class implements a buffered input stream. It provides methods to read a chunck 40 * of data from underlying data stream. 41 * 42 * @author Yanni Zhang 43 * 44 */ 45 public class KrbDataInputStream extends BufferedInputStream{ 46 private boolean bigEndian = true; 47 setNativeByteOrder()48 public void setNativeByteOrder() { 49 if (java.nio.ByteOrder.nativeOrder(). 50 equals(java.nio.ByteOrder.BIG_ENDIAN)) { 51 bigEndian = true; 52 } else { 53 bigEndian = false; 54 } 55 } KrbDataInputStream(InputStream is)56 public KrbDataInputStream(InputStream is){ 57 super(is); 58 } 59 60 /** 61 * Reads a length value which is represented in 4 bytes from 62 * this input stream. The value must be positive. 63 * @return the length value represented by this byte array. 64 * @throws IOException if there are not enough bytes or it represents 65 * a negative value 66 */ readLength4()67 final public int readLength4() throws IOException { 68 int len = read(4); 69 if (len < 0) { 70 throw new IOException("Invalid encoding"); 71 } 72 return len; 73 } 74 75 /** 76 * Reads up to the specific number of bytes from this input stream. 77 * @param num the number of bytes to be read. 78 * @return the int value of this byte array. 79 * @throws IOException if there are not enough bytes 80 */ read(int num)81 public int read(int num) throws IOException { 82 byte[] bytes = new byte[num]; 83 if (read(bytes, 0, num) != num) { 84 throw new IOException("Premature end of stream reached"); 85 } 86 int result = 0; 87 for (int i = 0; i < num; i++) { 88 if (bigEndian) { 89 result |= (bytes[i] & 0xff) << (num - i - 1) * 8; 90 } else { 91 result |= (bytes[i] & 0xff) << i * 8; 92 } 93 } 94 return result; 95 } 96 readVersion()97 public int readVersion() throws IOException { 98 // always read in big-endian mode 99 int result = (read() & 0xff) << 8; 100 return result | (read() & 0xff); 101 } 102 } 103