X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fcrypto%2FRSA.java;h=e3c179ce63427fb2349682879d9206b2ca578932;hb=HEAD;hp=7156cce7636acc1dc6e80edda3ee76ef65ef7113;hpb=8ebc6a170e802a5f040b677c72cb0da601900fa8;p=org.ibex.crypto.git diff --git a/src/org/ibex/crypto/RSA.java b/src/org/ibex/crypto/RSA.java index 7156cce..e3c179c 100644 --- a/src/org/ibex/crypto/RSA.java +++ b/src/org/ibex/crypto/RSA.java @@ -2,6 +2,11 @@ // Licensed under the Apache Public Source License 2.0 ("the License"). // You may not use this file except in compliance with the License. +/* + * org.ibex.RSA - By Brian Alliet + * Copyright (C) 2004 Brian Alliet + */ + package org.ibex.crypto; import java.math.BigInteger; import java.util.*; @@ -20,16 +25,18 @@ public class RSA { public int getInputBlockSize() { return (pq.bitLength()+7) / 8 - (reverse ? 0 : 1); } public int getOutputBlockSize() { return (pq.bitLength()+7) / 8 - (reverse ? 1 : 0); } + // FEATURE: Check that in.length is within the expected range public byte[] process(byte[] in) { // output block is the same size as the modulus (rounded up) int outSize = getOutputBlockSize(); BigInteger t = new BigInteger(1,in); BigInteger c = t.modPow(e,pq); byte[] cbytes = c.toByteArray(); - if(cbytes.length > outSize || (reverse && cbytes[0] == 0)) { + if(cbytes.length > outSize + 1) throw new RuntimeException("should never happen"); + if(reverse ? cbytes[0] == 0 : cbytes.length > outSize) { if(cbytes[0] != 0) throw new RuntimeException("should never happen"); - byte[] buf = new byte[outSize]; - System.arraycopy(cbytes,1,buf,0,outSize); + byte[] buf = new byte[cbytes.length-1]; + System.arraycopy(cbytes,1,buf,0,buf.length); return buf; } else if(!reverse && cbytes.length < outSize) { // output needs to be exactly outSize in length