diff options
author | unknown <tonu@volk.internalnet> | 2001-11-06 22:57:14 +0200 |
---|---|---|
committer | unknown <tonu@volk.internalnet> | 2001-11-06 22:57:14 +0200 |
commit | b37c7d4a3d95cbd49ddad29aadd90b62587aaabe (patch) | |
tree | b8300ea238ea41d9c4b94a1ccd7fa538ff7a2ea1 /sql | |
parent | 8cba75e56fa34ea5d997125d24fbc540a9b3c43e (diff) | |
download | mariadb-git-b37c7d4a3d95cbd49ddad29aadd90b62587aaabe.tar.gz |
des_encrypt(), des_decrypt() functions added. Not finally ready yet, so I will clean it up later.
sql/item_strfunc.cc:
des_encrypt(), des_decrypt() functions added
sql/item_strfunc.h:
des_encrypt(), des_decrypt() functions added
sql/lex.h:
des_encrypt(), des_decrypt() functions added
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item_strfunc.cc | 133 | ||||
-rw-r--r-- | sql/item_strfunc.h | 20 | ||||
-rw-r--r-- | sql/lex.h | 2 |
3 files changed, 154 insertions, 1 deletions
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 355f28d5432..b2c475dc4a0 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -30,6 +30,9 @@ #ifdef HAVE_CRYPT_H #include <crypt.h> #endif +#ifdef HAVE_OPENSSL +#include <openssl/des.h> +#endif /* HAVE_OPENSSL */ #include "md5.h" String empty_string(""); @@ -198,6 +201,135 @@ void Item_func_concat::fix_length_and_dec() } } +#define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.') + +String *Item_func_des_encrypt::val_str(String *str) +{ + String *res =args[0]->val_str(str); + +#ifdef HAVE_OPENSSL + des_key_schedule ks1, ks2, ks3; + des_cblock ivec={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; + union { + des_cblock allkeys[3]; + des_cblock key1; + des_cblock key2; + des_cblock key3; + } key; + + + + if ((null_value=args[0]->null_value)) + return 0; + if (res->length() == 0) + return &empty_string; + String *in_str=args[1]->val_str(&tmp_value); + char *tmp=my_malloc(res->length()+8, MYF(0)); + DBUG_PRINT("info",("DES: key string='%s'",in_str->c_ptr())); + DBUG_PRINT("info",("DES: data string='%s'",res->c_ptr())); + DBUG_PRINT("info",("DES: cipher pointer='%x'",EVP_get_cipherbyname("DES-EDE3-CBC"))); + EVP_BytesToKey(EVP_get_cipherbyname("DES-EDE3-CBC"),EVP_md5(),NULL, + (unsigned char *)in_str->c_ptr(), + in_str->length(),1,(uchar *)&key.allkeys,ivec); + des_set_key_unchecked(&key.key1,ks1); + des_set_key_unchecked(&key.key2,ks2); + des_set_key_unchecked(&key.key3,ks3); + DBUG_PRINT("info",("DES: checkpoint")); + des_ede3_cbc_encrypt( + (const unsigned char*)(res->c_ptr()) , + (uchar*)tmp, + res->length(), + ks1, ks2, ks3, &ivec, TRUE); + res->length(res->length()+8-(res->length() % 8)); + DBUG_PRINT("info",("DES: checkpoint")); + DBUG_PRINT("info",("DES: string length='%d' versus '%d'",res->length(),strlen(res->c_ptr()))); + DBUG_PRINT("info",("DES: crypted data string='%s'",tmp)); + str->set((const char*)0,(uint)0); + for(uint i=0 ; i < res->length() ; ++i) + { + str->append(tmp[i]); +// str->append(bin_to_ascii(tmp[i] & 0x3f)); +// str->append(bin_to_ascii((tmp[i] >> 5) & 0x3f)); + } + DBUG_PRINT("info",("DES: crypted data plain string='%s'",str->c_ptr())); + str->copy(); + DBUG_PRINT("info",("DES: crypted data plain string='%s'",str->c_ptr())); + my_free(tmp,MYF(0)); + return str; +#else + null_value=1; + return 0; +#endif /* HAVE_OPENSSL */ +} + + +String *Item_func_des_decrypt::val_str(String *str) +{ + String *res =args[0]->val_str(str); + +#ifdef HAVE_OPENSSL + des_key_schedule ks1, ks2, ks3; + des_cblock ivec={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; + union { + des_cblock allkeys[3]; + des_cblock key1; + des_cblock key2; + des_cblock key3; + } key; + + + if ((null_value=args[0]->null_value)) + return 0; + if (res->length() == 0) + return &empty_string; + String *in_str=args[1]->val_str(&tmp_value); + char *tmp=my_malloc(res->length()+8, MYF(0)); + DBUG_PRINT("info",("DES: key string='%s'",in_str->c_ptr())); + DBUG_PRINT("info",("DES: data string='%s'",res->c_ptr())); +/* int EVP_BytesToKey(const EVP_CIPHER *type, EVP_MD *md, + const unsigned char *salt, const unsigned char *data, int datal, + int count, unsigned char *key, unsigned char *iv) +*/ + EVP_BytesToKey(EVP_get_cipherbyname("DES-EDE3-CBC"),EVP_md5(),NULL, + (unsigned char *)in_str->c_ptr(), + in_str->length(),1,(uchar *)&key.allkeys,ivec); + des_set_key_unchecked(&key.key1,ks1); + des_set_key_unchecked(&key.key2,ks2); + des_set_key_unchecked(&key.key3,ks3); + DBUG_PRINT("info",("DES: cipher pointer='%x'",EVP_get_cipherbyname("DES-EDE3-CBC"))); + EVP_BytesToKey(EVP_get_cipherbyname("DES-EDE3-CBC"),EVP_md5(),NULL, + (unsigned char *)in_str->c_ptr(), + in_str->length(),1,(uchar *)&key.allkeys,ivec); + + DBUG_PRINT("info",("DES: checkpoint")); + des_ede3_cbc_encrypt( + (const unsigned char*)(res->c_ptr()) , + (uchar*)tmp, + res->length(), + ks1, ks2, ks3, &ivec, FALSE); + + DBUG_PRINT("info",("DES: checkpoint")); + DBUG_PRINT("info",("DES: string length='%d' versus '%d'",res->length(),strlen(res->c_ptr()))); + DBUG_PRINT("info",("DES: crypted data string='%s'",tmp)); + str->set((const char*)0,(uint)0); + for(uint i=0 ; i < res->length() ; ++i) + { + str->append(tmp[i]); +// str->append(bin_to_ascii(tmp[i] & 0x3f)); +// str->append(bin_to_ascii((tmp[i] >> 5) & 0x3f)); + } + DBUG_PRINT("info",("DES: crypted data plain string='%s'",str->c_ptr())); + str->copy(); + DBUG_PRINT("info",("DES: crypted data plain string='%s'",str->c_ptr())); + my_free(tmp,MYF(0)); + return str; +#else + null_value=1; + return 0; +#endif /* HAVE_OPENSSL */ +} + + /* @@ -992,7 +1124,6 @@ String *Item_func_password::val_str(String *str) return str; } -#define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.') String *Item_func_encrypt::val_str(String *str) { diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 59bb815f0c3..7bd587e44a9 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -222,6 +222,26 @@ public: const char *func_name() const { return "password"; } }; +class Item_func_des_encrypt :public Item_str_func +{ + String tmp_value; +public: + Item_func_des_encrypt(Item *a) :Item_str_func(a) {} + Item_func_des_encrypt(Item *a, Item *b): Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec() { maybe_null=1; max_length = 13; } +}; + +class Item_func_des_decrypt :public Item_str_func +{ + String tmp_value; +public: + Item_func_des_decrypt(Item *a) :Item_str_func(a) {} + Item_func_des_decrypt(Item *a, Item *b): Item_str_func(a,b) {} + String *val_str(String *); + void fix_length_and_dec() { maybe_null=1; max_length = 13; } +}; + class Item_func_encrypt :public Item_str_func { String tmp_value; diff --git a/sql/lex.h b/sql/lex.h index 07fbfda229a..37fe38b76a1 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -405,6 +405,8 @@ static SYMBOL sql_functions[] = { { "DAYOFYEAR", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_dayofyear)}, { "DECODE", SYM(DECODE_SYM),0,0}, { "DEGREES", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_degrees)}, + { "DES_ENCRYPT", SYM(DES_ENCRYPT),0,0}, + { "DES_DECRYPT", SYM(DES_DECRYPT),0,0}, { "ELT", SYM(ELT_FUNC),0,0}, { "ENCODE", SYM(ENCODE_SYM),0,0}, { "ENCRYPT", SYM(ENCRYPT),0,0}, |