Index: common/src/java/org/apache/hadoop/hive/common/AesUtils.java =================================================================== --- common/src/java/org/apache/hadoop/hive/common/AesUtils.java (revision 0) +++ common/src/java/org/apache/hadoop/hive/common/AesUtils.java (revision 0) @@ -0,0 +1,30 @@ +package org.apache.hadoop.hive.common; + +import java.io.UnsupportedEncodingException; + +public class AesUtils { + + public static StringBuffer generate128BitKey(String key_string) throws UnsupportedEncodingException { + StringBuffer buffer = new StringBuffer(); + // key length must be 128 bits (16 bytes) + // if too large cut it down + if (key_string.getBytes("UTF-8").length > 16) { + byte[] short_key = new byte[16]; + for (int i = 0; i < key_string.getBytes("UTF-8").length; ++i) { + short_key[i] = key_string.getBytes("UTF-8")[i]; + } + buffer.append(short_key); + } else + // if too small null pad string + if (key_string.getBytes("UTF-8").length < 16) { + buffer.append(key_string); + for (int i = key_string.getBytes("UTF-8").length; i < 16; i++) { + buffer.append('\0'); + } + } else { + // correct size + buffer.append(key_string); + } + return buffer; + } +} \ No newline at end of file Index: ql/src/test/results/clientpositive/udf_aes.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_aes.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_aes.q.out (revision 0) @@ -0,0 +1,130 @@ +PREHOOK: query: EXPLAIN +SELECT aes_decrypt(aes_encrypt('yo','123'), '123') FROM src LIMIT 1 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT aes_decrypt(aes_encrypt('yo','123'), '123') FROM src LIMIT 1 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF src)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION aes_decrypt (TOK_FUNCTION aes_encrypt 'yo' '123') '123'))) (TOK_LIMIT 1))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: aes_dencrypt(aes_encrypt('yo','123'),'123') + type: string + outputColumnNames: _col0 + Limit + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + + Stage: Stage-0 + Fetch Operator + limit: 1 + + +PREHOOK: query: SELECT aes_decrypt(aes_encrypt('yo','123'), '123') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-15-46_764_4576542499447022539/-mr-10000 +POSTHOOK: query: SELECT aes_decrypt(aes_encrypt('yo','123'), '123') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-15-46_764_4576542499447022539/-mr-10000 +yo +PREHOOK: query: EXPLAIN +SELECT aes_decrypt(aes_encrypt(key,'mysecret'), 'mysecret') FROM src WHERE src.key < 10 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT aes_decrypt(aes_encrypt(key,'mysecret'), 'mysecret') FROM src WHERE src.key < 10 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF src)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION aes_decrypt (TOK_FUNCTION aes_encrypt (TOK_TABLE_OR_COL key) 'mysecret') 'mysecret'))) (TOK_WHERE (< (. (TOK_TABLE_OR_COL src) key) 10)))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Filter Operator + predicate: + expr: (key < 10) + type: boolean + Filter Operator + predicate: + expr: (key < 10) + type: boolean + Select Operator + expressions: + expr: aes_dencrypt(aes_encrypt(key,'mysecret'),'mysecret') + type: string + outputColumnNames: _col0 + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + + Stage: Stage-0 + Fetch Operator + limit: -1 + + +PREHOOK: query: SELECT aes_decrypt(aes_encrypt(key,'mysecret'), 'mysecret') FROM src WHERE src.key < 10 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-15-54_062_3252940370973728282/-mr-10000 +POSTHOOK: query: SELECT aes_decrypt(aes_encrypt(key,'mysecret'), 'mysecret') FROM src WHERE src.key < 10 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-15-54_062_3252940370973728282/-mr-10000 +0 +4 +8 +0 +0 +5 +5 +2 +5 +9 +PREHOOK: query: DESCRIBE FUNCTION aes_decrypt +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION aes_decrypt +POSTHOOK: type: DESCFUNCTION +aes_decrypt(str,key_str) - computer aes digest +PREHOOK: query: DESCRIBE FUNCTION EXTENDED aes_decrypt +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED aes_decrypt +POSTHOOK: type: DESCFUNCTION +aes_decrypt(str,key_str) - computer aes digest +PREHOOK: query: DESCRIBE FUNCTION aes_encrypt +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION aes_encrypt +POSTHOOK: type: DESCFUNCTION +aes_encrypt(str,key_str) - computer aes digest +PREHOOK: query: DESCRIBE FUNCTION EXTENDED aes_encrypt +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED aes_encrypt +POSTHOOK: type: DESCFUNCTION +aes_encrypt(str,key_str) - computer aes digest Index: ql/src/test/results/clientpositive/udf_md5.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_md5.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_md5.q.out (revision 0) @@ -0,0 +1,57 @@ +PREHOOK: query: EXPLAIN +SELECT md5('hive rules!') FROM src LIMIT 1 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT md5('hive rules!') FROM src LIMIT 1 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF src)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION md5 'hive rules!'))) (TOK_LIMIT 1))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: md5('hive rules!') + type: string + outputColumnNames: _col0 + Limit + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + + Stage: Stage-0 + Fetch Operator + limit: 1 + + +PREHOOK: query: SELECT md5('hive rules!') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-28-10_246_7753927233383182969/-mr-10000 +POSTHOOK: query: SELECT md5('hive rules!') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-28-10_246_7753927233383182969/-mr-10000 +aee0841aab5d121b8660287fa21749b8 +PREHOOK: query: DESCRIBE FUNCTION md5 +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION md5 +POSTHOOK: type: DESCFUNCTION +md5(a1) - Returns the md5 checksum +PREHOOK: query: DESCRIBE FUNCTION EXTENDED md5 +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED md5 +POSTHOOK: type: DESCFUNCTION +md5(a1) - Returns the md5 checksum Index: ql/src/test/results/clientpositive/udf_crc32.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_crc32.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_crc32.q.out (revision 0) @@ -0,0 +1,57 @@ +PREHOOK: query: EXPLAIN +SELECT crc32('hive rules!') FROM src LIMIT 1 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT crc32('hive rules!') FROM src LIMIT 1 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF src)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION crc32 'hive rules!'))) (TOK_LIMIT 1))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: crc32('hive rules!') + type: bigint + outputColumnNames: _col0 + Limit + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + + Stage: Stage-0 + Fetch Operator + limit: 1 + + +PREHOOK: query: SELECT crc32('hive rules!') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-34-33_416_1746772952803534965/-mr-10000 +POSTHOOK: query: SELECT crc32('hive rules!') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-34-33_416_1746772952803534965/-mr-10000 +2015525977 +PREHOOK: query: DESCRIBE FUNCTION crc32 +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION crc32 +POSTHOOK: type: DESCFUNCTION +crc32(a1) - Returns the CRC32 checksum +PREHOOK: query: DESCRIBE FUNCTION EXTENDED crc32 +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED crc32 +POSTHOOK: type: DESCFUNCTION +crc32(a1) - Returns the CRC32 checksum Index: ql/src/test/results/clientpositive/show_functions.q.out =================================================================== --- ql/src/test/results/clientpositive/show_functions.q.out (revision 1038444) +++ ql/src/test/results/clientpositive/show_functions.q.out (working copy) @@ -20,6 +20,8 @@ ^ abs acos +aes_decrypt +aes_encrypt and array array_contains @@ -44,6 +46,7 @@ count covar_pop covar_samp +crc32 create_union date_add date_sub @@ -88,6 +91,7 @@ ltrim map max +md5 min minute month @@ -118,6 +122,7 @@ rtrim second sentences +sha sign sin size @@ -178,6 +183,7 @@ count covar_pop covar_samp +crc32 create_union PREHOOK: query: SHOW FUNCTIONS '.*e$' PREHOOK: type: SHOWFUNCTIONS Index: ql/src/test/results/clientpositive/udf_sha.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_sha.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_sha.q.out (revision 0) @@ -0,0 +1,57 @@ +PREHOOK: query: EXPLAIN +SELECT sha('hive rules!') FROM src LIMIT 1 +PREHOOK: type: QUERY +POSTHOOK: query: EXPLAIN +SELECT sha('hive rules!') FROM src LIMIT 1 +POSTHOOK: type: QUERY +ABSTRACT SYNTAX TREE: + (TOK_QUERY (TOK_FROM (TOK_TABREF src)) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION sha 'hive rules!'))) (TOK_LIMIT 1))) + +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Alias -> Map Operator Tree: + src + TableScan + alias: src + Select Operator + expressions: + expr: sha('hive rules!') + type: string + outputColumnNames: _col0 + Limit + File Output Operator + compressed: false + GlobalTableId: 0 + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + + Stage: Stage-0 + Fetch Operator + limit: 1 + + +PREHOOK: query: SELECT sha('hive rules!') FROM src LIMIT 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-25-10_957_7974393416859395707/-mr-10000 +POSTHOOK: query: SELECT sha('hive rules!') FROM src LIMIT 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: file:/tmp/edward/hive_2010-12-02_13-25-10_957_7974393416859395707/-mr-10000 +e0b2715219b3234f0aef56786f81046a366699f +PREHOOK: query: DESCRIBE FUNCTION sha +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION sha +POSTHOOK: type: DESCFUNCTION +sha(a1) - Returns the sha checksum +PREHOOK: query: DESCRIBE FUNCTION EXTENDED sha +PREHOOK: type: DESCFUNCTION +POSTHOOK: query: DESCRIBE FUNCTION EXTENDED sha +POSTHOOK: type: DESCFUNCTION +sha(a1) - Returns the sha checksum Index: ql/src/test/queries/clientpositive/udf_crc32.q =================================================================== --- ql/src/test/queries/clientpositive/udf_crc32.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_crc32.q (revision 0) @@ -0,0 +1,7 @@ +EXPLAIN +SELECT crc32('hive rules!') FROM src LIMIT 1; + +SELECT crc32('hive rules!') FROM src LIMIT 1; + +DESCRIBE FUNCTION crc32; +DESCRIBE FUNCTION EXTENDED crc32; \ No newline at end of file Index: ql/src/test/queries/clientpositive/udf_aes.q =================================================================== --- ql/src/test/queries/clientpositive/udf_aes.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_aes.q (revision 0) @@ -0,0 +1,14 @@ + +EXPLAIN +SELECT aes_decrypt(aes_encrypt('yo','123'), '123') FROM src LIMIT 1; +SELECT aes_decrypt(aes_encrypt('yo','123'), '123') FROM src LIMIT 1; + +EXPLAIN +SELECT aes_decrypt(aes_encrypt(key,'mysecret'), 'mysecret') FROM src WHERE src.key < 10; +SELECT aes_decrypt(aes_encrypt(key,'mysecret'), 'mysecret') FROM src WHERE src.key < 10; + +DESCRIBE FUNCTION aes_decrypt; +DESCRIBE FUNCTION EXTENDED aes_decrypt; + +DESCRIBE FUNCTION aes_encrypt; +DESCRIBE FUNCTION EXTENDED aes_encrypt; Index: ql/src/test/queries/clientpositive/udf_sha.q =================================================================== --- ql/src/test/queries/clientpositive/udf_sha.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_sha.q (revision 0) @@ -0,0 +1,7 @@ +EXPLAIN +SELECT sha('hive rules!') FROM src LIMIT 1; + +SELECT sha('hive rules!') FROM src LIMIT 1; + +DESCRIBE FUNCTION sha; +DESCRIBE FUNCTION EXTENDED sha; \ No newline at end of file Index: ql/src/test/queries/clientpositive/udf_md5.q =================================================================== --- ql/src/test/queries/clientpositive/udf_md5.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_md5.q (revision 0) @@ -0,0 +1,7 @@ +EXPLAIN +SELECT md5('hive rules!') FROM src LIMIT 1; + +SELECT md5('hive rules!') FROM src LIMIT 1; + +DESCRIBE FUNCTION md5; +DESCRIBE FUNCTION EXTENDED md5; \ No newline at end of file Index: ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (revision 1038444) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (working copy) @@ -144,12 +144,15 @@ import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFVarianceSample; import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFnGrams; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDFAesDecrypt; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDFAesEncrypt; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFArray; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFArrayContains; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFCase; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFCoalesce; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFConcatWS; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDFCrc32; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFElt; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFField; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFHash; @@ -158,6 +161,7 @@ import org.apache.hadoop.hive.ql.udf.generic.GenericUDFIndex; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFInstr; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFLocate; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDFMD5; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFMap; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPAnd; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPEqual; @@ -172,6 +176,7 @@ import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPOr; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFReflect; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFSentences; +import org.apache.hadoop.hive.ql.udf.generic.GenericUDFSha; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFSize; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFSplit; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFStringToMap; @@ -407,6 +412,14 @@ registerGenericUDF("array_contains", GenericUDFArrayContains.class); registerGenericUDF("sentences", GenericUDFSentences.class); + registerGenericUDF("aes_encrypt", GenericUDFAesEncrypt.class); + registerGenericUDF("aes_decrypt", GenericUDFAesDecrypt.class); + + registerGenericUDF("md5", GenericUDFMD5.class); + registerGenericUDF("sha", GenericUDFSha.class); + registerGenericUDF("crc32", GenericUDFCrc32.class); + + // Generic UDTF's registerGenericUDTF("explode", GenericUDTFExplode.class); registerGenericUDTF("json_tuple", GenericUDTFJSONTuple.class); Index: ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFAesDecrypt.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFAesDecrypt.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFAesDecrypt.java (revision 0) @@ -0,0 +1,105 @@ +package org.apache.hadoop.hive.ql.udf.generic; + +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.common.AesUtils; +import org.apache.hadoop.hive.ql.exec.Description; +import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.ql.udf.UDFType; +import org.apache.hadoop.hive.serde.Constants; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters; +import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; +import org.apache.hadoop.io.Text; + + +/** + * GenericUDF Class for computing aes digests. + * select aes_decrypt(aes_encrypt('yo','123'), '123') + */ +@Description( + name = "aes_decrypt", + value = "_FUNC_(str,key_str) - computer aes digest" +) +@UDFType(deterministic=false) +public class GenericUDFAesDecrypt extends GenericUDF { + private static Log LOG = LogFactory.getLog(GenericUDFAesDecrypt.class.getName()); + ObjectInspector[] argumentOIs; + ObjectInspectorConverters.Converter[] converters; + Text result = new Text(); + Text data = new Text(); + Text key_string = new Text(); + + @Override + public ObjectInspector initialize(ObjectInspector[] arguments) + throws UDFArgumentTypeException { + + for (int i=0;i<2;i++){ + if ( arguments[i].getCategory() == ObjectInspector.Category.PRIMITIVE) { + PrimitiveObjectInspector poi = ((PrimitiveObjectInspector)arguments[i]); + + if (! (poi.getPrimitiveCategory() == PrimitiveObjectInspector.PrimitiveCategory.STRING)){ + throw new UDFArgumentTypeException(i, + "The argument of function should be \"" + Constants.STRING_TYPE_NAME + + "\", but \"" + arguments[i].getTypeName() + "\" is found"); + } + } + } + converters = new ObjectInspectorConverters.Converter[arguments.length]; + for(int i = 0; i < arguments.length; i++) { + converters[i] = ObjectInspectorConverters.getConverter(arguments[i], + PrimitiveObjectInspectorFactory.writableStringObjectInspector); + } + this.argumentOIs = arguments; + return PrimitiveObjectInspectorFactory.writableStringObjectInspector ; + } + + @Override + public Object evaluate(DeferredObject[] arguments) throws HiveException { + if (arguments[0].get() == null || arguments[1].get()==null){ + return null; + } + byte [] decrypted = null; + data = (Text) converters[0].convert(arguments[0].get()); + key_string = (Text) converters[1].convert(arguments[1].get()); + try { + StringBuffer buffer = AesUtils.generate128BitKey(key_string.toString()); + Cipher cipher = Cipher.getInstance("AES"); + SecretKeySpec skeySpec = new SecretKeySpec(buffer.toString().getBytes("UTF-8"), "AES"); + cipher.init(Cipher.DECRYPT_MODE, skeySpec); + decrypted =cipher.doFinal(data.getBytes() ); + } catch (NoSuchAlgorithmException e) { + LOG.error(e); + } catch (NoSuchPaddingException e) { + LOG.error(e); + } catch (InvalidKeyException e) { + LOG.error(e); + } catch (IllegalBlockSizeException e) { + LOG.error(e); + } catch (BadPaddingException e) { + LOG.error(e); + } catch (UnsupportedEncodingException e) { + LOG.error(e); + } + result.set(decrypted, 0, decrypted.length); + return result; + } + + @Override + public String getDisplayString(String[] children) { + return "aes_dencrypt(" + StringUtils.join(children, ',') + ")"; + } +} \ No newline at end of file Index: ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFSha.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFSha.java (revision 0) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFSha.java (revision 0) @@ -0,0 +1,78 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.udf.generic; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.hive.ql.exec.Description; +import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException; +import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; +import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; + +/** + * GenericUDF Class for computing sha checksums. + */ +@Description( + name = "sha", + value = "_FUNC_(a1) - Returns the sha checksum" +) +public class GenericUDFSha extends GenericUDF { + + private static Log LOG = LogFactory.getLog(GenericUDFSha.class.getName()); + ObjectInspector[] argumentOIs; + + @Override + public ObjectInspector initialize(ObjectInspector[] arguments) + throws UDFArgumentTypeException { + + this.argumentOIs = arguments; + return PrimitiveObjectInspectorFactory.javaStringObjectInspector; + } + + @Override + public Object evaluate(DeferredObject[] arguments) throws HiveException { + if (arguments[0].get() == null){ + return null; + } + byte [] b = arguments[0].get().toString().getBytes(); + MessageDigest digest; + try { + digest = java.security.MessageDigest.getInstance("SHA-1"); + } catch (NoSuchAlgorithmException e) { + LOG.error(e); + return null; + } + digest.update(b); + byte [] digested = digest.digest(); + StringBuffer hexString = new StringBuffer(); + for (int i=0;i