xref: /llvm-project/polly/lib/External/isl/imath/tests/rtest.c (revision 658eb9e14264d48888ade0e3daf0b648f76c3f0e)
1*658eb9e1SMichael Kruse /*
2*658eb9e1SMichael Kruse   Name:     rtest.c
3*658eb9e1SMichael Kruse   Purpose:  Test routines for RSA implementation.
4*658eb9e1SMichael Kruse   Author:   M. J. Fromberger
5*658eb9e1SMichael Kruse 
6*658eb9e1SMichael Kruse   Copyright (C) 2002-2008 Michael J. Fromberger, All Rights Reserved.
7*658eb9e1SMichael Kruse 
8*658eb9e1SMichael Kruse   Permission is hereby granted, free of charge, to any person obtaining a copy
9*658eb9e1SMichael Kruse   of this software and associated documentation files (the "Software"), to deal
10*658eb9e1SMichael Kruse   in the Software without restriction, including without limitation the rights
11*658eb9e1SMichael Kruse   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12*658eb9e1SMichael Kruse   copies of the Software, and to permit persons to whom the Software is
13*658eb9e1SMichael Kruse   furnished to do so, subject to the following conditions:
14*658eb9e1SMichael Kruse 
15*658eb9e1SMichael Kruse   The above copyright notice and this permission notice shall be included in
16*658eb9e1SMichael Kruse   all copies or substantial portions of the Software.
17*658eb9e1SMichael Kruse 
18*658eb9e1SMichael Kruse   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19*658eb9e1SMichael Kruse   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20*658eb9e1SMichael Kruse   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
21*658eb9e1SMichael Kruse   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22*658eb9e1SMichael Kruse   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23*658eb9e1SMichael Kruse   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24*658eb9e1SMichael Kruse   SOFTWARE.
25*658eb9e1SMichael Kruse  */
26*658eb9e1SMichael Kruse 
27*658eb9e1SMichael Kruse #include <limits.h>
28*658eb9e1SMichael Kruse #include <stdio.h>
29*658eb9e1SMichael Kruse #include <stdlib.h>
30*658eb9e1SMichael Kruse #include <string.h>
31*658eb9e1SMichael Kruse #include <time.h>
32*658eb9e1SMichael Kruse 
33*658eb9e1SMichael Kruse #include "rsamath.h"
34*658eb9e1SMichael Kruse 
35*658eb9e1SMichael Kruse void random_fill(unsigned char *buf, int len);
36*658eb9e1SMichael Kruse void print_buf(unsigned char *buf, int len, int brk, FILE *ofp);
37*658eb9e1SMichael Kruse 
main(int argc,char * argv[])38*658eb9e1SMichael Kruse int main(int argc, char *argv[]) {
39*658eb9e1SMichael Kruse   int buf_len, msg_len, i;
40*658eb9e1SMichael Kruse   unsigned char *buf;
41*658eb9e1SMichael Kruse   mp_result res;
42*658eb9e1SMichael Kruse 
43*658eb9e1SMichael Kruse   if (argc < 3) {
44*658eb9e1SMichael Kruse     fprintf(stderr, "Usage: %s <bufsize> <msglen>\n", argv[0]);
45*658eb9e1SMichael Kruse     return 1;
46*658eb9e1SMichael Kruse   }
47*658eb9e1SMichael Kruse 
48*658eb9e1SMichael Kruse   srand((unsigned int)time(NULL));
49*658eb9e1SMichael Kruse 
50*658eb9e1SMichael Kruse   if ((buf_len = atoi(argv[1])) <= 0) {
51*658eb9e1SMichael Kruse     fprintf(stderr, "Buffer length must be positive, not %d\n", buf_len);
52*658eb9e1SMichael Kruse     return 2;
53*658eb9e1SMichael Kruse   }
54*658eb9e1SMichael Kruse   if ((msg_len = atoi(argv[2])) <= 0) {
55*658eb9e1SMichael Kruse     fprintf(stderr, "Message length must be positive, not %d\n", msg_len);
56*658eb9e1SMichael Kruse     return 2;
57*658eb9e1SMichael Kruse   }
58*658eb9e1SMichael Kruse   if (msg_len > buf_len) msg_len = buf_len;
59*658eb9e1SMichael Kruse 
60*658eb9e1SMichael Kruse   buf = calloc(buf_len, sizeof(*buf));
61*658eb9e1SMichael Kruse   for (i = 0; i < msg_len; ++i) buf[i] = i + 1;
62*658eb9e1SMichael Kruse 
63*658eb9e1SMichael Kruse   printf(
64*658eb9e1SMichael Kruse       "Buffer size:  %d bytes\n"
65*658eb9e1SMichael Kruse       "Message len:  %d bytes\n\n",
66*658eb9e1SMichael Kruse       buf_len, msg_len);
67*658eb9e1SMichael Kruse 
68*658eb9e1SMichael Kruse   printf("Message:\n");
69*658eb9e1SMichael Kruse   print_buf(buf, msg_len, 16, stdout);
70*658eb9e1SMichael Kruse   fputc('\n', stdout);
71*658eb9e1SMichael Kruse 
72*658eb9e1SMichael Kruse   if ((res = rsa_pkcs1v15_encode(buf, msg_len, buf_len, 2, random_fill)) !=
73*658eb9e1SMichael Kruse       MP_OK) {
74*658eb9e1SMichael Kruse     printf("Error from encoding function: %d\n", res);
75*658eb9e1SMichael Kruse     free(buf);
76*658eb9e1SMichael Kruse     return 1;
77*658eb9e1SMichael Kruse   }
78*658eb9e1SMichael Kruse   printf("Encoded message:\n");
79*658eb9e1SMichael Kruse   print_buf(buf, buf_len, 16, stdout);
80*658eb9e1SMichael Kruse   fputc('\n', stdout);
81*658eb9e1SMichael Kruse 
82*658eb9e1SMichael Kruse   msg_len = -1; /* make decoder fill this in */
83*658eb9e1SMichael Kruse   if ((res = rsa_pkcs1v15_decode(buf, buf_len, 2, &msg_len)) != MP_OK) {
84*658eb9e1SMichael Kruse     printf("Error from decoding function: %d\n", res);
85*658eb9e1SMichael Kruse     free(buf);
86*658eb9e1SMichael Kruse     return 1;
87*658eb9e1SMichael Kruse   }
88*658eb9e1SMichael Kruse   printf("Decoded message (%d bytes):\n", msg_len);
89*658eb9e1SMichael Kruse   print_buf(buf, msg_len, 16, stdout);
90*658eb9e1SMichael Kruse   fputc('\n', stdout);
91*658eb9e1SMichael Kruse 
92*658eb9e1SMichael Kruse   free(buf);
93*658eb9e1SMichael Kruse   return 0;
94*658eb9e1SMichael Kruse }
95*658eb9e1SMichael Kruse 
random_fill(unsigned char * buf,int len)96*658eb9e1SMichael Kruse void random_fill(unsigned char *buf, int len) {
97*658eb9e1SMichael Kruse   int i;
98*658eb9e1SMichael Kruse 
99*658eb9e1SMichael Kruse   for (i = 0; i < len; ++i) {
100*658eb9e1SMichael Kruse     unsigned char c = 0;
101*658eb9e1SMichael Kruse 
102*658eb9e1SMichael Kruse     while (c == 0) c = (unsigned char)rand();
103*658eb9e1SMichael Kruse 
104*658eb9e1SMichael Kruse     buf[i] = c;
105*658eb9e1SMichael Kruse   }
106*658eb9e1SMichael Kruse }
107*658eb9e1SMichael Kruse 
print_buf(unsigned char * buf,int len,int brk,FILE * ofp)108*658eb9e1SMichael Kruse void print_buf(unsigned char *buf, int len, int brk, FILE *ofp) {
109*658eb9e1SMichael Kruse   int i;
110*658eb9e1SMichael Kruse 
111*658eb9e1SMichael Kruse   for (i = 0; i < len; ++i) {
112*658eb9e1SMichael Kruse     fprintf(ofp, "%02X", buf[i]);
113*658eb9e1SMichael Kruse 
114*658eb9e1SMichael Kruse     if ((i + 1) % brk == 0)
115*658eb9e1SMichael Kruse       fputc('\n', ofp);
116*658eb9e1SMichael Kruse     else
117*658eb9e1SMichael Kruse       fputc(' ', ofp);
118*658eb9e1SMichael Kruse   }
119*658eb9e1SMichael Kruse   if (i % brk) fputc('\n', ofp);
120*658eb9e1SMichael Kruse }
121