diff options
| author | Paul Buetow <paul@buetow.org> | 2010-11-21 16:02:41 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2010-11-21 16:02:41 +0000 |
| commit | c155ee9e0f133aafff70984f5b09c45efc62ca5a (patch) | |
| tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /0.8/src/contrib/crypt/md5crypt.cpp | |
| parent | 19f9940dc968afae01b54377ee23ec59069c9646 (diff) | |
moving stuff to branches
Diffstat (limited to '0.8/src/contrib/crypt/md5crypt.cpp')
| -rw-r--r-- | 0.8/src/contrib/crypt/md5crypt.cpp | 187 |
1 files changed, 0 insertions, 187 deletions
diff --git a/0.8/src/contrib/crypt/md5crypt.cpp b/0.8/src/contrib/crypt/md5crypt.cpp deleted file mode 100644 index 1e30c88..0000000 --- a/0.8/src/contrib/crypt/md5crypt.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/*:* - *: File: ./src/contrib/crypt/md5crypt.cpp - *: - *: yChat; Homepage: ychat.buetow.org; Version 0.9.0-CURRENT - *: - *: Copyright (C) 2003 Paul C. Buetow, Volker Richter - *: Copyright (C) 2004 Paul C. Buetow - *: Copyright (C) 2005 EXA Digital Solutions GbR - *: Copyright (C) 2006, 2007 Paul C. Buetow - *: - *: This program is free software; you can redistribute it and/or - *: modify it under the terms of the GNU General Public License - *: as published by the Free Software Foundation; either version 2 - *: of the License, or (at your option) any later version. - *: - *: This program is distributed in the hope that it will be useful, - *: but WITHOUT ANY WARRANTY; without even the implied warranty of - *: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - *: GNU General Public License for more details. - *: - *: You should have received a copy of the GNU General Public License - *: along with this program; if not, write to the Free Software - *: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - *:*/ - -/* - * ---------------------------------------------------------------------------- - * "THE BEER-WARE LICENSE" (Revision 42): - * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you - * can do whatever you want with this stuff. If we meet some day, and you think - * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp - * ---------------------------------------------------------------------------- - */ - -/* - * Ported from FreeBSD to Linux, only minimal changes. --marekm - */ - -#include <unistd.h> -/* #include <stdio.h> */ -#include <string.h> -#include "md5.h" - -namespace md5 -{ - -static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */ - "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - -static void -to64(char *s, unsigned long v, int n) -{ - while (--n >= 0) - { - *s++ = itoa64[v&0x3f]; - v >>= 6; - } -} - -/* - * UNIX password - * - * Use MD5 for what it is best at... - */ - -char * -MD5Crypt(const char *pw, const char *salt) -{ - static const char *magic = "$1$"; /* - * This string is magic for - * this algorithm. Having - * it this way, we can get - * get better later on - */ - static char passwd[120], *p; - static const char *sp,*ep; - unsigned char final[16]; - int sl,pl,i,j; - MD5_CTX ctx,ctx1; - unsigned long l; - - /* Refine the Salt first */ - sp = salt; - - /* If it starts with the magic string, then skip that */ - if (!strncmp(sp,magic,strlen(magic))) - sp += strlen(magic); - - /* It stops at the first '$', max 8 chars */ - for (ep=sp;*ep && *ep != '$' && ep < (sp+8);ep++) - continue; - - /* get the length of the true salt */ - sl = ep - sp; - - MD5Init(&ctx); - - /* The password first, since that is what is most unknown */ - MD5Update(&ctx,(const unsigned char*)pw,strlen(pw)); - - /* Then our magic string */ - MD5Update(&ctx,(const unsigned char*)magic,strlen(magic)); - - /* Then the raw salt */ - MD5Update(&ctx,(const unsigned char*)sp,sl); - - /* Then just as many characters of the MD5(pw,salt,pw) */ - MD5Init(&ctx1); - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - MD5Update(&ctx1,(const unsigned char*)sp,sl); - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - MD5Final(final,&ctx1); - for (pl = strlen(pw); pl > 0; pl -= 16) - MD5Update(&ctx,final,pl>16 ? 16 : pl); - - /* Don't leave anything around in vm they could use. */ - memset(final,0,sizeof final); - - /* Then something really weird... */ - for (j=0,i = strlen(pw); i ; i >>= 1) - if (i&1) - MD5Update(&ctx, final+j, 1); - else - MD5Update(&ctx, (const unsigned char*)pw+j, 1); - - /* Now make the output string */ - strcpy(passwd,magic); - strncat(passwd,sp,sl); - strcat(passwd,"$"); - - MD5Final(final,&ctx); - - /* - * and now, just to make sure things don't run too fast - * On a 60 Mhz Pentium this takes 34 msec, so you would - * need 30 seconds to build a 1000 entry dictionary... - */ - for (i=0;i<1000;i++) - { - MD5Init(&ctx1); - if (i & 1) - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - else - MD5Update(&ctx1,final,16); - - if (i % 3) - MD5Update(&ctx1,(const unsigned char*)sp,sl); - - if (i % 7) - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - - if (i & 1) - MD5Update(&ctx1,final,16); - else - MD5Update(&ctx1,(const unsigned char*)pw,strlen(pw)); - MD5Final(final,&ctx1); - } - - p = passwd + strlen(passwd); - - l = (final[ 0]<<16) | (final[ 6]<<8) | final[12]; - to64(p,l,4); - p += 4; - l = (final[ 1]<<16) | (final[ 7]<<8) | final[13]; - to64(p,l,4); - p += 4; - l = (final[ 2]<<16) | (final[ 8]<<8) | final[14]; - to64(p,l,4); - p += 4; - l = (final[ 3]<<16) | (final[ 9]<<8) | final[15]; - to64(p,l,4); - p += 4; - l = (final[ 4]<<16) | (final[10]<<8) | final[ 5]; - to64(p,l,4); - p += 4; - l = final[11] ; - to64(p,l,2); - p += 2; - *p = '\0'; - - /* Don't leave anything around in vm they could use. */ - memset(final,0,sizeof final); - - return passwd; -} - -} |
