ftp.nice.ch/pub/next/developer/resources/libraries/CryptSums.1.0.N.bsa.tar.gz#/CryptSums/cryptsum.c

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.