pgpdes3_68k.c

来自「著名的加密软件的应用于电子邮件中」· C语言 代码 · 共 405 行

C
405
字号
/*
* pgpDES3_68K.c
*
* Copyright (C) 1996,1997 Pretty Good Privacy, Inc. All rights reserved.
*
* $Id: pgpDES3_68K.c,v 1.1.2.1 1997/06/07 09:49:54 mhw Exp $
*/

#include <stdlib.h>

#include "PGPFoneUtils.h"
#include "pgpDES3.h"

static void deskey(uchar *, short, ulong *);

static asm void deskey(uchar *key, short edf, ulong *buf)
{
	fralloc +
	movem.l d3-d5/a2-a3,-(a7)	//save registers
	lea @kpp,a2	//table of permutation adjusts
	lea @kp0,a0	//tables of byte/bit offsets
	movea.l key,a1	//load address of nominal key
	moveq #0,d4	//clear this register
	moveq #15,d0	//do all 16 rounds
	movea.l buf,a3	//load address of key register
	cmpi.w #EN0,edf	//are we encrypting
	beq	@cks1 //yes - start now
	lea	120(a3),a3 //no - adjust backfill
	bra	@cks1 //now start
@kpp:
	dc.w	0,0,0,112,112,112,112,112,224,0,112,112,112,112,112,224
@kp0:
	dc.b	6,6,1,6,6,5,4,6,7,4,6,7,2,7,1,5,0,5,4,5,3,6,3,7,5,4,7,6
	dc.b	0,1,2,2,3,4,4,1,6,2,4,3,0,4,0,2,7,3,2,3,4,2,7,1,1,1,2,4
	dc.b	5,5,4,7,7,7,0,6,1,7,2,5,5,6,6,4,7,5,0,7,4,4,3,5,2,6,5,7
	dc.b	5,2,5,1,3,2,0,3,6,3,2,1,3,3,1,4,5,3,1,2,1,3,7,2,6,1,3,1

	dc.b	4,0,4,3,4,6,1,3,5,6,5,0,4,2,1,5,0,2,5,2,5,1,0,0,5,3,0,6
	dc.b	7,2,7,4,3,0,7,0,6,6,6,0,3,2,3,5,6,2,7,3,6,4,7,1,2,6,7,6
	dc.b	1,4,1,2,0,1,5,5,5,4,1,6,0,3,1,1,0,4,1,0,4,4,4,1,0,5,4,5
	dc.b	3,3,2,3,2,5,2,4,7,5,3,1,3,4,2,0,2,1,3,6,6,3,2,2,6,5,6,1

	dc.b	0,3,5,5,1,4,5,1,1,1,4,5,5,4,0,2,5,6,4,1,0,5,4,2,4,4,4,0
	dc.b	2,2,3,6,7,6,6,1,3,3,3,4,7,1,6,2,7,5,6,3,2,5,6,5,7,2,2,0
	dc.b	5,2,0,0,5,0,0,4,1,0,1,5,1,3,5,3,4,6,0,6,0,1,1,6,4,3,1,2
	dc.b	6,4,7,0,7,4,3,0,2,1,2,6,7,3,3,2,6,0,3,5,2,4,6,6,2,3,3,1
@cks1:
	suba.w (a2)+,a0	//correct permutation
	moveq #7,d1	//do 8 bytes worth
@cks2:
	moveq #6,d2	//do 7 bits per byte
	moveq #0,d3	//clear a byte to fill
@cks3:
	move.b (a0)+,d4	//get a byte number
	move.b (a0)+,d5	//get a bit number
	btst d5,0(a1,d4.w)	//test bit in key byte
	beq.s @cks4	//if no bit to set
	bset d2,d3	//else set a bit
@cks4:
		dbf d2,@cks3	//loop until all bits done
		move.b d3,(a3)+	//set byte
		dbf d1,@cks2	//loop through all bytes
		lea -8(a3),a1	//reset a1 to last subkey
		cmpi.w #EN0,edf	//check mode
		beq.s @cks5	//encryption
		lea -16(a3),a3	//adjust filling
@cks5:
		dbf d0,@cks1	//for all rounds
		move.l #0x3f3f3f3f,d1	//load bit mask
		movea.l buf,a0	//reload key register
		moveq #15,d2	//load loop index
@cks6:
		move.l (a0),d0	//next raw target
		and.l d1,d0	//clear bits
		rol.l #4,d0	//preallign
		move.l d0,(a0)+	//set cooked key - even
		and.l d1,(a0)+	//set cooked key - odd
		dbf d2,@cks6	//all 32 longs
		movem.l (a7)+,d3-d5/a2-a3	//restore registers
		frfree
		rts
	}

