opencard.core.terminal
Class APDU

java.lang.Object
  |
  +--opencard.core.terminal.APDU
Direct Known Subclasses:
CommandAPDU, ResponseAPDU

public abstract class APDU
extends java.lang.Object

An APDU represents a Application Protocol Data Unit which is the basic unit of communication with a smart card.

See Also:
CommandAPDU, ResponseAPDU

Field Summary
protected  byte[] apdu_buffer
          A buffer to hold the re-usable command APDU.
protected  int apdu_length
          The length of the command APDU currently in the buffer.
 
Constructor Summary
APDU(byte[] buffer)
          Creates a new re-usable APDU and initializes it with the given buffer.
APDU(byte[] buffer, int length)
          Creates a new re-usable APDU and initializes it with the given buffer.
APDU(int size)
          Creates a new re-usable APDU with a given buffer size.
 
Method Summary
 void append(byte b)
          Appends the given byte to the internally buffered APDU.
 void append(byte[] bytes)
          Appends the given byte array to the internally buffered APDU.
 byte[] getBuffer()
          Returns the internal APDU buffer.
 int getByte(int index)
          Gets the byte at the specified position in the buffer.
 byte[] getBytes()
          Returns a byte array holding the buffered APDU.
 int getLength()
          Returns the length of the buffered APDU.
 void setByte(int index, int value)
          Sets the byte at the specified position in the buffer.
 void setLength(int length)
          Sets the length of valid range within the APDU buffer.
 java.lang.String toString()
          Returns a human-readable string representation of this APDU.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

apdu_buffer

protected byte[] apdu_buffer
A buffer to hold the re-usable command APDU.

apdu_length

protected int apdu_length
The length of the command APDU currently in the buffer.
Constructor Detail

APDU

public APDU(byte[] buffer)
Creates a new re-usable APDU and initializes it with the given buffer. The internal buffer's length is set to the length of the buffer passed.
Parameters:
buffer - the byte array to be used for holding the APDU
See Also:
getLength()

APDU

public APDU(byte[] buffer,
            int length)
Creates a new re-usable APDU and initializes it with the given buffer. The buffer is assumed to hold an APDU. The length of the internally buffered APDU is set to length.
Parameters:
buffer - the byte array to be used for holding the APDU
length - the length of the APDU currently in the buffer
Throws:
java.lang.IndexOutOfBoundsException - length exceeds the size of the array bytes.
See Also:
getLength()

APDU

public APDU(int size)
Creates a new re-usable APDU with a given buffer size. A new buffer with the given size is allocated. The length of the internally buffered APDU is set to 0.
Parameters:
size - the size of the buffer to create
See Also:
getLength()
Method Detail

append

public void append(byte[] bytes)
            throws java.lang.IndexOutOfBoundsException
Appends the given byte array to the internally buffered APDU.
Parameters:
bytes - the byte array to be appended
Throws:
java.lang.IndexOutOfBoundsException - The buffer size is exceeded.

append

public void append(byte b)
            throws java.lang.IndexOutOfBoundsException
Appends the given byte to the internally buffered APDU.
Parameters:
b - the byte to be appended
Throws:
java.lang.IndexOutOfBoundsException - The buffer size is exceeded.

getBuffer

public final byte[] getBuffer()
Returns the internal APDU buffer. This method allows complex manipulations of the buffered APDU, for example MAC calculation. If the length of the APDU is changed by such an operation, setLength has to be used to store the new length.
Returns:
the buffer that holds the current APDU
See Also:
setLength(int)

getByte

public final int getByte(int index)
Gets the byte at the specified position in the buffer. The byte is converted to a positive integer in the range 0..255. This method can only be used to access the APDU currently stored. It is not possible to read beyond the end of the APDU.
Parameters:
index - the position in the buffer
Returns:
the value at the given position, or -1 if the position is invalid
See Also:
setByte(int, int), getLength()

getBytes

public final byte[] getBytes()
Returns a byte array holding the buffered APDU. The byte array returned gets allocated with the exact size of the buffered APDU. To get direct access to the internal buffer, use getBuffer.
Returns:
the buffered APDU, copied into a new array
See Also:
getBuffer()

getLength

public final int getLength()
Returns the length of the buffered APDU.
Returns:
the length of the APDU currently stored

setByte

public final void setByte(int index,
                          int value)
Sets the byte at the specified position in the buffer. The byte is passed as an integer, for consistence with getByte. This method can only be used to modify an APDU already stored. It is not possible to set bytes beyond the end of the current APDU. The method will behave as a no-op if this happens. Use append(byte) to extend the APDU.
Parameters:
index - the position in the buffer
value - the byte to store there
See Also:
getByte(int), append(byte)

setLength

public final void setLength(int length)
                     throws java.lang.IndexOutOfBoundsException
Sets the length of valid range within the APDU buffer. This method can be used to cut off the end of the APDU. It can also be used to increase the size of the APDU. In this case, it is the caller's responsibility to fill the additional bytes with useful information.
Parameters:
length - new length of the valid range
Throws:
java.lang.IndexOutOfBoundsException - thrown when the buffer size is exceeded

toString

public java.lang.String toString()
Returns a human-readable string representation of this APDU. This method does not use caching but creates the string from scratch on each invocation.
Returns:
a hex dump of the APDU currently stored
Overrides:
toString in class java.lang.Object