- add repo_deb to CMakeLists.txt
[platform/upstream/libsolv.git] / src / chksum.c
1 #include <sys/types.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <unistd.h>
6
7 #include "pool.h"
8 #include "util.h"
9 #include "chksum.h"
10
11 #include "md5.h"
12 #include "sha1.h"
13 #include "sha2.h"
14
15 struct ctxhandle {
16   Id type;
17   int done;
18   unsigned char result[64];
19   union {
20     MD5_CTX md5;
21     SHA1_CTX sha1;
22     SHA256_CTX sha256;
23   } c;
24 };
25
26 void *
27 sat_chksum_create(Id type)
28 {
29   struct ctxhandle *h;
30   h = sat_calloc(1, sizeof(*h));
31   h->type = type;
32   switch(type)
33     {
34     case REPOKEY_TYPE_MD5:
35       sat_MD5_Init(&h->c.md5);
36       return h;
37     case REPOKEY_TYPE_SHA1:
38       sat_SHA1_Init(&h->c.sha1);
39       return h;
40     case REPOKEY_TYPE_SHA256:
41       sat_SHA256_Init(&h->c.sha256);
42       return h;
43     }
44   free(h);
45   return 0;
46 }
47
48 void
49 sat_chksum_add(void *handle, const void *data, int len)
50 {
51   struct ctxhandle *h = handle;
52   switch(h->type)
53     {
54     case REPOKEY_TYPE_MD5:
55       sat_MD5_Update(&h->c.md5, (void *)data, len);
56       return;
57     case REPOKEY_TYPE_SHA1:
58       sat_SHA1_Update(&h->c.sha1, data, len);
59       return;
60     case REPOKEY_TYPE_SHA256:
61       sat_SHA256_Update(&h->c.sha256, data, len);
62       return;
63     default:
64       return;
65     }
66 }
67
68 unsigned char *
69 sat_chksum_get(void *handle, int *lenp)
70 {
71   struct ctxhandle *h = handle;
72   if (h->done)
73     return h->result;
74   switch(h->type)
75     {
76     case REPOKEY_TYPE_MD5:
77       sat_MD5_Final(h->result, &h->c.md5);
78       h->done = 1;
79       if (lenp)
80         *lenp = 16;
81       return h->result;
82     case REPOKEY_TYPE_SHA1:
83       sat_SHA1_Final(&h->c.sha1, h->result);
84       h->done = 1;
85       if (lenp)
86         *lenp = 20;
87       return h->result;
88     case REPOKEY_TYPE_SHA256:
89       sat_SHA256_Final(h->result, &h->c.sha256);
90       h->done = 1;
91       if (lenp)
92         *lenp = 32;
93       return h->result;
94     default:
95       if (lenp)
96         *lenp = 0;
97       return 0;
98     }
99 }
100
101 void *
102 sat_chksum_free(void *handle, unsigned char *cp)
103 {
104   if (cp)
105     {
106       unsigned char *res;
107       int l;
108       res = sat_chksum_get(handle, &l);
109       memcpy(cp, res, l);
110     }
111   sat_free(handle);
112   return 0;
113 }
114