Annotation of pgp/src/passwd.c, revision 1.1.1.4

1.1.1.2   root        1: /*     passwd.c - Password reading/hashing routines
                      2:        (c) 1989 Philip Zimmermann.  All rights reserved.
                      3:        Implemented in Microsoft C.
                      4:        Routines for getting a pass phrase from the user's console.
                      5: */
                      6: 
                      7: #include       <stdio.h>       /* for fprintf() */
                      8: #include       <ctype.h>       /* for isdigit(), toupper(), etc. */
                      9: #include       <string.h>      /* for strlen() */
                     10: 
                     11: #include       "random.h"      /* for getstring() */
                     12: #include       "md5.h"
                     13: #include       "language.h"
                     14: #include       "pgp.h"
                     15: 
                     16: #define MAXKEYLEN 254  /* max byte length of pass phrase */
                     17: 
                     18: boolean showpass = FALSE;
                     19: 
                     20: /*
                     21: **     hashpass - Hash pass phrase down to 128 bits (16 bytes).
                     22: **  keylen must be less than 1024.
                     23: **     Use the MD5 algorithm.
                     24: */
                     25: void hashpass (char *keystring, int keylen, byte *hash)
                     26: {
                     27:        MD5_CTX mdContext;
                     28: 
                     29:        /* Calculate the hash */
                     30:        MD5Init(&mdContext);
                     31:        MD5Update(&mdContext, (unsigned char *) keystring, keylen);
1.1.1.4 ! root       32:        MD5Final(hash, &mdContext);
1.1.1.2   root       33: }      /* hashpass */
                     34: 
                     35: 
                     36: /*
                     37: **     GetHashedPassPhrase - get pass phrase from user, hashes it to an IDEA key.
                     38:        Parameters:
                     39:                returns char *keystring as the pass phrase itself
                     40:                return char *hash as the 16-byte hash of the pass phrase
                     41:                                using MD5.
                     42:                byte noecho:  
                     43:                        0=ask once, echo. 
                     44:                        1=ask once, no echo. 
                     45:                        2=ask twice, no echo.
                     46:        Return 0 if no characters are input, else return 1.
                     47:        If we return 0, the hashed key will not be useful.
                     48: */
1.1.1.4 ! root       49: int GetHashedPassPhrase(char *hash, boolean noecho)
        !            50: {      char keystr1[MAXKEYLEN+2], keystr2[MAXKEYLEN+2];
1.1.1.2   root       51:        int len;
                     52: 
                     53:        if (showpass)
                     54:                noecho = 0;
                     55:        while (TRUE) {
                     56:                fprintf(pgpout,PSTR("\nEnter pass phrase: "));
1.1.1.4 ! root       57:                getstring(keystr1,MAXKEYLEN-1,!noecho);
1.1.1.2   root       58:                if (noecho<2)   /* no need to ask again if user can see it */
                     59:                        break;
                     60:                fprintf(pgpout,PSTR("\nEnter same pass phrase again: "));
                     61:                getstring(keystr2,MAXKEYLEN-1,!noecho);
1.1.1.4 ! root       62:                if (strcmp(keystr1,keystr2)==0)
1.1.1.2   root       63:                        break;
                     64:                fprintf(pgpout,PSTR("\n\007Error: Pass phrases were different.  Try again."));
1.1.1.4 ! root       65:                memset(keystr2, 0, sizeof(keystr2));
1.1.1.2   root       66:        }
1.1.1.3   root       67:        if (noecho && (filter_mode || quietmode))
1.1.1.2   root       68:                putc('\n', pgpout);
                     69: 
1.1.1.4 ! root       70:        len = strlen(keystr1);
1.1.1.2   root       71:        if (len == 0)
                     72:                return 0;
                     73:        /* We assume ASCII pass phrases, with no charset conversions. */
1.1.1.4 ! root       74:        /* This will have to change for EBCDIC */
        !            75:        hashpass (keystr1, strlen(keystr1), (byte *) hash);
        !            76:        memset(keystr1, 0, sizeof(keystr1));
1.1.1.2   root       77:        return 1;
                     78: }      /* GetHashedPassPhrase */
                     79: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.