| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | #include "ssh.h"#include "mpint.h"key_components *key_components_new(void){    key_components *kc = snew(key_components);    kc->ncomponents = 0;    kc->componentsize = 0;    kc->components = NULL;    return kc;}static void key_components_add_str(key_components *kc, const char *name,                                   KeyComponentType type, ptrlen data){    sgrowarray(kc->components, kc->componentsize, kc->ncomponents);    { // WINSCP    size_t n = kc->ncomponents++;    kc->components[n].name = dupstr(name);    kc->components[n].type = type;    kc->components[n].str = strbuf_dup_nm(data);    } // WINSCP}void key_components_add_text(key_components *kc,                             const char *name, const char *value){    key_components_add_str(kc, name, KCT_TEXT, ptrlen_from_asciz(value));}void key_components_add_text_pl(key_components *kc,                                const char *name, ptrlen value){    key_components_add_str(kc, name, KCT_TEXT, value);}void key_components_add_binary(key_components *kc,                               const char *name, ptrlen value){    key_components_add_str(kc, name, KCT_BINARY, value);}void key_components_add_mp(key_components *kc,                           const char *name, mp_int *value){    sgrowarray(kc->components, kc->componentsize, kc->ncomponents);    { // WINSCP    size_t n = kc->ncomponents++;    kc->components[n].name = dupstr(name);    kc->components[n].type = KCT_MPINT;    kc->components[n].mp = mp_copy(value);    } // WINSCP}void key_components_add_uint(key_components *kc,                             const char *name, uintmax_t value){    mp_int *mpvalue = mp_from_integer(value);    key_components_add_mp(kc, name, mpvalue);    mp_free(mpvalue);}void key_components_add_copy(key_components *kc,                             const char *name, const key_component *value){    switch (value->type) {      case KCT_TEXT:      case KCT_BINARY:        key_components_add_str(kc, name, value->type,                               ptrlen_from_strbuf(value->str));        break;      case KCT_MPINT:        key_components_add_mp(kc, name, value->mp);        break;    }}void key_components_free(key_components *kc){    size_t i; // WINSCP    for (i = 0; i < kc->ncomponents; i++) {        key_component *comp = &kc->components[i];        sfree(comp->name);        switch (comp->type) {          case KCT_MPINT:            mp_free(comp->mp);            break;          case KCT_TEXT:          case KCT_BINARY:            strbuf_free(comp->str);            break;          default:            unreachable("bad key component type");        }    }    sfree(kc->components);    sfree(kc);}
 |