|
|
1.1.1.5 ! root 1: /* passwd.c - Password reading/hashing routines ! 2: Implemented in Microsoft C. ! 3: Routines for getting a pass phrase from the user's console. ! 4: ! 5: (c) Copyright 1990-1994 by Philip Zimmermann. All rights reserved. ! 6: The author assumes no liability for damages resulting from the use ! 7: of this software, even if the damage results from defects in this ! 8: software. No warranty is expressed or implied. ! 9: ! 10: Note that while most PGP source modules bear Philip Zimmermann's ! 11: copyright notice, many of them have been revised or entirely written ! 12: by contributors who frequently failed to put their names in their ! 13: code. Code that has been incorporated into PGP from other authors ! 14: was either originally published in the public domain or is used with ! 15: permission from the various authors. ! 16: ! 17: PGP is available for free to the public under certain restrictions. ! 18: See the PGP User's Guide (included in the release package) for ! 19: important information about licensing, patent restrictions on ! 20: certain algorithms, trademarks, copyrights, and export controls. ! 21: */ ! 22: ! 23: #include <stdio.h> /* for fprintf() */ ! 24: #include <ctype.h> /* for isdigit(), toupper(), etc. */ ! 25: #include <string.h> /* for strlen() */ ! 26: ! 27: #include "random.h" /* for getstring() */ ! 28: #include "md5.h" ! 29: #include "language.h" ! 30: #include "pgp.h" ! 31: ! 32: #define MAXKEYLEN 254 /* max byte length of pass phrase */ ! 33: ! 34: boolean showpass = FALSE; ! 35: ! 36: /* ! 37: ** hashpass - Hash pass phrase down to 128 bits (16 bytes). ! 38: ** keylen must be less than 1024. ! 39: ** Use the MD5 algorithm. ! 40: */ ! 41: void hashpass (char *keystring, int keylen, byte *hash) ! 42: { ! 43: struct MD5Context mdContext; ! 44: ! 45: /* Calculate the hash */ ! 46: MD5Init(&mdContext); ! 47: MD5Update(&mdContext, (unsigned char *) keystring, keylen); ! 48: MD5Final(hash, &mdContext); ! 49: } /* hashpass */ ! 50: ! 51: ! 52: /* ! 53: ** GetHashedPassPhrase - get pass phrase from user, ! 54: hashes it to an IDEA key. ! 55: Parameters: ! 56: returns char *keystring as the pass phrase itself ! 57: return char *hash as the 16-byte hash of the pass phrase ! 58: using MD5. ! 59: byte noecho: ! 60: 0=ask once, echo. ! 61: 1=ask once, no echo. ! 62: 2=ask twice, no echo. ! 63: Return 0 if no characters are input, else return 1. ! 64: If we return 0, the hashed key will not be useful. ! 65: */ ! 66: int GetHashedPassPhrase(char *hash, boolean noecho) ! 67: { char keystr1[MAXKEYLEN+2], keystr2[MAXKEYLEN+2]; ! 68: int len; ! 69: ! 70: if (showpass) ! 71: noecho = 0; ! 72: for (;;) { ! 73: fprintf(pgpout,LANG("\nEnter pass phrase: ")); ! 74: getstring(keystr1,MAXKEYLEN-1,!noecho); ! 75: if (noecho<2) /* no need to ask again if user can see it */ ! 76: break; ! 77: fprintf(pgpout,LANG("\nEnter same pass phrase again: ")); ! 78: getstring(keystr2,MAXKEYLEN-1,!noecho); ! 79: if (strcmp(keystr1,keystr2)==0) ! 80: break; ! 81: fprintf(pgpout,LANG("\n\007Error: Pass phrases were different. Try again.")); ! 82: memset(keystr2, 0, sizeof(keystr2)); ! 83: } ! 84: if (noecho && (filter_mode || quietmode)) ! 85: putc('\n', pgpout); ! 86: ! 87: len = strlen(keystr1); ! 88: if (len == 0) ! 89: return 0; ! 90: /* We assume ASCII pass phrases, with no charset conversions. */ ! 91: /* This will have to change for EBCDIC */ ! 92: hashpass (keystr1, strlen(keystr1), (byte *) hash); ! 93: memset(keystr1, 0, sizeof(keystr1)); ! 94: return 1; ! 95: } /* GetHashedPassPhrase */ ! 96:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.