key_components.c 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "ssh.h"
  2. #include "mpint.h"
  3. key_components *key_components_new(void)
  4. {
  5. key_components *kc = snew(key_components);
  6. kc->ncomponents = 0;
  7. kc->componentsize = 0;
  8. kc->components = NULL;
  9. return kc;
  10. }
  11. static void key_components_add_str(key_components *kc, const char *name,
  12. KeyComponentType type, ptrlen data)
  13. {
  14. sgrowarray(kc->components, kc->componentsize, kc->ncomponents);
  15. { // WINSCP
  16. size_t n = kc->ncomponents++;
  17. kc->components[n].name = dupstr(name);
  18. kc->components[n].type = type;
  19. kc->components[n].str = strbuf_dup_nm(data);
  20. } // WINSCP
  21. }
  22. void key_components_add_text(key_components *kc,
  23. const char *name, const char *value)
  24. {
  25. key_components_add_str(kc, name, KCT_TEXT, ptrlen_from_asciz(value));
  26. }
  27. void key_components_add_text_pl(key_components *kc,
  28. const char *name, ptrlen value)
  29. {
  30. key_components_add_str(kc, name, KCT_TEXT, value);
  31. }
  32. void key_components_add_binary(key_components *kc,
  33. const char *name, ptrlen value)
  34. {
  35. key_components_add_str(kc, name, KCT_BINARY, value);
  36. }
  37. void key_components_add_mp(key_components *kc,
  38. const char *name, mp_int *value)
  39. {
  40. sgrowarray(kc->components, kc->componentsize, kc->ncomponents);
  41. { // WINSCP
  42. size_t n = kc->ncomponents++;
  43. kc->components[n].name = dupstr(name);
  44. kc->components[n].type = KCT_MPINT;
  45. kc->components[n].mp = mp_copy(value);
  46. } // WINSCP
  47. }
  48. void key_components_add_uint(key_components *kc,
  49. const char *name, uintmax_t value)
  50. {
  51. mp_int *mpvalue = mp_from_integer(value);
  52. key_components_add_mp(kc, name, mpvalue);
  53. mp_free(mpvalue);
  54. }
  55. void key_components_add_copy(key_components *kc,
  56. const char *name, const key_component *value)
  57. {
  58. switch (value->type) {
  59. case KCT_TEXT:
  60. case KCT_BINARY:
  61. key_components_add_str(kc, name, value->type,
  62. ptrlen_from_strbuf(value->str));
  63. break;
  64. case KCT_MPINT:
  65. key_components_add_mp(kc, name, value->mp);
  66. break;
  67. }
  68. }
  69. void key_components_free(key_components *kc)
  70. {
  71. size_t i; // WINSCP
  72. for (i = 0; i < kc->ncomponents; i++) {
  73. key_component *comp = &kc->components[i];
  74. sfree(comp->name);
  75. switch (comp->type) {
  76. case KCT_MPINT:
  77. mp_free(comp->mp);
  78. break;
  79. case KCT_TEXT:
  80. case KCT_BINARY:
  81. strbuf_free(comp->str);
  82. break;
  83. default:
  84. unreachable("bad key component type");
  85. }
  86. }
  87. sfree(kc->components);
  88. sfree(kc);
  89. }