diff options
author | unknown <peter@mysql.com> | 2002-10-06 13:42:16 +0400 |
---|---|---|
committer | unknown <peter@mysql.com> | 2002-10-06 13:42:16 +0400 |
commit | 8640cd354413508b698817dce787827c370e7b9a (patch) | |
tree | ec440e8cca80b5a48de9c9b085968243421b8b8d /sql/password.c | |
parent | 748191fd807d6f380b48b9331a8d8cf333d2bb45 (diff) | |
download | mariadb-git-8640cd354413508b698817dce787827c370e7b9a.tar.gz |
One more commit to do the merge of new 4.1 tree
client/mysqladmin.c:
Handle new password.c prototypes
include/mysql_com.h:
New prototypes
libmysql/Makefile.shared:
Client need sha1 compiled in now
libmysql/password.c:
Replace copy with symlink
mysql-test/r/func_crypt.result:
Fix test results to handle new password function
mysql-test/t/func_crypt.test:
New tests for new password function
sql/item_create.cc:
add old_password() function
sql/item_create.h:
add old_password() function
sql/item_strfunc.cc:
add old_password() function
changes to new password.c functions prototypes
sql/item_strfunc.h:
add old_password function
handle new prototypes
sql/lex.h:
add OLD_PASSWORD function
sql/password.c:
Continue to work on new password handling
sql/sql_acl.cc:
Handle new passwords
sql/sql_yacc.yy:
Changes for new prototypes
Diffstat (limited to 'sql/password.c')
-rw-r--r-- | sql/password.c | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/sql/password.c b/sql/password.c index 1875bb0ef04..ba7dc17c671 100644 --- a/sql/password.c +++ b/sql/password.c @@ -46,7 +46,6 @@ #define PVERSION41_CHAR '*' -extern my_bool opt_old_passwords; /* If prior 4.1 functions to be used */ @@ -95,14 +94,17 @@ void hash_password(ulong *result, const char *password) } -void make_scrambled_password(char *to,const char *password) + + + +void make_scrambled_password(char *to,const char *password,my_bool force_old_scramble) { 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 */ + if (force_old_scramble) /* Pre 4.1 password encryption */ { hash_password(hash_res,password); sprintf(to,"%08lx%08lx",hash_res[0],hash_res[1]); @@ -125,23 +127,33 @@ void make_scrambled_password(char *to,const char *password) sha1_input(&context,(int8*)&password[0],1); } sha1_result(&context,digest); + /* Hash one more time */ + sha1_reset(&context); + sha1_input(&context,digest,SHA1_HASH_SIZE); + 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]); - + digest[14],digest[15],digest[16],digest[17],digest[18],digest[19]); } } -uint get_password_length() +uint get_password_length(my_bool force_old_scramble) { - if (opt_old_passwords) + if (force_old_scramble) return 16; else return SHA1_HASH_SIZE*2+4+1; } +uint8 get_password_version(const char* password) +{ + if (password==NULL) return 0; + if (password[0]==PVERSION41_CHAR) return PVERSION41_CHAR; + return 0; +} + inline uint char_val(char X) { @@ -151,15 +163,27 @@ inline uint char_val(char X) } /* -** This code assumes that len(password) is divideable with 8 and that -** res is big enough (2 in mysql) +** This code detects new version password by leading char. +** Old password has to be divisible by 8 length +** do not forget to increase array length if you need longer passwords */ void get_salt_from_password(ulong *res,const char *password) { - res[0]=res[1]=0; + bzero(res,5*sizeof(res[0])); if (password) { + if (password[0]==PVERSION41_CHAR) // if new password + { + uint val=0; + uint i; + password++; // skip version identifier. + //get hashing salt from password and store in in the start of array + + for (i=0 ; i < 4 ; i++) + val=(val << 4)+char_val(*password++); + *res++=val; + } while (*password) { ulong val=0; @@ -167,13 +191,14 @@ void get_salt_from_password(ulong *res,const char *password) for (i=0 ; i < 8 ; i++) val=(val << 4)+char_val(*password++); *res++=val; - } + } } return; } void make_password_from_salt(char *to, ulong *hash_res) { + // warning this does not work for new passwords yet sprintf(to,"%08lx%08lx",hash_res[0],hash_res[1]); } |