~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to libdrizzle/password.c

Merged build changes from Antony.

Show diffs side-by-side

added added

removed removed

Lines of Context:
58
58
 
59
59
*****************************************************************************/
60
60
 
61
 
#include <my_global.h>
62
 
#include <my_sys.h>
63
 
#include <m_string.h>
64
 
#include <sha1.h>
 
61
#include <drizzled/global.h>
 
62
#include <mysys/my_sys.h>
 
63
#include <mystrings/m_string.h>
 
64
#include <mysys/sha1.h>
65
65
#include "drizzle.h"
66
66
 
67
67
/************ MySQL 3.23-4.0 authentication routines: untouched ***********/
78
78
void randominit(struct rand_struct *rand_st, uint32_t seed1, uint32_t seed2)
79
79
{                                               /* For mysql 3.21.# */
80
80
#ifdef HAVE_purify
81
 
  bzero((char*) rand_st,sizeof(*rand_st));      /* Avoid UMC varnings */
 
81
  memset((char*) rand_st, 0, sizeof(*rand_st));      /* Avoid UMC varnings */
82
82
#endif
83
83
  rand_st->max_value= 0x3FFFFFFFL;
84
84
  rand_st->max_value_dbl=(double) rand_st->max_value;
132
132
  result[1]=nr2 & (((uint32_t) 1L << 31) -1L);
133
133
}
134
134
 
135
 
static inline uint8 char_val(uint8 X)
 
135
static inline uint8_t char_val(uint8_t X)
136
136
{
137
137
  return (uint) (X >= '0' && X <= '9' ? X-'0' :
138
138
      X >= 'A' && X <= 'Z' ? X-'A'+10 : X-'a'+10);
204
204
*/ 
205
205
 
206
206
static void
207
 
hex2octet(uint8 *to, const char *str, uint len)
 
207
hex2octet(uint8_t *to, const char *str, uint len)
208
208
{
209
209
  const char *str_end= str + len;
210
210
  while (str < str_end)
230
230
static void
231
231
my_crypt(char *to, const uchar *s1, const uchar *s2, uint len)
232
232
{
233
 
  const uint8 *s1_end= s1 + len;
 
233
  const uint8_t *s1_end= s1 + len;
234
234
  while (s1 < s1_end)
235
235
    *to++= *s1++ ^ *s2++;
236
236
}
252
252
make_scrambled_password(char *to, const char *password)
253
253
{
254
254
  SHA1_CONTEXT sha1_context;
255
 
  uint8 hash_stage2[SHA1_HASH_SIZE];
 
255
  uint8_t hash_stage2[SHA1_HASH_SIZE];
256
256
 
257
257
  mysql_sha1_reset(&sha1_context);
258
258
  /* stage 1: hash password */
259
 
  mysql_sha1_input(&sha1_context, (uint8 *) password, (uint) strlen(password));
260
 
  mysql_sha1_result(&sha1_context, (uint8 *) to);
 
259
  mysql_sha1_input(&sha1_context, (uint8_t *) password, (uint) strlen(password));
 
260
  mysql_sha1_result(&sha1_context, (uint8_t *) to);
261
261
  /* stage 2: hash stage1 output */
262
262
  mysql_sha1_reset(&sha1_context);
263
 
  mysql_sha1_input(&sha1_context, (uint8 *) to, SHA1_HASH_SIZE);
 
263
  mysql_sha1_input(&sha1_context, (uint8_t *) to, SHA1_HASH_SIZE);
264
264
  /* separate buffer is used to pass 'to' in octet2hex */
265
265
  mysql_sha1_result(&sha1_context, hash_stage2);
266
266
  /* convert hash_stage2 to hex string */
290
290
scramble(char *to, const char *message, const char *password)
291
291
{
292
292
  SHA1_CONTEXT sha1_context;
293
 
  uint8 hash_stage1[SHA1_HASH_SIZE];
294
 
  uint8 hash_stage2[SHA1_HASH_SIZE];
 
293
  uint8_t hash_stage1[SHA1_HASH_SIZE];
 
294
  uint8_t hash_stage2[SHA1_HASH_SIZE];
295
295
 
296
296
  mysql_sha1_reset(&sha1_context);
297
297
  /* stage 1: hash password */
298
 
  mysql_sha1_input(&sha1_context, (uint8 *) password, (uint) strlen(password));
 
298
  mysql_sha1_input(&sha1_context, (uint8_t *) password, (uint) strlen(password));
299
299
  mysql_sha1_result(&sha1_context, hash_stage1);
300
300
  /* stage 2: hash stage 1; note that hash_stage2 is stored in the database */
301
301
  mysql_sha1_reset(&sha1_context);
303
303
  mysql_sha1_result(&sha1_context, hash_stage2);
304
304
  /* create crypt string as sha1(message, hash_stage2) */;
305
305
  mysql_sha1_reset(&sha1_context);
306
 
  mysql_sha1_input(&sha1_context, (const uint8 *) message, SCRAMBLE_LENGTH);
 
306
  mysql_sha1_input(&sha1_context, (const uint8_t *) message, SCRAMBLE_LENGTH);
307
307
  mysql_sha1_input(&sha1_context, hash_stage2, SHA1_HASH_SIZE);
308
308
  /* xor allows 'from' and 'to' overlap: lets take advantage of it */
309
 
  mysql_sha1_result(&sha1_context, (uint8 *) to);
 
309
  mysql_sha1_result(&sha1_context, (uint8_t *) to);
310
310
  my_crypt(to, (const uchar *) to, hash_stage1, SCRAMBLE_LENGTH);
311
311
}
312
312
 
333
333
 
334
334
my_bool
335
335
check_scramble(const char *scramble_arg, const char *message,
336
 
               const uint8 *hash_stage2)
 
336
               const uint8_t *hash_stage2)
337
337
{
338
338
  SHA1_CONTEXT sha1_context;
339
 
  uint8 buf[SHA1_HASH_SIZE];
340
 
  uint8 hash_stage2_reassured[SHA1_HASH_SIZE];
 
339
  uint8_t buf[SHA1_HASH_SIZE];
 
340
  uint8_t hash_stage2_reassured[SHA1_HASH_SIZE];
341
341
 
342
342
  mysql_sha1_reset(&sha1_context);
343
343
  /* create key to encrypt scramble */
344
 
  mysql_sha1_input(&sha1_context, (const uint8 *) message, SCRAMBLE_LENGTH);
 
344
  mysql_sha1_input(&sha1_context, (const uint8_t *) message, SCRAMBLE_LENGTH);
345
345
  mysql_sha1_input(&sha1_context, hash_stage2, SHA1_HASH_SIZE);
346
346
  mysql_sha1_result(&sha1_context, buf);
347
347
  /* encrypt scramble */
364
364
    password  IN  4.1.1 version value of user.password
365
365
*/
366
366
    
367
 
void get_salt_from_password(uint8 *hash_stage2, const char *password)
 
367
void get_salt_from_password(uint8_t *hash_stage2, const char *password)
368
368
{
369
369
  hex2octet(hash_stage2, password+1 /* skip '*' */, SHA1_HASH_SIZE * 2);
370
370
}
377
377
    salt  IN  password in salt format
378
378
*/
379
379
 
380
 
void make_password_from_salt(char *to, const uint8 *hash_stage2)
 
380
void make_password_from_salt(char *to, const uint8_t *hash_stage2)
381
381
{
382
382
  *to++= PVERSION41_CHAR;
383
383
  octet2hex(to, (const char*) hash_stage2, SHA1_HASH_SIZE);