rsa2any.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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, "rsa2any: warning: missing size; will add\n");
  69. else if((sz = strtol(p, &p, 10)) == 0 || *p != 0)
  70. fprint(2, "rsa2any: warning: bad size; will correct\n");
  71. else if(sz != mpsignif(key->pub.n))
  72. fprint(2, "rsa2any: 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, "rsa2any: 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, "rsa2any: warning: bad !kp\n");
  107. regen = 1;
  108. goto regen;
  109. }
  110. if((p = _strfindattr(a, "!kq")) == nil){
  111. fprint(2, "rsa2any: 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, "rsa2any: warning: bad !kq\n");
  117. regen = 1;
  118. goto regen;
  119. }
  120. if((p = _strfindattr(a, "!c2")) == nil){
  121. fprint(2, "rsa2any: 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, "rsa2any: 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. }