/** * * Copyright (c) 2014, the Railo Company Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. * **/ package lucee.runtime.functions.displayFormatting; import java.nio.charset.Charset; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import lucee.commons.digest.MD5; import lucee.commons.io.CharsetUtil; import lucee.commons.lang.StringUtil; import lucee.runtime.PageContext; import lucee.runtime.exp.PageException; import lucee.runtime.ext.function.Function; import lucee.runtime.op.Caster; import lucee.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 Charset cs; if(StringUtil.isEmpty(charset,true)) cs=pc.getWebCharset(); else 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); } }