package org.basex.query.func; import org.basex.query.QueryContext; import org.basex.query.QueryException; import org.basex.query.expr.Expr; import org.basex.query.item.AtomType; import org.basex.query.item.Item; import org.basex.query.util.Err; import org.basex.query.util.crypto.DigitalSignature; import org.basex.query.util.crypto.Encryption; import org.basex.util.InputInfo; import org.basex.util.Token; /** * EXPath Cryptographic Module. * @author BaseX Team 2005-12, BSD License * @author Lukas Kircher */ public class FNCrypto extends StandardFunc { /** * Constructor. * @param ii input info * @param fd function * @param args function arguments */ public FNCrypto(final InputInfo ii, final Function fd, final Expr[] args) { super(ii, fd, args); } @Override public Item item(final QueryContext ctx, final InputInfo ii) throws QueryException { switch(sig) { case _CRYPTO_HMAC: return new Encryption(ii).hmac(checkStr(expr[0], ctx), checkStr(expr[1], ctx), checkStr(expr[2], ctx), expr.length == 4 ? checkStr(expr[3], ctx) : Token.EMPTY); case _CRYPTO_ENCRYPT: return new Encryption(ii).encryption(checkStr(expr[0], ctx), checkStr(expr[1], ctx), checkStr(expr[2], ctx), checkStr(expr[3], ctx), true); case _CRYPTO_DECRYPT: return new Encryption(ii).encryption(checkStr(expr[0], ctx), checkStr(expr[1], ctx), checkStr(expr[2], ctx), checkStr(expr[3], ctx), false); case _CRYPTO_GENERATE_SIGNATURE: // determine type of 7th argument Item arg6 = null; boolean arg6Str = false; if(expr.length > 6) { arg6 = checkItem(expr[6], ctx); if(arg6.type.isString()) arg6Str = true; else if(arg6.type.isNode()); else Err.type(this, AtomType.STR, arg6); } return new DigitalSignature(ii).generateSignature( checkNode(expr[0].item(ctx, ii)), checkStr(expr[1], ctx), checkStr(expr[2], ctx), checkStr(expr[3], ctx), checkStr(expr[4], ctx), checkStr(expr[5], ctx), arg6Str ? arg6.string(ii) : Token.token(""), expr.length > 7 ? checkNode(expr[7].item(ctx, ii)) : expr.length == 7 && !arg6Str ? checkNode(expr[6].item(ctx, ii)) : null); case _CRYPTO_VALIDATE_SIGNATURE: return new DigitalSignature(ii). validateSignature(checkNode(expr[0].item(ctx, ii))); default: return super.item(ctx, ii); } } }