rsa2any.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <auth.h>
  5. #include <mp.h>
  6. #include <libsec.h>
  7. #include "rsa2any.h"
  8. RSApriv*
  9. getkey(int argc, char **argv, int needprivate, Attr **pa)
  10. {
  11. char *file, *s, *p;
  12. int sz;
  13. RSApriv *key;
  14. Biobuf *b;
  15. int regen;
  16. Attr *a;
  17. if(argc == 0)
  18. file = "#d/0";
  19. else
  20. file = argv[0];
  21. key = mallocz(sizeof(RSApriv), 1);
  22. if(key == nil)
  23. return nil;
  24. if((b = Bopen(file, OREAD)) == nil){
  25. werrstr("open %s: %r", file);
  26. return nil;
  27. }
  28. s = Brdstr(b, '\n', 1);
  29. if(s == nil){
  30. werrstr("read %s: %r", file);
  31. return nil;
  32. }
  33. if(strncmp(s, "key ", 4) != 0){
  34. werrstr("bad key format");
  35. return nil;
  36. }
  37. regen = 0;
  38. a = _parseattr(s+4);
  39. if(a == nil){
  40. werrstr("empty key");
  41. return nil;
  42. }
  43. if((p = _strfindattr(a, "proto")) == nil){
  44. werrstr("no proto");
  45. return nil;
  46. }
  47. if(strcmp(p, "rsa") != 0){
  48. werrstr("proto not rsa");
  49. return nil;
  50. }
  51. if((p = _strfindattr(a, "ek")) == nil){
  52. werrstr("no ek");
  53. return nil;
  54. }
  55. if((key->pub.ek = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  56. werrstr("bad ek");
  57. return nil;
  58. }
  59. if((p = _strfindattr(a, "n")) == nil){
  60. werrstr("no n");
  61. return nil;
  62. }
  63. if((key->pub.n = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  64. werrstr("bad n");
  65. return nil;
  66. }
  67. if((p = _strfindattr(a, "size")) == nil)
  68. fprint(2, "warning: missing size; will add\n");
  69. else if((sz = strtol(p, &p, 10)) == 0 || *p != 0)
  70. fprint(2, "warning: bad size; will correct\n");
  71. else if(sz != mpsignif(key->pub.n))
  72. fprint(2, "warning: wrong size (got %d, expected %d); will correct\n",
  73. sz, mpsignif(key->pub.n));
  74. if(!needprivate)
  75. goto call;
  76. if((p = _strfindattr(a, "!dk")) == nil){
  77. werrstr("no !dk");
  78. return nil;
  79. }
  80. if((key->dk = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  81. werrstr("bad !dk");
  82. return nil;
  83. }
  84. if((p = _strfindattr(a, "!p")) == nil){
  85. werrstr("no !p");
  86. return nil;
  87. }
  88. if((key->p = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  89. werrstr("bad !p");
  90. return nil;
  91. }
  92. if((p = _strfindattr(a, "!q")) == nil){
  93. werrstr("no !q");
  94. return nil;
  95. }
  96. if((key->q = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  97. werrstr("bad !q");
  98. return nil;
  99. }
  100. if((p = _strfindattr(a, "!kp")) == nil){
  101. fprint(2, "warning: no !kp\n");
  102. regen = 1;
  103. goto regen;
  104. }
  105. if((key->kp = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  106. fprint(2, "warning: bad !kp\n");
  107. regen = 1;
  108. goto regen;
  109. }
  110. if((p = _strfindattr(a, "!kq")) == nil){
  111. fprint(2, "warning: no !kq\n");
  112. regen = 1;
  113. goto regen;
  114. }
  115. if((key->kq = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  116. fprint(2, "warning: bad !kq\n");
  117. regen = 1;
  118. goto regen;
  119. }
  120. if((p = _strfindattr(a, "!c2")) == nil){
  121. fprint(2, "warning: no !c2\n");
  122. regen = 1;
  123. goto regen;
  124. }
  125. if((key->c2 = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  126. fprint(2, "warning: bad !c2\n");
  127. regen = 1;
  128. goto regen;
  129. }
  130. regen:
  131. if(regen){
  132. RSApriv *k2;
  133. k2 = rsafill(key->pub.n, key->pub.ek, key->dk, key->p, key->q);
  134. if(k2 == nil){
  135. werrstr("regenerating chinese-remainder parts failed: %r");
  136. return nil;
  137. }
  138. key = k2;
  139. }
  140. call:
  141. a = _delattr(a, "ek");
  142. a = _delattr(a, "n");
  143. a = _delattr(a, "size");
  144. a = _delattr(a, "!dk");
  145. a = _delattr(a, "!p");
  146. a = _delattr(a, "!q");
  147. a = _delattr(a, "!c2");
  148. a = _delattr(a, "!kp");
  149. a = _delattr(a, "!kq");
  150. if(pa)
  151. *pa = a;
  152. return key;
  153. }
  154. DSApriv*
  155. getdsakey(int argc, char **argv, int needprivate, Attr **pa)
  156. {
  157. char *file, *s, *p;
  158. DSApriv *key;
  159. Biobuf *b;
  160. Attr *a;
  161. if(argc == 0)
  162. file = "#d/0";
  163. else
  164. file = argv[0];
  165. key = mallocz(sizeof(RSApriv), 1);
  166. if(key == nil)
  167. return nil;
  168. if((b = Bopen(file, OREAD)) == nil){
  169. werrstr("open %s: %r", file);
  170. return nil;
  171. }
  172. s = Brdstr(b, '\n', 1);
  173. if(s == nil){
  174. werrstr("read %s: %r", file);
  175. return nil;
  176. }
  177. if(strncmp(s, "key ", 4) != 0){
  178. werrstr("bad key format");
  179. return nil;
  180. }
  181. a = _parseattr(s+4);
  182. if(a == nil){
  183. werrstr("empty key");
  184. return nil;
  185. }
  186. if((p = _strfindattr(a, "proto")) == nil){
  187. werrstr("no proto");
  188. return nil;
  189. }
  190. if(strcmp(p, "dsa") != 0){
  191. werrstr("proto not dsa");
  192. return nil;
  193. }
  194. if((p = _strfindattr(a, "p")) == nil){
  195. werrstr("no p");
  196. return nil;
  197. }
  198. if((key->pub.p = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  199. werrstr("bad p");
  200. return nil;
  201. }
  202. if((p = _strfindattr(a, "q")) == nil){
  203. werrstr("no q");
  204. return nil;
  205. }
  206. if((key->pub.q = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  207. werrstr("bad q");
  208. return nil;
  209. }
  210. if((p = _strfindattr(a, "alpha")) == nil){
  211. werrstr("no alpha");
  212. return nil;
  213. }
  214. if((key->pub.alpha = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  215. werrstr("bad alpha");
  216. return nil;
  217. }
  218. if((p = _strfindattr(a, "key")) == nil){
  219. werrstr("no key=");
  220. return nil;
  221. }
  222. if((key->pub.key = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  223. werrstr("bad key=");
  224. return nil;
  225. }
  226. if(!needprivate)
  227. goto call;
  228. if((p = _strfindattr(a, "!secret")) == nil){
  229. werrstr("no !secret");
  230. return nil;
  231. }
  232. if((key->secret = strtomp(p, &p, 16, nil)) == nil || *p != 0){
  233. werrstr("bad !secret");
  234. return nil;
  235. }
  236. call:
  237. a = _delattr(a, "p");
  238. a = _delattr(a, "q");
  239. a = _delattr(a, "alpha");
  240. a = _delattr(a, "key");
  241. a = _delattr(a, "!secret");
  242. if(pa)
  243. *pa = a;
  244. return key;
  245. }
  246. uchar*
  247. put4(uchar *p, uint n)
  248. {
  249. p[0] = (n>>24)&0xFF;
  250. p[1] = (n>>16)&0xFF;
  251. p[2] = (n>>8)&0xFF;
  252. p[3] = n&0xFF;
  253. return p+4;
  254. }
  255. uchar*
  256. putn(uchar *p, void *v, uint n)
  257. {
  258. memmove(p, v, n);
  259. p += n;
  260. return p;
  261. }
  262. uchar*
  263. putstr(uchar *p, char *s)
  264. {
  265. p = put4(p, strlen(s));
  266. p = putn(p, s, strlen(s));
  267. return p;
  268. }
  269. uchar*
  270. putmp2(uchar *p, mpint *b)
  271. {
  272. int bits, n;
  273. if(mpcmp(b, mpzero) == 0)
  274. return put4(p, 0);
  275. bits = mpsignif(b);
  276. n = (bits+7)/8;
  277. if(bits%8 == 0){
  278. p = put4(p, n+1);
  279. *p++ = 0;
  280. }else
  281. p = put4(p, n);
  282. mptobe(b, p, n, nil);
  283. p += n;
  284. return p;
  285. }