File: key_components.c

package info (click to toggle)
putty 0.83-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 13,216 kB
  • sloc: ansic: 148,476; python: 8,466; perl: 1,830; makefile: 128; sh: 117
file content (93 lines) | stat: -rw-r--r-- 2,666 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#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);
    size_t n = kc->ncomponents++;
    kc->components[n].name = dupstr(name);
    kc->components[n].type = type;
    kc->components[n].str = strbuf_dup_nm(data);
}

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);
    size_t n = kc->ncomponents++;
    kc->components[n].name = dupstr(name);
    kc->components[n].type = KCT_MPINT;
    kc->components[n].mp = mp_copy(value);
}

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)
{
    for (size_t 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);
}