import repository from arizona
[raven.git] / 2.0 / c / keyconvert / keyconvert.c
1 #include <stdlib.h>
2 #include <openssl/bn.h>
3 #include <openssl/rsa.h>
4 #include <openssl/dsa.h>
5
6 #ifndef TRUE
7 #define TRUE 1
8 #define FALSE (!TRUE)
9 #endif
10
11 void write_rsa(FILE *fout, char *estr, int elen, char *nstr, int nlen)
12 {
13     RSA *rsa;
14     BIGNUM *r1, *r2;
15
16     rsa = RSA_new();
17     rsa->e = BN_new();
18     rsa->n = BN_new();
19
20     r1 = BN_bin2bn(estr, elen, rsa->e);
21     r2 = BN_bin2bn(nstr, nlen, rsa->n);
22
23     PEM_write_RSA_PUBKEY(fout, rsa);
24
25     // free rsa ?
26 }
27
28 void write_dsa(FILE *fout, char *pstr, int plen, char *qstr, int qlen, char *gstr, int glen, char *pkstr, int pklen)
29 {
30     DSA *dsa;
31
32     dsa = DSA_new();
33     dsa->p = BN_new();
34     dsa->q = BN_new();
35     dsa->g = BN_new();
36     dsa->pub_key = BN_new();
37
38     BN_bin2bn(pstr, plen, dsa->p);
39     BN_bin2bn(qstr, qlen, dsa->q);
40     BN_bin2bn(gstr, glen, dsa->g);
41     BN_bin2bn(pkstr, pklen, dsa->pub_key);
42
43     PEM_write_DSA_PUBKEY(fout, dsa);
44
45     // free dsa ?
46 }
47
48 int get_str(char **src, int *len, char *dest)
49 {
50    int *iptr = (int*) (*src);
51    int thislen = ntohl(*iptr);
52
53    // eat 4 bytes
54    (*len) -= 4;
55    (*src) = (*src) + 4;
56
57 //   fprintf(stdout, "thislen = %d\n", thislen);
58
59    if (thislen > *len) {
60        fprintf(stdout, "thislen(%d) > *len(%d)\n", thislen, *len);
61        return -1;
62    }
63
64    memcpy(dest, *src, thislen);
65
66    (*len) = (*len) - thislen;
67    (*src) = (*src) + thislen;
68
69    // null terminate it
70    *(dest + thislen) = '\0';
71
72    return thislen;
73 }
74
75 int openssh_binary_to_openssl(char *s, int len, FILE *fout)
76 {
77     char keytype[1024], estr[1024], nstr[1024], pstr[1024], qstr[1024], gstr[1024], pkstr[1024];
78     int elen, nlen, plen, qlen, glen, pklen;
79     int result;
80
81     result = get_str(&s, &len, keytype);
82     if (result <= 0) {
83         return FALSE;
84     }
85
86     fprintf(stdout, "keytype = %s\n", keytype);
87
88     if (strcmp(keytype, "ssh-rsa") == 0) {
89         elen = get_str(&s, &len, estr);
90 //        fprintf(stdout, "elen = %d\n", elen);
91         if (elen <= 0) {
92             return FALSE;
93         }
94         nlen = get_str(&s, &len, nstr);
95 //        fprintf(stdout, "nlen = %d\n", nlen);
96         if (nlen <= 0) {
97             return FALSE;
98         }
99         write_rsa(fout, estr, elen, nstr, nlen);
100     } else if (strcmp(keytype, "ssh-dss") == 0) {
101         plen = get_str(&s, &len, pstr);
102 //        fprintf(stdout, "plen = %d\n", plen);
103         if (plen <= 0) {
104             return FALSE;
105         }
106         qlen = get_str(&s, &len, qstr);
107 //        fprintf(stdout, "qlen = %d\n", qlen);
108         if (qlen <= 0) {
109             return FALSE;
110         }
111         glen = get_str(&s, &len, gstr);
112 //        fprintf(stdout, "glen = %d\n", glen);
113         if (glen <= 0) {
114             return FALSE;
115         }
116         pklen = get_str(&s, &len, pkstr);
117 //        fprintf(stdout, "pklen = %d\n", pklen);
118         if (pklen <= 0) {
119             return FALSE;
120         }
121         write_dsa(fout, pstr, plen, qstr, qlen, gstr, glen, pkstr, pklen);
122     } else {
123         return FALSE;
124     }
125 }
126