package de.persosim.simulator.perso.xstream; import static org.globaltester.logging.BasicLogger.ERROR; import static org.globaltester.logging.BasicLogger.log; import java.math.BigInteger; import java.security.spec.ECParameterSpec; import java.security.spec.ECPoint; import java.security.spec.EllipticCurve; import com.thoughtworks.xstream.XStreamException; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; /** * This class is a converter which is responsible for serializing/deserializing * ECParameterSpec objects. * * @author jgoeke * */ public class ECParameterSpecConverter implements Converter { int h = 0; BigInteger n = null; EllipticCurve curve = null; ECPoint point = null; @Override public boolean canConvert(@SuppressWarnings("rawtypes") Class clazz) { return clazz.equals(ECParameterSpec.class); } @Override public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) { ECParameterSpec parameterSpec = (ECParameterSpec) object; EllipticCurve curve = parameterSpec.getCurve(); ECPoint point = parameterSpec.getGenerator(); context.convertAnother(curve, new CurveConverter()); context.convertAnother(point, new PointConverter()); BigInteger n = parameterSpec.getOrder(); int h = parameterSpec.getCofactor(); // n element writer.startNode("n"); writer.setValue(n.toString()); writer.endNode(); // h element writer.startNode("h"); writer.setValue(String.valueOf(h)); writer.endNode(); } public void getValuesFromXML(HierarchicalStreamReader reader, UnmarshallingContext context) { while (reader.hasMoreChildren()) { reader.moveDown(); String nodeName = reader.getNodeName(); switch(nodeName) { case "curve": curve = (EllipticCurve) context.convertAnother(reader, EllipticCurve.class, new CurveConverter()); break; case "point": point = (ECPoint) context.convertAnother(reader, ECPoint.class, new PointConverter()); break; case "n": n = new BigInteger(reader.getValue()); break; case "h": h = Integer.parseInt(reader.getValue()); break; } if(reader.hasMoreChildren()) { getValuesFromXML(reader, context); } reader.moveUp(); } } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { if (reader.getNodeName().toLowerCase().endsWith("ecparameterspec")) { getValuesFromXML(reader, context); } if(point == null || curve == null || n == null) { String message = "can not create ParameterSpec object, unmarshal failed!"; log(getClass(), message, ERROR); throw new XStreamException (message); } return new ECParameterSpec(curve, point, n, h); } }