rsa2any.c 6.1 KB

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