diff options
author | unknown <peter@mysql.com> | 2002-10-03 22:48:53 +0400 |
---|---|---|
committer | unknown <peter@mysql.com> | 2002-10-03 22:48:53 +0400 |
commit | 748191fd807d6f380b48b9331a8d8cf333d2bb45 (patch) | |
tree | b9522531a456b10dced6edbc21b35f15c338869c /sql/password.c | |
parent | e607221a3cd778131cc9250108473819c9b8c8a0 (diff) | |
parent | a370f86622f98fa33e7085878522ff181e7effba (diff) | |
download | mariadb-git-748191fd807d6f380b48b9331a8d8cf333d2bb45.tar.gz |
Merge mysql.com:/home/pz/mysql/mysql-4.1-root
into mysql.com:/home/pz/mysql/mysql-4.1
BitKeeper/etc/logging_ok:
auto-union
sql/item_strfunc.cc:
Auto merged
sql/item_strfunc.h:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/mysqld.cc:
Auto merged
Diffstat (limited to 'sql/password.c')
-rw-r--r-- | sql/password.c | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/sql/password.c b/sql/password.c index 48181ea18e6..1875bb0ef04 100644 --- a/sql/password.c +++ b/sql/password.c @@ -37,9 +37,19 @@ #include <my_global.h> #include <my_sys.h> #include <m_string.h> +#include <sha1.h> #include "mysql.h" + +/* Character to use as version identifier for version 4.1 */ +#define PVERSION41_CHAR '*' + + +extern my_bool opt_old_passwords; /* If prior 4.1 functions to be used */ + + + void randominit(struct rand_struct *rand_st,ulong seed1, ulong seed2) { /* For mysql 3.21.# */ #ifdef HAVE_purify @@ -84,13 +94,55 @@ void hash_password(ulong *result, const char *password) return; } + void make_scrambled_password(char *to,const char *password) +{ + ulong hash_res[2]; /* Used for pre 4.1 password hashing */ + static uint salt=0; /* Salt for 4.1 version password */ + unsigned char* slt=(unsigned char*)&salt; + SHA1_CONTEXT context; + uint8 digest[SHA1_HASH_SIZE]; + if (opt_old_passwords) /* Pre 4.1 password encryption */ + { + hash_password(hash_res,password); + sprintf(to,"%08lx%08lx",hash_res[0],hash_res[1]); + } + else /* New password 4.1 password scrambling */ + { + to[0]=PVERSION41_CHAR; /* New passwords have version prefix */ + /* We do not need too strong salt generation so this should be enough */ + salt+=getpid()+time(NULL)+0x01010101; + /* Use only 2 first bytes from it */ + sprintf(&(to[1]),"%02x%02x",slt[0],slt[1]); + sha1_reset(&context); + /* Use Salt for Hash */ + sha1_input(&context,(uint8*)&salt,2); + + for (; *password ; password++) + { + if (*password == ' ' || *password == '\t') + continue;/* skip space in password */ + sha1_input(&context,(int8*)&password[0],1); + } + sha1_result(&context,digest); + /* Print resulting hash into the password*/ + sprintf(&(to[5]), + "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + digest[0],digest[1],digest[2],digest[3],digest[4],digest[5],digest[6], + digest[7],digest[8],digest[9],digest[10],digest[11],digest[12],digest[13], + digest[14],digest[15],digest[16],digest[17],digest[18],digest[19]); + + } +} + +uint get_password_length() { - ulong hash_res[2]; - hash_password(hash_res,password); - sprintf(to,"%08lx%08lx",hash_res[0],hash_res[1]); + if (opt_old_passwords) + return 16; + else return SHA1_HASH_SIZE*2+4+1; } + inline uint char_val(char X) { return (uint) (X >= '0' && X <= '9' ? X-'0' : |