package hamaster.gradesign.mail;
import hamaster.gradesgin.ibe.core.IBEEngine;
import hamaster.gradesgin.ibs.IBSSignature;
import hamaster.gradesgin.util.Hash;
import hamaster.gradesign.IBECSR;
import hamaster.gradesign.client.Base64Encoder;
import hamaster.gradesign.client.Encoder;
import hamaster.gradesign.daemon.EJBClient;
import hamaster.gradesign.dao.IDRequestDAO;
import hamaster.gradesign.dao.UserDAO;
import hamaster.gradesign.entity.IDRequest;
import hamaster.gradesign.entity.User;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;
public class IBEMailParameterGenerator {
public final static String CONTENT_KEY = "c";// content
public final static String SIGNATURE_KEY = "s";//signature
final private static long oneweek = 604800000L; // 7天
private UserDAO userDAO;
private IDRequestDAO requestDAO;
public IBEMailParameterGenerator() {
}
public Properties sign(ActivationContent content) {
Properties props = new Properties();
byte[] bs = ActivationContent.toBytes(content);
byte[] digest = Hash.sha256(bs);
EJBClient client = EJBClient.getInstance();
IBSSignature signature = IBEEngine.sign(client.serverCertificate(), digest, "SHA-256");
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
signature.writeExternal(out);
out.flush();
} catch (IOException e) {
}
byte[] sign = out.toByteArray();
Encoder base64 = new Base64Encoder();
String ct = base64.encode(bs);
ct = ct.replace('+', '*');
ct = ct.replace('/', '-');
ct = ct.replaceAll("=", "%3D");
String sg = base64.encode(sign);
sg = sg.replace('+', '*');
sg = sg.replace('/', '-');
sg = sg.replaceAll("=", "%3D");
props.setProperty(CONTENT_KEY, ct);
props.setProperty(SIGNATURE_KEY, sg);
return props;
}
public int verify(byte[] content, byte[] signature) {
byte[] digest = Hash.sha256(content);
IBSSignature sign = new IBSSignature();
ByteArrayInputStream in = new ByteArrayInputStream(signature);
try {
sign.readExternal(in);
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
boolean b0 = IBEEngine.verify(sign, digest);
if (!b0)
return 1;// 错误
ActivationContent activationContent = ActivationContent.fromBytes(content);
long now = System.currentTimeMillis();
long start = activationContent.getActiveDate().getTime();
if (now - start < oneweek) {
User applicant = userDAO.get(User.class, activationContent.getUserId());
if (activationContent.getType() == ActivationContent.ACTIVE_ID) {
IDRequest request = requestDAO.getByOwner(applicant, activationContent.getEmail());
if (request.getStatus() != IBECSR.APPLICATION_NOT_VERIFIED)
return 3;//已经激活
request.setStatus(IBECSR.APPLICATION_STARTED);
requestDAO.update(request);
} else if (activationContent.getType() == ActivationContent.ACTIVE_USER) {
if (applicant.getStatus() != User.USER_REG)
return 3;
applicant.setStatus(User.USER_ACTIVE);
userDAO.update(applicant);
}
return 0;// 成功
}
return 2;// 过期
}
public void setRequestDAO(IDRequestDAO requestDAO) {
this.requestDAO = requestDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}