rpmio/tkey.c

Go to the documentation of this file.
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 /* FIPS-186 test vectors. */
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 /* Secret key */
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 /* Public key */
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 /* Signature */
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 }

Generated on Mon Mar 5 13:30:29 2007 for rpm by  doxygen 1.5.1