1 #include <lib9.h> 2 #include <kernel.h> 3 #include <isa.h> 4 #include "interp.h" 5 #include "../libinterp/runt.h" 6 #include "mp.h" 7 #include "libsec.h" 8 #include "keys.h" 9 10 static char* pkattr[] = { "p", "q", "alpha", "key", nil }; 11 static char* skattr[] = { "p", "q", "alpha", "key", "!secret", nil }; 12 static char* sigattr[] = { "r", "s", nil }; 13 14 static void* 15 dsa_str2sk(char *str, char **strp) 16 { 17 DSApriv *dsa; 18 char *p; 19 20 dsa = dsaprivalloc(); 21 dsa->pub.p = base64tobig(str, &p); 22 dsa->pub.q = base64tobig(str, &p); 23 dsa->pub.alpha = base64tobig(p, &p); 24 dsa->pub.key = base64tobig(p, &p); 25 dsa->secret = base64tobig(p, &p); 26 if(strp) 27 *strp = p; 28 if(dsa->pub.p == nil || dsa->pub.q == nil || 29 dsa->pub.alpha == nil || dsa->pub.key == nil || dsa->secret == nil){ 30 dsaprivfree(dsa); 31 return nil; 32 } 33 return dsa; 34 } 35 36 static void* 37 dsa_str2pk(char *str, char **strp) 38 { 39 DSApub *dsa; 40 char *p; 41 42 dsa = dsapuballoc(); 43 dsa->p = base64tobig(str, &p); 44 dsa->q = base64tobig(str, &p); 45 dsa->alpha = base64tobig(p, &p); 46 dsa->key = base64tobig(p, &p); 47 if(strp) 48 *strp = p; 49 if(dsa->p == nil || dsa->q == nil || dsa->alpha == nil || dsa->key == nil){ 50 dsapubfree(dsa); 51 return nil; 52 } 53 return dsa; 54 } 55 56 static void* 57 dsa_str2sig(char *str, char **strp) 58 { 59 DSAsig *dsa; 60 char *p; 61 62 dsa = dsasigalloc(); 63 dsa->r = base64tobig(str, &p); 64 dsa->s = base64tobig(p, &p); 65 if(strp) 66 *strp = p; 67 if(dsa->r == nil || dsa->s == nil){ 68 dsasigfree(dsa); 69 return nil; 70 } 71 return dsa; 72 } 73 74 static int 75 dsa_sk2str(void *veg, char *buf, int len) 76 { 77 DSApriv *dsa; 78 char *cp, *ep; 79 80 dsa = veg; 81 ep = buf + len - 1; 82 cp = buf; 83 84 cp += snprint(cp, ep - cp, "%U\n", dsa->pub.p); 85 cp += snprint(cp, ep - cp, "%U\n", dsa->pub.q); 86 cp += snprint(cp, ep - cp, "%U\n", dsa->pub.alpha); 87 cp += snprint(cp, ep - cp, "%U\n", dsa->pub.key); 88 cp += snprint(cp, ep - cp, "%U\n", dsa->secret); 89 *cp = 0; 90 91 return cp - buf; 92 } 93 94 static int 95 dsa_pk2str(void *veg, char *buf, int len) 96 { 97 DSApub *dsa; 98 char *cp, *ep; 99 100 dsa = veg; 101 ep = buf + len - 1; 102 cp = buf; 103 104 cp += snprint(cp, ep - cp, "%U\n", dsa->p); 105 cp += snprint(cp, ep - cp, "%U\n", dsa->q); 106 cp += snprint(cp, ep - cp, "%U\n", dsa->alpha); 107 cp += snprint(cp, ep - cp, "%U\n", dsa->key); 108 *cp = 0; 109 110 return cp - buf; 111 } 112 113 static int 114 dsa_sig2str(void *veg, char *buf, int len) 115 { 116 DSAsig *dsa; 117 char *cp, *ep; 118 119 dsa = veg; 120 ep = buf + len - 1; 121 cp = buf; 122 123 cp += snprint(cp, ep - cp, "%U\n", dsa->r); 124 cp += snprint(cp, ep - cp, "%U\n", dsa->s); 125 *cp = 0; 126 127 return cp - buf; 128 } 129 130 static void* 131 dsa_sk2pk(void *vs) 132 { 133 return dsaprivtopub((DSApriv*)vs); 134 } 135 136 /* generate a dsa secret key with new params */ 137 static void* 138 dsa_gen(int len) 139 { 140 USED(len); 141 return dsagen(nil); 142 } 143 144 /* generate a dsa secret key with same params as a public key */ 145 static void* 146 dsa_genfrompk(void *vpub) 147 { 148 return dsagen((DSApub*)vpub); 149 } 150 151 static void 152 dsa_freepub(void *a) 153 { 154 dsapubfree((DSApub*)a); 155 } 156 157 static void 158 dsa_freepriv(void *a) 159 { 160 dsaprivfree((DSApriv*)a); 161 } 162 163 static void 164 dsa_freesig(void *a) 165 { 166 dsasigfree((DSAsig*)a); 167 } 168 169 static void* 170 dsa_sign(mpint* md, void *key) 171 { 172 return dsasign((DSApriv*)key, md); 173 } 174 175 static int 176 dsa_verify(mpint* md, void *sig, void *key) 177 { 178 return dsaverify((DSApub*)key, (DSAsig*)sig, md) == 0; 179 } 180 181 SigAlgVec* 182 dsainit(void) 183 { 184 SigAlgVec *vec; 185 186 vec = malloc(sizeof(SigAlgVec)); 187 if(vec == nil) 188 return nil; 189 190 vec->name = "dsa"; 191 192 vec->pkattr = pkattr; 193 vec->skattr = skattr; 194 vec->sigattr = sigattr; 195 196 vec->str2sk = dsa_str2sk; 197 vec->str2pk = dsa_str2pk; 198 vec->str2sig = dsa_str2sig; 199 200 vec->sk2str = dsa_sk2str; 201 vec->pk2str = dsa_pk2str; 202 vec->sig2str = dsa_sig2str; 203 204 vec->sk2pk = dsa_sk2pk; 205 206 vec->gensk = dsa_gen; 207 vec->genskfrompk = dsa_genfrompk; 208 vec->sign = dsa_sign; 209 vec->verify = dsa_verify; 210 211 vec->skfree = dsa_freepriv; 212 vec->pkfree = dsa_freepub; 213 vec->sigfree = dsa_freesig; 214 215 return vec; 216 } 217