Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 1:f5ac63519541 1 /* Copyright (C) 2007 MySQL AB & Michael Widenius
Michael J. Spencer 1:f5ac63519541 2
Michael J. Spencer 1:f5ac63519541 3 This program is free software; you can redistribute it and/or modify
Michael J. Spencer 1:f5ac63519541 4 it under the terms of the GNU General Public License as published by
Michael J. Spencer 1:f5ac63519541 5 the Free Software Foundation; version 2 of the License.
Michael J. Spencer 1:f5ac63519541 6
Michael J. Spencer 1:f5ac63519541 7 This program is distributed in the hope that it will be useful,
Michael J. Spencer 1:f5ac63519541 8 but WITHOUT ANY WARRANTY; without even the implied warranty of
Michael J. Spencer 1:f5ac63519541 9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Michael J. Spencer 1:f5ac63519541 10 GNU General Public License for more details.
Michael J. Spencer 1:f5ac63519541 11
Michael J. Spencer 1:f5ac63519541 12 You should have received a copy of the GNU General Public License
Michael J. Spencer 1:f5ac63519541 13 along with this program; if not, write to the Free Software
Michael J. Spencer 1:f5ac63519541 14 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
Michael J. Spencer 1:f5ac63519541 15
Michael J. Spencer 1:f5ac63519541 16 #define SCRAMBLE_LENGTH_323 8
Michael J. Spencer 1:f5ac63519541 17
Michael J. Spencer 1:f5ac63519541 18 #include <string.h>
Michael J. Spencer 1:f5ac63519541 19 #include <math.h>
Michael J. Spencer 1:f5ac63519541 20
Michael J. Spencer 1:f5ac63519541 21 typedef unsigned int uint;
Michael J. Spencer 1:f5ac63519541 22 typedef unsigned long ulong;
Michael J. Spencer 1:f5ac63519541 23 typedef unsigned char uchar;
Michael J. Spencer 1:f5ac63519541 24
Michael J. Spencer 1:f5ac63519541 25 struct my_rnd_struct {
Michael J. Spencer 1:f5ac63519541 26 unsigned long seed1,seed2,max_value;
Michael J. Spencer 1:f5ac63519541 27 double max_value_dbl;
Michael J. Spencer 1:f5ac63519541 28 };
Michael J. Spencer 1:f5ac63519541 29
Michael J. Spencer 1:f5ac63519541 30 static void my_rnd_init(struct my_rnd_struct *rand_st, ulong seed1, ulong seed2);
Michael J. Spencer 1:f5ac63519541 31 static double my_rnd(struct my_rnd_struct *rand_st);
Michael J. Spencer 1:f5ac63519541 32 static void hash_password(ulong *result, const char *password, uint password_len);
Michael J. Spencer 1:f5ac63519541 33
Michael J. Spencer 1:f5ac63519541 34 /*
Michael J. Spencer 1:f5ac63519541 35 Initialize random generator
Michael J. Spencer 1:f5ac63519541 36
Michael J. Spencer 1:f5ac63519541 37 NOTES
Michael J. Spencer 1:f5ac63519541 38 MySQL's password checks depends on this, so don't do any changes
Michael J. Spencer 1:f5ac63519541 39 that changes the random numbers that are generated!
Michael J. Spencer 1:f5ac63519541 40 */
Michael J. Spencer 1:f5ac63519541 41
Michael J. Spencer 1:f5ac63519541 42 static void my_rnd_init(struct my_rnd_struct *rand_st, ulong seed1, ulong seed2)
Michael J. Spencer 1:f5ac63519541 43 {
Michael J. Spencer 1:f5ac63519541 44 rand_st->max_value= 0x3FFFFFFFL;
Michael J. Spencer 1:f5ac63519541 45 rand_st->max_value_dbl=(double) rand_st->max_value;
Michael J. Spencer 1:f5ac63519541 46 rand_st->seed1=seed1%rand_st->max_value ;
Michael J. Spencer 1:f5ac63519541 47 rand_st->seed2=seed2%rand_st->max_value;
Michael J. Spencer 1:f5ac63519541 48 }
Michael J. Spencer 1:f5ac63519541 49
Michael J. Spencer 1:f5ac63519541 50 /*
Michael J. Spencer 1:f5ac63519541 51 Generate random number.
Michael J. Spencer 1:f5ac63519541 52
Michael J. Spencer 1:f5ac63519541 53 SYNOPSIS
Michael J. Spencer 1:f5ac63519541 54 my_rnd()
Michael J. Spencer 1:f5ac63519541 55 rand_st INOUT Structure used for number generation
Michael J. Spencer 1:f5ac63519541 56
Michael J. Spencer 1:f5ac63519541 57 RETURN VALUE
Michael J. Spencer 1:f5ac63519541 58 generated pseudo random number
Michael J. Spencer 1:f5ac63519541 59 */
Michael J. Spencer 1:f5ac63519541 60
Michael J. Spencer 1:f5ac63519541 61 static double my_rnd(struct my_rnd_struct *rand_st)
Michael J. Spencer 1:f5ac63519541 62 {
Michael J. Spencer 1:f5ac63519541 63 rand_st->seed1=(rand_st->seed1*3+rand_st->seed2) % rand_st->max_value;
Michael J. Spencer 1:f5ac63519541 64 rand_st->seed2=(rand_st->seed1+rand_st->seed2+33) % rand_st->max_value;
Michael J. Spencer 1:f5ac63519541 65 return (((double) rand_st->seed1)/rand_st->max_value_dbl);
Michael J. Spencer 1:f5ac63519541 66 }
Michael J. Spencer 1:f5ac63519541 67
Michael J. Spencer 1:f5ac63519541 68 /*
Michael J. Spencer 1:f5ac63519541 69 Generate binary hash from raw text string
Michael J. Spencer 1:f5ac63519541 70 Used for Pre-4.1 password handling
Michael J. Spencer 1:f5ac63519541 71 SYNOPSIS
Michael J. Spencer 1:f5ac63519541 72 hash_password()
Michael J. Spencer 1:f5ac63519541 73 result OUT store hash in this location
Michael J. Spencer 1:f5ac63519541 74 password IN plain text password to build hash
Michael J. Spencer 1:f5ac63519541 75 password_len IN password length (password may be not null-terminated)
Michael J. Spencer 1:f5ac63519541 76 */
Michael J. Spencer 1:f5ac63519541 77
Michael J. Spencer 1:f5ac63519541 78 static void hash_password(ulong *result, const char *password, uint password_len)
Michael J. Spencer 1:f5ac63519541 79 {
Michael J. Spencer 1:f5ac63519541 80 register ulong nr=1345345333L, add=7, nr2=0x12345671L;
Michael J. Spencer 1:f5ac63519541 81 ulong tmp;
Michael J. Spencer 1:f5ac63519541 82 const char *password_end= password + password_len;
Michael J. Spencer 1:f5ac63519541 83 for (; password < password_end; password++)
Michael J. Spencer 1:f5ac63519541 84 {
Michael J. Spencer 1:f5ac63519541 85 if (*password == ' ' || *password == '\t')
Michael J. Spencer 1:f5ac63519541 86 continue; /* skip space in password */
Michael J. Spencer 1:f5ac63519541 87 tmp= (ulong) (uchar) *password;
Michael J. Spencer 1:f5ac63519541 88 nr^= (((nr & 63)+add)*tmp)+ (nr << 8);
Michael J. Spencer 1:f5ac63519541 89 nr2+=(nr2 << 8) ^ nr;
Michael J. Spencer 1:f5ac63519541 90 add+=tmp;
Michael J. Spencer 1:f5ac63519541 91 }
Michael J. Spencer 1:f5ac63519541 92 result[0]=nr & (((ulong) 1L << 31) -1L); /* Don't use sign bit (str2int) */;
Michael J. Spencer 1:f5ac63519541 93 result[1]=nr2 & (((ulong) 1L << 31) -1L);
Michael J. Spencer 1:f5ac63519541 94 }
Michael J. Spencer 1:f5ac63519541 95
Michael J. Spencer 1:f5ac63519541 96
Michael J. Spencer 1:f5ac63519541 97
Michael J. Spencer 1:f5ac63519541 98 /*
Michael J. Spencer 1:f5ac63519541 99 Scramble string with password.
Michael J. Spencer 1:f5ac63519541 100 Used in pre 4.1 authentication phase.
Michael J. Spencer 1:f5ac63519541 101 SYNOPSIS
Michael J. Spencer 1:f5ac63519541 102 scramble_323()
Michael J. Spencer 1:f5ac63519541 103 to OUT Store scrambled message here. Buffer must be at least
Michael J. Spencer 1:f5ac63519541 104 SCRAMBLE_LENGTH_323+1 bytes long
Michael J. Spencer 1:f5ac63519541 105 message IN Message to scramble. Message must be at least
Michael J. Spencer 1:f5ac63519541 106 SRAMBLE_LENGTH_323 bytes long.
Michael J. Spencer 1:f5ac63519541 107 password IN Password to use while scrambling
Michael J. Spencer 1:f5ac63519541 108 */
Michael J. Spencer 1:f5ac63519541 109
Michael J. Spencer 1:f5ac63519541 110 void scramble_323(char *to, const char *message, const char *password)
Michael J. Spencer 1:f5ac63519541 111 {
Michael J. Spencer 1:f5ac63519541 112 struct my_rnd_struct rand_st;
Michael J. Spencer 1:f5ac63519541 113 ulong hash_pass[2], hash_message[2];
Michael J. Spencer 1:f5ac63519541 114
Michael J. Spencer 1:f5ac63519541 115 if (password && password[0])
Michael J. Spencer 1:f5ac63519541 116 {
Michael J. Spencer 1:f5ac63519541 117 char extra, *to_start=to;
Michael J. Spencer 1:f5ac63519541 118 const char *message_end= message + SCRAMBLE_LENGTH_323;
Michael J. Spencer 1:f5ac63519541 119 hash_password(hash_pass,password, (uint) strlen(password));
Michael J. Spencer 1:f5ac63519541 120 hash_password(hash_message, message, SCRAMBLE_LENGTH_323);
Michael J. Spencer 1:f5ac63519541 121 my_rnd_init(&rand_st,hash_pass[0] ^ hash_message[0],
Michael J. Spencer 1:f5ac63519541 122 hash_pass[1] ^ hash_message[1]);
Michael J. Spencer 1:f5ac63519541 123 for (; message < message_end; message++)
Michael J. Spencer 1:f5ac63519541 124 *to++= (char) (floor(my_rnd(&rand_st)*31)+64);
Michael J. Spencer 1:f5ac63519541 125 extra=(char) (floor(my_rnd(&rand_st)*31));
Michael J. Spencer 1:f5ac63519541 126 while (to_start != to)
Michael J. Spencer 1:f5ac63519541 127 *(to_start++)^=extra;
Michael J. Spencer 1:f5ac63519541 128 }
Michael J. Spencer 1:f5ac63519541 129 *to= 0;
Michael J. Spencer 1:f5ac63519541 130 }
Michael J. Spencer 1:f5ac63519541 131