
BigIntegerUtil 

1 /* $RCSfile: BigIntegerUtil.java,v $ 2 * $Revision: 1.2 $ 3 * $Date: 2002/01/04 14:05:50 $ 4 * $Author: uwe $ 5 * $State: Exp $ 6 * 7 * Created on December 20, 2001 10:13 AM 8 * 9 * Copyright (C) 2001 Uwe Guenther <uwe@cscc.de> 10 * 11 * This file is part of the jhbci JCEServiceProvider. The jhbci JCE 12 * ServiceProvider is a library, written in JavaTM, that should be 13 * used in HBCI banking applications (clients and may be servers), 14 * to do cryptographic operations. 15 * 16 * The jhbci library is free software; you can redistribute it and/or 17 * modify it under the terms of the GNU Lesser General Public 18 * License as published by the Free Software Foundation; either 19 * version 2.1 of the License, or (at your option) any later version. 20 * 21 * The jhbci library is distributed in the hope that it will be useful, 22 * but WITHOUT ANY WARRANTY; without even the implied warranty of 23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 24 * Lesser General Public License for more details. 25 * 26 * You should have received a copy of the GNU Lesser General Public 27 * License along with this library; if not, write to the Free Software 28 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 021111307 USA 29 * 30 */ 31 32 package de.cscc.crypto.util; 33 34 import java.math.BigInteger; 35 36 /** 37 * BigIntegerUtil Class. 38 * 39 * <p>This is a wrapper class for frequentliy used methods that are missed in 40 * the BigInteger class. Because BigInteger is immutable we are not able to 41 * extend this class. 42 * 43 * @author <a href=mailto:uwe@cscc.de>Uwe Günther</a> 44 * 45 * @version $Revision: 1.2 $ 46 */ 47 public final class BigIntegerUtil { 48 49 /** This class can't be instance, because its constructor is private.*/ 50 private BigIntegerUtil() {} 51 52 /** 53 * Cuts a leading 0x00 byte that indicates that this number is non negative. 54 * 55 * <p>BigInterger#toByteArray returns a two'scomplement representation 56 * of the BigInteger. This does not matter because we hav a non negative 57 * number (number >= 0). Two's Complement uses the leftmost bit (most 58 * significant bit) for the sign bit. Because BigInteger represents 59 * infinite numbers, there is no concrete sign bit. This isn't realy a 60 * problem for us, because positive numbers has no sign bit. But what, if 61 * a positive number where the leftmost bit in its leftmost byte is set? 62 * Is it a negative or a positive number? For these cases 63 * BigInteger#toByteArray adds a whole 0x00 byte add the left side to 64 * indicate this number is positive. This byte is bad for us, so we want to 65 * filter it out in this method. 66 * 67 * @param signature the signature that will be converted to an unsigned byte[]. 68 * @throws NullPointerException if signature is null. 69 * @throws IllegalArgumentException if signature is a negative number. 70 * @see java.math.BigInteger#toByteArray 71 */ 72 public static byte[] toUnsignedByteArray(BigInteger signature) { 73 74 if (signature == null) { 75 throw new NullPointerException("Parameter signature is null."); 76 } 77 if (signature.compareTo(BigInteger.ZERO) < 0) { 78 //signature < ZERO 79 throw new IllegalArgumentException( 80 "Parameter signature is negative. signature: " + signature); 81 } 82 83 //Fetch two'scomplement representation of the signature (BigInteger) 84 byte[] twosComplement = signature.toByteArray(); 85 86 //If there is no leading Zero byte, we are right. 87 if (twosComplement[0] != 0x00) { 88 return twosComplement; 89 } 90 //We have a leading 0x00 byte, but twosComplement.length is only 1, that 91 //means our signature has the number "0". 92 if (twosComplement.length == 1) { 93 return twosComplement; 94 } 95 //If we are at this point, we should cut the leading 0x00 byte that 96 //is only an indicator that our number is not negative. 97 byte[] unsigned = new byte[twosComplement.length  1]; 98 for (int i = 0; i < unsigned.length; i++) { 99 unsigned[i] = twosComplement[i + 1]; 100 } 101 //We return the new unsigned value. 102 return unsigned; 103 } 104 105 106 } 107

BigIntegerUtil 
