This is cryptsum.c in view mode; [Download] [Up]
/* cryptsum.c -- copyright 1992 by C.D.Lane */
#include <c.h>
#include <libc.h>
#include <ctype.h>
#include <stdio.h>
#include "cryptsum.h"
#define RANGE (127)
#define MAXUSHORT ((unsigned short) 0x8000)
union overlay { unsigned short halfword; char salt[2]; };
char *cs_cryptkey(const char *key, unsigned short checksum)
{
union overlay u_sum;
u_sum.halfword = checksum;
if(!isalpha(u_sum.salt[0] &= RANGE)) u_sum.salt[0] = ((u_sum.salt[0] * ('z' - 'a')) / RANGE) + 'a';
if(!isalpha(u_sum.salt[1] &= RANGE)) u_sum.salt[1] = ((u_sum.salt[1] * ('Z' - 'A')) / RANGE) + 'A';
return(crypt((char *) key, u_sum.salt) + sizeof(u_sum));
}
char *cs_tablelookup(const char *segment, const char *section, const char *table)
{
static char key[BUFSIZ];
(void) sprintf(key, "%s %s", segment, section);
while(table != NULL && *table != '\0' && strncmp(key, table, strlen(key)) != 0)
if((table = index(table, '\n')) != NULL) table++;
if(table == NULL || *table == '\0' || (table = index(table + strlen(key), ' ')) == NULL) return(NULL);
return((char *) ++table);
}
unsigned short cs_checksum(unsigned short checksum, unsigned char byte)
{
return(byte ^ ((checksum << 1) | ((checksum & MAXUSHORT) != 0)));
}
int cs_checkkey(const char *segment, const char *section, const char *key)
{
int i, size;
void *pointer;
unsigned short halfword = 0;
char *password, *encrypted, table[MAXBSIZE];
if((pointer = getsectdata(segment, section, &size)) == NULL) return(CS_NOSECTION);
for(i = 0; i < size; i++) halfword = cs_checksum(halfword, *((unsigned char *) pointer++));
if((pointer = getsectdata(CS_SEGMENT, CS_SECTION, &size)) == NULL) return(CS_NOCHECKSUM);
(void) strcat(strncpy(table, (char *) pointer, MIN(size, MAXBSIZE - 1)), "");
if((encrypted = cs_tablelookup(segment, section, table)) == NULL) return(CS_NOENTRY);
password = cs_cryptkey(key, halfword);
if(strncmp(password, encrypted, strlen(password)) != 0) return(CS_NOMATCH);
return(CS_SUCCESS);
}These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.