/*
*******************************************************************************
* BTChip Bitcoin Hardware Wallet Java Card implementation
* (c) 2013 BTChip - 1BTChip7VfTnrPra5jqci7ejnMguuHogTn
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************
*/
package com.btchip.applet.poc;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
/**
* Basic operations on large unsigned integers
* @author BTChip
*
*/
public class GenericBEHelper {
public static boolean isZero(byte size, byte[] buffer, short offset) {
for (byte i=0; i<size; i++) {
if (buffer[(short)(offset + i)] != 0) {
return false;
}
}
return true;
}
public static void swap(byte size, byte[] target, short targetOffset, byte[] a, short aOffset) {
for (byte i=0; i<size; i++) {
target[(short)(targetOffset + size - 1 - i)] = a[(short)(aOffset + i)];
}
}
public static void add(byte size, byte[] target, short targetOffset, byte[] a, short aOffset, byte[] b, short bOffset) {
boolean carry = false;
for (byte i=0; i<size; i++) {
short val = (short)((short)(a[(short)(aOffset + size - 1 - i)] & 0xff) + (short)(b[(short)(bOffset + size - 1 - i)] & 0xff));
if (carry) {
val++;
}
carry = (val > 255);
target[(short)(targetOffset + size - 1 - i)] = (byte)val;
}
if (carry) {
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
}
}
public static void sub(byte size, byte[] target, short targetOffset, byte[] a, short aOffset, byte[] b, short bOffset) {
boolean borrow = false;
for (byte i=0; i<size; i++) {
short tmpA = (short)(a[(short)(aOffset + size - 1 - i)] & 0xff);
short tmpB = (short)(b[(short)(bOffset + size - 1 - i)] & 0xff);
if (borrow) {
if (tmpA <= tmpB) {
tmpA += (255 + 1) - 1;
}
else {
borrow = false;
tmpA--;
}
}
if (tmpA < tmpB) {
borrow = true;
tmpA += 255 + 1;
}
target[(short)(targetOffset + size - 1 - i)] = (byte)(tmpA - tmpB);
}
if (borrow) {
ISOException.throwIt(ISO7816.SW_WRONG_DATA);
}
}
}