Blame


1 53bf0b54 2023-02-23 op /*
2 53bf0b54 2023-02-23 op * Copyright (c) 2018 Stefan Sperling <stsp@openbsd.org>
3 53bf0b54 2023-02-23 op *
4 53bf0b54 2023-02-23 op * Permission to use, copy, modify, and distribute this software for any
5 53bf0b54 2023-02-23 op * purpose with or without fee is hereby granted, provided that the above
6 53bf0b54 2023-02-23 op * copyright notice and this permission notice appear in all copies.
7 53bf0b54 2023-02-23 op *
8 53bf0b54 2023-02-23 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 53bf0b54 2023-02-23 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 53bf0b54 2023-02-23 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 53bf0b54 2023-02-23 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 53bf0b54 2023-02-23 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 53bf0b54 2023-02-23 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 53bf0b54 2023-02-23 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 53bf0b54 2023-02-23 op */
16 53bf0b54 2023-02-23 op
17 53bf0b54 2023-02-23 op #include <sys/types.h>
18 87a3ab84 2023-02-23 op #include <sys/queue.h>
19 87a3ab84 2023-02-23 op
20 53bf0b54 2023-02-23 op #include <sha1.h>
21 53bf0b54 2023-02-23 op #include <sha2.h>
22 53bf0b54 2023-02-23 op #include <errno.h>
23 53bf0b54 2023-02-23 op #include <stdio.h>
24 53bf0b54 2023-02-23 op #include <stdlib.h>
25 87a3ab84 2023-02-23 op #include <string.h>
26 53bf0b54 2023-02-23 op #include <limits.h>
27 53bf0b54 2023-02-23 op
28 87a3ab84 2023-02-23 op #include "got_object.h"
29 87a3ab84 2023-02-23 op
30 53bf0b54 2023-02-23 op #include "got_lib_hash.h"
31 53bf0b54 2023-02-23 op
32 53bf0b54 2023-02-23 op int
33 53bf0b54 2023-02-23 op got_parse_xdigit(uint8_t *val, const char *hex)
34 53bf0b54 2023-02-23 op {
35 53bf0b54 2023-02-23 op char *ep;
36 53bf0b54 2023-02-23 op long lval;
37 53bf0b54 2023-02-23 op
38 53bf0b54 2023-02-23 op errno = 0;
39 53bf0b54 2023-02-23 op lval = strtol(hex, &ep, 16);
40 53bf0b54 2023-02-23 op if (hex[0] == '\0' || *ep != '\0')
41 53bf0b54 2023-02-23 op return 0;
42 53bf0b54 2023-02-23 op if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN))
43 53bf0b54 2023-02-23 op return 0;
44 53bf0b54 2023-02-23 op
45 53bf0b54 2023-02-23 op *val = (uint8_t)lval;
46 53bf0b54 2023-02-23 op return 1;
47 53bf0b54 2023-02-23 op }
48 53bf0b54 2023-02-23 op
49 87a3ab84 2023-02-23 op static int
50 87a3ab84 2023-02-23 op parse_digest(uint8_t *digest, int len, const char *line)
51 53bf0b54 2023-02-23 op {
52 53bf0b54 2023-02-23 op uint8_t b = 0;
53 53bf0b54 2023-02-23 op char hex[3] = {'\0', '\0', '\0'};
54 53bf0b54 2023-02-23 op int i, j;
55 53bf0b54 2023-02-23 op
56 87a3ab84 2023-02-23 op for (i = 0; i < len; i++) {
57 53bf0b54 2023-02-23 op if (line[0] == '\0' || line[1] == '\0')
58 53bf0b54 2023-02-23 op return 0;
59 53bf0b54 2023-02-23 op for (j = 0; j < 2; j++) {
60 53bf0b54 2023-02-23 op hex[j] = *line;
61 53bf0b54 2023-02-23 op line++;
62 53bf0b54 2023-02-23 op }
63 53bf0b54 2023-02-23 op if (!got_parse_xdigit(&b, hex))
64 53bf0b54 2023-02-23 op return 0;
65 53bf0b54 2023-02-23 op digest[i] = b;
66 53bf0b54 2023-02-23 op }
67 53bf0b54 2023-02-23 op
68 53bf0b54 2023-02-23 op return 1;
69 53bf0b54 2023-02-23 op }
70 53bf0b54 2023-02-23 op
71 87a3ab84 2023-02-23 op static char *
72 87a3ab84 2023-02-23 op digest_to_str(const uint8_t *digest, int len, char *buf)
73 53bf0b54 2023-02-23 op {
74 14f89e3e 2023-02-23 naddy const char hex[] = "0123456789abcdef";
75 53bf0b54 2023-02-23 op char *p = buf;
76 53bf0b54 2023-02-23 op int i;
77 53bf0b54 2023-02-23 op
78 87a3ab84 2023-02-23 op for (i = 0; i < len; i++) {
79 14f89e3e 2023-02-23 naddy *p++ = hex[digest[i] >> 4];
80 14f89e3e 2023-02-23 naddy *p++ = hex[digest[i] & 0xf];
81 53bf0b54 2023-02-23 op }
82 14f89e3e 2023-02-23 naddy *p = '\0';
83 53bf0b54 2023-02-23 op
84 53bf0b54 2023-02-23 op return buf;
85 53bf0b54 2023-02-23 op }
86 87a3ab84 2023-02-23 op
87 87a3ab84 2023-02-23 op char *
88 87a3ab84 2023-02-23 op got_sha1_digest_to_str(const uint8_t *digest, char *buf, size_t size)
89 87a3ab84 2023-02-23 op {
90 87a3ab84 2023-02-23 op if (size < SHA1_DIGEST_STRING_LENGTH)
91 87a3ab84 2023-02-23 op return NULL;
92 87a3ab84 2023-02-23 op return digest_to_str(digest, SHA1_DIGEST_LENGTH, buf);
93 87a3ab84 2023-02-23 op }
94 87a3ab84 2023-02-23 op
95 87a3ab84 2023-02-23 op char *
96 87a3ab84 2023-02-23 op got_sha256_digest_to_str(const uint8_t *digest, char *buf, size_t size)
97 87a3ab84 2023-02-23 op {
98 87a3ab84 2023-02-23 op if (size < SHA256_DIGEST_STRING_LENGTH)
99 87a3ab84 2023-02-23 op return NULL;
100 87a3ab84 2023-02-23 op return digest_to_str(digest, SHA256_DIGEST_LENGTH, buf);
101 87a3ab84 2023-02-23 op }
102 87a3ab84 2023-02-23 op
103 87a3ab84 2023-02-23 op int
104 87a3ab84 2023-02-23 op got_parse_hash_digest(uint8_t *digest, const char *line,
105 87a3ab84 2023-02-23 op enum got_hash_algorithm algo)
106 87a3ab84 2023-02-23 op {
107 87a3ab84 2023-02-23 op switch (algo) {
108 87a3ab84 2023-02-23 op case GOT_HASH_SHA1:
109 87a3ab84 2023-02-23 op return parse_digest(digest, SHA1_DIGEST_LENGTH, line);
110 87a3ab84 2023-02-23 op case GOT_HASH_SHA256:
111 87a3ab84 2023-02-23 op return parse_digest(digest, SHA256_DIGEST_LENGTH, line);
112 87a3ab84 2023-02-23 op default:
113 87a3ab84 2023-02-23 op return 0;
114 87a3ab84 2023-02-23 op }
115 87a3ab84 2023-02-23 op }
116 87a3ab84 2023-02-23 op
117 87a3ab84 2023-02-23 op int
118 87a3ab84 2023-02-23 op got_parse_object_id(struct got_object_id *id, const char *line,
119 87a3ab84 2023-02-23 op enum got_hash_algorithm algo)
120 87a3ab84 2023-02-23 op {
121 87a3ab84 2023-02-23 op memset(id, 0, sizeof(*id));
122 87a3ab84 2023-02-23 op
123 87a3ab84 2023-02-23 op /* XXX: temporary until we grow got_object_id */
124 87a3ab84 2023-02-23 op if (algo != GOT_HASH_SHA1)
125 87a3ab84 2023-02-23 op return 0;
126 87a3ab84 2023-02-23 op
127 87a3ab84 2023-02-23 op return got_parse_hash_digest(id->sha1, line, algo);
128 87a3ab84 2023-02-23 op }
129 ae25a666 2023-02-23 op
130 ae25a666 2023-02-23 op void
131 ae25a666 2023-02-23 op got_hash_init(struct got_hash *hash, enum got_hash_algorithm algo)
132 ae25a666 2023-02-23 op {
133 ae25a666 2023-02-23 op memset(hash, 0, sizeof(*hash));
134 ae25a666 2023-02-23 op hash->algo = algo;
135 ae25a666 2023-02-23 op
136 ae25a666 2023-02-23 op if (algo == GOT_HASH_SHA1)
137 ae25a666 2023-02-23 op SHA1Init(&hash->sha1_ctx);
138 ae25a666 2023-02-23 op else if (algo == GOT_HASH_SHA256)
139 ae25a666 2023-02-23 op SHA256Init(&hash->sha256_ctx);
140 ae25a666 2023-02-23 op }
141 ae25a666 2023-02-23 op
142 ae25a666 2023-02-23 op void
143 ae25a666 2023-02-23 op got_hash_update(struct got_hash *hash, const void *data, size_t len)
144 ae25a666 2023-02-23 op {
145 ae25a666 2023-02-23 op if (hash->algo == GOT_HASH_SHA1)
146 ae25a666 2023-02-23 op SHA1Update(&hash->sha1_ctx, data, len);
147 ae25a666 2023-02-23 op else if (hash->algo == GOT_HASH_SHA256)
148 ae25a666 2023-02-23 op SHA256Update(&hash->sha256_ctx, data, len);
149 ae25a666 2023-02-23 op }
150 ae25a666 2023-02-23 op
151 ae25a666 2023-02-23 op void
152 ae25a666 2023-02-23 op got_hash_final(struct got_hash *hash, uint8_t *out)
153 ae25a666 2023-02-23 op {
154 ae25a666 2023-02-23 op if (hash->algo == GOT_HASH_SHA1)
155 ae25a666 2023-02-23 op SHA1Final(out, &hash->sha1_ctx);
156 ae25a666 2023-02-23 op else if (hash->algo == GOT_HASH_SHA256)
157 ae25a666 2023-02-23 op SHA256Final(out, &hash->sha256_ctx);
158 ae25a666 2023-02-23 op }
159 ae25a666 2023-02-23 op
160 ae25a666 2023-02-23 op void
161 ae25a666 2023-02-23 op got_hash_final_object_id(struct got_hash *hash, struct got_object_id *id)
162 ae25a666 2023-02-23 op {
163 ae25a666 2023-02-23 op memset(id, 0, sizeof(*id));
164 ae25a666 2023-02-23 op got_hash_final(hash, id->sha1);
165 ae25a666 2023-02-23 op }
166 ae25a666 2023-02-23 op
167 ae25a666 2023-02-23 op int
168 ae25a666 2023-02-23 op got_hash_cmp(enum got_hash_algorithm algo, uint8_t *b1, uint8_t *b2)
169 ae25a666 2023-02-23 op {
170 ae25a666 2023-02-23 op if (algo == GOT_HASH_SHA1)
171 ae25a666 2023-02-23 op return memcmp(b1, b2, SHA1_DIGEST_LENGTH);
172 ae25a666 2023-02-23 op else if (algo == GOT_HASH_SHA256)
173 ae25a666 2023-02-23 op return memcmp(b1, b2, SHA256_DIGEST_LENGTH);
174 ae25a666 2023-02-23 op return -1;
175 ae25a666 2023-02-23 op }