// (do 'flg|num ['any | (NIL 'any . prg) | (T 'any . prg) ..]) -> any any doDo(any x) { any y, z, a; cell c1; x = cdr(x); if (isNil(data(c1) = EVAL(car(x)))) return Nil; Save(c1); if (isNum(data(c1))) { if (isNeg(data(c1))) { drop(c1); return Nil; } data(c1) = bigCopy(data(c1)); } x = cdr(x), z = Nil; for (;;) { if (isNum(data(c1))) { if (IsZero(data(c1))) { drop(c1); return z; } digSub1(data(c1)); } y = x; do { if (!isNum(z = car(y))) { if (isSym(z)) z = val(z); else if (isNil(car(z))) { z = cdr(z); if (isNil(a = EVAL(car(z)))) { drop(c1); return prog(cdr(z)); } val(At) = a; z = Nil; } else if (car(z) == T) { z = cdr(z); if (!isNil(a = EVAL(car(z)))) { val(At) = a; drop(c1); return prog(cdr(z)); } z = Nil; } else z = evList(z); } } while (isCell(y = cdr(y))); } }
void getRSAkeys(uint8_t* e,uint8_t* d,uint8_t* n){ uint32_t expected=0.693147*NUMLEN; uint8_t q[NUMLEN],p[NUMLEN]; *e=0; while(!*e){ #if RSADEBUG0==1 USART0_SendStr("Generating "); USART0_SendNum(PRIMELEN); USART0_SendStr("-byte primes.\n"); USART0_SendStr("Expected number of attempts: "); USART0_SendNum(expected); USART0_SendStr("\n\nGenerating prime (1/2):\n"); #endif getLargePrime(q,PRIMELEN); unsigned temp=bigBitLen(q); USART0_SendStr("==========="); USART0_SendNum(temp); USART0_SendStr("==========="); #if RSADEBUG0==1 USART0_SendStr("Generating prime (2/2):\n"); #endif getLargePrime(p,PRIMELEN); q[0]&=~1;//q-=1 p[0]&=~1;//p-=1 bigCopy(n,q); bigMul(n,p,NULL);//n=(q-1)(p-1)=phi(q*p) if(bigBitLen(n)<=MSGBITLEN) continue; q[0]|=1; p[0]|=1; *e=getOpenExp(n); } bigReverseBS(n,*e,d); bigCopy(n,q); bigMul(n,p,NULL);//n=q*p }
int32_t millerRabin(uint8_t* n){ //Most memory requirement part. mem=8*NUMLEN #if RSADEBUG==1 USART0_SendStr("Start MR test:\n"); #endif if(n[0]&1==0) return 0; uint32_t t=0; int32_t i=0,k; uint8_t temp; uint8_t s[NUMLEN]; uint8_t a[NUMLEN]; int32_t next=0; bigCopy(s,n); s[0]^=1;//s=s-1 while(!s[i]){ ++i; t+=8; } temp=s[i]; while((temp&1)==0){ ++t; temp>>=1; } bigRShift(s,t); k=0; while(k<MILLER_RABIN_K){ #if RSADEBUG==1 USART0_SendByte('.'); #endif n[0]|=1; bigRandom(a,n); bigExp(a,s,n);//a=a**s mod n n[0]^=1; if(!(bigIsOne(a)||bigEqual(a,n))){ next=0; for(i=0;(i<t-1)&&!next;++i){ n[0]|=1; bigMul(a,a,n); if(bigIsOne(a)){ #if RSADEBUG==1 USART0_SendByte(' '); #endif return 0; } n[0]^=1; if(bigEqual(a,n)) next=1; } if(!next){ #if RSADEBUG==1 USART0_SendByte(' '); #endif return 0; } } k+=2; } #if RSADEBUG==1 USART0_SendStr("\n"); #endif n[0]|=1; return 1; }
// (for sym 'num ['any | (NIL 'any . prg) | (T 'any . prg) ..]) -> any // (for sym|(sym2 . sym) 'lst ['any | (NIL 'any . prg) | (T 'any . prg) ..]) -> any // (for (sym|(sym2 . sym) 'any1 'any2 [. prg]) ['any | (NIL 'any . prg) | (T 'any . prg) ..]) -> any any doFor(any x) { any y, body, cond, a; cell c1; struct { // bindFrame struct bindFrame *link; int i, cnt; struct {any sym; any val;} bnd[2]; } f; f.link = Env.bind, Env.bind = (bindFrame*)&f; f.i = 0; if (!isCell(y = car(x = cdr(x))) || !isCell(cdr(y))) { if (!isCell(y)) { f.cnt = 1; f.bnd[0].sym = y; f.bnd[0].val = val(y); } else { f.cnt = 2; f.bnd[0].sym = cdr(y); f.bnd[0].val = val(cdr(y)); f.bnd[1].sym = car(y); f.bnd[1].val = val(car(y)); val(f.bnd[1].sym) = Zero; } y = Nil; x = cdr(x), Push(c1, EVAL(car(x))); if (isNum(data(c1))) val(f.bnd[0].sym) = Zero; body = x = cdr(x); for (;;) { if (isNum(data(c1))) { val(f.bnd[0].sym) = bigCopy(val(f.bnd[0].sym)); digAdd(val(f.bnd[0].sym), 2); if (bigCompare(val(f.bnd[0].sym), data(c1)) > 0) break; } else { if (!isCell(data(c1))) break; val(f.bnd[0].sym) = car(data(c1)); if (!isCell(data(c1) = cdr(data(c1)))) data(c1) = Nil; } if (f.cnt == 2) { val(f.bnd[1].sym) = bigCopy(val(f.bnd[1].sym)); digAdd(val(f.bnd[1].sym), 2); } do { if (!isNum(y = car(x))) { if (isSym(y)) y = val(y); else if (isNil(car(y))) { y = cdr(y); if (isNil(a = EVAL(car(y)))) { y = prog(cdr(y)); goto for1; } val(At) = a; y = Nil; } else if (car(y) == T) { y = cdr(y); if (!isNil(a = EVAL(car(y)))) { val(At) = a; y = prog(cdr(y)); goto for1; } y = Nil; } else y = evList(y); } } while (isCell(x = cdr(x))); x = body; } for1: drop(c1); if (f.cnt == 2) val(f.bnd[1].sym) = f.bnd[1].val; val(f.bnd[0].sym) = f.bnd[0].val; Env.bind = f.link; return y; } if (!isCell(car(y))) { f.cnt = 1; f.bnd[0].sym = car(y); f.bnd[0].val = val(car(y)); } else { f.cnt = 2; f.bnd[0].sym = cdar(y); f.bnd[0].val = val(cdar(y)); f.bnd[1].sym = caar(y); f.bnd[1].val = val(caar(y)); val(f.bnd[1].sym) = Zero; } y = cdr(y); val(f.bnd[0].sym) = EVAL(car(y)); y = cdr(y), cond = car(y), y = cdr(y); Push(c1,Nil); body = x = cdr(x); while (!isNil(a = EVAL(cond))) { val(At) = a; if (f.cnt == 2) { val(f.bnd[1].sym) = bigCopy(val(f.bnd[1].sym)); digAdd(val(f.bnd[1].sym), 2); } do { if (!isNum(data(c1) = car(x))) { if (isSym(data(c1))) data(c1) = val(data(c1)); else if (isNil(car(data(c1)))) { data(c1) = cdr(data(c1)); if (isNil(a = EVAL(car(data(c1))))) { data(c1) = prog(cdr(data(c1))); goto for2; } val(At) = a; data(c1) = Nil; } else if (car(data(c1)) == T) { data(c1) = cdr(data(c1)); if (!isNil(a = EVAL(car(data(c1))))) { val(At) = a; data(c1) = prog(cdr(data(c1))); goto for2; } data(c1) = Nil; } else data(c1) = evList(data(c1)); } } while (isCell(x = cdr(x))); if (isCell(y)) val(f.bnd[0].sym) = prog(y); x = body; } for2: if (f.cnt == 2) val(f.bnd[1].sym) = f.bnd[1].val; val(f.bnd[0].sym) = f.bnd[0].val; Env.bind = f.link; return Pop(c1); }