#include double powers[12] = { 1.0 /* 2^0 */ , 4194304.0 /* 2^22 */ , 8796093022208.0 /* 2^43 */ , 18446744073709551616.0 /* 2^64 */ , 38685626227668133590597632.0 /* 2^85 */ , 162259276829213363391578010288128.0 /* 2^107 */ , 340282366920938463463374607431768211456.0 /* 2^128 */ , 713623846352979940529142984724747568191373312.0 /* 2^149 */ , 1496577676626844588240573268701473812127674924007424.0 /* 2^170 */ , 6277101735386680763835789423207666416102355444464034512896.0 /* 2^192 */ , 13164036458569648337239753460458804039861886925068638906788872192.0 /* 2^213 */ , 27606985387162255149739023449108101809804435888681546220650096895197184.0 /* 2^234 */ } ; double f[12]; double h[23]; extern void curve25519_sq(double [23],const double [12]); const double curve25519_constants[4] = { 170141183460469231731687303715884105728.0 /* 2^127 */ , 0.0000000000000000000000000000000000000058774717541114375398436826861112283890933277838604376075437585313920862972736358642578125 /* 2^-127 */ , 0.000000000000000000000000000000000000000000000000000000000000000000000000000328174405093588895764681370786415183702408013848578692630900731866406488520172228202917285131946952609300797169953687216685813759979613974358814143528206841438077390193939208984375 /* 19 2^-255 */ , 2.0 } ; int main(int argc,char **argv) { int i; for (i = 0;i < 12;++i) f[i] = (random() & 1048575) * powers[i]; printf("f=0"); for (i = 0;i < 12;++i) printf("%+.0f",f[i]); printf(";\n"); curve25519_sq(h,f); printf("h=0"); for (i = 0;i < 23;++i) printf("%+.0f",h[i]); printf(";\n"); printf("h-(f*f)\n"); return 0; }