egalg.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include <lib9.h>
  2. #include <kernel.h>
  3. #include <isa.h>
  4. #include "interp.h"
  5. #include "../libinterp/keyringif.h"
  6. #include "mp.h"
  7. #include "libsec.h"
  8. #include "keys.h"
  9. static char* pkattr[] = { "p", "alpha", "key", nil };
  10. static char* skattr[] = { "p", "alpha", "key", "!secret", nil };
  11. static char* sigattr[] = { "r", "s", nil };
  12. static void*
  13. eg_str2sk(char *str, char **strp)
  14. {
  15. EGpriv *eg;
  16. char *p;
  17. eg = egprivalloc();
  18. eg->pub.p = base64tobig(str, &p);
  19. eg->pub.alpha = base64tobig(p, &p);
  20. eg->pub.key = base64tobig(p, &p);
  21. eg->secret = base64tobig(p, &p);
  22. if(strp)
  23. *strp = p;
  24. if(eg->pub.p == nil || eg->pub.alpha == nil || eg->pub.key == nil || eg->secret == nil){
  25. egprivfree(eg);
  26. return nil;
  27. }
  28. return eg;
  29. }
  30. static void*
  31. eg_str2pk(char *str, char **strp)
  32. {
  33. EGpub *eg;
  34. char *p;
  35. eg = egpuballoc();
  36. eg->p = base64tobig(str, &p);
  37. eg->alpha = base64tobig(p, &p);
  38. eg->key = base64tobig(p, &p);
  39. if(strp)
  40. *strp = p;
  41. if(eg->p == nil || eg->alpha == nil || eg->key == nil){
  42. egpubfree(eg);
  43. return nil;
  44. }
  45. return eg;
  46. }
  47. static void*
  48. eg_str2sig(char *str, char **strp)
  49. {
  50. EGsig *eg;
  51. char *p;
  52. eg = egsigalloc();
  53. eg->r = base64tobig(str, &p);
  54. eg->s = base64tobig(p, &p);
  55. if(strp)
  56. *strp = p;
  57. if(eg->r == nil || eg->s == nil){
  58. egsigfree(eg);
  59. return nil;
  60. }
  61. return eg;
  62. }
  63. static int
  64. eg_sk2str(void *veg, char *buf, int len)
  65. {
  66. EGpriv *eg;
  67. char *cp, *ep;
  68. eg = (EGpriv*)veg;
  69. ep = buf + len - 1;
  70. cp = buf;
  71. cp += snprint(cp, ep - cp, "%U\n", eg->pub.p);
  72. cp += snprint(cp, ep - cp, "%U\n", eg->pub.alpha);
  73. cp += snprint(cp, ep - cp, "%U\n", eg->pub.key);
  74. cp += snprint(cp, ep - cp, "%U\n", eg->secret);
  75. *cp = 0;
  76. return cp - buf;
  77. }
  78. static int
  79. eg_pk2str(void *veg, char *buf, int len)
  80. {
  81. EGpub *eg;
  82. char *cp, *ep;
  83. eg = (EGpub*)veg;
  84. ep = buf + len - 1;
  85. cp = buf;
  86. cp += snprint(cp, ep - cp, "%U\n", eg->p);
  87. cp += snprint(cp, ep - cp, "%U\n", eg->alpha);
  88. cp += snprint(cp, ep - cp, "%U\n", eg->key);
  89. *cp = 0;
  90. return cp - buf;
  91. }
  92. static int
  93. eg_sig2str(void *veg, char *buf, int len)
  94. {
  95. EGsig *eg;
  96. char *cp, *ep;
  97. eg = veg;
  98. ep = buf + len - 1;
  99. cp = buf;
  100. cp += snprint(cp, ep - cp, "%U\n", eg->r);
  101. cp += snprint(cp, ep - cp, "%U\n", eg->s);
  102. *cp = 0;
  103. return cp - buf;
  104. }
  105. static void*
  106. eg_sk2pk(void *vs)
  107. {
  108. return egprivtopub((EGpriv*)vs);
  109. }
  110. /* generate an el gamal secret key with new params */
  111. static void*
  112. eg_gen(int len)
  113. {
  114. return eggen(len, 0);
  115. }
  116. /* generate an el gamal secret key with same params as a public key */
  117. static void*
  118. eg_genfrompk(void *vpub)
  119. {
  120. EGpub *pub;
  121. EGpriv *priv;
  122. int nlen;
  123. pub = vpub;
  124. priv = egprivalloc();
  125. priv->pub.p = mpcopy(pub->p);
  126. priv->pub.alpha = mpcopy(pub->alpha);
  127. nlen = mpsignif(pub->p);
  128. pub = &priv->pub;
  129. pub->key = mpnew(0);
  130. priv->secret = mpnew(0);
  131. mprand(nlen-1, genrandom, priv->secret);
  132. mpexp(pub->alpha, priv->secret, pub->p, pub->key);
  133. return priv;
  134. }
  135. static void*
  136. eg_sign(mpint* mp, void *key)
  137. {
  138. return egsign((EGpriv*)key, mp);
  139. }
  140. static int
  141. eg_verify(mpint* mp, void *sig, void *key)
  142. {
  143. return egverify((EGpub*)key, (EGsig*)sig, mp) == 0;
  144. }
  145. static void
  146. eg_freepub(void *a)
  147. {
  148. egpubfree((EGpub*)a);
  149. }
  150. static void
  151. eg_freepriv(void *a)
  152. {
  153. egprivfree((EGpriv*)a);
  154. }
  155. static void
  156. eg_freesig(void *a)
  157. {
  158. egsigfree((EGsig*)a);
  159. }
  160. SigAlgVec*
  161. elgamalinit(void)
  162. {
  163. SigAlgVec *vec;
  164. vec = malloc(sizeof(SigAlgVec));
  165. if(vec == nil)
  166. return nil;
  167. vec->name = "elgamal";
  168. vec->pkattr = pkattr;
  169. vec->skattr = skattr;
  170. vec->sigattr = sigattr;
  171. vec->str2sk = eg_str2sk;
  172. vec->str2pk = eg_str2pk;
  173. vec->str2sig = eg_str2sig;
  174. vec->sk2str = eg_sk2str;
  175. vec->pk2str = eg_pk2str;
  176. vec->sig2str = eg_sig2str;
  177. vec->sk2pk = eg_sk2pk;
  178. vec->gensk = eg_gen;
  179. vec->genskfrompk = eg_genfrompk;
  180. vec->sign = eg_sign;
  181. vec->verify = eg_verify;
  182. vec->skfree = eg_freepriv;
  183. vec->pkfree = eg_freepub;
  184. vec->sigfree = eg_freesig;
  185. return vec;
  186. }