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