9fans archive / 1998 / 04 / 97 / prev next
From: Russ Cox rsc@pla...
Subject: [9fans] encryption routines for il
Date: Wed, 22 Apr 1998 14:26:51 -0400
Take Pace's il.tar.gz, make des.c a null file, and then
use the following encrypt.c:
(The inspiration and almost all of the code for this came from Kenji Arisawa.)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#define DESKEYLEN 7
#define NAMELEN 22
typedef unsigned char uchar;
uchar a[8] = { 128, 64, 32, 16, 8, 4, 2, 1 };
/* get bit status at the bit position n of string s
char s[8]
int n: 0 .. 63
*/
int strbit(char *s, int n)
{ int q,m;
q = n / 8;
m = n % 8;
return (s[q] & a[m]?1:0);
}
/* uchar s[8]
uchar x[1]
*/
uchar s2b(uchar *s)
{ int i;
uchar x;
x = 0;
for(i = 0; i < 8; i++) if(s[i]) x |= a[i];
return x;
}
/* uchar s[8]
uchar x[1]
*/
void b2s(uchar x, uchar *s)
{ int i;
for(i = 0; i < 8; i++) s[i] = 0;
for(i = 0; i < 8; i++) if(x & a[i]) s[i] = 1;
}
/* uchar s[64], x[8] */
void blk2str(uchar *x, uchar *s)
{ int i;
for(i = 0; i < 8; i++) b2s(x[i],&s[8*i]);
}
/* uchar s[64], x[8] */
void str2blk(uchar *s, uchar *x)
{ int i;
for(i = 0; i < 8; i++) x[i] = s2b(&s[8*i]);
}
/* Plan9 encrypt
uchar key[7] --- deskey
uchar t[8] --- target(des cypher block)
*/
void des(uchar *key, uchar *t)
{ int i,j;
char s[64],u[64];
for(j = 0; j < 8; j++){
for(i = 0; i < 7; i++) s[8*j + i] = strbit(key, 7*j + i);
s[8*j + 7] = 0;
}
setkey(s);
blk2str(t,u);
encrypt(u,0); /* encrypt */
str2blk(u,t);
}
void
plan9_encrypt(uchar *key, uchar *t, int len)
{
des(key, t);
}
This doesn't work under Linux. Don't complain to me.
Russ