package hamaster.gradesign.ibe;
import hamaster.gradesign.ibe.jni.IBENative;
/**
* 对IBE的Java封装
* @author <a href="mailto:wangyeee@gmail.com">王烨</a>
*/
public final class IBELibrary {
public final static int PBC_G_SIZE = 128;
public final static int PBC_ZR_SIZE = 20;
private IBELibrary() {
}
/**
* 生成系统参数
* @param alphaOut 系统主密钥,长度20字节
* @param gOut 参数g,长度128字节
* @param g1Out 参数g1,长度128字节
* @param hOut 参数h,长度128字节
* @param pairingIn 椭圆曲线参数
* @return
*/
public final static int setup(byte[] alphaOut, byte[] gOut, byte[] g1Out, byte[] hOut, byte[] pairingIn) {
ensureArrayCapacity(alphaOut, PBC_ZR_SIZE);
ensureArrayCapacity(gOut, PBC_G_SIZE);
ensureArrayCapacity(g1Out, PBC_G_SIZE);
ensureArrayCapacity(hOut, PBC_G_SIZE);
return IBENative.setup_str(alphaOut, gOut, g1Out, hOut, pairingIn);
}
/**
* 为用户生成私钥
* @param hIDOut 私钥hID参数,长度128字节
* @param rIDOut 私钥rID参数,长度20字节
* @param userIn 用户身份,如电子邮件地址
* @param alphaIn 系统主密钥,长度20字节
* @param gIn 参数g,长度128字节
* @param hIn 参数h,长度128字节
* @param pairingIn 椭圆曲线参数
* @return
*/
public final static int keygen(byte[] hIDOut, byte[] rIDOut, byte[] userIn, byte[] alphaIn, byte[] gIn, byte[] hIn, byte[] pairingIn) {
ensureArrayCapacity(rIDOut, PBC_ZR_SIZE);
ensureArrayCapacity(hIDOut, PBC_G_SIZE);
return IBENative.keygen_str(hIDOut, rIDOut, userIn, alphaIn, gIn, hIn, pairingIn, true);
}
/**
* 加密数据
* @param cipherBufferOut 输出密文,长度384字节,按照uvw顺序排列
* @param plainIn 明文,长度128字节
* @param gIn 接收方参数g,长度128字节
* @param g1In 接收方参数g1,长度128字节
* @param hIn 接收方参数h,长度128字节
* @param aliceIn 接收方身份,长度20字节
* @param pairingIn 椭圆曲线参数
* @return
*/
public final static int encrypt(byte[] cipherBufferOut, byte[] plainIn, byte[] gIn, byte[] g1In, byte[] hIn, byte[] aliceIn, byte[] pairingIn) {
ensureArrayCapacity(cipherBufferOut, 3 * PBC_G_SIZE);
return IBENative.encrypt_str(cipherBufferOut, plainIn, gIn, g1In, hIn, aliceIn, pairingIn);
}
/**
* 解密数据
* @param plainBufferOut 输出明文,长度128字节
* @param cipherIn 输入密文,长度384字节,按照uvw顺序排列
* @param rIDIn 接收方私钥rID,长度20字节
* @param hIDIn 接收方私钥hID,长度128字节
* @param pairingIn 椭圆曲线参数
* @return
*/
public final static int decrypt(byte[] plainBufferOut, byte[] cipherIn, byte[] rIDIn, byte[] hIDIn, byte[] pairingIn) {
ensureArrayCapacity(plainBufferOut, PBC_G_SIZE);
return IBENative.decrypt_str(plainBufferOut, cipherIn, rIDIn, hIDIn, pairingIn);
}
private final static void ensureArrayCapacity(byte[] array, int min) {
if (array == null)
throw new InvalidKeySizeException(new StringBuilder("array size must be at least:").append(min).append(",actural:0").toString());
if (min < 1)
throw new IllegalArgumentException(new StringBuilder("minimum size must be above zero:").append(min).toString());
if (array.length < min)
throw new InvalidKeySizeException(new StringBuilder("array size must be at least:").append(min).append(",actural:").append(array.length).toString());
}
}