00001
00006 static int _debug = 0;
00007
00008 #include "system.h"
00009 #include "rpmio_internal.h"
00010 #include "debug.h"
00011
00012 static int doit(const char *sig, pgpDig dig, int printing)
00013 {
00014 const char *s, *t;
00015 unsigned char * dec;
00016 size_t declen;
00017 char * enc;
00018 int rc;
00019 int i;
00020
00021 if (_debug)
00022 fprintf(stderr, "*** sig is\n%s\n", sig);
00023
00024 if ((rc = b64decode(sig, (void **)&dec, &declen)) != 0) {
00025 fprintf(stderr, "*** b64decode returns %d\n", rc);
00026 return rc;
00027 }
00028 rc = pgpPrtPkts(dec, declen, dig, printing);
00029 if (rc < 0) {
00030 fprintf(stderr, "*** pgpPrtPkts returns %d\n", rc);
00031 return rc;
00032 }
00033
00034 if ((enc = b64encode(dec, declen)) == NULL) {
00035 fprintf(stderr, "*** b64encode failed\n");
00036 return rc;
00037 }
00038
00039 if (_debug)
00040 fprintf(stderr, "*** enc is\n%s\n", enc);
00041
00042 rc = 0;
00043 for (i = 0, s = sig, t = enc; *s & *t; i++, s++, t++) {
00044 if (*s == '\n') s++;
00045 if (*t == '\n') t++;
00046 if (*s == *t) continue;
00047 fprintf(stderr, "??? %5d %02x != %02x '%c' != '%c'\n", i, (*s & 0xff), (*t & 0xff), *s, *t);
00048 rc = 5;
00049 }
00050
00051 return rc;
00052 }
00053
00054
00055 static const char * fips_p = "8df2a494492276aa3d25759bb06869cbeac0d83afb8d0cf7cbb8324f0d7882e5d0762fc5b7210eafc2e9adac32ab7aac49693dfbf83724c2ec0736ee31c80291";
00056 static const char * fips_q = "c773218c737ec8ee993b4f2ded30f48edace915f";
00057 static const char * fips_g = "626d027839ea0a13413163a55b4cb500299d5522956cefcb3bff10f399ce2c2e71cb9de5fa24babf58e5b79521925c9cc42e9f6f464b088cc572af53e6d78802";
00058
00059 static const char * fips_hm = "a9993e364706816aba3e25717850c26c9cd0d89d";
00060
00061 static const char * fips_y = "19131871d75b1612a819f29d78d1b0d7346f7aa77bb62a859bfd6c5675da9d212d3a36ef1672ef660b8c7c255cc0ec74858fba33f44c06699630a76b030ee333";
00062
00063 static const char * fips_r = "8bac1ab66410435cb7181f95b16ab97c92b341c0";
00064 static const char * fips_s = "41e2345f1f56df2458f426d155b4ba2db6dcd8c8";
00065
00066
00067 static const char * jbjSecretDSA = "
00068 lQFvBDu6XHwRAwCTIHRgKeIlOFUIEZeJVYSrXn0eUrM5S8OF471tTc+IV7AwiXBR
00069 zCFCan4lO1ipmoAipyN2A6ZX0HWOcWdYlWz2adxA7l8JNiZTzkemA562xwex2wLy
00070 AQWVTtRN6jv0LccAoN4UWZkIvkT6tV918sEvDEggGARxAv9190RhrDq/GMqd+AHm
00071 qWrRkrBRHDUBBL2fYEuU3gFekYrW5CDIN6s3Mcq/yUsvwHl7bwmoqbf2qabbyfnv
00072 Y66ETOPKLcw67ggcptHXHcwlvpfJmHKpjK+ByzgauPXXbRAC+gKDjzXL0kAQxjmT
00073 2D+16O4vI8Emlx2JVcGLlq/aWhspvQWIzN6PytA3iKZ6uzesrM7yXmqzgodZUsJh
00074 1wwl/0K5OIJn/oD41UayU8RXNER8SzDYvDYsJymFRwE1s58lL/8DAwJUAllw1pdZ
00075 WmBIoAvRiv7kE6hWfeCvZzdBVgrHYrp8ceUa3OdulGfYw/0sIzpEU0FfZmFjdG9y
00076 OgAA30gJ4JMFKVfthnDCHHL+O8lNxykKBmrgVPLClue0KUplZmYgSm9obnNvbiAo
00077 QVJTIE4zTlBRKSA8amJqQHJlZGhhdC5jb20+iFcEExECABcFAju6XHwFCwcKAwQD
00078 FQMCAxYCAQIXgAAKCRCB0qVW2I6DmQU6AJ490bVWZuM4yCOh8MWj6qApCr1/gwCf
00079 f3+QgXFXAeTyPtMmReyWxThABtE=
00080 ";
00081
00082
00083 static const char * jbjPublicDSA = "
00084 mQFCBDu6XHwRAwCTIHRgKeIlOFUIEZeJVYSrXn0eUrM5S8OF471tTc+IV7AwiXBR
00085 zCFCan4lO1ipmoAipyN2A6ZX0HWOcWdYlWz2adxA7l8JNiZTzkemA562xwex2wLy
00086 AQWVTtRN6jv0LccAoN4UWZkIvkT6tV918sEvDEggGARxAv9190RhrDq/GMqd+AHm
00087 qWrRkrBRHDUBBL2fYEuU3gFekYrW5CDIN6s3Mcq/yUsvwHl7bwmoqbf2qabbyfnv
00088 Y66ETOPKLcw67ggcptHXHcwlvpfJmHKpjK+ByzgauPXXbRAC+gKDjzXL0kAQxjmT
00089 2D+16O4vI8Emlx2JVcGLlq/aWhspvQWIzN6PytA3iKZ6uzesrM7yXmqzgodZUsJh
00090 1wwl/0K5OIJn/oD41UayU8RXNER8SzDYvDYsJymFRwE1s58lL7QpSmVmZiBKb2hu
00091 c29uIChBUlMgTjNOUFEpIDxqYmpAcmVkaGF0LmNvbT6IVwQTEQIAFwUCO7pcfAUL
00092 BwoDBAMVAwIDFgIBAheAAAoJEIHSpVbYjoOZBToAn3TXaAI+bhg51EeyaiFip/6W
00093 OVwBAJ44rTtNsgZBQxXISjB64CWxl4VaWQ==
00094 ";
00095
00096
00097 static const char * abcSignatureDSA = "
00098 iD8DBQA7vII+gdKlVtiOg5kRAvg4AJ0fV3gDBADobAnK2HOkV88bfmFMEgCeNysO
00099 nP3dWWJnp0Pnbor7pIob4Dk=
00100 ";
00101
00102 int
00103 main (int argc, char *argv[])
00104 {
00105 pgpDig dig;
00106 int printing = 1;
00107 int rc;
00108
00109 dig = pgpNewDig();
00110
00111 mpbzero(&dig->p); mpbsethex(&dig->p, fips_p);
00112 mpbzero(&dig->q); mpbsethex(&dig->q, fips_q);
00113 mpnzero(&dig->g); mpnsethex(&dig->g, fips_g);
00114 mpnzero(&dig->y); mpnsethex(&dig->y, fips_y);
00115 mpnzero(&dig->r); mpnsethex(&dig->r, fips_r);
00116 mpnzero(&dig->s); mpnsethex(&dig->s, fips_s);
00117 mpnzero(&dig->hm); mpnsethex(&dig->hm, fips_hm);
00118
00119 rc = dsavrfy(&dig->p, &dig->q, &dig->g, &dig->hm,
00120 &dig->y, &dig->r, &dig->s);
00121
00122 fprintf(stderr, "=============================== DSA FIPS-186-1: rc %d\n", rc);
00123
00124 mpbfree(&dig->p);
00125 mpbfree(&dig->q);
00126 mpnfree(&dig->g);
00127 mpnfree(&dig->y);
00128
00129 mpnfree(&dig->hm);
00130 mpnfree(&dig->r);
00131 mpnfree(&dig->s);
00132
00133 fprintf(stderr, "=============================== GPG Secret Key\n");
00134 if ((rc = doit(jbjSecretDSA, dig, printing)) != 0)
00135 fprintf(stderr, "==> FAILED: rc %d\n", rc);
00136
00137 fprintf(stderr, "=============================== GPG Public Key\n");
00138 if ((rc = doit(jbjPublicDSA, dig, printing)) != 0)
00139 fprintf(stderr, "==> FAILED: rc %d\n", rc);
00140
00141 fprintf(stderr, "=============================== GPG Signature of \"abc\"\n");
00142 if ((rc = doit(abcSignatureDSA, dig, printing)) != 0)
00143 fprintf(stderr, "==> FAILED: rc %d\n", rc);
00144
00145 { DIGEST_CTX ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
00146 struct pgpDigParams_s * dsig = &dig->signature;
00147 const char * digest = NULL;
00148 size_t digestlen = 0;
00149 const char * txt = "abc";
00150
00151 rpmDigestUpdate(ctx, txt, strlen(txt));
00152 rpmDigestUpdate(ctx, dsig->hash, dsig->hashlen);
00153 rpmDigestFinal(ctx, (void **)&digest, &digestlen, 1);
00154
00155 mpnzero(&dig->hm); mpnsethex(&dig->hm, digest);
00156
00157 fprintf(stderr, "\n hm = [ 160]: %s\n\n", digest);
00158
00159 if (digest) {
00160 free((void *)digest);
00161 digest = NULL;
00162 }
00163 }
00164
00165 rc = dsavrfy(&dig->p, &dig->q, &dig->g, &dig->hm,
00166 &dig->y, &dig->r, &dig->s);
00167
00168 fprintf(stderr, "=============================== DSA verify: rc %d\n", rc);
00169
00170 mpbfree(&dig->p);
00171 mpbfree(&dig->q);
00172 mpnfree(&dig->g);
00173 mpnfree(&dig->y);
00174
00175 mpnfree(&dig->hm);
00176 mpnfree(&dig->r);
00177 mpnfree(&dig->s);
00178
00179 dig = pgpFreeDig(dig);
00180
00181 return rc;
00182 }