172 lines
6.0 KiB
Java
172 lines
6.0 KiB
Java
/*
|
|
SmartPGP : JavaCard implementation of OpenPGP card v3 specification
|
|
https://c0de.dev/c0de/SmartPGP
|
|
Copyright (C) 2016 ANSSI
|
|
Copyright (C) 2023 Code Fox <SmartPGP@c0de.dev>
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
package dev.c0de.smartpgp;
|
|
|
|
import javacard.framework.*;
|
|
|
|
public final class Transients {
|
|
|
|
protected final byte[] buffer;
|
|
|
|
private final short[] shorts;
|
|
private static final byte SHORT_OFFSET_CURRENT_TAG = 0;
|
|
private static final byte SHORT_OFFSET_OUTPUT_START = SHORT_OFFSET_CURRENT_TAG + 1;
|
|
private static final byte SHORT_OFFSET_OUTPUT_LENGTH = SHORT_OFFSET_OUTPUT_START + 1;
|
|
private static final byte SHORT_OFFSET_CHAINING_INPUT_LENGTH = SHORT_OFFSET_OUTPUT_LENGTH + 1;
|
|
private static final byte SHORTS_SIZE = SHORT_OFFSET_CHAINING_INPUT_LENGTH + 1;
|
|
|
|
private final byte[] bytes;
|
|
private static final byte BYTE_OFFSET_CHAINING_INPUT_INS = 0;
|
|
private static final byte BYTE_OFFSET_CHAINING_INPUT_P1 = BYTE_OFFSET_CHAINING_INPUT_INS + 1;
|
|
private static final byte BYTE_OFFSET_CHAINING_INPUT_P2 = BYTE_OFFSET_CHAINING_INPUT_P1 + 1;
|
|
private static final byte BYTE_OFFSET_CURRENT_TAG_OCCURRENCE = BYTE_OFFSET_CHAINING_INPUT_P2 + 1;
|
|
private static final byte BYTES_SIZE = BYTE_OFFSET_CURRENT_TAG_OCCURRENCE + 1;
|
|
|
|
private final boolean[] booleans;
|
|
private static final byte BOOLEAN_OFFSET_CHAINING_OUTPUT = 0;
|
|
private static final byte BOOLEAN_OFFSET_CHAINING_INPUT = BOOLEAN_OFFSET_CHAINING_OUTPUT + 1;
|
|
private static final byte BOOLEAN_OFFSET_USER_PIN_MODE_81 = BOOLEAN_OFFSET_CHAINING_INPUT + 1;
|
|
private static final byte BOOLEAN_OFFSET_USER_PIN_MODE_82 = BOOLEAN_OFFSET_USER_PIN_MODE_81 + 1;
|
|
private static final byte BOOLEANS_SIZE = BOOLEAN_OFFSET_USER_PIN_MODE_82 + 1;
|
|
|
|
|
|
protected Transients() {
|
|
buffer = JCSystem.makeTransientByteArray(Constants.INTERNAL_BUFFER_MAX_LENGTH,
|
|
JCSystem.CLEAR_ON_DESELECT);
|
|
shorts = JCSystem.makeTransientShortArray(SHORTS_SIZE,
|
|
JCSystem.CLEAR_ON_DESELECT);
|
|
bytes = JCSystem.makeTransientByteArray(BYTES_SIZE,
|
|
JCSystem.CLEAR_ON_DESELECT);
|
|
booleans = JCSystem.makeTransientBooleanArray(BOOLEANS_SIZE,
|
|
JCSystem.CLEAR_ON_DESELECT);
|
|
}
|
|
|
|
protected final void clear() {
|
|
for(byte i = 0; i < shorts.length; ++i) {
|
|
shorts[i] = (short)0;
|
|
}
|
|
for(byte i = 0; i < bytes.length; ++i) {
|
|
bytes[i] = (byte)0;
|
|
}
|
|
for(byte i = 0; i < booleans.length; ++i) {
|
|
booleans[i] = false;
|
|
}
|
|
}
|
|
|
|
protected final void setCurrentTag(final short tag) {
|
|
shorts[SHORT_OFFSET_CURRENT_TAG] = tag;
|
|
}
|
|
|
|
protected final short currentTag() {
|
|
return shorts[SHORT_OFFSET_CURRENT_TAG];
|
|
}
|
|
|
|
protected final void setChainingInputLength(final short len) {
|
|
shorts[SHORT_OFFSET_CHAINING_INPUT_LENGTH] = len;
|
|
}
|
|
|
|
protected final short chainingInputLength() {
|
|
return shorts[SHORT_OFFSET_CHAINING_INPUT_LENGTH];
|
|
}
|
|
|
|
protected final void setOutputStart(final short off) {
|
|
shorts[SHORT_OFFSET_OUTPUT_START] = off;
|
|
}
|
|
|
|
protected final short outputStart() {
|
|
return shorts[SHORT_OFFSET_OUTPUT_START];
|
|
}
|
|
|
|
protected final void setOutputLength(final short len) {
|
|
shorts[SHORT_OFFSET_OUTPUT_LENGTH] = len;
|
|
}
|
|
|
|
protected final short outputLength() {
|
|
return shorts[SHORT_OFFSET_OUTPUT_LENGTH];
|
|
}
|
|
|
|
protected final void setChainingInputIns(final byte ins) {
|
|
bytes[BYTE_OFFSET_CHAINING_INPUT_INS] = ins;
|
|
}
|
|
|
|
protected final byte chainingInputIns() {
|
|
return bytes[BYTE_OFFSET_CHAINING_INPUT_INS];
|
|
}
|
|
|
|
protected final void setChainingInputP1(final byte p1) {
|
|
bytes[BYTE_OFFSET_CHAINING_INPUT_P1] = p1;
|
|
}
|
|
|
|
protected final byte chainingInputP1() {
|
|
return bytes[BYTE_OFFSET_CHAINING_INPUT_P1];
|
|
}
|
|
|
|
protected final void setChainingInputP2(final byte p2) {
|
|
bytes[BYTE_OFFSET_CHAINING_INPUT_P2] = p2;
|
|
}
|
|
|
|
protected final byte chainingInputP2() {
|
|
return bytes[BYTE_OFFSET_CHAINING_INPUT_P2];
|
|
}
|
|
|
|
protected final void setCurrentTagOccurrence(final byte occ) {
|
|
bytes[BYTE_OFFSET_CURRENT_TAG_OCCURRENCE] = occ;
|
|
}
|
|
|
|
protected final byte currentTagOccurrence() {
|
|
return bytes[BYTE_OFFSET_CURRENT_TAG_OCCURRENCE];
|
|
}
|
|
|
|
protected final void setChainingOutput(final boolean chaining) {
|
|
booleans[BOOLEAN_OFFSET_CHAINING_OUTPUT] = chaining;
|
|
}
|
|
|
|
protected final boolean chainingOutput() {
|
|
return booleans[BOOLEAN_OFFSET_CHAINING_OUTPUT];
|
|
}
|
|
|
|
protected final void setChainingInput(final boolean chaining) {
|
|
booleans[BOOLEAN_OFFSET_CHAINING_INPUT] = chaining;
|
|
}
|
|
|
|
protected final boolean chainingInput() {
|
|
return booleans[BOOLEAN_OFFSET_CHAINING_INPUT];
|
|
}
|
|
|
|
protected final void setUserPinMode81(final boolean is81) {
|
|
booleans[BOOLEAN_OFFSET_USER_PIN_MODE_81] = is81;
|
|
}
|
|
|
|
protected final boolean userPinMode81() {
|
|
return booleans[BOOLEAN_OFFSET_USER_PIN_MODE_81];
|
|
}
|
|
|
|
protected final void setUserPinMode82(final boolean is82) {
|
|
booleans[BOOLEAN_OFFSET_USER_PIN_MODE_82] = is82;
|
|
}
|
|
|
|
protected final boolean userPinMode82() {
|
|
return booleans[BOOLEAN_OFFSET_USER_PIN_MODE_82];
|
|
}
|
|
|
|
}
|