rsaalg.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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[] = { "n", "ek", nil };
  10. static char* skattr[] = { "n", "ek", "!dk", "!p", "!q", "!kp", "!kq", "!c2", nil };
  11. static char* sigattr[] = { "val", nil };
  12. static void*
  13. rsa_str2sk(char *str, char **strp)
  14. {
  15. RSApriv *rsa;
  16. char *p;
  17. rsa = rsaprivalloc();
  18. rsa->pub.n = base64tobig(str, &p);
  19. rsa->pub.ek = base64tobig(p, &p);
  20. rsa->dk = base64tobig(p, &p);
  21. rsa->p = base64tobig(p, &p);
  22. rsa->q = base64tobig(p, &p);
  23. rsa->kp = base64tobig(p, &p);
  24. rsa->kq = base64tobig(p, &p);
  25. rsa->c2 = base64tobig(p, &p);
  26. if(strp)
  27. *strp = p;
  28. if(rsa->pub.n == nil || rsa->pub.ek == nil ||
  29. rsa->dk == nil || rsa->p == nil || rsa->q == nil ||
  30. rsa->kp == nil || rsa->kq == nil || rsa->c2 == nil){
  31. rsaprivfree(rsa);
  32. return nil;
  33. }
  34. return rsa;
  35. }
  36. static void*
  37. rsa_str2pk(char *str, char **strp)
  38. {
  39. RSApub *rsa;
  40. char *p;
  41. rsa = rsapuballoc();
  42. rsa->n = base64tobig(str, &p);
  43. rsa->ek = base64tobig(p, &p);
  44. if(strp)
  45. *strp = p;
  46. if(rsa->n == nil || rsa->ek == nil){
  47. rsapubfree(rsa);
  48. return nil;
  49. }
  50. return rsa;
  51. }
  52. static void*
  53. rsa_str2sig(char *str, char **strp)
  54. {
  55. mpint *rsa;
  56. char *p;
  57. rsa = base64tobig(str, &p);
  58. if(rsa == nil)
  59. return nil;
  60. if(strp)
  61. *strp = p;
  62. return rsa;
  63. }
  64. static int
  65. rsa_sk2str(void *vrsa, char *buf, int len)
  66. {
  67. RSApriv *rsa;
  68. char *cp, *ep;
  69. rsa = vrsa;
  70. ep = buf + len - 1;
  71. cp = buf;
  72. cp += snprint(cp, ep - cp, "%U\n", rsa->pub.n);
  73. cp += snprint(cp, ep - cp, "%U\n", rsa->pub.ek);
  74. cp += snprint(cp, ep - cp, "%U\n", rsa->dk);
  75. cp += snprint(cp, ep - cp, "%U\n", rsa->p);
  76. cp += snprint(cp, ep - cp, "%U\n", rsa->q);
  77. cp += snprint(cp, ep - cp, "%U\n", rsa->kp);
  78. cp += snprint(cp, ep - cp, "%U\n", rsa->kq);
  79. cp += snprint(cp, ep - cp, "%U\n", rsa->c2);
  80. *cp = 0;
  81. return cp - buf;
  82. }
  83. static int
  84. rsa_pk2str(void *vrsa, char *buf, int len)
  85. {
  86. RSApub *rsa;
  87. char *cp, *ep;
  88. rsa = vrsa;
  89. ep = buf + len - 1;
  90. cp = buf;
  91. cp += snprint(cp, ep - cp, "%U\n", rsa->n);
  92. cp += snprint(cp, ep - cp, "%U\n", rsa->ek);
  93. *cp = 0;
  94. return cp - buf;
  95. }
  96. static int
  97. rsa_sig2str(void *vrsa, char *buf, int len)
  98. {
  99. mpint *rsa;
  100. char *cp, *ep;
  101. rsa = vrsa;
  102. ep = buf + len - 1;
  103. cp = buf;
  104. cp += snprint(cp, ep - cp, "%U\n", rsa);
  105. *cp = 0;
  106. return cp - buf;
  107. }
  108. static void*
  109. rsa_sk2pk(void *vs)
  110. {
  111. return rsaprivtopub((RSApriv*)vs);
  112. }
  113. /* generate an rsa secret key */
  114. static void*
  115. rsa_gen(int len)
  116. {
  117. RSApriv *key;
  118. for(;;){
  119. key = rsagen(len, 6, 0);
  120. if(mpsignif(key->pub.n) == len)
  121. return key;
  122. rsaprivfree(key);
  123. }
  124. }
  125. /* generate an rsa secret key with same params as a public key */
  126. static void*
  127. rsa_genfrompk(void *vpub)
  128. {
  129. RSApub *pub;
  130. pub = vpub;
  131. return rsagen(mpsignif(pub->n), mpsignif(pub->ek), 0);
  132. }
  133. static void*
  134. rsa_sign(mpint* m, void *key)
  135. {
  136. return rsadecrypt((RSApriv*)key, m, nil);
  137. }
  138. static int
  139. rsa_verify(mpint* m, void *sig, void *key)
  140. {
  141. mpint *t;
  142. int r;
  143. t = rsaencrypt((RSApub*)key, (mpint*)sig, nil);
  144. r = mpcmp(t, m) == 0;
  145. mpfree(t);
  146. return r;
  147. }
  148. static void
  149. rsa_freepriv(void *a)
  150. {
  151. rsaprivfree((RSApriv*)a);
  152. }
  153. static void
  154. rsa_freepub(void *a)
  155. {
  156. rsapubfree((RSApub*)a);
  157. }
  158. static void
  159. rsa_freesig(void *a)
  160. {
  161. mpfree(a);
  162. }
  163. SigAlgVec*
  164. rsainit(void)
  165. {
  166. SigAlgVec *vec;
  167. vec = malloc(sizeof(SigAlgVec));
  168. if(vec == nil)
  169. return nil;
  170. vec->name = "rsa";
  171. vec->pkattr = pkattr;
  172. vec->skattr = skattr;
  173. vec->sigattr = sigattr;
  174. vec->str2sk = rsa_str2sk;
  175. vec->str2pk = rsa_str2pk;
  176. vec->str2sig = rsa_str2sig;
  177. vec->sk2str = rsa_sk2str;
  178. vec->pk2str = rsa_pk2str;
  179. vec->sig2str = rsa_sig2str;
  180. vec->sk2pk = rsa_sk2pk;
  181. vec->gensk = rsa_gen;
  182. vec->genskfrompk = rsa_genfrompk;
  183. vec->sign = rsa_sign;
  184. vec->verify = rsa_verify;
  185. vec->skfree = rsa_freepriv;
  186. vec->pkfree = rsa_freepub;
  187. vec->sigfree = rsa_freesig;
  188. return vec;
  189. }