Commit b147f169 authored by tonu@volk.internalnet's avatar tonu@volk.internalnet
Browse files

des_encrypt(), des_decrypt() functions added. Not finally ready yet, so I will clean it up later.

parent eac7e9f2
Loading
Loading
Loading
Loading
+132 −1
Original line number Diff line number Diff line
@@ -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)
{
+20 −0
Original line number Diff line number Diff line
@@ -222,6 +222,26 @@ class Item_func_password :public Item_str_func
  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;
+2 −0
Original line number Diff line number Diff line
@@ -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},