Re: The market of ASICs (One GigaKey / Second?)

"Dan Oetting" <[email protected]>
Newsgroups gmane.comp.distributed-net.hardware
Message-ID <[email protected]>
On Aug 7, 2004, at 3:16 AM, david fleischer wrote:

> Hi,
> I was wondering, has anyone done analysis of the code
> that is available? (the source code) There is the
> assembly code and also an ansiC version, but little if
> any description of which part goes with which.
> Am I supposed to figure this out from the code alone?

What type of analysis are you looking for? One of the first thing I did 
when starting to work on optimizing the cores was build a simple 
reference core to understand what was going on. Here is my RC5-64 
reference core. The only major change for RC5-72 is the key and L[ ] 
need to be 3 words (big enough to hold 72 bits) instead of 2 and the 
index j in the inner loop needs to cycle 0,1,2,0,1,2... This should 
give you an idea of what the hardware needs to do.

#include "RC5UnitWork.h"	// interface definitions
#include "rotate.h"			// Inline rotate macros for most platforms

// reverse the bytes in a word (belongs in rotate.h)
#define reverse_bytes(x) \
	((((x) >> 24) & 0x000000FF) | \
	 (((x) >>  8) & 0x0000FF00) | \
	 (((x) <<  8) & 0x00FF0000) | \
	 (((x) << 24) & 0xFF000000))

WorkPrototype RC5_Reference;
unsigned long RC5_Reference( RC5UnitWork *work, unsigned long 
itterations )
{
	const RC5_WORD P = 0xB7E15163;
	const RC5_WORD Q = 0x9E3779B9;
	
	RC5_WORD S[26],L[2];
	RC5_WORD A, B;
	
	int i, j, k;
	unsigned long count;

	count = itterations;


	while (count)
	{
		/* round 0 */
		S[0] = P;
		for (i=1;i<26;i++)
			S[i] = S[i-1] + Q;

		L[0] = work->L0.lo;
		L[1] = work->L0.hi;
		
		/* rounds 1,2,3 */
		A = B = 0;
		j = 0;
		for (k=1;k<4;k++)
		{
			for (i=j=0;i<26;i++,j=1-j)
			{
				A = S[i] = ROTL3(S[i] + A + B);
				B = L[j] = ROTL(L[j] + A + B, A + B);
			}
		}
		
		/* encryption */
		A = work->plain.lo + S[0];
		B = work->plain.hi + S[1];

		
		for (i=2; i<26; i+=2)
		{
			A = ROTL(A ^ B, B) + S[i];
			B = ROTL(B ^ A, A) + S[i+1];
		}

                 /* test for found key */
		if ((A == work->cypher.lo) && (B == work->cypher.hi))
			break;
		
		/* increment key */
		work->L0.hi = reverse_bytes(reverse_bytes(work->L0.hi)+1);
		if (work->L0.hi == 0)
			work->L0.lo = reverse_bytes(reverse_bytes(work->L0.lo)+1);
		
		count--;
	}/* while (count) */

	return (itterations - count);
}

_______________________________________________
Hardware mailing list
Hardware-Ra3b/QYEcJ3d140v2zMXi0fjHoOT/h/[email protected]
http://lists.distributed.net/mailman/listinfo/hardware
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.