Quadcap Embeddable Database

com/quadcap/crypto/RSAKey.java

Go to the documentation of this file.
00001 package com.quadcap.crypto; 00002 00003 /* Copyright 2002 - 2003 Quadcap Software. All rights reserved. 00004 * 00005 * This software is distributed under the Quadcap Free Software License. 00006 * This software may be used or modified for any purpose, personal or 00007 * commercial. Open Source redistributions are permitted. Commercial 00008 * redistribution of larger works derived from, or works which bundle 00009 * this software requires a "Commercial Redistribution License"; see 00010 * http://www.quadcap.com/purchase. 00011 * 00012 * Redistributions qualify as "Open Source" under one of the following terms: 00013 * 00014 * Redistributions are made at no charge beyond the reasonable cost of 00015 * materials and delivery. 00016 * 00017 * Redistributions are accompanied by a copy of the Source Code or by an 00018 * irrevocable offer to provide a copy of the Source Code for up to three 00019 * years at the cost of materials and delivery. Such redistributions 00020 * must allow further use, modification, and redistribution of the Source 00021 * Code under substantially the same terms as this license. 00022 * 00023 * Redistributions of source code must retain the copyright notices as they 00024 * appear in each source code file, these license terms, and the 00025 * disclaimer/limitation of liability set forth as paragraph 6 below. 00026 * 00027 * Redistributions in binary form must reproduce this Copyright Notice, 00028 * these license terms, and the disclaimer/limitation of liability set 00029 * forth as paragraph 6 below, in the documentation and/or other materials 00030 * provided with the distribution. 00031 * 00032 * The Software is provided on an "AS IS" basis. No warranty is 00033 * provided that the Software is free of defects, or fit for a 00034 * particular purpose. 00035 * 00036 * Limitation of Liability. Quadcap Software shall not be liable 00037 * for any damages suffered by the Licensee or any third party resulting 00038 * from use of the Software. 00039 */ 00040 00041 import java.util.Random; 00042 import java.math.BigInteger; 00043 import java.nio.ByteBuffer; 00044 00045 import com.quadcap.util.Debug; 00046 import com.quadcap.util.Util; 00047 00048 /** 00049 * Implementation detail; factoring operations common to public and 00050 * private RSA keys. 00051 * 00052 * @author Stan Bailes 00053 */ 00054 public abstract class RSAKey implements Key { 00055 static final BigInteger e = new BigInteger("3"); 00056 protected BigInteger n; 00057 String text; 00058 Random random; 00059 int size; 00060 byte[] buf; 00061 00062 protected void init(String text, int size, BigInteger n) { 00063 this.text = text; 00064 this.size = size; 00065 this.n = n; 00066 this.buf = new byte[blockSize()]; 00067 } 00068 00069 /** 00070 * Run the algorithm (encryption or decyption) on the specified 00071 * buffers 00072 */ 00073 public void engine(ByteBuffer in, ByteBuffer out) { 00074 int byteCnt = blockSize(); 00075 Debug.println("BLOCK SIZE: " + byteCnt + " bytes"); 00076 Debug.println("in: [" + in.position() + "/" + in.limit() + "-" + 00077 in.capacity() + "]"); 00078 Debug.println("out: [" + out.position() + "/" + out.limit() + "-" + 00079 out.capacity() + "]"); 00080 while (in.remaining() > 0) { 00081 int len = Math.min(byteCnt, in.remaining()); 00082 in.get(buf, 0, len); 00083 BigInteger pi = new BigInteger(1, buf); 00084 BigInteger xi = engine(pi); 00085 byte[] t = xi.toByteArray(); 00086 if (t.length > byteCnt) { 00087 if (t.length > byteCnt + 1) { 00088 throw new RuntimeException("---- t.length = " + t.length); 00089 } else { 00090 out.put(t, 0, byteCnt); 00091 } 00092 } else { 00093 if (t.length < byteCnt) { 00094 int lim = byteCnt - t.length; 00095 while (lim-- > 0) out.put((byte)0); 00096 } 00097 out.put(t); 00098 } 00099 for (int i = 0; i < buf.length; i++) buf[i] = 0; 00100 } 00101 } 00102 00103 /** 00104 * The derived class actually implements this 00105 */ 00106 public abstract void f(ByteBuffer src, ByteBuffer dst); 00107 00108 /** 00109 * The derived class (public/private) implements this as appropriate 00110 */ 00111 protected abstract BigInteger engine(BigInteger x); 00112 00113 final Random getRandom() { 00114 if (random == null) { 00115 random = new Random(); 00116 } 00117 return random; 00118 } 00119 00120 final void randomBytes(byte[] buf, int pos, int cnt) { 00121 byte[] tbuf = new byte[cnt]; 00122 getRandom().nextBytes(tbuf); 00123 System.arraycopy(tbuf, 0, buf, pos, cnt); 00124 } 00125 00126 public int blockSize() { 00127 return size >> 3; 00128 } 00129 00130 }