package hamaster.gradesgin.ibe;
import static hamaster.gradesign.ibe.util.Hex.bytesToInt;
import static hamaster.gradesign.ibe.util.Hex.intToByte;
import hamaster.gradesgin.util.MemoryUtil;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.security.PublicKey;
import java.util.Arrays;
/**
* IBE用户公钥
* @author <a href="mailto:wangyeee@gmail.com">Wang Ye</a>
* @deprecated 由于身份即公钥 使用时用字符串代替这个类
*/
@Deprecated
public class IBEPublicKey implements IBEConstraints, Serializable, PublicKey {
private static final long serialVersionUID = -4861524673840672351L;
/**
* 用户ID的摘要值(PBC hash)
*/
private byte[] user;
/**
* 用户ID 即实际使用的公钥
*/
private String userString;
public IBEPublicKey() {
}
public byte[] getUser() {
return user;
}
public void setUser(byte[] user) {
this.user = user;
}
public String getUserString() {
return userString;
}
public void setUserString(String userString) {
this.userString = userString;
}
/*
* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(user);
result = prime * result
+ ((userString == null) ? 0 : userString.hashCode());
return result;
}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof IBEPublicKey))
return false;
IBEPublicKey other = (IBEPublicKey) obj;
if (!Arrays.equals(user, other.user))
return false;
if (userString == null) {
if (other.userString != null)
return false;
} else if (!userString.equals(other.userString))
return false;
return true;
}
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "IBEPublicKey [user=" + Arrays.toString(user) + ", userString="
+ userString + "]";
}
/*
* (non-Javadoc)
* @see java.security.Key#getAlgorithm()
*/
@Override
public String getAlgorithm() {
return "IBE";
}
/*
* (non-Javadoc)
* @see java.security.Key#getFormat()
*/
@Override
public String getFormat() {
return null;
}
/*
* (non-Javadoc)
* @see java.security.Key#getEncoded()
*/
@Override
public byte[] getEncoded() {
return null;
}
/**
* 序列化字段:<br>
* 用户ID摘要 20字节<br>
* 用户ID长度 4字节<br>
* 用户ID字符串
* @see hamaster.gradesgin.ibe.IBEConstraints#writeExternal(java.io.OutputStream)
*/
@Override
public void writeExternal(OutputStream out) throws IOException {
byte[] encoded = getEncoded();
if (encoded != null) {
out.write(encoded);
out.flush();
return;
}
// 不编码,直接将公钥写入输出流
byte[] userBuffer = new byte[IBE_ZR_SIZE];
Arrays.fill(userBuffer, (byte) 0);
if (user != null)
System.arraycopy(user, 0, userBuffer, 0, IBE_ZR_SIZE > user.length ? user.length : IBE_ZR_SIZE);
out.write(userBuffer);
int keySize = userString == null ? 0 : userString.getBytes(USER_STRING_ENCODING).length;
out.write(intToByte(keySize));
byte[] strBuffer = null;
if (userString != null) {
strBuffer = userString.getBytes(USER_STRING_ENCODING);
out.write(strBuffer);
}
out.flush();
if (strBuffer != null)
MemoryUtil.fastSecureBuffers(userBuffer, strBuffer);
else
MemoryUtil.fastSecureBuffers(userBuffer);
}
/*
* (non-Javadoc)
* @see hamaster.gradesgin.ibe.IBEConstraints#readExternal(java.io.InputStream)
*/
@Override
public void readExternal(InputStream in) throws IOException, ClassNotFoundException {
byte[] buffer = new byte[IBE_ZR_SIZE];
int keySize = in.read(buffer);
if (keySize != buffer.length)
throw new IOException("Not enough bytes for a PublicKey");
this.user = new byte[IBE_ZR_SIZE];
System.arraycopy(buffer, 0, user, 0, IBE_ZR_SIZE);
byte[] kTmp = new byte[4];
Arrays.fill(kTmp, (byte) 0);
if (4 != in.read(kTmp)) {
throw new IOException("Not enough bytes for a PublicKey");
}
keySize = bytesToInt(kTmp);
byte[] kBuffer = new byte[keySize];
keySize = in.read(kBuffer);
if (keySize != kBuffer.length)
throw new IOException("Not enough bytes for a PublicKey");
this.userString = new String(kBuffer, USER_STRING_ENCODING);
MemoryUtil.fastSecureBuffers(buffer);
}
}