#include #include #include typedef uint8_t leg_t; typedef uint16_t dleg_t; #if 0 static void mp_sqr( leg_t *result, leg_t const * a, int legs ) { while( legs-- ) { leg_t *offs = result+2*legs+1; leg_t fac = a[legs]; int leg = legs; dleg_t acc = (dleg_t)*offs + (dleg_t)fac * fac; *(offs--) = (leg_t)acc; acc >>= 8*sizeof(leg_t); while( leg-- ) { dleg_t subresult = fac * a[leg]; int carry = !!(subresult & (1<<(8*sizeof(dleg_t)-1))); subresult <<= 1; acc += subresult + *offs; *(offs--) = (leg_t)acc; acc >>= 8*sizeof(leg_t); acc += carry; } while( acc ) { acc += *offs; *(offs--) = (leg_t)acc; acc >>= 8*sizeof(leg_t); } } } #else static void mp_sqr( leg_t *result, leg_t const * a, int legs ) { int i; while( legs-- ) { leg_t *offs = result+2*legs+1; leg_t fac = a[legs]; int leg = legs,i; dleg_t acc = (dleg_t)*offs + (dleg_t)fac * (dleg_t)fac; *(offs--) = (leg_t)acc; acc >>= 8*sizeof(leg_t); while( leg-- ) { dleg_t subresult = (dleg_t)fac * (dleg_t)a[leg]; int carry = 1 & ( subresult >> (16*sizeof(leg_t)-1)); subresult ^= carry << (16*sizeof(leg_t)-1); acc += 2 * subresult + (dleg_t)*offs; *(offs--) = (leg_t)acc; acc >>= 8*sizeof(leg_t); acc += (dleg_t)carry << 8*sizeof(leg_t); printf( "%04X %04X %d\n", acc, subresult, carry ); } for(i=0;i<6;++i) printf( "%02X", result[i] ); putchar(10); while( acc ) { acc += (dleg_t)*offs; *(offs--) = (leg_t)acc; acc >>= 8*sizeof(leg_t); } } for(i=0;i<6;++i) printf( "%02X", result[i] ); putchar(10); } #endif int main() { leg_t a[3] = { 0xff, 0xff, 0xa1 }; leg_t r[6] = {0,0,0,0,0,0}; int i; mp_sqr( r, a, 3 ); for(i=0;i<6;++i) printf( "%02X", r[i] ); putchar(10); }