Splint fiddles.
[tools/librpm-tizen.git] / rpmio / tkey.c
1 /** \ingroup rpmio signature
2  * \file rpmio/tkey.c
3  * Routines to handle RFC-2440 detached signatures.
4  */
5
6 static int _debug = 0;
7
8 #include "system.h"
9 #include "rpmio_internal.h"
10 #include "debug.h"
11
12 static int doit(const char *sig, pgpDig dig, int printing)
13 {
14     const char *s, *t;
15     unsigned char * dec;
16     size_t declen;
17     char * enc;
18     int rc;
19     int i;
20
21 if (_debug)
22 fprintf(stderr, "*** sig is\n%s\n", sig);
23
24     if ((rc = b64decode(sig, (void **)&dec, &declen)) != 0) {
25         fprintf(stderr, "*** b64decode returns %d\n", rc);
26         return rc;
27     }
28     rc = pgpPrtPkts(dec, declen, dig, printing);
29     if (rc < 0) {
30         fprintf(stderr, "*** pgpPrtPkts returns %d\n", rc);
31         return rc;
32     }
33
34     if ((enc = b64encode(dec, declen)) == NULL) {
35         fprintf(stderr, "*** b64encode failed\n");
36         return rc;
37     }
38
39 if (_debug)
40 fprintf(stderr, "*** enc is\n%s\n", enc);
41
42 rc = 0;
43 for (i = 0, s = sig, t = enc; *s & *t; i++, s++, t++) {
44     if (*s == '\n') s++;
45     if (*t == '\n') t++;
46     if (*s == *t) continue;
47 fprintf(stderr, "??? %5d %02x != %02x '%c' != '%c'\n", i, (*s & 0xff), (*t & 0xff), *s, *t);
48     rc = 5;
49 }
50
51     return rc;
52 }
53
54 /* FIPS-186 test vectors. */
55 static const char * fips_p = "8df2a494492276aa3d25759bb06869cbeac0d83afb8d0cf7cbb8324f0d7882e5d0762fc5b7210eafc2e9adac32ab7aac49693dfbf83724c2ec0736ee31c80291";
56 static const char * fips_q = "c773218c737ec8ee993b4f2ded30f48edace915f";
57 static const char * fips_g = "626d027839ea0a13413163a55b4cb500299d5522956cefcb3bff10f399ce2c2e71cb9de5fa24babf58e5b79521925c9cc42e9f6f464b088cc572af53e6d78802";
58
59 static const char * fips_hm = "a9993e364706816aba3e25717850c26c9cd0d89d";
60
61 static const char * fips_y = "19131871d75b1612a819f29d78d1b0d7346f7aa77bb62a859bfd6c5675da9d212d3a36ef1672ef660b8c7c255cc0ec74858fba33f44c06699630a76b030ee333";
62
63 static const char * fips_r = "8bac1ab66410435cb7181f95b16ab97c92b341c0";
64 static const char * fips_s = "41e2345f1f56df2458f426d155b4ba2db6dcd8c8";
65
66 /* Secret key */
67 static const char * jbjSecretDSA = "
68 lQFvBDu6XHwRAwCTIHRgKeIlOFUIEZeJVYSrXn0eUrM5S8OF471tTc+IV7AwiXBR
69 zCFCan4lO1ipmoAipyN2A6ZX0HWOcWdYlWz2adxA7l8JNiZTzkemA562xwex2wLy
70 AQWVTtRN6jv0LccAoN4UWZkIvkT6tV918sEvDEggGARxAv9190RhrDq/GMqd+AHm
71 qWrRkrBRHDUBBL2fYEuU3gFekYrW5CDIN6s3Mcq/yUsvwHl7bwmoqbf2qabbyfnv
72 Y66ETOPKLcw67ggcptHXHcwlvpfJmHKpjK+ByzgauPXXbRAC+gKDjzXL0kAQxjmT
73 2D+16O4vI8Emlx2JVcGLlq/aWhspvQWIzN6PytA3iKZ6uzesrM7yXmqzgodZUsJh
74 1wwl/0K5OIJn/oD41UayU8RXNER8SzDYvDYsJymFRwE1s58lL/8DAwJUAllw1pdZ
75 WmBIoAvRiv7kE6hWfeCvZzdBVgrHYrp8ceUa3OdulGfYw/0sIzpEU0FfZmFjdG9y
76 OgAA30gJ4JMFKVfthnDCHHL+O8lNxykKBmrgVPLClue0KUplZmYgSm9obnNvbiAo
77 QVJTIE4zTlBRKSA8amJqQHJlZGhhdC5jb20+iFcEExECABcFAju6XHwFCwcKAwQD
78 FQMCAxYCAQIXgAAKCRCB0qVW2I6DmQU6AJ490bVWZuM4yCOh8MWj6qApCr1/gwCf
79 f3+QgXFXAeTyPtMmReyWxThABtE=
80 ";
81
82 /* Public key */
83 static const char * jbjPublicDSA = "
84 mQFCBDu6XHwRAwCTIHRgKeIlOFUIEZeJVYSrXn0eUrM5S8OF471tTc+IV7AwiXBR
85 zCFCan4lO1ipmoAipyN2A6ZX0HWOcWdYlWz2adxA7l8JNiZTzkemA562xwex2wLy
86 AQWVTtRN6jv0LccAoN4UWZkIvkT6tV918sEvDEggGARxAv9190RhrDq/GMqd+AHm
87 qWrRkrBRHDUBBL2fYEuU3gFekYrW5CDIN6s3Mcq/yUsvwHl7bwmoqbf2qabbyfnv
88 Y66ETOPKLcw67ggcptHXHcwlvpfJmHKpjK+ByzgauPXXbRAC+gKDjzXL0kAQxjmT
89 2D+16O4vI8Emlx2JVcGLlq/aWhspvQWIzN6PytA3iKZ6uzesrM7yXmqzgodZUsJh
90 1wwl/0K5OIJn/oD41UayU8RXNER8SzDYvDYsJymFRwE1s58lL7QpSmVmZiBKb2hu
91 c29uIChBUlMgTjNOUFEpIDxqYmpAcmVkaGF0LmNvbT6IVwQTEQIAFwUCO7pcfAUL
92 BwoDBAMVAwIDFgIBAheAAAoJEIHSpVbYjoOZBToAn3TXaAI+bhg51EeyaiFip/6W
93 OVwBAJ44rTtNsgZBQxXISjB64CWxl4VaWQ==
94 ";
95
96 /* Signature */
97 static const char * abcSignatureDSA = "
98 iD8DBQA7vII+gdKlVtiOg5kRAvg4AJ0fV3gDBADobAnK2HOkV88bfmFMEgCeNysO
99 nP3dWWJnp0Pnbor7pIob4Dk=
100 ";
101
102 int
103 main (int argc, char *argv[])
104 {
105     pgpDig dig;
106     int printing = 1;
107     int rc;
108
109     dig = pgpNewDig();
110
111     mpbzero(&dig->p);   mpbsethex(&dig->p, fips_p);
112     mpbzero(&dig->q);   mpbsethex(&dig->q, fips_q);
113     mpnzero(&dig->g);   mpnsethex(&dig->g, fips_g);
114     mpnzero(&dig->y);   mpnsethex(&dig->y, fips_y);
115     mpnzero(&dig->r);   mpnsethex(&dig->r, fips_r);
116     mpnzero(&dig->s);   mpnsethex(&dig->s, fips_s);
117     mpnzero(&dig->hm);  mpnsethex(&dig->hm, fips_hm);
118
119     rc = dsavrfy(&dig->p, &dig->q, &dig->g, &dig->hm,
120                 &dig->y, &dig->r, &dig->s);
121
122 fprintf(stderr, "=============================== DSA FIPS-186-1: rc %d\n", rc);
123
124     mpbfree(&dig->p);
125     mpbfree(&dig->q);
126     mpnfree(&dig->g);
127     mpnfree(&dig->y);
128
129     mpnfree(&dig->hm);
130     mpnfree(&dig->r);
131     mpnfree(&dig->s);
132
133 fprintf(stderr, "=============================== GPG Secret Key\n");
134     if ((rc = doit(jbjSecretDSA, dig, printing)) != 0)
135         fprintf(stderr, "==> FAILED: rc %d\n", rc);
136
137 fprintf(stderr, "=============================== GPG Public Key\n");
138     if ((rc = doit(jbjPublicDSA, dig, printing)) != 0)
139         fprintf(stderr, "==> FAILED: rc %d\n", rc);
140
141 fprintf(stderr, "=============================== GPG Signature of \"abc\"\n");
142     if ((rc = doit(abcSignatureDSA, dig, printing)) != 0)
143         fprintf(stderr, "==> FAILED: rc %d\n", rc);
144
145     {   DIGEST_CTX ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
146         struct pgpDigParams_s * dsig = &dig->signature;
147         const char * digest = NULL;
148         size_t digestlen = 0;
149         const char * txt = "abc";
150         
151         rpmDigestUpdate(ctx, txt, strlen(txt));
152         rpmDigestUpdate(ctx, dsig->hash, dsig->hashlen);
153         rpmDigestFinal(ctx, (void **)&digest, &digestlen, 1);
154
155         mpnzero(&dig->hm); mpnsethex(&dig->hm, digest);
156
157 fprintf(stderr, "\n    hm = [ 160]: %s\n\n", digest);
158
159         if (digest) {
160             free((void *)digest);
161             digest = NULL;
162         }
163     }
164
165     rc = dsavrfy(&dig->p, &dig->q, &dig->g, &dig->hm,
166                 &dig->y, &dig->r, &dig->s);
167
168 fprintf(stderr, "=============================== DSA verify: rc %d\n", rc);
169
170     mpbfree(&dig->p);
171     mpbfree(&dig->q);
172     mpnfree(&dig->g);
173     mpnfree(&dig->y);
174
175     mpnfree(&dig->hm);
176     mpnfree(&dig->r);
177     mpnfree(&dig->s);
178
179     dig = pgpFreeDig(dig);
180
181     return rc;
182 }