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:   29-May-2010 19:36:11
  Branch: HEAD                             Handle: 2010052917361100

  Modified files:
    rpm/tests               trsa.c

  Log:
    - rsa: WIP.

  Summary:
    Revision    Changes     Path
    1.3         +167 -137   rpm/tests/trsa.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/tests/trsa.c
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 trsa.c
  --- rpm/tests/trsa.c  29 May 2010 15:14:36 -0000      1.2
  +++ rpm/tests/trsa.c  29 May 2010 17:36:11 -0000      1.3
  @@ -347,7 +347,7 @@
   void hexdump(const char * msg, unsigned char * b, size_t blen)
        /*...@*/
   {
  -    static const char hex[] = "0123456789abcdef";
  +    static const char hex[] = "0123456789ABCDEF";
   
       fprintf(stderr, "*** %s:", msg);
       if (b != NULL)
  @@ -363,7 +363,6 @@
   }
   /*...@=modfilesys@*/
   
  -#ifdef       NOTYET
   static int _rpmssl_spew;
   
   static int rpmsslLoadBN(BIGNUM ** bnp, const char * bnstr, int spew)
  @@ -386,48 +385,47 @@
   
       return rc;
   }
  -#endif
   
   #define SetKey \
     BIGNUM * cex = NULL; \
     int xx; \
  -  xx = BN_hex2bn(&key->n, n); \
  -  xx = BN_hex2bn(&key->e, e); \
  -  xx = BN_hex2bn(&key->d, d); \
  -  xx = BN_hex2bn(&key->p, p); \
  -  xx = BN_hex2bn(&key->q, q); \
  -  xx = BN_hex2bn(&key->dmp1, dmp1); \
  -  xx = BN_hex2bn(&key->dmq1, dmq1); \
  -  xx = BN_hex2bn(&key->iqmp, iqmp); \
  -  xx = BN_hex2bn(&cex, ctext_ex); \
  +  xx = rpmsslLoadBN(&key->n, n, _rpmssl_spew); \
  +  xx = rpmsslLoadBN(&key->e, e, _rpmssl_spew); \
  +  xx = rpmsslLoadBN(&key->d, d, _rpmssl_spew); \
  +  xx = rpmsslLoadBN(&key->p, p, _rpmssl_spew); \
  +  xx = rpmsslLoadBN(&key->q, q, _rpmssl_spew); \
  +  xx = rpmsslLoadBN(&key->dmp1, dmp1, _rpmssl_spew); \
  +  xx = rpmsslLoadBN(&key->dmq1, dmq1, _rpmssl_spew); \
  +  xx = rpmsslLoadBN(&key->iqmp, iqmp, _rpmssl_spew); \
  +  xx = rpmsslLoadBN(&cex, ctext_ex, _rpmssl_spew); \
     xx = BN_bn2bin(cex, c); \
     BN_free(cex); \
     return xx;
   
   static int key1(RSA *key, unsigned char *c)
   {
  -    static char n[] =
  +    static char n[] = "0x"
        "00AA36ABCE88ACFDFF55523C7FC4523F90EFA00DF3774A259F2E62B4C5D99CB5"
        "ADB300A0285E5301930E0C70FB6876939CE616CE624A11E0086D341EBCACA0A1"
        "F5";
  -    static char e[] = "11";
  +    static char e[] = "0x" "11";
       static char d[] =
        "0A033748626487695F5F30BC38B98B44C2CD2DFF434098CD20D8A138D090BF64"
        "797C3FA7A2CDCB3CD1E0BDBA2654B4F9DF8E8AE59D733D9F33B301624AFD1D51";
  -    static char p[] =
  +    static char p[] = "0x"
        "00D840B41666B42E92EA0DA3B43204B5CFCE3352524D0416A5A441E700AF4612"
        "0D";
  -    static char q[] =
  +    static char q[] = "0x"
        "00C97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05A0F2035028B9D"
        "89";
  -    static char dmp1[] =
  +    static char dmp1[] = "0x"
        "590B9572A2C2A9C406059DC2AB2F1DAFEB7E8B4F10A7549E8EEDF5B4FCE09E05";
  -    static char dmq1[] =
  +    static char dmq1[] = "0x"
        "008E3C0521FE15E0EA06A36FF0F10C9952C35B7A7514FD3238B80AAD5298628D"
        "51";
  -    static char iqmp[] =
  +    static char iqmp[] = "0x"
        "363FF7189DA8E90B1D341F71D09B76A8A943E11D10B24D249F2DEAFEF80C1826";
  -    static char ctext_ex[] =
  +    static char ctext_ex[] = "0x"
        "1b8f05f9ca1a79526e53f3cc514fdb892bfb9193231e78b992e68d50a480cb52"
        "33895c74958d5d02ab8c0fd040eb5844b005c39ed8274a9dbfa80671409439d2";
   
  @@ -436,24 +434,24 @@
   
   static int key2(RSA *key, unsigned char *c)
   {
  -    static char n[] =
  +    static char n[] = "0x"
        "00A3079A90DF0DFD72AC090CCC2A78B87413133E40759C98FAF8204F358A0B26"
        "3C6770E783A93B6971B73779D2717BE83477CF";
  -    static char e[] = "3";
  -    static char d[] =
  +    static char e[] = "0x" "3";
  +    static char d[] = "0x"
        "6CAFBC6094B3FE4C72B0B332C6FB25A2B76229804E6865FCA45A74DF0F8FB841"
        "3B52C0D0E53D9B590FF19BE79F49DD21E5EB";
  -    static char p[] =
  +    static char p[] = "0x"
        "00CF2035028B9D869840B41666B42E92EA0DA3B43204B5CFCE91";
  -    static char q[] =
  +    static char q[] = "0x"
        "00C97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05F";
  -    static char dmp1[] =
  +    static char dmp1[] = "0x"
        "008A1578AC5D13AF102B22B999CD7461F15E6D22CC0323DFDF0B";
  -    static char dmq1[] =
  +    static char dmq1[] = "0x"
        "008655214AC54D8D4ECD6177F1C73690CE2A482C8B0599CBE03F";
  -    static char iqmp[] =
  +    static char iqmp[] = "0x"
        "0083EFEFB8A9A40D1DB6ED98AD84ED1335DCC108F322D057CF8D";
  -    static char ctext_ex[] =
  +    static char ctext_ex[] = "0x"
        "14bddd28c98335192380e8e549b1582a8b40b4486d03a6a5311f1fd5f0a180e4"
        "17530329a9349074b1521354290824526251";
   
  @@ -462,38 +460,38 @@
   
   static int key3(RSA *key, unsigned char *c)
   {
  -    static char n[] =
  +    static char n[] = "0x"
        "00BBF82F090682CE9C2338AC2B9DA871F7368D07EED41043A440D6B6F07454F5"
        "1FB8DFBAAF035C02AB61EA48CEEB6FCD4876ED520D60E1EC4619719D8A5B8B80"
        "7FAFB8E0A3DFC737723EE6B4B7D93A2584EE6A649D060953748834B245459839"
        "4EE0AAB12D7B61A51F527A9A41F6C1687FE2537298CA2A8F5946F8E5FD091DBD"
        "CB";
  -    static char e[] = "11";
  -    static char d[] =
  +    static char e[] = "0x" "11";
  +    static char d[] = "0x"
        "00A5DAFC5341FAF289C4B988DB30C1CDF83F31251E0668B42784813801579641"
        "B29410B3C7998D6BC465745E5C392669D6870DA2C082A939E37FDCB82EC93EDA"
        "C97FF3AD5950ACCFBC111C76F1A9529444E56AAF68C56C092CD38DC3BEF5D20A"
        "939926ED4F74A13EDDFBE1A1CECC4894AF9428C2B7B8883FE4463A4BC85B1CB3"
        "C1";
  -    static char p[] =
  +    static char p[] = "0x"
        "00EECFAE81B1B9B3C908810B10A1B5600199EB9F44AEF4FDA493B81A9E3D84F6"
        "32124EF0236E5D1E3B7E28FAE7AA040A2D5B252176459D1F397541BA2A58FB65"
        "99";
  -    static char q[] =
  +    static char q[] = "0x"
        "00C97FB1F027F453F6341233EAAAD1D9353F6C42D08866B1D05A0F2035028B9D"
        "869840B41666B42E92EA0DA3B43204B5CFCE3352524D0416A5A441E700AF4615"
        "03";
  -    static char dmp1[] =
  +    static char dmp1[] = "0x"
        "54494CA63EBA0337E4E24023FCD69A5AEB07DDDC0183A4D0AC9B54B051F2B13E"
        "D9490975EAB77414FF59C1F7692E9A2E202B38FC910A474174ADC93C1F67C981";
  -    static char dmq1[] =
  +    static char dmq1[] = "0x"
        "471E0290FF0AF0750351B7F878864CA961ADBD3A8A7E991C5C0556A94C3146A7"
        "F9803F8F6F8AE342E931FD8AE47A220D1B99A495849807FE39F9245A9836DA3D";
  -    static char iqmp[] =
  +    static char iqmp[] = "0x"
        "00B06C4FDABB6301198D265BDBAE9423B380F271F73453885093077FCD39E211"
        "9FC98632154F5883B167A967BF402B4E9E2E0F9656E698EA3666EDFB25798039"
        "F7";
  -    static char ctext_ex[] =
  +    static char ctext_ex[] = "0x"
        "b8246b56a6ed5881aeb585d9a25b2ad790c417e080681bf1ac2bc3deb69d8bce"
        "f0c4366fec400af052a72e9b0effb5b3f2f192dbeaca03c12740057113bf1f06"
        "69ac22e9f3a7852e3c15d913cab0b8863a95c99294ce8674214954610346f4d4"
  @@ -502,6 +500,126 @@
       SetKey;
   }
   
  +static unsigned char ptext_ex[] = "\x54\x85\x9b\x34\x2c\x49\xea\x2a";
  +static size_t plen = sizeof(ptext_ex) - 1;
  +static unsigned char ptext[256];
  +static unsigned char ctext[256];
  +static unsigned char ctext_ex[256];
  +static size_t clen = 0;
  +
  +static void rpmsslLoadKEY(pgpDig dig, int v)
  +{
  +    rpmssl ssl = dig->impl;
  +
  +    ssl->rsa = RSA_new();
  +    switch (v%3) {
  +    case 0:
  +     clen = key1(ssl->rsa, ctext_ex);
  +     break;
  +    case 1:
  +     clen = key2(ssl->rsa, ctext_ex);
  +     break;
  +    case 2:
  +     clen = key3(ssl->rsa, ctext_ex);
  +     break;
  +    }
  +    if (v/3 >= 1) ssl->rsa->flags |= RSA_FLAG_NO_CONSTTIME;
  +}
  +
  +static int rpmsslTestPKCS(pgpDig dig)
  +{
  +    rpmssl ssl = dig->impl;
  +    const char * msg;
  +    int num;
  +    int rc = 0;              /* assume failure */
  +
  +ERR_clear_error();
  +    num = RSA_public_encrypt(plen, ptext_ex, ctext, ssl->rsa,
  +                              RSA_PKCS1_PADDING);
  +    msg = "encryption";
  +    if (num != (int)clen)
  +     goto exit;
  +  
  +    num = RSA_private_decrypt(num, ctext, ptext, ssl->rsa,
  +                               RSA_PKCS1_PADDING);
  +    msg = "decryption";
  +    if (num != (int)plen || memcmp(ptext, ptext_ex, num) != 0)
  +     goto exit;
  +    msg = "encryption/decryption";
  +    rc = 1;
  +
  +exit:
  +    fprintf(stderr, "PKCS #1 v1.5 %s %s\n", msg, (!rc ? "failed" : "ok"));
  +    return rc;               /* XXX 1 on success */
  +}
  +
  +static int pad_unknown(void)
  +{
  +    unsigned long l;
  +    while ((l = ERR_get_error()) != 0)
  +      if (ERR_GET_REASON(l) == RSA_R_UNKNOWN_PADDING_TYPE)
  +     return 1;
  +    return 0;
  +}
  +
  +static int rpmsslTestOAEP(pgpDig dig)
  +{
  +    rpmssl ssl = dig->impl;
  +    const char * msg;
  +    int num;
  +    size_t n;
  +    int rc = 0;              /* assume failure */
  +
  +ERR_clear_error();
  +
  +    num = RSA_public_encrypt(plen, ptext_ex, ctext, ssl->rsa,
  +                              RSA_PKCS1_OAEP_PADDING);
  +    msg = "unsupported";
  +    if (num == -1 && pad_unknown())
  +     goto exit;
  +    msg = "encryption";
  +    if (num != (int)clen)
  +     goto exit;
  +
  +    num = RSA_private_decrypt(num, ctext, ptext, ssl->rsa,
  +                               RSA_PKCS1_OAEP_PADDING);
  +    msg = "decryption (encrypted data)";
  +    if (num != (int)plen || memcmp(ptext, ptext_ex, num) != 0)
  +     goto exit;
  +    if (memcmp(ctext, ctext_ex, num) != 0) {
  +     /* Different ciphertexts (rsa_oaep.c w/o -DPKCS_TESTVECT). */
  +     num = RSA_private_decrypt(clen, ctext_ex, ptext, ssl->rsa,
  +                               RSA_PKCS1_OAEP_PADDING);
  +
  +     msg = "decryption (test vector data)";
  +     if (num != (int)plen || memcmp(ptext, ptext_ex, num) != 0)
  +         goto exit;
  +    }
  +
  +    /* Try decrypting corrupted ciphertexts */
  +    msg = "decryption (corrupt data)";
  +    for (n = 0 ; n < clen ; ++n) {
  +     unsigned char saved = ctext[n];
  +     int b;
  +     for (b = 0 ; b < 256 ; ++b) {
  +         if (b == saved)
  +             continue;
  +         ctext[n] = b;
  +         num = RSA_private_decrypt(num, ctext, ptext, ssl->rsa,
  +                                       RSA_PKCS1_OAEP_PADDING);
  +         if (num > 0)
  +             goto exit;
  +     }
  +    }
  +
  +    msg = "encryption/decryption";
  +    rc = 1;
  +
  +exit:
  +    fprintf(stderr, "OAEP %s %s\n", msg, (!rc ? "failed" : "ok"));
  +    return rc;               /* XXX 1 on success */
  +}
  +
   static
   int rpmsslSetRSA(/*...@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp)
        /*...@modifies dig @*/
  @@ -659,15 +777,6 @@
   
   /*==============================================================*/
   
  -static int pad_unknown(void)
  -{
  -    unsigned long l;
  -    while ((l = ERR_get_error()) != 0)
  -      if (ERR_GET_REASON(l) == RSA_R_UNKNOWN_PADDING_TYPE)
  -     return(1);
  -    return(0);
  -}
  -
   #ifdef       NOTYET
   static int pgpDigTestOne(pgpDig dig,
                const char * msg, const char *r_in, const char *s_in)
  @@ -723,7 +832,7 @@
   }
   #endif       /* NOTYET */
   
  -static int pgpDigTests(pgpDig dig)
  +static int pgpDigRSATests(pgpDig dig)
   {
       int ret = -1;    /* assume failure */
   
  @@ -781,102 +890,23 @@
   
   #else        /* DYING */
   
  -    rpmssl ssl = dig->impl;
  +#if defined(_RPMSSL_INTERNAL)
       int v;
  -    unsigned char ptext[256];
  -    unsigned char ctext[256];
  -    static unsigned char ptext_ex[] = "\x54\x85\x9b\x34\x2c\x49\xea\x2a";
  -    unsigned char ctext_ex[256];
  -    int plen = sizeof(ptext_ex) - 1;
  -    int clen = 0;
  -    int num;
  -    int n;
   
       for (v = 0; v < 6; v++) {
  -     ssl->rsa = RSA_new();
  -     switch (v%3) {
  -     case 0:
  -         clen = key1(ssl->rsa, ctext_ex);
  -         break;
  -     case 1:
  -         clen = key2(ssl->rsa, ctext_ex);
  -         break;
  -     case 2:
  -         clen = key3(ssl->rsa, ctext_ex);
  -         break;
  -     }
  -     if (v/3 >= 1) ssl->rsa->flags |= RSA_FLAG_NO_CONSTTIME;
   
  -     num = RSA_public_encrypt(plen, ptext_ex, ctext, ssl->rsa,
  -                              RSA_PKCS1_PADDING);
  -     if (num != clen) {
  -         printf("PKCS#1 v1.5 encryption failed!\n");
  -         ret = 0;
  -         goto oaep;
  -     }
  -  
  -     num = RSA_private_decrypt(num, ctext, ptext, ssl->rsa,
  -                               RSA_PKCS1_PADDING);
  -     if (num != plen || memcmp(ptext, ptext_ex, num) != 0) {
  -         printf("PKCS#1 v1.5 decryption failed!\n");
  -         ret = 0;
  -     } else
  -         printf("PKCS #1 v1.5 encryption/decryption ok\n");
  +     rpmsslLoadKEY(dig, v);
   
  -    oaep:
  -     ERR_clear_error();
  -     num = RSA_public_encrypt(plen, ptext_ex, ctext, ssl->rsa,
  -                              RSA_PKCS1_OAEP_PADDING);
  -     if (num == -1 && pad_unknown()) {
  -         printf("No OAEP support\n");
  -         goto next;
  -     }
  -     if (num != clen) {
  -         printf("OAEP encryption failed!\n");
  +     if (!rpmsslTestPKCS(dig))
            ret = 0;
  -         goto next;
  -     }
   
  -     num = RSA_private_decrypt(num, ctext, ptext, ssl->rsa,
  -                               RSA_PKCS1_OAEP_PADDING);
  -     if (num != plen || memcmp(ptext, ptext_ex, num) != 0) {
  -         printf("OAEP decryption (encrypted data) failed!\n");
  +     if (!rpmsslTestOAEP(dig))
            ret = 0;
  -     } else
  -     if (memcmp(ctext, ctext_ex, num) == 0)
  -         printf("OAEP test vector %d passed!\n", v);
  -    
  -     /* Different ciphertexts (rsa_oaep.c without -DPKCS_TESTVECT).
  -        Try decrypting ctext_ex */
  -
  -     num = RSA_private_decrypt(clen, ctext_ex, ptext, ssl->rsa,
  -                               RSA_PKCS1_OAEP_PADDING);
   
  -     if (num != plen || memcmp(ptext, ptext_ex, num) != 0) {
  -         printf("OAEP decryption (test vector data) failed!\n");
  -         ret = 0;
  -     } else
  -         printf("OAEP encryption/decryption ok\n");
  +     pgpImplClean(dig->impl);
   
  -     /* Try decrypting corrupted ciphertexts */
  -     for (n = 0 ; n < clen ; ++n) {
  -         int b;
  -         unsigned char saved = ctext[n];
  -         for(b = 0 ; b < 256 ; ++b) {
  -             if (b == saved)
  -                 continue;
  -             ctext[n] = b;
  -             num = RSA_private_decrypt(num, ctext, ptext, ssl->rsa,
  -                                       RSA_PKCS1_OAEP_PADDING);
  -             if (num > 0) {
  -                 printf("Corrupt data decrypted!\n");
  -                 ret = 0;
  -             }
  -         }
  -     }
  -    next:
  -     pgpImplClean(dig->impl);        /* XXX needed for memleaks */
       }
  +#endif       /* _RPMSSL_INTERNAL */
   
   #endif       /* DYING */
   
  @@ -1038,10 +1068,10 @@
       int ec = 1;      /* assume failure */
   int rc;
   
  -#if defined(_RPMSSL_INTERNAL) && !defined(OPENSSL_NO_ECDSA)
  +#if defined(_RPMSSL_INTERNAL)
   dig = _rpmsslInit();
       rc = 1;  /* assume success */
  -    if (pgpDigTests(dig) <= 0)
  +    if (pgpDigRSATests(dig) <= 0)
        rc = 0;
   dig = _rpmsslFini(dig);
       if (rc <= 0)
  @@ -1051,7 +1081,7 @@
   #if defined(_RPMGC_INTERNAL)
   dig = _rpmgcInit();
       rc = 1;  /* assume success */
  -    if (pgpDigTests(dig) <= 0)
  +    if (pgpDigRSATests(dig) <= 0)
        rc = 0;
   dig = _rpmgcFini(dig);
       if (rc <= 0)
  @@ -1061,7 +1091,7 @@
   #if defined(_RPMNSS_INTERNAL)
   dig = _rpmnssInit();
       rc = 1;  /* assume success */
  -    if (pgpDigTests(dig) <= 0)
  +    if (pgpDigRSATests(dig) <= 0)
        rc = 0;
   dig = _rpmnssFini(dig);
       if (rc <= 0)
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to