/* * Copyright 1983 UniSoft Corporation * Use of this material is subject to your disclosure agreement * with UniSoft Systems of Berkeley. * * mkser (buf) * Given a pointer to a buffer to stick the results in this routine * gets the serial number in raw format and converts to a 13 byte ascii * passwd sequence. * NOTE that this is the only machine dependant routine in all of the serial * number code. */ #include mkser (buf) char *buf; { unsigned long v, v1, v2; register char *lp, *cp; int i; char *cptr, *sn(); char b[20]; char *crypt(); cptr = sn(); /* get the REAL serial number */ if (!cptr) { printf("Couldn't get the serial #\n"); while(1); } lp = buf; /* resultant string buffer */ cp = cptr; /* nibble format serial # */ for (i=5; i>0; i--) { *lp = (*cp++ << 4) & 0xF0; *lp++ |= (*cp++ & 0xF); } *lp = (*cp++ << 4) & 0xF0; cp += 3; for (i=5; i>0; i--) { *lp++ |= (*cp++ & 0xF); *lp = (*cp++ << 4) & 0xF0; } *lp++ |= (*cp++ & 0xF); /* Now convert BCD serial # into binary. * Two 32 bit words + one 12 bit word */ v = 0; for (cp=buf; cp> 4) & 0xF); v = v * 10 + (*cp & 0xF); } v = v * 10 + ((*cp >> 4) & 0xF); v1 = v; v = *cp++ & 0xF; while (cp> 4) & 0xF); v = v * 10 + (*cp & 0xF); cp++; } v2 = v; v = 0; while (cp> 4) & 0xF); v = v * 10 + (*cp & 0xF); cp++; } v1 <<= 2; v1 |= v & 3; v >>= 2; v2 <<= 2; v2 |= v & 3; v >>= 2; v &= 0xFFF; cp = buf; for (i=0; i<4; i++) { *cp++ = v1 & 0xFF; v1 >>= 8; } for (i=0; i<4; i++) { *cp++ = v2 & 0xFF; v2 >>= 8; } /* use the 12 bit word as the salt to encrypt the two * 32 bit words treated as 8 characters. * Return the resultant 13 byte sting. */ cvtcy((long)v, b, 2); /* convert to two ascii chars */ cp = crypt(buf, b); /* encrypt serial number */ lp = buf; for (i=0; i<13; i++) lp[i] = *cp++; lp[i] = 0; }