void des3key(uchar *hexkey, short mode, void **ksa)
{
		ulong *ks;
		uchar *first, *third;
		short revmod;

		*ksa = ks = (ulong *)pgp_malloc(96 * sizeof(ulong));

		if(mode == EN0)
		{
			revmod = DE1;
			first = hexkey;
			third = &hexkey[16];
		}
		else
		{
			revmod = EN0;
			first = &hexkey[16];
			third = hexkey;
		}
	deskey(first, mode, ks);
	deskey(&hexkey[8], revmod, &ks[32]);
	deskey(third, mode, &ks[64]);
	}

void DESDKeyDone(void *ksa)
{
	pgp_free((ulong *)ksa);
}

asm void D3des(uchar *in, uchar *out, void *ksa)
{
	fralloc +
	movem.l	d3-d7/a2,-(a7)
	movea.l	in,a0
	move.l (a0)+,d3	/* D3 = L */
	move.l (a0),d5	/* D5 = R */
	move.l d3,d2	/* EXSHMSK(R,0x0f0f0f0f,L,4,tmp) */
	lsr.l #4,d2
	eor.l d5,d2
	andi.l #0x0f0f0f0f,d2
	eor.l d2,d5
	lsl.l #4,d2
	eor.l d2,d3
	swap d3	/* EXSHMSK(R,0x0000ffff,L,16,tmp) */
	move.w d3,d2
	move.w d5,d3
	move.w d2,d5
	swap d3
	move.l d5,d2	/* EXSHMSK(L,0x33333333,R,2,tmp) */
	lsr.l #2,d2
	eor.l d3,d2
	andi.l #0x33333333,d2
	eor.l d2,d3
	lsl.l #2,d2
	eor.l d2,d5
	move.l d5,d2	/* EXSHMSK(L,0x00ff00ff,R,8,tmp) */
	lsr.l #8,d2
	eor.l d3,d2
	andi.l #0x00ff00ff,d2
	eor.l d2,d3
	lsl.l #8,d2
	eor.l d2,d5
	rol.l #1,d5	/* EXSHMSK(R,0x55555555,L,1,tmp) */
	move.l d3,d2
	eor.l d5,d2
	andi.l #0xaaaaaaaa,d2
	eor.l d2,d5
	eor.l d2,d3
	rol.l #1,d3
	lea @SP0,a0
	lea @SP1,a1
	movea.l ksa,a2
	move.l #0x03f003f0,d2
	moveq #2,d7
	bra @des0
	DC.W 0x0123 /* alignment slop */
/* On a 68030 it helps _a_lot_ if SP0 (& SP1) are long alligned! */
@SP0:
	DC.L	0x01010400,0x00000208,0x00000100,0x00200000
	DC.L	0x00000000,0x08020200,0x02080100,0x04200002
	DC.L	0x00010000,0x00000000,0x02080000,0x04000802
	DC.L	0x01010404,0x08020008,0x42000100,0x00000000
	DC.L	0x01010004,0x08000200,0x00080000,0x00000800
	DC.L	0x00010404,0x00000000,0x00000100,0x04000802
	DC.L	0x00000004,0x00020208,0x40000000,0x00200802
	DC.L	0x00010000,0x08000200,0x02080000,0x04200800
	DC.L	0x00000400,0x00020008,0x40080100,0x04200802
	DC.L	0x01010400,0x08000008,0x00080000,0x00200000
	DC.L	0x01010404,0x08000008,0x02000100,0x00000000
	DC.L	0x00000400,0x00020000,0x40080100,0x04000002
	DC.L	0x01000404,0x08020208,0x42000100,0x00000002
	DC.L	0x01010004,0x00020008,0x42080000,0x04000000
	DC.L	0x01000000,0x08020000,0x00080100,0x04200002
	DC.L	0x00000004,0x00000208,0x40000000,0x00000802
	DC.L	0x00000404,0x08000000,0x02000000,0x04000800
	DC.L	0x01000400,0x00000008,0x40080000,0x00200802
	DC.L	0x01000400,0x08020200,0x40080000,0x00200002
	DC.L	0x00010400,0x00000200,0x00000000,0x04000800
	DC.L	0x00010400,0x00020200,0x40000100,0x04000002
	DC.L	0x01010000,0x08020000,0x42080100,0x04200000
	DC.L	0x01010000,0x08020008,0x42080100,0x04200800
	DC.L	0x01000404,0x00020208,0x02000100,0x00200002
	DC.L	0x00010004,0x08000208,0x42080000,0x04200000
	DC.L	0x01000004,0x00020200,0x40000100,0x00000800
	DC.L	0x01000004,0x00020000,0x00000000,0x00000802
	DC.L	0x00010004,0x08000208,0x42000000,0x04200802
	DC.L	0x00000000,0x00000008,0x02080100,0x00200800
	DC.L	0x00000404,0x08020208,0x02000000,0x00000002
	DC.L	0x00010404,0x00000200,0x42000000,0x04000000
	DC.L	0x01000000,0x08000000,0x00080100,0x00200800
	DC.L	0x00010000,0x08020200,0x00080000,0x04000000
	DC.L	0x01010404,0x08000000,0x42000100,0x00200800
	DC.L	0x00000004,0x00020008,0x00000100,0x00200000
	DC.L	0x01010000,0x00000208,0x02000000,0x04000802
	DC.L	0x01010400,0x00020000,0x40000000,0x04000802
	DC.L	0x01000000,0x08020200,0x02080000,0x04200002
	DC.L	0x01000000,0x08000200,0x42000100,0x04200002
	DC.L	0x00000400,0x00000000,0x40080100,0x00000002
	DC.L	0x01010004,0x00000200,0x02000100,0x00200002
	DC.L	0x00010000,0x00020008,0x40000000,0x04000000
	DC.L	0x00010400,0x08020208,0x42080000,0x04000800
	DC.L	0x01000004,0x08000200,0x02080100,0x00200000
	DC.L	0x00000400,0x08000008,0x40080100,0x04200800
	DC.L	0x00000004,0x00000200,0x00000100,0x00000802
	DC.L	0x01000404,0x00000000,0x02000000,0x00200802
	DC.L	0x00010404,0x08020008,0x42080000,0x04200800
	DC.L	0x01010404,0x08000208,0x42080100,0x00000802
	DC.L	0x00010004,0x00020000,0x00080100,0x04000002
	DC.L	0x01010000,0x08000000,0x42000000,0x04200802
	DC.L	0x01000404,0x08020208,0x42080100,0x04200000
	DC.L	0x01000004,0x00000008,0x02080000,0x00200800
	DC.L	0x00000404,0x00020208,0x00000000,0x00000000
	DC.L	0x00010404,0x00020200,0x40080000,0x00000002
	DC.L	0x01010400,0x08000008,0x42000000,0x04200802
	DC.L	0x00000404,0x08020000,0x00080100,0x00000000
	DC.L	0x01000400,0x08000208,0x02000100,0x00200802
	DC.L	0x01000400,0x00000208,0x40000100,0x04200000
	DC.L	0x00000000,0x08020000,0x00080000,0x00000800
	DC.L	0x00010004,0x00020208,0x00000000,0x04000002
	DC.L	0x00010400,0x00000008,0x40080000,0x04000800
	DC.L	0x00000000,0x08020008,0x02080100,0x00000800
	DC.L	0x01010004,0x00020200,0x40000100,0x00200002
@SP1:
	DC.L	0x80108020,0x00802001,0x20000010,0x10001040
	DC.L	0x80008000,0x00002081,0x20400000,0x00001000
	DC.L	0x00008000,0x00002081,0x00004000,0x00040000
	DC.L	0x00108020,0x00000080,0x20404010,0x10041040
	DC.L	0x00100000,0x00802080,0x20400000,0x10000000
	DC.L	0x00000020,0x00800081,0x00000010,0x10001040
	DC.L	0x80100020,0x00800001,0x20404010,0x00000040
	DC.L	0x80008020,0x00002001,0x00400000,0x10000000
	DC.L	0x80000020,0x00000000,0x20004000,0x00040040
	DC.L	0x80108020,0x00802000,0x00404010,0x10040000
	DC.L	0x80108000,0x00802000,0x00400000,0x10041040
	DC.L	0x80000000,0x00802081,0x20000010,0x00041000
	DC.L	0x80008000,0x00000081,0x00400010,0x10041000
	DC.L	0x00100000,0x00000000,0x20004000,0x00041040
	DC.L	0x00000020,0x00800080,0x20000000,0x00001000
	DC.L	0x80100020,0x00800001,0x00004010,0x00000040
	DC.L	0x00108000,0x00000001,0x00000000,0x10040000
	DC.L	0x00100020,0x00002000,0x00400010,0x10000040
	DC.L	0x80008020,0x00800000,0x20004010,0x10001000
	DC.L	0x00000000,0x00802001,0x00004000,0x00001040
	DC.L	0x80000000,0x00000080,0x00404000,0x00041000
	DC.L	0x00008000,0x00800000,0x20004010,0x00040040
	DC.L	0x00108020,0x00002001,0x00000010,0x10040040
	DC.L	0x80100000,0x00002080,0x20400010,0x10041000
	DC.L	0x00100020,0x00800081,0x20400010,0x00001040
	DC.L	0x80000020,0x00000001,0x00000000,0x00000000
	DC.L	0x00000000,0x00002080,0x00404010,0x00000000
	DC.L	0x00108000,0x00800080,0x20404000,0x10040040
	DC.L	0x00008020,0x00002000,0x00004010,0x10000040
	DC.L	0x80108000,0x00802080,0x00404000,0x10001000
	DC.L	0x80100000,0x00802081,0x20404000,0x00041040
	DC.L	0x00008020,0x00000081,0x20000000,0x00040000
	DC.L	0x00000000,0x00800080,0x20004000,0x00041040
	DC.L	0x00108020,0x00800001,0x00000010,0x00040000
	DC.L	0x80100020,0x00802000,0x20400010,0x10041000
	DC.L	0x00100000,0x00802081,0x00404000,0x00001000
	DC.L	0x80008020,0x00000081,0x20404010,0x00000040
	DC.L	0x80100000,0x00000000,0x00400000,0x10040040
	DC.L	0x80108000,0x00000000,0x00004010,0x00001000
	DC.L	0x00008000,0x00802000,0x20000010,0x00041040
	DC.L	0x80100000,0x00002080,0x00400000,0x10001000
	DC.L	0x80008000,0x00800080,0x20004000,0x00000040
	DC.L	0x00000020,0x00800081,0x20000000,0x10000040
	DC.L	0x80108020,0x00000001,0x00004010,0x10040000
	DC.L	0x00108020,0x00802001,0x20000010,0x10040040
	DC.L	0x00000020,0x00002081,0x20404010,0x10000000
	DC.L	0x00008000,0x00002081,0x00404000,0x00040000
	DC.L	0x80000000,0x00000080,0x20400000,0x10001040
	DC.L	0x00008020,0x00802081,0x00404010,0x00000000
	DC.L	0x80108000,0x00000081,0x20404000,0x10041040
	DC.L	0x00100000,0x00000001,0x00000000,0x00040040
	DC.L	0x80000020,0x00002000,0x20400010,0x10000040
	DC.L	0x00100020,0x00800001,0x00000010,0x10040000
	DC.L	0x80008020,0x00002001,0x00004000,0x10001000
	DC.L	0x80000020,0x00802080,0x20400000,0x10001040
	DC.L	0x00100020,0x00800081,0x00404010,0x00000000
	DC.L	0x00108000,0x00002001,0x00004000,0x10041040
	DC.L	0x00000000,0x00002080,0x00400010,0x00041000
	DC.L	0x80008000,0x00800000,0x20004010,0x00041000
	DC.L	0x00008020,0x00802001,0x00000000,0x00001040
	DC.L	0x80000000,0x00000080,0x20404000,0x00001040
	DC.L	0x80100020,0x00800000,0x20000000,0x00040040
	DC.L	0x80108020,0x00002000,0x00400010,0x10000000
	DC.L 0x00108000,0x00802080,0x20004010,0x10041000
@desIter:
	exg d5,d3
@des0:
	moveq #7,d1
@desLoop:
	move.l (a2)+,d0
	eor.l d5,d0
	move.l d0,d6
	and.l d2,d0
	move.l 12(a0,d0.w),d4	/* S6 */
	swap d0
	or.l 4(a0,d0.w),d4	/* S2 */
	ror.l #8,d6
	and.l d2,d6
	or.l 8(a0,d6.w),d4	/* S4 */
	swap d6
	or.l 0(a0,d6.w),d4	/* S0 */
	move.l (a2)+,d0
	eor.l d5,d0
	move.l d0,d6
	lsl.l #4,d0
	and.l d2,d0
	or.l 12(a1,d0.w),d4	/* S7 */
	swap d0
	or.l 4(a1,d0.w),d4	/* S3 */
	lsr.l #4,d6
	and.l d2,d6
	or.l 8(a1,d6.w),d4	/* S5 */
	swap d6
	or.l 0(a1,d6.w),d4	/* S1 */
	eor.l d4,d3
	move.l (a2)+,d0
	eor.l d3,d0
	move.l d0,d6
	and.l d2,d0
	move.l 12(a0,d0.w),d4	/* S6 */
	swap d0
	or.l 4(a0,d0.w),d4	/* S2 */
	ror.l #8,d6
	and.l d2,d6
	or.l 8(a0,d6.w),d4	/* S4 */
	swap d6
	or.l 0(a0,d6.w),d4	/* S0 */
	move.l (a2)+,d0
	eor.l d3,d0
	move.l d0,d6
	lsl.l #4,d0
	and.l d2,d0
	or.l 12(a1,d0.w),d4	/* S7 */
	swap d0
	or.l 4(a1,d0.w),d4	/* S3 */
	lsr.l #4,d6
	and.l d2,d6
	or.l 8(a1,d6.w),d4	/* S5 */
	swap d6
	or.l 0(a1,d6.w),d4	/* S1 */
	eor.l d4,d5
	dbf d1,@desLoop	/* 53 */
	dbf d7,@desIter
	ror.l #1,d5	/* EXSHMSK(R,0x55555555,L,1,tmp) */
	move.l d5,d2
	eor.l d3,d2
	andi.l #0xaaaaaaaa,d2
	eor.l d2,d3
	eor.l d2,d5
	ror.l #1,d3
	move.l d3,d2	/* EXSHMSK(L,0x00ff00ff,R,8,tmp) */
	lsr.l #8,d2
	eor.l d5,d2
	andi.l #0x00ff00ff,d2
	eor.l d2,d5
	lsl.l #8,d2
	eor.l d2,d3
	move.l d3,d2	/* EXSHMSK(L,0x33333333,R,2,tmp) */
	lsr.l #2,d2
	eor.l d5,d2
	andi.l #0x33333333,d2
	eor.l d2,d5
	lsl.l #2,d2
	eor.l d2,d3
	swap d5	/* EXSHMSK(R,0x0000ffff,L,16,tmp) */
	move.w d5,d2
	move.w d3,d5
	move.w d2,d3
	swap d5
	move.l d5,d2	/* EXSHMSK(R,0x0f0f0f0f,L,4,tmp) */
	lsr.l #4,d2
	eor.l d3,d2
	andi.l #0x0f0f0f0f,d2
	eor.l d2,d3
	lsl.l #4,d2
	eor.l d2,d5
	movea.l out,a0
	move.l d5,(a0)+
	move.l d3,(a0)
	movem.l (a7)+,a2/d3-d7
	frfree
	rts
}

/* Validation triples -
*
* Double-length key, single-length plaintext -
* Key	: 0123 4567 89ab cdef fedc ba98 7654 3210
* Plain : 0123 4567 89ab cde7
* Cipher : 7f1d 0a77 826b 8aff
*
* Triple-length key, single-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
* Plain : 0123 4567 89ab cde7
* Cipher : de0b 7c06 ae5e 0ed5
*
*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?