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