RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [email protected]
  Module: rpm                              Date:   30-May-2010 22:24:37
  Branch: HEAD                             Handle: 2010053020243700

  Modified files:
    rpm/tests               trsa.c

  Log:
    - rsa: WIP.

  Summary:
    Revision    Changes     Path
    1.11        +441 -244   rpm/tests/trsa.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/tests/trsa.c
  ============================================================================
  $ cvs diff -u -r1.10 -r1.11 trsa.c
  --- rpm/tests/trsa.c  30 May 2010 07:39:47 -0000      1.10
  +++ rpm/tests/trsa.c  30 May 2010 20:24:37 -0000      1.11
  @@ -142,7 +142,7 @@
       }
       return keyval;
   }
  -#endif
  +#endif       /* NOTYET */
   
   /*==============================================================*/
   
  @@ -291,12 +291,6 @@
                gcry_pk_verify (gc->sig, gc->hash, gc->pub_key) );
   /*...@=moduncon@*/
   
  -#ifdef       DYING
  -    gcry_sexp_release(gc-pub_keypkey);       gc->pub_key = NULL;
  -    gcry_sexp_release(gc->hash);     gc->hash = NULL;
  -    gcry_sexp_release(gc->sig);              gc->sig = NULL;
  -#endif
  -
   exit:
       rc = (gc->err == 0);
   
  @@ -330,7 +324,46 @@
   int rpmgcGenerateRSA(/*...@unused@*/pgpDig dig)
        /*...@*/
   {
  -    int rc = 0;              /* XXX always fail. */
  +    rpmgc gc = dig->impl;
  +    int rc;
  +
  +/* XXX FIXME: use gc->nbits */
  +    gc->err = rpmgcErr(gc, "gc->key_spec",
  +             gcry_sexp_new(&gc->key_spec,
  +                     in_fips_mode
  +                         ? "(genkey (rsa (nbits 4:1024)))"
  +                         : "(genkey (rsa (nbits 4:1024)(transient-key)))",
  +                     0, 1));
  +    if (gc->err)
  +     goto exit;
  +
  +    gc->err = rpmgcErr(gc, "gc->key_pair",
  +             gcry_pk_genkey(&gc->key_pair, gc->key_spec));
  +    if (gc->err)
  +     goto exit;
  +
  +    gc->pub_key = gcry_sexp_find_token(gc->key_pair, "public-key", 0);
  +    if (gc->pub_key == NULL)
  +     goto exit;
  +
  +    gc->sec_key = gcry_sexp_find_token(gc->key_pair, "private-key", 0);
  +    if (gc->sec_key == NULL)
  +     goto exit;
  +
  +exit:
  +
  +    rc = (gc->err == 0 && gc->pub_key && gc->sec_key);
  +
  +#ifdef       NOTYET
  +if (gc->key_spec) {
  +    gcry_sexp_release(gc->key_spec);
  +    gc->key_spec = NULL;
  +}
  +if (gc->key_pair) {
  +    gcry_sexp_release(gc->key_pair);
  +    gc->key_pair = NULL;
  +}
  +#endif
   
       return rc;
   }
  @@ -399,12 +432,6 @@
       gc->err = rpmgcErr(gc, "DSA verify",
                gcry_pk_verify (gc->sig, gc->hash, gc->pub_key) );
   
  -#ifdef       DYING
  -    gcry_sexp_release(gc->pub_key);  gc->pub_key = NULL;
  -    gcry_sexp_release(gc->hash);     gc->hash = NULL;
  -    gcry_sexp_release(gc->sig);              gc->sig = NULL;
  -#endif
  -
   /*...@=moduncon -noeffectuncon @*/
   
   exit:
  @@ -479,13 +506,6 @@
       gc->err = rpmgcErr(gc, "ECDSA verify",
                gcry_pk_verify (gc->sig, gc->hash, gc->pub_key));
   
  -    /* XXX unnecessary? */
  -#ifdef       DYING
  -    gcry_sexp_release(gc->pub_key);  gc->pub_key = NULL;
  -    gcry_sexp_release(gc->hash);     gc->hash = NULL;
  -    gcry_sexp_release(gc->sig);              gc->sig = NULL;
  -#endif
  -
       rc = (gc->err == 0);
   
   if (_pgp_debug < 0)
  @@ -550,58 +570,58 @@
   
       return rc;
   }
  +#endif       /* _RPMGC_INTERNAL */
   
   /*==============================================================*/
   
  -#define USE_AES 1
  -#define USE_ARCFOUR 1
  -#define USE_BLOWFISH 1
  -#define USE_CAMELLIA 1
  -/* #undef USE_CAPABILITIES */
  -#define USE_CAST5 1
  -#define USE_CRC 1
  -#define USE_DES 1
  -#define USE_DSA 1
  -#define USE_ECC 1
  -#define USE_ELGAMAL 1
  -/* #undef USE_GNU_PTH */
  -#define USE_MD4 1
  -#define USE_MD5 1
  -/* #undef USE_ONLY_8DOT3 */
  -/* #undef USE_RANDOM_DAEMON */
  -#define USE_RFC2268 1
  -#define USE_RMD160 1
  -/* #undef USE_RNDEGD */
  -#define USE_RNDLINUX 1
  -/* #undef USE_RNDUNIX */
  -/* #undef USE_RNDW32 */
  -/* #undef USE_RNDW32CE */
  -#define USE_RSA 1
  -#define USE_SEED 1
  -#define USE_SERPENT 1
  -#define USE_SHA1 1
  -#define USE_SHA256 1
  -#define USE_SHA512 1
  -#define USE_TIGER 1
  -#define USE_TWOFISH 1
  -#define USE_WHIRLPOOL 1
  -
  -typedef struct test_spec_pubkey_key {
  -    const char *secret;
  -    const char *public;
  -    const char *grip;
  -} test_spec_pubkey_key_t;
  -
  -typedef struct test_spec_pubkey {
  -    int id;
  -    int flags;
  -    test_spec_pubkey_key_t key;
  -} test_spec_pubkey_t;
  -
   #define FLAG_CRYPT (1 << 0)
   #define FLAG_SIGN  (1 << 1)
   #define FLAG_GRIP  (1 << 2)
   
  +typedef struct _KP_RSA_s {
  +    const char * n;
  +    const char * e;
  +    const char * d;
  +    const char * p;
  +    const char * q;
  +    const char * u;
  +} KP_RSA_t;
  +typedef struct _KP_DSA_s {
  +    const char * p;
  +    const char * q;
  +    const char * g;
  +    const char * y;
  +    const char * x;
  +} KP_DSA_t;
  +typedef struct _KP_ELG_s {
  +    const char * p;
  +    const char * g;
  +    const char * y;
  +    const char * x;
  +} KP_ELG_t;
  +typedef struct _KP_ECDSA_s {
  +    const char * curve;
  +    const char * p;
  +    const char * a;
  +    const char * b;
  +    const char * g;
  +    const char * n;
  +    const char * q;
  +} KP_ECDSA_t;
  +typedef union _KP_u {
  +    void * sentinel;
  +    KP_RSA_t RSA;
  +    KP_DSA_t DSA;
  +    KP_ELG_t ELG;
  +    KP_ECDSA_t ECDSA;
  +} KP_t;
  +typedef struct _AFKP_s {
  +    int algo;
  +    int flags;
  +    KP_t KP;
  +    const unsigned char grip[20];
  +} AFKP_t;
  +
   static int error_count;
   
   static void fail(const char *format, ...)
  @@ -642,6 +662,10 @@
       fflush(stdout);
   }
   
  +/*==============================================================*/
  +
  +#if defined(_RPMGC_INTERNAL)
  +
   static void check_cbc_mac_cipher(pgpDig dig)
   {
     struct tv {
  @@ -1554,6 +1578,39 @@
   
   }
   
  +#define USE_AES 1
  +#define USE_ARCFOUR 1
  +#define USE_BLOWFISH 1
  +#define USE_CAMELLIA 1
  +/* #undef USE_CAPABILITIES */
  +#define USE_CAST5 1
  +#define USE_CRC 1
  +#define USE_DES 1
  +#define USE_DSA 1
  +#define USE_ECC 1
  +#define USE_ELGAMAL 1
  +/* #undef USE_GNU_PTH */
  +#define USE_MD4 1
  +#define USE_MD5 1
  +/* #undef USE_ONLY_8DOT3 */
  +/* #undef USE_RANDOM_DAEMON */
  +#define USE_RFC2268 1
  +#define USE_RMD160 1
  +/* #undef USE_RNDEGD */
  +#define USE_RNDLINUX 1
  +/* #undef USE_RNDUNIX */
  +/* #undef USE_RNDW32 */
  +/* #undef USE_RNDW32CE */
  +#define USE_RSA 1
  +#define USE_SEED 1
  +#define USE_SERPENT 1
  +#define USE_SHA1 1
  +#define USE_SHA256 1
  +#define USE_SHA512 1
  +#define USE_TIGER 1
  +#define USE_TWOFISH 1
  +#define USE_WHIRLPOOL 1
  +
   static void check_ciphers(pgpDig dig)
   {
       static int algos[] = {
  @@ -1653,6 +1710,9 @@
   
       rpmlog(RPMLOG_INFO, "Completed Cipher Mode checks.\n");
   }
  +#endif       /* _RPMGC_INTERNAL */
  +
  +/*==============================================================*/
   
   static void
   pgpDigTestDigest(pgpDig dig, int algo, int flags,
  @@ -1971,12 +2031,15 @@
       rpmlog(RPMLOG_INFO, "Starting hash checks.\n");
   
       for (i = 0; algos[i].md; i++) {
  +
  +#if defined(_RPMGC_INTERNAL)
        if ((gcry_md_test_algo(algos[i].md) || algos[i].md == PGPHASHALGO_MD5)
         && in_fips_mode) {
            rpmlog(RPMLOG_INFO, "  algorithm %d not available in fips mode\n",
                        algos[i].md);
            continue;
        }
  +#endif       /* _RPMGC_INTERNAL */
   
        pgpDigTestDigest(dig, algos[i].md, 0,
                algos[i].data, strlen(algos[i].data), algos[i].expect);
  @@ -2350,12 +2413,15 @@
       rpmlog(RPMLOG_INFO, "Starting hashed MAC checks.\n");
   
       for (i = 0; algos[i].md; i++) {
  +
  +#if defined(_RPMGC_INTERNAL)
        if ((gcry_md_test_algo(algos[i].md) || algos[i].md == PGPHASHALGO_MD5)
         && in_fips_mode) {
            rpmlog(RPMLOG_INFO, "  algorithm %d not available in fips mode\n",
                        algos[i].md);
            continue;
        }
  +#endif       /* _RPMGC_INTERNAL */
   
        pgpDigTestHMAC(dig, algos[i].md, 0,
                        algos[i].data, strlen(algos[i].data),
  @@ -2366,6 +2432,146 @@
       rpmlog(RPMLOG_INFO, "Completed hashed MAC checks.\n");
   }
   
  +/*==============================================================*/
  +
  +#if defined(_RPMGC_INTERNAL)
  +
  +static const char * rpmgcSecSexpr(int algo, KP_t * kp)
  +{
  +    char * t = NULL;
  +
  +    switch (algo) {
  +    default:
  +     break;
  +    case PGPPUBKEYALGO_RSA:
  +     t = rpmExpand(
  +             "(private-key\n",
  +             " (rsa\n",
  +             "  (n #", kp->RSA.n, "#)\n",
  +             "  (e #", kp->RSA.e, "#)\n",
  +             "  (d #", kp->RSA.d, "#)\n",
  +             "  (p #", kp->RSA.p, "#)\n",
  +             "  (q #", kp->RSA.q, "#)\n",
  +             "  (u #", kp->RSA.u, "#)))\n",
  +             NULL);
  +     break;
  +    case PGPPUBKEYALGO_DSA:
  +     t = rpmExpand(
  +             "(private-key\n",
  +             " (DSA\n",
  +             "  (p #", kp->DSA.p, "#)\n",
  +             "  (q #", kp->DSA.q, "#)\n",
  +             "  (g #", kp->DSA.g, "#)\n",
  +             "  (y #", kp->DSA.y, "#)\n",
  +             "  (x #", kp->DSA.x, "#)))\n",
  +             NULL);
  +     break;
  +    case PGPPUBKEYALGO_ELGAMAL:
  +     t = rpmExpand(
  +             "(private-key\n",
  +             " (ELG\n",
  +             "  (p #", kp->ELG.p, "#)\n",
  +             "  (g #", kp->ELG.g, "#)\n",
  +             "  (y #", kp->ELG.y, "#)\n",
  +             "  (x #", kp->ELG.x, "#)))\n",
  +             NULL);
  +     break;
  +    case PGPPUBKEYALGO_ECDSA:
  +     if (kp->ECDSA.curve == NULL) {
  +/* XXX FIXME */
  +         t = rpmExpand(
  +             "(public-key\n",
  +             " (ECDSA\n",
  +             "  (p #", kp->ECDSA.p, "#)\n",
  +             "  (a #", kp->ECDSA.a, "#)\n",
  +             "  (b #", kp->ECDSA.b, "#)\n",
  +             "  (g #", kp->ECDSA.g, "#)\n",
  +             "  (n #", kp->ECDSA.n, "#)\n",
  +             "  (q #", kp->ECDSA.q, "#)))\n",
  +             NULL);
  +     } else {
  +/* XXX FIXME */
  +         t = rpmExpand(
  +             "(public-key\n",
  +             " (ECDSA\n",
  +             "  (curve ", kp->ECDSA.curve, ")\n",
  +#ifdef       NOTYET  /* XXX optional overrides? */
  +             "  (b #", kp->ECDSA.b, "#)\n",
  +             "  (g #", kp->ECDSA.g, "#)\n",
  +             "  (n #", kp->ECDSA.n, "#)\n",
  +#endif
  +             "  (q #", kp->ECDSA.q, "#)))\n",
  +             NULL);
  +     }
  +     break;
  +    }
  +    return t;
  +}
  +
  +static const char * rpmgcPubSexpr(int algo, KP_t * kp)
  +{
  +    char * t = NULL;
  +
  +    switch (algo) {
  +    default:
  +     break;
  +    case PGPPUBKEYALGO_RSA:
  +     t = rpmExpand(
  +             "(public-key\n",
  +             " (rsa\n",
  +             "  (n #", kp->RSA.n, "#)\n",
  +             "  (e #", kp->RSA.e, "#)))\n",
  +             NULL);
  +     break;
  +    case PGPPUBKEYALGO_DSA:
  +     t = rpmExpand(
  +             "(public-key\n",
  +             " (DSA\n",
  +             "  (p #", kp->DSA.p, "#)\n",
  +             "  (q #", kp->DSA.q, "#)\n",
  +             "  (g #", kp->DSA.g, "#)\n",
  +             "  (y #", kp->DSA.y, "#)))\n",
  +             NULL);
  +     break;
  +    case PGPPUBKEYALGO_ELGAMAL:
  +     t = rpmExpand(
  +             "(public-key\n",
  +             " (ELG\n",
  +             "  (p #", kp->ELG.p, "#)\n",
  +             "  (g #", kp->ELG.g, "#)\n",
  +             "  (y #", kp->ELG.y, "#)))\n",
  +             NULL);
  +     break;
  +    case PGPPUBKEYALGO_ECDSA:
  +     if (kp->ECDSA.curve == NULL) {
  +         t = rpmExpand(
  +             "(public-key\n",
  +             " (ECDSA\n",
  +             "  (p #", kp->ECDSA.p, "#)\n",
  +             "  (a #", kp->ECDSA.a, "#)\n",
  +             "  (b #", kp->ECDSA.b, "#)\n",
  +             "  (g #", kp->ECDSA.g, "#)\n",
  +             "  (n #", kp->ECDSA.n, "#)\n",
  +             "  (q #", kp->ECDSA.q, "#)))\n",
  +             NULL);
  +     } else {
  +         t = rpmExpand(
  +             "(public-key\n",
  +             " (ECDSA\n",
  +             "  (curve ", kp->ECDSA.curve, ")\n",
  +#ifdef       NOTYET  /* XXX optional overrides? */
  +             "  (b #", kp->ECDSA.b, "#)\n",
  +             "  (g #", kp->ECDSA.g, "#)\n",
  +             "  (n #", kp->ECDSA.n, "#)\n",
  +#endif
  +             "  (q #", kp->ECDSA.q, "#)))\n",
  +             NULL);
  +     }
  +     break;
  +    }
  +    return t;
  +}
  +
   /* Check that the signature SIG matches the hash HASH. PKEY is the
      public key used for the verification. BADHASH is a hasvalue which
      should; result in a bad signature status. */
  @@ -2503,77 +2709,52 @@
        check_pubkey_grip(dig, n, grip);
   }
   
  -static void check_one_pubkey(pgpDig dig, int n, test_spec_pubkey_t spec)
  +static void check_one_pubkey(pgpDig dig, int n, AFKP_t * afkp)
   {
  -rpmgc gc = dig->impl;
  +    rpmgc gc = dig->impl;
  +
  +    /* Load the private key. */
  +    {        const char * sec = rpmgcSecSexpr(afkp->algo, &afkp->KP);
  +     gc->err = rpmgcErr(gc, "gc->sec_key",
  +                     gcry_sexp_sscan(&gc->sec_key, NULL, sec, strlen(sec)));
  +     sec = _free(sec);
  +    }
   
  -    gc->err = rpmgcErr(gc, "gc->sec_key",
  -             gcry_sexp_sscan(&gc->sec_key, NULL, spec.key.secret,
  -                       strlen(spec.key.secret)));
  -    if (!gc->err)
  +    /* Load the public key. */
  +    if (!gc->err) {
  +     const char * pub = rpmgcPubSexpr(afkp->algo, &afkp->KP);
        gc->err = rpmgcErr(gc, "gc->pub_key",
  -                     gcry_sexp_sscan(&gc->pub_key, NULL, spec.key.public,
  -                           strlen(spec.key.public)));
  +                     gcry_sexp_sscan(&gc->pub_key, NULL, pub, strlen(pub)));
  +     pub = _free(pub);
  +    }
  +
  +    /* Run tests on the key pair.. */
       if (gc->err)
        die("converting sample key failed: %s\n", gpg_strerror(gc->err));
  +    else
  +     do_check_one_pubkey(dig, n, afkp->grip, afkp->flags);
   
  -    do_check_one_pubkey(dig, n,
  -                     (const unsigned char *) spec.key.grip, spec.flags);
  +pgpDigClean(dig);
   
  -    gcry_sexp_release(gc->sec_key);
  -    gc->sec_key = NULL;
  -    gcry_sexp_release(gc->pub_key);
  -    gc->pub_key = NULL;
   }
   
   static void get_keys_new(pgpDig dig)
   {
       rpmgc gc = dig->impl;
  +int xx;
   
       rpmlog(RPMLOG_INFO, "  generating RSA key:");
   
  -/* XXX FIXME: use gc->nbits */
  -    gc->err = rpmgcErr(gc, "gc->key_spec",
  -             gcry_sexp_new(&gc->key_spec,
  -                     in_fips_mode
  -                         ? "(genkey (rsa (nbits 4:1024)))"
  -                         : "(genkey (rsa (nbits 4:1024)(transient-key)))",
  -                     0, 1));
  -
  -    if (gc->err)
  -     die("error creating S-expression: %s\n", gpg_strerror(gc->err));
  -
  -    gc->err = rpmgcErr(gc, "gc->key_pair",
  -             gcry_pk_genkey(&gc->key_pair, gc->key_spec));
  -
  -if (gc->key_spec) {
  -    gcry_sexp_release(gc->key_spec);
  -    gc->key_spec = NULL;
  -}
  -
  -    if (gc->err)
  -     die("error generating RSA key: %s\n", gpg_strerror(gc->err));
  -
  -if (gc->pub_key) {
  -    gcry_sexp_release(gc->pub_key);
  -    gc->pub_key = NULL;
  -}
  -    gc->pub_key = gcry_sexp_find_token(gc->key_pair, "public-key", 0);
  -    if (gc->pub_key == NULL)
  -     die("public part missing in key\n");
  -
  -if (gc->sec_key) {
  -    gcry_sexp_release(gc->sec_key);
  -    gc->sec_key = NULL;
  -}
  -    gc->sec_key = gcry_sexp_find_token(gc->key_pair, "private-key", 0);
  -    if (gc->sec_key == NULL)
  -     die("private part missing in key\n");
  +    xx = rpmgcGenerateRSA(dig);
   
  -if (gc->key_pair) {
  -    gcry_sexp_release(gc->key_pair);
  -    gc->key_pair = NULL;
  -}
  +    if (!xx) {
  +     if (gc->err)
  +         die("error generating RSA key: %s\n", gpg_strerror(gc->err));
  +     else if (gc->pub_key == NULL)
  +         die("public part missing in key\n");
  +     else if (gc->sec_key == NULL)
  +         die("private part missing in key\n");
  +    }
   
   }
   
  @@ -2581,150 +2762,157 @@
   {
       get_keys_new(dig);
       do_check_one_pubkey(dig, n, NULL, FLAG_SIGN | FLAG_CRYPT);
  +pgpDigClean(dig);
   }
  +#endif       /* _RPMGC_INTERNAL */
  +
  +static AFKP_t AFKP[] = {
  + {.algo = PGPPUBKEYALGO_RSA,
  +  .flags = FLAG_CRYPT | FLAG_SIGN,
  +  .grip =    "\x32\x10\x0c\x27\x17\x3e\xf6\xe9\xc4\xe9"
  +             "\xa2\x5d\x3d\x69\xf8\x6d\x37\xa4\xf9\x39",
  +  .KP = {
  +  .RSA = {
  +   .n =      
"00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
  +     "      2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
  +     "      ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
  +     "      
891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251",
  +   .e =      "010001",
  +   .d =      
"046129F2489D71579BE0A75FE029BD6CDB574EBF57EA8A5B0FDA942CAB943B11"
  +     "      7D7BB95E5D28875E0F9FC5FCC06A72F6D502464DABDED78EF6B716177B83D5BD"
  +     "      C543DC5D3FED932E59F5897E92E6F58A0F33424106A3B6FA2CBF877510E4AC21"
  +     "      
C3EE47851E97D12996222AC3566D4CCB0B83D164074ABF7DE655FC2446DA1781",
  +   .p =      
"00e861b700e17e8afe6837e7512e35b6ca11d0ae47d8b85161c67baf64377213"
  +     "      
fe52d772f2035b3ca830af41d8a4120e1c1c70d12cc22f00d28d31dd48a8d424f1",
  +   .q =      
"00f7a7ca5367c661f8e62df34f0d05c10c88e5492348dd7bddc942c9a8f369f9"
  +     "      
35a07785d2db805215ed786e4285df1658eed3ce84f469b81b50d358407b4ad361",
  +   .u =      
"304559a9ead56d2309d203811a641bb1a09626bc8eb36fffa23c968ec5bd891e"
  +     "      ebbafc73ae666e01ba7c8990bae06cc2bbe10b75e69fcacb353a6473079d8e9b"
  +   } /* .RSA */
  +  }  /* .KP */
  + },
  + {.algo = PGPPUBKEYALGO_DSA,
  +  .flags = FLAG_SIGN,
  +  .grip =    "\xc6\x39\x83\x1a\x43\xe5\x05\x5d\xc6\xd8"
  +             "\x4a\xa6\xf9\xeb\x23\xbf\xa9\x12\x2d\x5b",
  +  .KP = {
  +  .DSA = {
  +   .p =      
"00AD7C0025BA1A15F775F3F2D673718391D00456978D347B33D7B49E7F32EDAB"
  +     "      96273899DD8B2BB46CD6ECA263FAF04A28903503D59062A8865D2AE8ADFB5191"
  +     "      CF36FFB562D0E2F5809801A1F675DAE59698A9E01EFE8D7DCFCA084F4C6F5A44"
  +     "      
44D499A06FFAEA5E8EF5E01F2FD20A7B7EF3F6968AFBA1FB8D91F1559D52D8777B",
  +   .q =      "00EB7B5751D25EBBB7BD59D920315FD840E19AEBF9",
  +   .g =      
"1574363387FDFD1DDF38F4FBE135BB20C7EE4772FB94C337AF86EA8E49666503"
  +     "      AE04B6BE81A2F8DD095311E0217ACA698A11E6C5D33CCDAE71498ED35D13991E"
  +     "      B02F09AB40BD8F4C5ED8C75DA779D0AE104BC34C960B002377068AB4B5A1F984"
  +     "      
3FBA91F537F1B7CAC4D8DD6D89B0D863AF7025D549F9C765D2FC07EE208F8D15",
  +   .y =      
"64B11EF8871BE4AB572AA810D5D3CA11A6CDBC637A8014602C72960DB135BF46"
  +     "      A1816A724C34F87330FC9E187C5D66897A04535CC2AC9164A7150ABFA8179827"
  +     "      6E45831AB811EEE848EBB24D9F5F2883B6E5DDC4C659DEF944DCFD80BF4D0A20"
  +     "      
42CAA7DC289F0C5A9D155F02D3D551DB741A81695B74D4C8F477F9C7838EB0FB",
  +   .x =      "11D54E4ADBD3034160F2CED4B7CD292A4EBF3EC0"
  +   } /* .DSA */
  +  }  /* .KP */
  + },
  + {.algo = PGPPUBKEYALGO_ELGAMAL,
  +  .flags = FLAG_SIGN | FLAG_CRYPT,
  +  .grip =    "\xa7\x99\x61\xeb\x88\x83\xd2\xf4\x05\xc8"
  +             "\x4f\xba\x06\xf8\x78\x09\xbc\x1e\x20\xe5",
  +  .KP = {
  +  .ELG = {
  +   .p =      
"00B93B93386375F06C2D38560F3B9C6D6D7B7506B20C1773F73F8DE56E6CD65D"
  +     "      F48DFAAA1E93F57A2789B168362A0F787320499F0B2461D3A4268757A7B27517"
  +     "      B7D203654A0CD484DEC6AF60C85FEB84AAC382EAF2047061FE5DAB81A20A0797"
  +     "      
6E87359889BAE3B3600ED718BE61D4FC993CC8098A703DD0DC942E965E8F18D2A7",
  +   .g =      "05",
  +   .y =      
"72DAB3E83C9F7DD9A931FDECDC6522C0D36A6F0A0FEC955C5AC3C09175BBFF2B"
  +     "      E588DB593DC2E420201BEB3AC17536918417C497AC0F8657855380C1FCF11C5B"
  +     "      D20DB4BEE9BDF916648DE6D6E419FA446C513AAB81C30CB7B34D6007637BE675"
  +     "      
56CE6473E9F9EE9B9FADD275D001563336F2186F424DEC6199A0F758F6A00FF4",
  +   .x =      
"03C28900087B38DABF4A0AB98ACEA39BB674D6557096C01D72E31C16BDD32214"
  +   } /* .ELG */
  +  }  /* .KP */
  + },
  + {.algo = PGPPUBKEYALGO_ECDSA,
  +  .flags = FLAG_SIGN,
  +  .grip =    "\xE6\xDF\x94\x2D\xBD\x8C\x77\x05\xA3\xDD"
  +             "\x41\x6E\xFC\x04\x01\xDB\x31\x0E\x99\xB6",
  +  .KP = {
  +  .ECDSA = {
  +   .p =      
"00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
  +   .a =      
"00FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
  +   .b =      
"5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
  +   .g =      
"046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2"
  +     "964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
  +   .n =      
"00FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
  +   .q =      
"04C8A4CEC2E9A9BC8E173531A67B0840DF345C32E261ADD780E6D83D56EFADFD"
  +     "5DE872F8B854819B59543CE0B7F822330464FBC4E6324DADDCD9D059554F63B344"
  +   } /* .ECDSA */
  +  }  /* .KP */
  + },
  + { .algo = 0, .flags = 0, .KP = { .sentinel = NULL } }
  +};
   
   /* Run all tests for the public key functions. */
   static void check_pubkey(pgpDig dig)
   {
  -    test_spec_pubkey_t pubkeys[] = {
  -     {
  -      PGPPUBKEYALGO_RSA, FLAG_CRYPT | FLAG_SIGN,
  +    AFKP_t * afkp;
  +    size_t i;
   
  -      {"(private-key\n"
  -       " (rsa\n"
  -       "  (n 
#00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
  -       "      
2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
  -       "      
ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
  -       "      
891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251#)\n"
  -       "  (e #010001#)\n"
  -       "  (d 
#046129F2489D71579BE0A75FE029BD6CDB574EBF57EA8A5B0FDA942CAB943B11"
  -       "      
7D7BB95E5D28875E0F9FC5FCC06A72F6D502464DABDED78EF6B716177B83D5BD"
  -       "      
C543DC5D3FED932E59F5897E92E6F58A0F33424106A3B6FA2CBF877510E4AC21"
  -       "      
C3EE47851E97D12996222AC3566D4CCB0B83D164074ABF7DE655FC2446DA1781#)\n"
  -       "  (p 
#00e861b700e17e8afe6837e7512e35b6ca11d0ae47d8b85161c67baf64377213"
  -       "      
fe52d772f2035b3ca830af41d8a4120e1c1c70d12cc22f00d28d31dd48a8d424f1#)\n"
  -       "  (q 
#00f7a7ca5367c661f8e62df34f0d05c10c88e5492348dd7bddc942c9a8f369f9"
  -       "      
35a07785d2db805215ed786e4285df1658eed3ce84f469b81b50d358407b4ad361#)\n"
  -       "  (u 
#304559a9ead56d2309d203811a641bb1a09626bc8eb36fffa23c968ec5bd891e"
  -       "      
ebbafc73ae666e01ba7c8990bae06cc2bbe10b75e69fcacb353a6473079d8e9b#)))\n",
  -
  -       "(public-key\n"
  -       " (rsa\n"
  -       "  (n 
#00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
  -       "      
2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
  -       "      
ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
  -       "      
891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251#)\n"
  -       "  (e #010001#)))\n",
  -
  -       "\x32\x10\x0c\x27\x17\x3e\xf6\xe9\xc4\xe9"
  -       "\xa2\x5d\x3d\x69\xf8\x6d\x37\xa4\xf9\x39"}
  -      },
  -     {
  -      PGPPUBKEYALGO_DSA, FLAG_SIGN,
  +    rpmlog(RPMLOG_INFO, "Starting public key checks.\n");
   
  -      {"(private-key\n"
  -       " (DSA\n"
  -       "  (p 
#00AD7C0025BA1A15F775F3F2D673718391D00456978D347B33D7B49E7F32EDAB"
  -       "      
96273899DD8B2BB46CD6ECA263FAF04A28903503D59062A8865D2AE8ADFB5191"
  -       "      
CF36FFB562D0E2F5809801A1F675DAE59698A9E01EFE8D7DCFCA084F4C6F5A44"
  -       "      
44D499A06FFAEA5E8EF5E01F2FD20A7B7EF3F6968AFBA1FB8D91F1559D52D8777B#)\n"
  -       "  (q #00EB7B5751D25EBBB7BD59D920315FD840E19AEBF9#)\n"
  -       "  (g 
#1574363387FDFD1DDF38F4FBE135BB20C7EE4772FB94C337AF86EA8E49666503"
  -       "      
AE04B6BE81A2F8DD095311E0217ACA698A11E6C5D33CCDAE71498ED35D13991E"
  -       "      
B02F09AB40BD8F4C5ED8C75DA779D0AE104BC34C960B002377068AB4B5A1F984"
  -       "      
3FBA91F537F1B7CAC4D8DD6D89B0D863AF7025D549F9C765D2FC07EE208F8D15#)\n"
  -       "  (y 
#64B11EF8871BE4AB572AA810D5D3CA11A6CDBC637A8014602C72960DB135BF46"
  -       "      
A1816A724C34F87330FC9E187C5D66897A04535CC2AC9164A7150ABFA8179827"
  -       "      
6E45831AB811EEE848EBB24D9F5F2883B6E5DDC4C659DEF944DCFD80BF4D0A20"
  -       "      
42CAA7DC289F0C5A9D155F02D3D551DB741A81695B74D4C8F477F9C7838EB0FB#)\n"
  -       "  (x #11D54E4ADBD3034160F2CED4B7CD292A4EBF3EC0#)))\n",
  -
  -       "(public-key\n"
  -       " (DSA\n"
  -       "  (p 
#00AD7C0025BA1A15F775F3F2D673718391D00456978D347B33D7B49E7F32EDAB"
  -       "      
96273899DD8B2BB46CD6ECA263FAF04A28903503D59062A8865D2AE8ADFB5191"
  -       "      
CF36FFB562D0E2F5809801A1F675DAE59698A9E01EFE8D7DCFCA084F4C6F5A44"
  -       "      
44D499A06FFAEA5E8EF5E01F2FD20A7B7EF3F6968AFBA1FB8D91F1559D52D8777B#)\n"
  -       "  (q #00EB7B5751D25EBBB7BD59D920315FD840E19AEBF9#)\n"
  -       "  (g 
#1574363387FDFD1DDF38F4FBE135BB20C7EE4772FB94C337AF86EA8E49666503"
  -       "      
AE04B6BE81A2F8DD095311E0217ACA698A11E6C5D33CCDAE71498ED35D13991E"
  -       "      
B02F09AB40BD8F4C5ED8C75DA779D0AE104BC34C960B002377068AB4B5A1F984"
  -       "      
3FBA91F537F1B7CAC4D8DD6D89B0D863AF7025D549F9C765D2FC07EE208F8D15#)\n"
  -       "  (y 
#64B11EF8871BE4AB572AA810D5D3CA11A6CDBC637A8014602C72960DB135BF46"
  -       "      
A1816A724C34F87330FC9E187C5D66897A04535CC2AC9164A7150ABFA8179827"
  -       "      
6E45831AB811EEE848EBB24D9F5F2883B6E5DDC4C659DEF944DCFD80BF4D0A20"
  -       "      
42CAA7DC289F0C5A9D155F02D3D551DB741A81695B74D4C8F477F9C7838EB0FB#)))\n",
  -
  -       "\xc6\x39\x83\x1a\x43\xe5\x05\x5d\xc6\xd8"
  -       "\x4a\xa6\xf9\xeb\x23\xbf\xa9\x12\x2d\x5b"}
  -      },
  -     {
  -      PGPPUBKEYALGO_ELGAMAL, FLAG_SIGN | FLAG_CRYPT,
  +    for (i = 0, afkp = AFKP; afkp->KP.sentinel; i++, afkp++) {
   
  -      {"(private-key\n"
  -       " (ELG\n"
  -       "  (p 
#00B93B93386375F06C2D38560F3B9C6D6D7B7506B20C1773F73F8DE56E6CD65D"
  -       "      
F48DFAAA1E93F57A2789B168362A0F787320499F0B2461D3A4268757A7B27517"
  -       "      
B7D203654A0CD484DEC6AF60C85FEB84AAC382EAF2047061FE5DAB81A20A0797"
  -       "      
6E87359889BAE3B3600ED718BE61D4FC993CC8098A703DD0DC942E965E8F18D2A7#)\n"
  -       "  (g #05#)\n"
  -       "  (y 
#72DAB3E83C9F7DD9A931FDECDC6522C0D36A6F0A0FEC955C5AC3C09175BBFF2B"
  -       "      
E588DB593DC2E420201BEB3AC17536918417C497AC0F8657855380C1FCF11C5B"
  -       "      
D20DB4BEE9BDF916648DE6D6E419FA446C513AAB81C30CB7B34D6007637BE675"
  -       "      
56CE6473E9F9EE9B9FADD275D001563336F2186F424DEC6199A0F758F6A00FF4#)\n"
  -       "  (x 
#03C28900087B38DABF4A0AB98ACEA39BB674D6557096C01D72E31C16BDD32214#)))\n",
  -
  -       "(public-key\n"
  -       " (ELG\n"
  -       "  (p 
#00B93B93386375F06C2D38560F3B9C6D6D7B7506B20C1773F73F8DE56E6CD65D"
  -       "      
F48DFAAA1E93F57A2789B168362A0F787320499F0B2461D3A4268757A7B27517"
  -       "      
B7D203654A0CD484DEC6AF60C85FEB84AAC382EAF2047061FE5DAB81A20A0797"
  -       "      
6E87359889BAE3B3600ED718BE61D4FC993CC8098A703DD0DC942E965E8F18D2A7#)\n"
  -       "  (g #05#)\n"
  -       "  (y 
#72DAB3E83C9F7DD9A931FDECDC6522C0D36A6F0A0FEC955C5AC3C09175BBFF2B"
  -       "      
E588DB593DC2E420201BEB3AC17536918417C497AC0F8657855380C1FCF11C5B"
  -       "      
D20DB4BEE9BDF916648DE6D6E419FA446C513AAB81C30CB7B34D6007637BE675"
  -       "      
56CE6473E9F9EE9B9FADD275D001563336F2186F424DEC6199A0F758F6A00FF4#)))\n",
  -
  -       "\xa7\x99\x61\xeb\x88\x83\xd2\xf4\x05\xc8"
  -       "\x4f\xba\x06\xf8\x78\x09\xbc\x1e\x20\xe5"}
  -      },
  -    };
  -    size_t i;
  +     if (afkp->algo <= 0)
  +         continue;
   
  -    rpmlog(RPMLOG_INFO, "Starting public key checks.\n");
  +/* XXX FIXME: no sec_key parameters. */
  +     if (afkp->algo == PGPPUBKEYALGO_ECDSA)
  +         continue;
   
  -    for (i = 0; i < sizeof(pubkeys) / sizeof(*pubkeys); i++)
  -     if (pubkeys[i].id) {
  -         if (gcry_pk_test_algo(pubkeys[i].id) && in_fips_mode) {
  -             rpmlog(RPMLOG_INFO, "  algorithm %d not available in fips 
mode\n",
  -                         pubkeys[i].id);
  -             continue;
  -         }
  -         check_one_pubkey(dig, i, pubkeys[i]);
  +#if defined(_RPMGC_INTERNAL)
  +     if (gcry_pk_test_algo(afkp->algo) && in_fips_mode) {
  +         rpmlog(RPMLOG_INFO, "  algorithm %d not available in fips mode\n",
  +                         afkp->algo);
  +         continue;
        }
   
  +     check_one_pubkey(dig, i, afkp);
  +#endif       /* _RPMGC_INTERNAL */
  +
  +    }
  +
       rpmlog(RPMLOG_INFO, "Completed public key checks.\n");
   
       rpmlog(RPMLOG_INFO, "Starting additional public key checks.\n");
   
  -    for (i = 0; i < sizeof(pubkeys) / sizeof(*pubkeys); i++)
  -     if (pubkeys[i].id) {
  -         if (gcry_pk_test_algo(pubkeys[i].id) && in_fips_mode) {
  -             rpmlog(RPMLOG_INFO, "  algorithm %d not available in fips 
mode\n",
  -                         pubkeys[i].id);
  -             continue;
  -         }
  -         check_one_pubkey_new(dig, i);
  +    for (i = 0, afkp = AFKP; afkp->KP.sentinel; i++, afkp++) {
  +
  +     if (afkp->algo <= 0)
  +         continue;
  +
  +/* XXX FIXME: no sec_key parameters. */
  +     if (afkp->algo == PGPPUBKEYALGO_ECDSA)
  +         continue;
  +
  +#if defined(_RPMGC_INTERNAL)
  +     if (gcry_pk_test_algo(afkp->algo) && in_fips_mode) {
  +         rpmlog(RPMLOG_INFO, "  algorithm %d not available in fips mode\n",
  +                         afkp->algo);
  +         continue;
        }
   
  +     check_one_pubkey_new(dig, i);
  +#endif       /* _RPMGC_INTERNAL */
  +
  +    }
  +
       rpmlog(RPMLOG_INFO, "Completed additional public key checks.\n");
   
   }
   
   static int rpmgcBasicTests(pgpDig dig)
   {
  -    gpg_error_t err;
   
       if (selftest_only) {
        rpmIncreaseVerbosity();
  @@ -2734,6 +2922,7 @@
   fprintf(stderr, "%s: use_fips %d in_fips_mode %d selftest_only %d\n",
   __FUNCTION__, use_fips, in_fips_mode, selftest_only);
   
  +#if defined(_RPMGC_INTERNAL)
       if (rpmIsVerbose())
        gcry_control(GCRYCTL_SET_VERBOSITY, 3);
   
  @@ -2759,17 +2948,23 @@
   
       /* No valuable keys are created, so we can speed up our RNG. */
       gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0);
  +#endif       /* _RPMGC_INTERNAL */
   
       if (!selftest_only) {
  +#if defined(_RPMGC_INTERNAL)
        check_ciphers(dig);
        check_cipher_modes(dig);
  +#endif       /* _RPMGC_INTERNAL */
        pgpDigTestDigests(dig);
        pgpDigTestHMACS(dig);
        check_pubkey(dig);
       }
   
  +    /* If we are in fips mode do some more tests. */
  +#if defined(_RPMGC_INTERNAL)
       if (in_fips_mode && !selftest_only) {
  -     /* If we are in fips mode do some more tests. */
  +     gpg_error_t err;
  +
        gcry_md_hd_t md;
   
        /* First trigger a self-test.  */
  @@ -2813,15 +3008,17 @@
        if (gcry_control(GCRYCTL_SELFTEST, 0))
            fail("running self-test failed\n");
       }
  +#endif       /* _RPMGC_INTERNAL */
   
       rpmlog(RPMLOG_INFO, "\nAll tests completed. Errors: %i\n", error_count);
   
  +#if defined(_RPMGC_INTERNAL)
       if (in_fips_mode && !gcry_fips_mode_active())
        fprintf(stderr, "FIPS mode is not anymore active\n");
  +#endif       /* _RPMGC_INTERNAL */
   
  -    return error_count ? 0 : 1;
  +    return error_count ? 1 : 0;              /* XXX 0 on success */
   }
  -#endif       /* _RPMGC_INTERNAL */
   
   /*==============================================================*/
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to