package railo.runtime.functions.displayFormatting; import java.nio.charset.Charset; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import railo.commons.digest.MD5; import railo.commons.io.CharsetUtil; import railo.commons.lang.StringUtil; import railo.runtime.PageContext; import railo.runtime.exp.PageException; import railo.runtime.ext.function.Function; import railo.runtime.op.Caster; import railo.runtime.op.Decision; public class HMAC implements Function { private static final long serialVersionUID = -1999122154087043893L; public static String call(PageContext pc,Object oMessage, Object oKey) throws PageException { return call(pc, oMessage, oKey, null, null); } public static String call(PageContext pc,Object oMessage, Object oKey, String algorithm) throws PageException { return call(pc, oMessage, oKey, algorithm, null); } public static String call(PageContext pc,Object oMessage, Object oKey, String algorithm, String charset) throws PageException { // charset if(StringUtil.isEmpty(charset,true)) charset=pc.getConfig().getWebCharset(); Charset cs = CharsetUtil.toCharset(charset); // message byte[] msg=toBinary(oMessage,cs); // message byte[] key=toBinary(oKey,cs); // algorithm if(StringUtil.isEmpty(algorithm,true)) algorithm = "HmacMD5"; SecretKey sk = new SecretKeySpec(key, algorithm); try { Mac mac = Mac.getInstance(algorithm); mac.init(sk); mac.reset(); mac.update(msg); msg = mac.doFinal(); return MD5.stringify(msg).toUpperCase(); } catch(Exception e) { throw Caster.toPageException(e); } } private static byte[] toBinary(Object obj, Charset cs) throws PageException { if(Decision.isBinary(obj)){ return Caster.toBinary(obj); } return Caster.toString(obj).getBytes(cs); } }