package hamaster.gradesgin.ibe; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable; import java.util.Arrays; /** * IBE系统参数 包含系统公共参数和系统主密钥 * The system parameter of an IBE system, containing the public parameter and system master key. * @author <a href="mailto:wangyeee@gmail.com">Wang Ye</a> */ public class IBESystemParameter implements Serializable, IBEConstraints { private static final long serialVersionUID = 784755162095627372L; /** * 公共参数 * The public key */ protected IBEPublicParameter publicParameter; /** * 主密钥 * The system master key, all user private keys are generated from this key. */ protected byte[] masterKey; public IBESystemParameter() { } public IBEPublicParameter getPublicParameter() { return publicParameter; } public void setPublicParameter(IBEPublicParameter publicParameter) { this.publicParameter = publicParameter; } public byte[] getMasterKey() { return masterKey; } public void setMasterKey(byte[] masterKey) { this.masterKey = masterKey; } /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Arrays.hashCode(masterKey); result = prime * result + ((publicParameter == null) ? 0 : publicParameter.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 IBESystemParameter)) return false; IBESystemParameter other = (IBESystemParameter) obj; if (!Arrays.equals(masterKey, other.masterKey)) return false; if (publicParameter == null) { if (other.publicParameter != null) return false; } else if (!publicParameter.equals(other.publicParameter)) return false; return true; } /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "IBESystemParameter [publicParameter=" + publicParameter + ", masterKey=" + Arrays.toString(masterKey) + "]"; } /* * (non-Javadoc) * @see hamaster.gradesgin.ibe.IBEConstraints#writeExternal(java.io.OutputStream) */ @Override public void writeExternal(OutputStream out) throws IOException { if (masterKey == null) { byte[] zero = new byte[IBE_ZR_SIZE]; Arrays.fill(zero, (byte) 0); out.write(zero); } else { // TODO encryption is also needed to protect the master key with a password. out.write(masterKey); } if (publicParameter != null) publicParameter.writeExternal(out); out.flush(); } /* * (non-Javadoc) * @see hamaster.gradesgin.ibe.IBEConstraints#readExternal(java.io.InputStream) */ @Override public void readExternal(InputStream in) throws IOException, ClassNotFoundException { this.masterKey = new byte[IBE_ZR_SIZE]; if (IBE_ZR_SIZE != in.read(masterKey)) throw new IOException("Not enough bytes for a SystemParameter"); this.publicParameter = new IBEPublicParameter(); publicParameter.readExternal(in); } }