/[rdesktop]/jpeg/rdpproxy/trunk/rsa2der.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /jpeg/rdpproxy/trunk/rsa2der.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1507 - (hide annotations)
Mon Jul 20 16:45:11 2009 UTC (14 years, 9 months ago) by dpavlin
File MIME type: text/plain
File size: 2343 byte(s)
branch for integration of Daniel Jarboe <daniel.jarboe(at)gmail.com>
patches for jpeg
1 forsberg 429 #include <stdio.h>
2     #include <string.h>
3     #include <unistd.h>
4     #include <fcntl.h>
5     #include <openssl/rsa.h>
6    
7     /* reverse an array in situ */
8     void
9     reverse(unsigned char *p, unsigned int len)
10     {
11     char temp;
12     int i, j;
13    
14     for (i = 0, j = len - 1; i < j; i++, j--)
15     {
16     temp = p[i];
17     p[i] = p[j];
18     p[j] = temp;
19     }
20     }
21    
22     int
23     read_file(char *filename, unsigned char *buffer, unsigned int maxlen)
24     {
25     int fd, len;
26    
27     fd = open(filename, O_RDONLY);
28     if (fd == -1)
29     {
30     perror(filename);
31     return -1;
32     }
33    
34     len = read(fd, buffer, maxlen);
35     close(fd);
36     return len;
37     }
38    
39     int
40     write_file(char *filename, unsigned char *buffer, unsigned int len)
41     {
42     int fd;
43    
44     fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0600);
45     if (fd == -1)
46     {
47     perror(filename);
48     return -1;
49     }
50    
51     len = write(fd, buffer, len);
52     close(fd);
53     return len;
54     }
55    
56     BIGNUM *
57     parse_bignum(unsigned char **buf, unsigned int len)
58     {
59     BIGNUM *bn;
60    
61     reverse(*buf, len);
62     bn = BN_bin2bn(*buf, len, NULL);
63     *buf += len;
64    
65     return bn;
66     }
67    
68     RSA *
69     parse_rsa2(unsigned char *buf, unsigned int len)
70     {
71     RSA *rsa;
72     unsigned int modlen;
73    
74     if (strncmp(buf, "RSA2", 4) != 0)
75     {
76     fprintf(stderr, "Not an RSA2 private key\n");
77     return NULL;
78     }
79    
80     /* FIXME: should be a DWORD */
81     modlen = *(buf + 4);
82     if (len < (20 + (9 * modlen / 2)))
83     {
84     fprintf(stderr, "Input file truncated?\n");
85     return NULL;
86     }
87    
88     buf += 16;
89    
90     rsa = RSA_new();
91     if (rsa == NULL)
92     return NULL;
93    
94     rsa->e = parse_bignum(&buf, 4);
95     rsa->n = parse_bignum(&buf, modlen);
96     rsa->p = parse_bignum(&buf, modlen / 2);
97     rsa->q = parse_bignum(&buf, modlen / 2);
98     rsa->dmp1 = parse_bignum(&buf, modlen / 2);
99     rsa->dmq1 = parse_bignum(&buf, modlen / 2);
100     rsa->iqmp = parse_bignum(&buf, modlen / 2);
101     rsa->d = parse_bignum(&buf, modlen);
102    
103     return rsa;
104     }
105    
106     int
107     main(int argc, char *argv[])
108     {
109     unsigned char buffer[1024];
110     unsigned char *p = buffer;
111     unsigned int len;
112     RSA *rsa;
113    
114     if (argc < 3)
115     {
116     fprintf(stderr, "Usage: %s <infile> <outfile>\n", argv[0]);
117     return 0;
118     }
119    
120     if ((len = read_file(argv[1], buffer, sizeof(buffer))) == -1)
121     {
122     fprintf(stderr, "Failed to read file\n");
123     return 1;
124     }
125    
126     if ((rsa = parse_rsa2(buffer, len)) == NULL)
127     {
128     fprintf(stderr, "Failed to parse RSA key\n");
129     return 1;
130     }
131    
132     len = i2d_RSAPrivateKey(rsa, &p);
133     if (write_file(argv[2], buffer, len) == -1)
134     {
135     fprintf(stderr, "Failed to write file\n");
136     return 1;
137     }
138    
139     return 0;
140     }

  ViewVC Help
Powered by ViewVC 1.1.26