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:   04-Aug-2009 21:54:35
  Branch: HEAD                             Handle: 2009080419543500

  Modified files:
    rpm/js                  rpmmpw-js.c
    rpm/js/tscripts         Mpw.js

  Log:
    - js: fix: scale arguments to "invm" correctly.
    - js: add RSAES-OAEP and RSASSA-PSS test vectors.
    - js: eliminate memleaks in the mpw RPN calculator.

  Summary:
    Revision    Changes     Path
    1.12        +97 -35     rpm/js/rpmmpw-js.c
    1.15        +212 -17    rpm/js/tscripts/Mpw.js
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/js/rpmmpw-js.c
  ============================================================================
  $ cvs diff -u -r1.11 -r1.12 rpmmpw-js.c
  --- rpm/js/rpmmpw-js.c        3 Aug 2009 19:04:43 -0000       1.11
  +++ rpm/js/rpmmpw-js.c        4 Aug 2009 19:54:35 -0000       1.12
  @@ -37,6 +37,8 @@
   #define rpmmpw_iteratorobject        NULL
   #define rpmmpw_wrappedobject NULL
   
  +#define      OBJ_IS_MPW(cx,obj)      (OBJ_GET_CLASS(cx, obj) == &rpmmpwClass)
  +
   /* --- helpers */
   typedef struct mpwObject_s {
       int ob_size;
  @@ -1110,6 +1112,7 @@
   {
       mpwObject * z = NULL;
   
  +assert(x);
       if (x == NULL)
        goto exit;
   
  @@ -1124,26 +1127,27 @@
       default:
        goto exit;
        /*...@notreached@*/ break;
  -    case 'N':
  +    case '_':
        z->ob_size = -z->ob_size;
        break;
  -    case 'A':
  +    case '!':
        if (z->ob_size < 0)
            z->ob_size = -z->ob_size;
        break;
  -    case '~':        /* Implement ~z as -(z+1) */
  +    case '~':  /* Implement ~z as -(z+1) */
       {        mpw val = 1;
        int carry = mpaddx(MPW_SIZE(z), MPW_DATA(z), 1, &val);
  -     carry = carry;  /* XXX gcc warning */
  +     carry = carry;  /* XXX gcc warning */
        if (x->ob_size > 0)
            z->ob_size = -z->ob_size;
  -    }        break;
  +    }  break;
       }
   
   if (_debug < 0)
   fprintf(stderr, "<== %s(%c) %p[%d]\t", __FUNCTION__, op, MPW_DATA(z), 
MPW_SIZE(z)), mpfprintln(stderr, MPW_SIZE(z), MPW_DATA(z));
   
   exit:
  +assert(z);
       return z;
   }
   
  @@ -1171,6 +1175,8 @@
       int zsign = 0;
   
       mpbzero(&b);
  +assert(x);
  +assert(m);
       if (x == NULL || m == NULL)
        goto exit;
   
  @@ -1430,14 +1436,16 @@
            z->ob_size = -z->ob_size;
       }        break;
       case 'G':
  +     /* XXX this scaling is not correct. */
        wksp = alloca((xsize) * sizeof(*wksp));
        z = mpw_New(msize);
        mpgcd_w(xsize, xdata, mdata, MPW_DATA(z), wksp);
        break;
       case 'I':
  -     wksp = alloca((6*msize+6)*sizeof(*wksp));
  -     z = mpw_New(msize);
  -     (void) mpextgcd_w(msize, mdata, xdata, MPW_DATA(z), wksp);
  +     wksp = alloca(((1+1+6)*msize+6)*sizeof(*wksp));
  +     mpsetx(msize, wksp+msize, xsize, xdata);
  +     (void) mpextgcd_w(msize, mdata, wksp+msize, wksp, wksp+2*msize);
  +     z = mpw_FromMPW(msize, wksp, 0);
        break;
   #ifdef       DYING
       case 'R':
  @@ -1450,6 +1458,7 @@
       }        break;
   #endif
       case 'S':
  +     /* XXX is scaling correct if xsize > msize? */
        wksp = alloca((4*msize+2)*sizeof(*wksp));
        mpbset(&b, msize, mdata);
        z = mpw_New(msize);
  @@ -1462,6 +1471,7 @@
   
   exit:
       mpbfree(&b);
  +assert(z);
       return z;
   }
   
  @@ -1483,6 +1493,9 @@
       mpw* wksp;
   
       mpbzero(&b);
  +assert(x);
  +assert(y);
  +assert(m);
       if (x == NULL || y == NULL || m == NULL)
        goto exit;
   
  @@ -1503,6 +1516,18 @@
   
       zsize = b.size;
       zdata = alloca(zsize * sizeof(*zdata));
  +
  +#ifdef       NOTYET  /* XXX no known scaling problems (yet) */
  +    wksp = alloca(zsize * sizeof(*zdata));
  +    mpsetx(zsize, wksp, xsize, xdata);
  +    xsize = zsize;
  +    xdata = wksp;
  +    wksp = alloca(zsize * sizeof(*zdata));
  +    mpsetx(zsize, wksp, ysize, ydata);
  +    ysize = zsize;
  +    ydata = wksp;
  +#endif
  +
       wksp = alloca((4*zsize+2)*sizeof(*wksp));
   
       switch (op) {
  @@ -1532,6 +1557,7 @@
   
   exit:
       mpbfree(&b);
  +assert(z);
       return z;
   }
   
  @@ -1560,13 +1586,19 @@
       mpwObject * z = NULL;
       if (JSVAL_IS_INT(v))
        z = mpw_FromLong(JSVAL_TO_INT(v));
  -    if (JSVAL_IS_DOUBLE(v))
  +    else if (JSVAL_IS_DOUBLE(v))
        z = mpw_FromDouble(*JSVAL_TO_DOUBLE(v));
  -    if (JSVAL_IS_STRING(v))
  +    else if (JSVAL_IS_STRING(v))
        z = mpw_FromHEX(JS_GetStringBytes(JSVAL_TO_STRING(v)));
  -    if (JSVAL_IS_OBJECT(v))
  -     z = JS_GetInstancePrivate(cx, JSVAL_TO_OBJECT(v), &rpmmpwClass, NULL);
  +    else if (JSVAL_IS_OBJECT(v)) {
  +     JSObject *o = JSVAL_TO_OBJECT(v);
  +     if (OBJ_IS_MPW(cx, o))
  +         z = JS_GetInstancePrivate(cx, o, &rpmmpwClass, NULL);
  +    }
  +if (z == NULL) {
  +fprintf(stderr, "*** %s: 0x%x[%s]\n", __FUNCTION__, (unsigned)v, v2s(cx, v));
   assert(z != NULL);
  +}
       return z;
   }
   
  @@ -1843,6 +1875,7 @@
       JSBool ok = JS_TRUE;
       jsval v = JSVAL_NULL;
       void ** stack = memset(alloca(argc*sizeof(*stack)), 0, 
(argc*sizeof(*stack)));
  +    char * freeme = memset(alloca(argc*sizeof(*freeme)), 0, 
(argc*sizeof(*freeme)));
       int ix = -1;
       uintN i;
       
  @@ -1871,9 +1904,9 @@
                if (!strcmp(s, "**")) c = (int)'P';
                if (!strcmp(s, "<<")) c = (int)'<';
                if (!strcmp(s, ">>")) c = (int)'>';
  -             if (!strcmp(s, "abs")) c = (int)'A';
  +             if (!strcmp(s, "abs")) c = (int)'!';
                if (!strcmp(s, "not")) c = (int)'~';
  -             if (!strcmp(s, "negate")) c = (int)'N';
  +             if (!strcmp(s, "neg")) c = (int)'_';
                if (!strcmp(s, "gcd")) c = (int)'G';    /* gcd(x, y). */
                if (!strcmp(s, "invm")) c = (int)'I';   /* inverse of x (modulo 
m). */
                if (!strcmp(s, "sqrm")) c = (int)'S';   /* x*x (modulo m). */
  @@ -1882,49 +1915,74 @@
   #endif
   
                switch (c) {
  -             case 'A':
  -             case 'N':
  -             case '~':
  -                 stack[ix] = mpw_ops1(c, stack[ix]);
  +             case '!':       /* abs(x) */
  +             case '_':       /* -x */
  +             case '~':       /* ~x */
  +assert(ix >= 0);
  +                 z = stack[ix];
  +                 stack[ix] = mpw_ops1(c, z);
  +                 if (freeme[ix]) z = _free(z);
  +                 freeme[ix] = 1;
                    break;
  -             case '%':
  -             case '/':
  +             case '%':       /* x % y */
  +             case '/':       /* x / y */
                    /* XXX divide-by-zero check. */
  -             case '+':
  -             case '-':
  -             case '*':
  +assert(ix > 0);
  +                 z = stack[ix];
  +assert(mpz(MPW_SIZE(z), MPW_DATA(z)) == 0);
  +                 /*...@fallthrough@*/
  +             case '+':       /* x + y */
  +             case '-':       /* x - y */
  +             case '*':       /* x * y */
                case 'P':       /* x ** y */
  -             case 'G':       /* gcd(x, y). */
  -             case 'I':       /* inverse of x (modulo m). */
  -             case 'S':       /* x*x (modulo m). */
  +             case 'G':       /* gcd(x, y) */
  +             case 'I':       /* inverse of x (modulo m) */
  +             case 'S':       /* x * x (modulo m) */
                case '<':       /* x << y */
                case '>':       /* x >> y */
  -             case '&':
  -             case '^':
  -             case '|':
  +             case '&':       /* x & y */
  +             case '^':       /* x ^ y */
  +             case '|':       /* x | y */
   assert(--ix >= 0);
  -                 stack[ix] = mpw_ops2(c, stack[ix], stack[ix+1]);
  +                 z = stack[ix];
  +                 stack[ix] = mpw_ops2(c, z, stack[ix+1]);
  +                 if (freeme[ix+1]) stack[ix+1] = _free(stack[ix+1]); 
freeme[ix+1] = 0;
  +                 if (freeme[ix]) z = _free(z);
  +                 freeme[ix] = 1;
                    break;
                default:
                case 0:
  -                 if (!strcmp(s, "addm")) c = (int)'+';       /* x+x (modulo 
m). */
  -                 if (!strcmp(s, "subm")) c = (int)'-';       /* x-x (modulo 
m). */
  -                 if (!strcmp(s, "mulm")) c = (int)'*';       /* x*x (modulo 
m). */
  -                 if (!strcmp(s, "powm")) c = (int)'P';       /* x**x (modulo 
m). */
  +                 if (!strcmp(s, "addm")) c = (int)'+';       /* x+x (modulo 
m) */
  +                 if (!strcmp(s, "subm")) c = (int)'-';       /* x-x (modulo 
m) */
  +                 if (!strcmp(s, "mulm")) c = (int)'*';       /* x*x (modulo 
m) */
  +                 if (!strcmp(s, "powm")) c = (int)'P';       /* x**x (modulo 
m) */
                    if (c) {
   assert(--ix >= 0);
   assert(--ix >= 0);
  -                     stack[ix] = mpw_ops3(c, stack[ix], stack[ix+1], 
stack[ix+2]);
  +                     z = stack[ix];
  +                     stack[ix] = mpw_ops3(c, z, stack[ix+1], stack[ix+2]);
  +                     if (freeme[ix+2]) stack[ix+2] = _free(stack[ix+2]); 
freeme[ix+2] = 0;
  +                     if (freeme[ix+1]) stack[ix+1] = _free(stack[ix+1]); 
freeme[ix+1] = 0;
  +                     if (freeme[ix]) z = _free(z);
  +                     freeme[ix] = 1;
                    } else {
   assert(++ix < (int)argc);
                        stack[ix] = mpw_j2mpw(cx, v);
  +                     freeme[ix] = 1;
                    }
                    
                    break;
                }
            } else {
  +             if (JSVAL_IS_OBJECT(v)) {
  +                 o = JSVAL_TO_OBJECT(v);
  +                 if (!OBJ_IS_MPW(cx, o))
  +                     o = NULL;
  +             } else
  +                 o = NULL;
   assert(++ix < (int)argc);
                stack[ix] = mpw_j2mpw(cx, v);
  +             freeme[ix] = (o == NULL ? 1 : 0);
            }
        }
        if (ix < 0) {
  @@ -1940,6 +1998,10 @@
            ok = mpw_wrap(cx, rval, z);
            o = JSVAL_TO_OBJECT(*rval);
        }
  +     while (ix >= 0) {
  +         if (freeme[ix]) stack[ix] = _free(stack[ix]); freeme[ix] = 0;
  +         ix--;
  +     }
        break;
       }
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/js/tscripts/Mpw.js
  ============================================================================
  $ cvs diff -u -r1.14 -r1.15 Mpw.js
  --- rpm/js/tscripts/Mpw.js    3 Aug 2009 19:04:43 -0000       1.14
  +++ rpm/js/tscripts/Mpw.js    4 Aug 2009 19:54:35 -0000       1.15
  @@ -15,7 +15,7 @@
   
   var wb = mpw(0x10);
   ack('wb.toString(16)', '0x10');
  -var wc = mpw('0fedcba000000000');
  +var wc = mpw('fedcba000000000');
   ack('wc.toString(16)', '0xfedcba000000000');
   
   var za = 0x0000000007654321;
  @@ -36,6 +36,10 @@
   ack('mpw(wa, wb, "^").toString(10)', (za ^ zb).toString(10));
   ack('mpw(wa, wb, "|").toString(10)', (za | zb).toString(10));
   
  +// XXX FIXME divide-by-zero exception handling
  +// var foo = mpw(1, 0, "/");
  +// var foo = mpw(1, 0, "%");
  +
   var m = mpw(15);
   ack('m.toString(10)', '15');
   ack('m.isPrime()', false);
  @@ -56,18 +60,17 @@
   ack('mpw(x, y, m, "powm").toString(10)', '7');
    
   var zx = 2*3*5*19;
  +// FIXME wrong answers here
  +// zx *= zx;
  +// zx *= zx;
  +// XXX FIXME segfault here
  +// zx *= zx;
   var zy = 7*11*13*19;
   ack('mpw(zx, zy, "gcd").toString(10)', '19');
   
  -x = mpw(zx, "neg");
  -zx = -zx;
  -ack('x.toString(10)', zx.toString(10));
  -x = mpw(zx, "abs");
  -zx = Math.abs(zx);
  -ack('x.toString(10)', zx.toString(10));
  -x = mpw(zx, "~");
  -zx = ~zx;
  -ack('x.toString(10)', zx.toString(10));
  +ack('mpw(zx, "neg").toString(10)', (-zx).toString(10));
  +ack('mpw(zx, "abs").toString(10)', Math.abs(zx).toString(10));
  +ack('mpw(zx, "~").toString(10)', (~zx).toString(10));
   
   // ===== Carry/borrow tests
   var a = 0x7fffffff;
  @@ -182,14 +185,67 @@
   function RSA(p, q, e) {
     this.p = mpw(p);
     ack('mpw(p).isPrime()', true);
  +  this.pm1 = mpw(this.p, 1, "-");
     this.q = mpw(q);
     ack('mpw(q).isPrime()', true);
  +  this.qm1 = mpw(this.q, 1, "-");
     this.e = mpw(e);
  -  this.n = mpw(p, q, "*");
  -  this.phi = mpw(p, 1, "-", q, 1, "-", "*");
  -  ack('mpw(this.e, this.phi, "gcd").toString(10)', '1');
  +
  +  this.n = mpw(this.p, this.q, "*");
  +  this.phi = mpw(this.pm1, this.qm1, "*");
  +//ack('mpw(this.e, this.phi, "gcd").toString(10)', '1');
     this.d = mpw(this.e, this.phi, "invm");
  -  ack('mpw(this.e, this.d, this.phi, "mulm").toString(10)', '1');
  +// ack('mpw(this.e, this.d, "*", this.phi, "%").toString(10)', '1');
  +
  +  this.sign =
  +    function (hm) {
  +     this.hm = mpw(hm);
  +     this.s = mpw(this.hm, this.d, this.n, "powm");
  +     return this.s;
  +    };
  +  this.verify =
  +    function (hm, s) {
  +     return (mpw(s, this.e, this.n, "powm").toString(10) == hm.toString(10)
  +             ? true : false);
  +    }
  +  return true;
  +}
  +
  +function RSAv21(p, q, d, e, dP, dQ, qInv) {
  +  this.p = mpw(p);
  +  ack('mpw(p).isPrime()', true);
  +  this.pm1 = mpw(this.p, 1, "-");
  +  this.q = mpw(q);
  +  ack('mpw(q).isPrime()', true);
  +  this.qm1 = mpw(this.q, 1, "-");
  +  this.d = mpw(d);
  +  this.e = mpw(e);
  +  this.dP = mpw(dP);
  +  this.dQ = mpw(dQ);
  +
  +  this.n = mpw(this.p, this.q, "*");
  +  this.lambda = mpw(this.pm1, this.qm1, "*");
  +//  ack('mpw(this.n, this.lambda, "gcd").toString(10)', '1');
  +//  ack('mpw(this.e, this.lambda, "gcd").toString(10)', '1');
  +
  +//  this.d = mpw(this.e, this.lambda, "invm");
  +//  ack('mpw(this.e, this.lambda, "invm").toString(16)', 
this.d.toString(16));
  +
  +//  ack('mpw(this.e, this.d, "*", this.lambda, "%").toString(10)', '1');
  +//  ack('mpw(this.e, this.dP, this.pm1, "mulm").toString(10)', '1');
  +//  ack('mpw(this.e, this.dQ, this.qm1, "mulm").toString(10)', '1');
  +
  +//  this.dP = mpw(this.e, this.pm1, "invm");
  +//  ack('mpw(this.e, this.pm1, "invm").toString(16)', this.dP.toString(16));
  +//  ack('mpw(this.e, this.dP, "*", this.pm1, "%").toString(10)', '1');
  +//  this.dQ = mpw(this.e, this.qm1, "invm");
  +//  ack('mpw(this.e, this.qm1, "invm").toString(16)', this.dQ.toString(16));
  +//  ack('mpw(this.e, this.dQ, "*", this.qm1, "%").toString(10)', '1');
  +
  +    this.qInv = mpw(this.q, this.p, "invm");
  +    ack('this.qInv.toString(16)', qInv.toString(16));
  +    ack('mpw(this.q, this.qInv, this.p, "mulm").toString(10)', '1');
  +  
     this.sign =
       function (hm) {
        this.hm = mpw(hm);
  @@ -205,7 +261,6 @@
   }
   
   // ===== RSA example (from "Handbook of Applied Cryptography" 11.20 p434).
  -print("===== RSA");
   var p   = 7927;
   var q   = 6997;
   var n   = 55465219;
  @@ -217,6 +272,7 @@
   var hm  = 31229978;
   var s   = 30729435;
   
  +print("===== RSA");
   var rsa = new RSA(p, q, e);
   
   ack('rsa.verify(hm, rsa.sign(hm))', true);
  @@ -232,6 +288,141 @@
   
   delete rsa;
   
  +// ===== RSAES-OAEP example from
  +//   ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip
  +var n   = mpw(
  +     'a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8ae4811a1e0ab'+
  +     'c4c7e0b082d693a5e7fced675cf4668512772c0cbc64a742c6c630f533c8cc72'+
  +     'f62ae833c40bf25842e984bb78bdbf97c0107d55bdb662f5c4e0fab9845cb514'+
  +     '8ef7392dd3aaff93ae1e6b667bb3d4247616d4f5ba10d4cfd226de88d39f16fb');
  +var e   = 0x10001;
  +var d   = mpw(
  +     '53339cfdb79fc8466a655c7316aca85c55fd8f6dd898fdaf119517ef4f52e8fd'+
  +     '8e258df93fee180fa0e4ab29693cd83b152a553d4ac4d1812b8b9fa5af0e7f55'+
  +     'fe7304df41570926f3311f15c4d65a732c483116ee3d3d2d0af3549ad9bf7cbf'+
  +     'b78ad884f84d5beb04724dc7369b31def37d0cf539e9cfcdd3de653729ead5d1');
  +var p   = mpw(
  +     'd32737e7267ffe1341b2d5c0d150a81b586fb3132bed2f8d5262864a9cb9f30a'+
  +     'f38be448598d413a172efb802c21acf1c11c520c2f26a471dcad212eac7ca39d');
  +var q   = mpw(
  +     'cc8853d1d54da630fac004f471f281c7b8982d8224a490edbeb33d3e3d5cc93c'+
  +     '4765703d1dd791642f1f116a0dd852be2419b2af72bfe9a030e860b0288b5d77');
  +var dP   = mpw(
  +     '0e12bf1718e9cef5599ba1c3882fe8046a90874eefce8f2ccc20e4f2741fb0a3'+
  +     '3a3848aec9c9305fbecbd2d76819967d4671acc6431e4037968db37878e695c1');
  +var dQ   = mpw(
  +     '95297b0f95a2fa67d00707d609dfd4fc05c89dafc2ef6d6ea55bec771ea33373'+
  +     '4d9251e79082ecda866efef13c459e1a631386b7e354c899f5f112ca85d71583');
  +var qInv = mpw(
  +     '4f456c502493bdc0ed2ab756a3a6ed4d67352a697d4216e93212b127a63d5411'+
  +     'ce6fa98d5dbefd73263e3728142743818166ed7dd63687dd2a8ca1d2f4fbd8e1');
  +
  +var hm  = 31229978;
  +var s   = mpw(
  +     '354fe67b4a126d5d35fe36c777791a3f7ba13def484e2d3908aff722fad468fb'+
  +     '21696de95d0be911c2d3174f8afcc201035f7b6d8e69402de5451618c21a535f'+
  +     'a9d7bfc5b8dd9fc243f8cf927db31322d6e881eaa91a996170e657a05a266426'+
  +     'd98c88003f8477c1227094a0d9fa1e8c4024309ce1ecccb5210035d47ac72e8a');
  +
  +// print("===== RSAES-OAEP");
  +var rsa = new RSA(p, q, e);
  +ack('rsa.n.toString(16)', n.toString(16));
  +ack('rsa.e.toString(10)', e.toString(10));
  +ack('rsa.d.toString(16)', d.toString(16));
  +ack('rsa.p.toString(16)', p.toString(16));
  +ack('rsa.q.toString(16)', q.toString(16));
  +delete rsa;
  +
  +print("===== RSAES-OAEP 2.1");
  +var rsa = new RSAv21(p, q, d, e, dP, dQ, qInv);
  +
  +ack('rsa.n.toString(16)', n.toString(16));
  +ack('rsa.e.toString(10)', e.toString(10));
  +ack('rsa.d.toString(16)', d.toString(16));
  +ack('rsa.p.toString(16)', p.toString(16));
  +ack('rsa.q.toString(16)', q.toString(16));
  +
  +ack('rsa.dP.toString(16)', dP.toString(16));
  +ack('rsa.dQ.toString(16)', dQ.toString(16));
  +ack('rsa.qInv.toString(16)', qInv.toString(16));
  +
  +// ack('rsa.verify(hm, rsa.sign(hm))', true);
  +
  +// ack('rsa.phi.toString(10)', phi.toString(10));
  +// ack('rsa.hm.toString(10)', hm.toString(10));
  +// ack('rsa.s.toString(10)', s.toString(10));
  +
  +delete rsa;
  +
  +// ===== RSASSA-PSS example from
  +//   ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip
  +var n    = mpw(
  +     'a56e4a0e701017589a5187dc7ea841d156f2ec0e36ad52a44dfeb1e61f7ad991'+
  +     'd8c51056ffedb162b4c0f283a12a88a394dff526ab7291cbb307ceabfce0b1df'+
  +     'd5cd9508096d5b2b8b6df5d671ef6377c0921cb23c270a70e2598e6ff89d19f1'+
  +     '05acc2d3f0cb35f29280e1386b6f64c4ef22e1e1f20d0ce8cffb2249bd9a2137');
  +var e   = 0x10001;
  +var d    = mpw(
  +     '33a5042a90b27d4f5451ca9bbbd0b44771a101af884340aef9885f2a4bbe92e8'+
  +     '94a724ac3c568c8f97853ad07c0266c8c6a3ca0929f1e8f11231884429fc4d9a'+
  +     'e55fee896a10ce707c3ed7e734e44727a39574501a532683109c2abacaba283c'+
  +     '31b4bd2f53c3ee37e352cee34f9e503bd80c0622ad79c6dcee883547c6a3b325');
  +var p    = mpw(
  +     'e7e8942720a877517273a356053ea2a1bc0c94aa72d55c6e86296b2dfc967948'+
  +     'c0a72cbccca7eacb35706e09a1df55a1535bd9b3cc34160b3b6dcd3eda8e6443');
  +var q    = mpw(
  +     'b69dca1cf7d4d7ec81e75b90fcca874abcde123fd2700180aa90479b6e48de8d'+
  +     '67ed24f9f19d85ba275874f542cd20dc723e6963364a1f9425452b269a6799fd');
  +var dP   = mpw(
  +     '28fa13938655be1f8a159cbaca5a72ea190c30089e19cd274a556f36c4f6e19f'+
  +     '554b34c077790427bbdd8dd3ede2448328f385d81b30e8e43b2fffa027861979');
  +
  +var dQ   = mpw(
  +     '1a8b38f398fa712049898d7fb79ee0a77668791299cdfa09efc0e507acb21ed7'+
  +     '4301ef5bfd48be455eaeb6e1678255827580a8e4e8e14151d1510a82a3f2e729');
  +
  +var qInv = mpw(
  +     '27156aba4126d24a81f3a528cbfb27f56886f840a9f6e86e17a44b94fe931958'+
  +     '4b8e22fdde1e5a2e3bd8aa5ba8d8584194eb2190acf832b847f13a3d24a79f4d');
  +
  +
  +var hm  = 31229978;
  +var s   = mpw(
  +     '9074308fb598e9701b2294388e52f971faac2b60a5145af185df5287b5ed2887'+
  +     'e57ce7fd44dc8634e407c8e0e4360bc226f3ec227f9d9e54638e8d31f5051215'+
  +     'df6ebb9c2f9579aa77598a38f914b5b9c1bd83c4e2f9f382a0d0aa3542ffee65'+
  +     '984a601bc69eb28deb27dca12c82c2d4c3f66cd500f1ff2b994d8a4e30cbb33c');
  +
  +print("===== RSASSA-PSS");
  +var rsa = new RSA(p, q, e);
  +ack('rsa.n.toString(16)', n.toString(16));
  +ack('rsa.e.toString(10)', e.toString(10));
  +// FIXME wrong answer
  +// ack('rsa.d.toString(16)', d.toString(16));
  +ack('rsa.p.toString(16)', p.toString(16));
  +ack('rsa.q.toString(16)', q.toString(16));
  +delete rsa;
  +
  +print("===== RSASSA-PSS 2.1");
  +var rsa = new RSAv21(p, q, d, e, dP, dQ, qInv);
  +
  +ack('rsa.n.toString(16)', n.toString(16));
  +ack('rsa.e.toString(10)', e.toString(10));
  +ack('rsa.d.toString(16)', d.toString(16));
  +ack('rsa.p.toString(16)', p.toString(16));
  +ack('rsa.q.toString(16)', q.toString(16));
  +ack('rsa.dP.toString(16)', dP.toString(16));
  +ack('rsa.dQ.toString(16)', dQ.toString(16));
  +ack('rsa.qInv.toString(16)', qInv.toString(16));
  +
  +// ack('rsa.verify(hm, rsa.sign(hm))', true);
  +
  +// ack('rsa.phi.toString(16)', phi.toString(16));
  +// ack('rsa.hm.toString(16)', hm.toString(16));
  +// ack('rsa.s.toString(16)', s.toString(16));
  +
  +delete rsa;
  +
   // =======================================================
   function ElGamal(p, alpha, a, k) {
     this.p = mpw(p);
  @@ -584,6 +775,7 @@
   
   var c    = mpw('5b056c7e11dd68f40469ee7f3c7a7d74f7d121116506d031218291fb');
   var b    = mpw('b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4');
  +// FIXME mulm?
   ack('mpw(mpw(b, b, "*", p, "%"), c, "*", p, "%").toString(10)', mpw(p, 27, 
"-").toString(10));
   var gx   = mpw('b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21');
   var gy   = mpw('bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34');
  @@ -648,12 +840,15 @@
   ack('mpw(k, n, "invm").toString(16)', kinv.toString(16));
   var r    = 
mpw('2b42f576d07f4165ff65d1f3b1500f81e44c316f1f0b3ef57325b69aca46104f');
   var s    = 
mpw('dc42c2122d6392cd3e3a993a89502a8198c1886fe69d262c4b329bdb6b63faf1');
  +// FIXME mulm?
   ack('mpw(mpw(mpw(r, d, "*", n, "%"), e, "+", n, "%"), kinv, "*", n, 
"%").toString(16)', s.toString(16));
   
   var w    = mpw(s, n, "invm");
   var u1   = 
mpw('b807bf3281dd13849958f444fd9aea808d074c2c48ee8382f6c47a435389a17e');
  +// FIXME mulm?
   ack('mpw(e, w, "*", n, "%").toString(16)', u1.toString(16));
   var u2   = 
mpw('1777f73443a4d68c23d1fc4cb5f8b7f2554578ee87f04c253df44efd181c184c');
  +// FIXME mulm?
   ack('mpw(r, w, "*", n, "%").toString(16)', u2.toString(16));
   var v    = 
mpw('2b42f576d07f4165ff65d1f3b1500f81e44c316f1f0b3ef57325b69aca46104f');
   
  @@ -671,6 +866,7 @@
   
   var c    = 
mpw('79d1e655f868f02fff48dcdee14151ddb80643c1406d0ca10dfe6fc52009540a495e8042ea5f744f6e184667cc722483');
   var b    = 
mpw('b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef');
  +// FIXME mulm?
   ack('mpw(mpw(b, b, "*", p, "%"), c, "*", p, "%").toString(10)', mpw(p, 27, 
"-").toString(10));
   var gx   = 
mpw('aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7');
   var gy   = 
mpw('3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f');
  @@ -727,8 +923,7 @@
   var msg  = "Example of ECDSA with P-512";
   var e    = 
mpw('9bf0e1deeda31e00f925b77f7cb6b1ced7368de1dc75bb9f94582c1ca709205d32af90025b02fa132fbebd6cddcd9172c0d66d8e581767a8b6f71de60be1f932');
   var kinv = 
mpw('01eab94335a7ed337bce83c95de95447925edb0ee27f8e8378713e767d6da570fccfb4f13dcf57f898e77ddb540a9453e0c3d5c97ae8d2ec843590bcb1d349044c09');
  -// FIXME: wrong answer
  -// ack('mpw(k, n, "invm").toString(16)', kinv.toString(16));
  +ack('mpw(k, n, "invm").toString(16)', kinv.toString(16));
   var r    = 
mpw('0140c8edca57108ce3f7e7a240ddd3ad74d81e2de62451fc1d558fdc79269adacd1c2526eeeef32f8c0432a9d56e2b4a8a732891c37c9b96641a9254ccfe5dc3e2ba');
   var s    = 
mpw('00d72f15229d0096376da6651d9985bfd7c07f8d49583b545db3eab20e0a2c1e8615bd9e298455bdeb6b61378e77af1c54eee2ce37b2c61f5c9a8232951cb988b5b1');
   ack('mpw(kinv, mpw(e, mpw(r, d, n, "mulm"), n, "addm"), n, 
"mulm").toString(16)', s.toString(16));
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to