V5/usr/source/s3/crypt.s
/ crypt -- password incoding
/ mov $key,r0
/ jsr pc,crypt
.globl crypt, word
crypt:
mov r1,-(sp)
mov r2,-(sp)
mov r3,-(sp)
mov r4,-(sp)
mov r5,-(sp)
mov r0,r1
mov $key,r0
movb $004,(r0)+
movb $034,(r0)+
1:
cmp r0,$key+64.
bhis 1f
movb (r1)+,(r0)+
bne 1b
1:
dec r0
/
/
/ fill out key space with clever junk
/
mov $key,r1
1:
movb -1(r0),r2
movb (r1)+,r3
xor r3,r2
movb r2,(r0)+
cmp r0,$key+128.
blo 1b
/
/
/ establish wheel codes and cage codes
/
mov $wheelcode,r4
mov $cagecode,r5
mov $256.,-(sp)
2:
clr r2
clr (r4)
mov $wheeldiv,r3
3:
clr r0
mov (sp),r1
div (r3)+,r0
add r1,r2
bic $40,r2
bis shift(r2),(r4)
cmp r3,$wheeldiv+6.
bhis 4f
bis shift+4(r2),(r5)
4:
cmp r3,$wheeldiv+10.
blo 3b
sub $2,(sp)
tst (r4)+
tst (r5)+
cmp r4,$wheelcode+256.
blo 2b
tst (sp)+
/
.data
shift: 1;2;4;10;20;40;100;200;400;1000;2000;4000;10000;20000;40000;100000
1;2
wheeldiv: 32.; 18.; 10.; 6.; 4.
.bss
cagecode: .=.+256.
wheelcode: .=.+256.
.text
/
/
/ make the internal settings of the machine
/ both the lugs on the 128 cage bars and the lugs
/ on the 16 wheels are set from the expanded key
/
mov $key,r0
mov $cage,r2
mov $wheel,r3
1:
movb (r0)+,r1
bic $!177,r1
asl r1
mov cagecode(r1),(r2)+
mov wheelcode(r1),(r3)+
cmp r0,$key+128.
blo 1b
/
/
/ now spin the cage against the wheel to produce output.
/
mov $word,r4
mov $wheel+128.,r3
3:
mov -(r3),r2
mov $cage,r0
clr r5
1:
bit r2,(r0)+
beq 2f
incb r5
2:
cmp r0,$cage+256.
blo 1b
/
/ we have a piece of output from current wheel
/ it needs to be folded to remove lingering hopes of
/ inverting the function
/
mov r4,-(sp)
clr r4
div $26.+26.+10.,r4
add $'0,r5
cmp r5,$'9
blos 1f
add $'A-'9-1,r5
cmp r5,$'Z
blos 1f
add $'a-'Z-1,r5
1:
mov (sp)+,r4
movb r5,(r4)+
cmp r4,$word+8.
blo 3b
/
mov (sp)+,r5
mov (sp)+,r4
mov (sp)+,r3
mov (sp)+,r2
mov (sp)+,r1
mov $word,r0
rts pc
.bss
key: .=.+128.
word: .=.+32.
cage: .=.+256.
wheel: .=.+256.