2 * crypto_scalarmult/try.c version 20090118
8 #include "crypto_scalarmult.h"
9 #include "windows/windows-quirks.h"
11 extern unsigned char *alignedcalloc(unsigned long long);
13 const char *primitiveimplementation
= crypto_scalarmult_IMPLEMENTATION
;
15 #define mlen crypto_scalarmult_SCALARBYTES
16 #define nlen crypto_scalarmult_SCALARBYTES
17 #define plen crypto_scalarmult_BYTES
18 #define qlen crypto_scalarmult_BYTES
19 #define rlen crypto_scalarmult_BYTES
21 static unsigned char *m
;
22 static unsigned char *n
;
23 static unsigned char *p
;
24 static unsigned char *q
;
25 static unsigned char *r
;
27 static unsigned char *m2
;
28 static unsigned char *n2
;
29 static unsigned char *p2
;
30 static unsigned char *q2
;
31 static unsigned char *r2
;
33 void preallocate(void)
39 m
= alignedcalloc(mlen
);
40 n
= alignedcalloc(nlen
);
41 p
= alignedcalloc(plen
);
42 q
= alignedcalloc(qlen
);
43 r
= alignedcalloc(rlen
);
44 m2
= alignedcalloc(mlen
+ crypto_scalarmult_BYTES
);
45 n2
= alignedcalloc(nlen
+ crypto_scalarmult_BYTES
);
46 p2
= alignedcalloc(plen
+ crypto_scalarmult_BYTES
);
47 q2
= alignedcalloc(qlen
+ crypto_scalarmult_BYTES
);
48 r2
= alignedcalloc(rlen
+ crypto_scalarmult_BYTES
);
57 crypto_scalarmult(q
,n
,p
);
58 crypto_scalarmult_base(r
,n
);
61 char checksum
[crypto_scalarmult_BYTES
* 2 + 1];
63 const char *checksum_compute(void)
69 for (i
= 0;i
< mlen
;++i
) m
[i
] = i
;
70 for (i
= 0;i
< nlen
;++i
) n
[i
] = i
+ 1;
71 for (i
= 0;i
< plen
;++i
) p
[i
] = i
+ 2;
72 for (i
= 0;i
< qlen
;++i
) q
[i
] = i
+ 3;
73 for (i
= 0;i
< rlen
;++i
) r
[i
] = i
+ 4;
75 for (i
= -16;i
< 0;++i
) p
[i
] = rand();
76 for (i
= -16;i
< 0;++i
) n
[i
] = rand();
77 for (i
= plen
;i
< plen
+ 16;++i
) p
[i
] = rand();
78 for (i
= nlen
;i
< nlen
+ 16;++i
) n
[i
] = rand();
79 for (i
= -16;i
< plen
+ 16;++i
) p2
[i
] = p
[i
];
80 for (i
= -16;i
< nlen
+ 16;++i
) n2
[i
] = n
[i
];
82 if (crypto_scalarmult_base(p
,n
) != 0) return "crypto_scalarmult_base returns nonzero";
84 for (i
= -16;i
< nlen
+ 16;++i
) if (n2
[i
] != n
[i
]) return "crypto_scalarmult_base overwrites input";
85 for (i
= -16;i
< 0;++i
) if (p2
[i
] != p
[i
]) return "crypto_scalarmult_base writes before output";
86 for (i
= plen
;i
< plen
+ 16;++i
) if (p2
[i
] != p
[i
]) return "crypto_scalarmult_base writes after output";
88 for (tests
= 0;tests
< 100;++tests
) {
89 for (i
= -16;i
< 0;++i
) q
[i
] = rand();
90 for (i
= -16;i
< 0;++i
) p
[i
] = rand();
91 for (i
= -16;i
< 0;++i
) m
[i
] = rand();
92 for (i
= qlen
;i
< qlen
+ 16;++i
) q
[i
] = rand();
93 for (i
= plen
;i
< plen
+ 16;++i
) p
[i
] = rand();
94 for (i
= mlen
;i
< mlen
+ 16;++i
) m
[i
] = rand();
95 for (i
= -16;i
< qlen
+ 16;++i
) q2
[i
] = q
[i
];
96 for (i
= -16;i
< plen
+ 16;++i
) p2
[i
] = p
[i
];
97 for (i
= -16;i
< mlen
+ 16;++i
) m2
[i
] = m
[i
];
99 if (crypto_scalarmult(q
,m
,p
) != 0) return "crypto_scalarmult returns nonzero";
101 for (i
= -16;i
< mlen
+ 16;++i
) if (m2
[i
] != m
[i
]) return "crypto_scalarmult overwrites n input";
102 for (i
= -16;i
< plen
+ 16;++i
) if (p2
[i
] != p
[i
]) return "crypto_scalarmult overwrites p input";
103 for (i
= -16;i
< 0;++i
) if (q2
[i
] != q
[i
]) return "crypto_scalarmult writes before output";
104 for (i
= qlen
;i
< qlen
+ 16;++i
) if (q2
[i
] != q
[i
]) return "crypto_scalarmult writes after output";
106 if (crypto_scalarmult(m2
,m2
,p
) != 0) return "crypto_scalarmult returns nonzero";
107 for (i
= 0;i
< qlen
;++i
) if (q
[i
] != m2
[i
]) return "crypto_scalarmult does not handle n overlap";
108 for (i
= 0;i
< qlen
;++i
) m2
[i
] = m
[i
];
110 if (crypto_scalarmult(p2
,m2
,p2
) != 0) return "crypto_scalarmult returns nonzero";
111 for (i
= 0;i
< qlen
;++i
) if (q
[i
] != p2
[i
]) return "crypto_scalarmult does not handle p overlap";
113 if (crypto_scalarmult(r
,n
,q
) != 0) return "crypto_scalarmult returns nonzero";
114 if (crypto_scalarmult(q
,n
,p
) != 0) return "crypto_scalarmult returns nonzero";
115 if (crypto_scalarmult(p
,m
,q
) != 0) return "crypto_scalarmult returns nonzero";
116 for (j
= 0;j
< plen
;++j
) if (p
[j
] != r
[j
]) return "crypto_scalarmult not associative";
117 for (j
= 0;j
< mlen
;++j
) m
[j
] ^= q
[j
% qlen
];
118 for (j
= 0;j
< nlen
;++j
) n
[j
] ^= p
[j
% plen
];
121 for (i
= 0;i
< crypto_scalarmult_BYTES
;++i
) {
122 checksum
[2 * i
] = "0123456789abcdef"[15 & (p
[i
] >> 4)];
123 checksum
[2 * i
+ 1] = "0123456789abcdef"[15 & p
[i
]];