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:   13-Aug-2009 15:46:22
  Branch: HEAD                             Handle: 2009081313462200

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

  Log:
    - js: refactor ECC point on curve tests.
    - js: fix jsdouble mpw coercion.
    - js: add mpw compare/min/max methods with tests.

  Summary:
    Revision    Changes     Path
    1.17        +243 -44    rpm/js/rpmmpw-js.c
    1.19        +124 -65    rpm/js/tscripts/Mpw.js
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/js/rpmmpw-js.c
  ============================================================================
  $ cvs diff -u -r1.16 -r1.17 rpmmpw-js.c
  --- rpm/js/rpmmpw-js.c        9 Aug 2009 15:53:40 -0000       1.16
  +++ rpm/js/rpmmpw-js.c        13 Aug 2009 13:46:22 -0000      1.17
  @@ -38,7 +38,8 @@
   #define rpmmpw_iteratorobject        NULL
   #define rpmmpw_wrappedobject NULL
   
  -#define      OBJ_IS_MPW(cx,obj)      (OBJ_GET_CLASS(cx, obj) == &rpmmpwClass)
  +#define      OBJ_IS_MPW(cx,obj)      ((obj) && OBJ_GET_CLASS((cx), (obj)) == 
&rpmmpwClass)
  +#define      JSVAL_IS_MPW(cx, v)     (JSVAL_IS_OBJECT(v) && OBJ_IS_MPW(cx, 
JSVAL_TO_OBJECT(v)))
   
   /* --- helpers */
   typedef struct mpwObject_s {
  @@ -966,8 +967,6 @@
       }
       z->data[0] = (mpw) ival;
   
  -if (_debug < 0)
  -fprintf(stderr, "<== %s(%ld) z %p\n\t", __FUNCTION__, ival, z), 
mpfprintln(stderr, MPW_SIZE(z), MPW_DATA(z));
       return z;
   }
   
  @@ -979,7 +978,13 @@
       double frac = frexp(dval, &exp);
       uint64_t flval;
       uint64_t llval;
  -    mpwObject * x;
  +#if (MP_WBITS == 64)
  +    size_t xsize = 1;
  +    mpw xdata[1];
  +#else
  +    size_t xsize = 2;
  +    mpw xdata[2];
  +#endif
       int bits = exp - MP_WBITS;
       size_t zsize = 1;
       mpwObject * z;
  @@ -995,37 +1000,29 @@
       flval = ldexp(frac, mbits);
   
   #if (MP_WBITS == 64)
  -    x = mpw_New(1);
  -    mpsetw(MPW_SIZE(z), MPW_DATA(z), (mpw)flval);
  +    xdata[0] = (mpw)flval;
   #else
  -    if (exp > (int)MP_WBITS) {
  -     x = mpw_New(2);
  -     x->data[0] = (mpw) ((flval >> 32) & 0xffffffff);
  -     x->data[1] = (mpw) ((flval      ) & 0xffffffff);
  -    } else {
  -     x = mpw_New(1);
  -     x->data[0] = (mpw) flval;
  -    }
  +    xdata[0] = (mpw) ((flval >> 32) & 0xffffffff);
  +    xdata[1] = (mpw) ((flval      ) & 0xffffffff);
   #endif
       if (exp == mbits)
        exp = 0;        /* nothing to do */
       else if (exp < mbits) {
  -     mprshift(MPW_SIZE(x), MPW_DATA(x), (mbits - exp));
  +     mprshift(xsize, xdata, (mbits - exp));
        exp = 0;
       } else if (exp < 64) {
  -     mplshift(MPW_SIZE(x), MPW_DATA(x), (exp - mbits));
  +     mplshift(xsize, xdata, (exp - mbits));
        exp = 0;
       } else
        exp -= mbits;
   
       z = mpw_New(zsize);
  -    mpsetx(MPW_SIZE(z), MPW_DATA(z), MPW_SIZE(x), MPW_DATA(x));
  +    mpsetx(MPW_SIZE(z), MPW_DATA(z), xsize, xdata);
       if (exp > 0) {
        mplshift(MPW_SIZE(z), MPW_DATA(z), exp);
       }
       if (dval < 0.0)
        z->ob_size = -z->ob_size;
  -    x = _free(x);
   
       return z;
   }
  @@ -1221,6 +1218,7 @@
        goto exit;
   
   if (_debug < 0) {
  +fprintf(stderr, "==> %s(%c)\n", __FUNCTION__, (op & 0xff));
   prtmpw("a", x);
   }
   
  @@ -1241,10 +1239,15 @@
        if (z->ob_size < 0)
            z->ob_size = -z->ob_size;
        break;
  -    case '~':  /* Implement ~z as -(z+1) */
  +    case '~': 
  +#ifdef       DYING
  +     /* Implement ~z as -(z+1) */
        (void) mpaddw(MPW_SIZE(z), MPW_DATA(z), 1);
        if (x->ob_size > 0)
            z->ob_size = -z->ob_size;
  +#else
  +     (void) mpnot(MPW_SIZE(z), MPW_DATA(z));
  +#endif
        break;
       }
   
  @@ -1296,6 +1299,7 @@
       }
   
   if (_debug < 0) {
  +fprintf(stderr, "==> %s(%c)\n", __FUNCTION__, (op & 0xff));
   prtmpw("a", x);
   prtmpw("b", m);
   }
  @@ -1434,7 +1438,11 @@
            z->ob_size = -z->ob_size;
        break;
       case '%':
  -     asize = xsize+1;
  +     if (mpz(msize, mdata)) {
  +         z = mpw_FromMPW(xsize, xdata, 1);
  +         break;
  +     }
  +     asize = MAX(xsize, msize) + 1;
        adata = alloca(asize * sizeof(*adata));
        mpsetx(asize, adata, xsize, xdata);
        bsize = msize;
  @@ -1442,46 +1450,50 @@
   
        zsize = asize;
        zdata = alloca(zsize * sizeof(*zdata));
  -#ifdef       DYING   /* XXX Python dares to be different. */
        zsign = x->ob_size * m->ob_size;
  -#else
  -     zsign = x->ob_size;
  -#endif
        wksp = alloca((2*bsize+1) * sizeof(*wksp));
   
        mpmod(zdata, asize, adata, bsize, bdata, wksp);
   
  -#ifdef       DYING   /* XXX Python dares to be different. */
  +#ifdef       NOTYET
        if (zsign < 0) {
            if (m->ob_size < 0) {
                (void) mpsubx(zsize, zdata, bsize, bdata);
                mpneg(zsize, zdata);
  -         } else {
  -             zsign = 0;
  +         } else if (x->ob_size < 0) {
                mpneg(zsize, zdata);
                (void) mpaddx(zsize, zdata, bsize, bdata);
            }
        }
   #endif
  +
        z = mpw_FromMPW(zsize, zdata, 1);
  +
  +#ifdef       NOTYET
        if (zsign < 0)
  -         z->ob_size = -z->ob_size;
  -#ifdef       DYING   /* XXX Python dares to be different. */
  -     else if (zsign > 0) {
  -         if (x->ob_size < 0)
  +#endif
  +     {
  +#ifdef       PYTHON_DIVISOR
  +         if (m->ob_size < 0)         /* divisor determines sign. */
  +#else
  +         if (x->ob_size < 0)         /* dividend determines sign. */
  +#endif
                z->ob_size = -z->ob_size;
        }
  -#endif
        break;
       case '<':
  -     /* XXX FIXME: enlarge? negative count? sign?. */
  -     shift = (size_t) (msize == 1 ? mdata[0] : 0);
  -     z = mpw_FromMPW(xsize, xdata, 0);
  +     /* XXX FIXME: negative count? sign?. */
  +     shift = (size_t) (msize == 1 ? (mdata[0] & 0x00ffffff) : 0);
  +     msize = MP_ROUND_B2W(shift - mpmszcnt(xsize, xdata));
  +     asize = MAX(xsize, msize);
  +     adata = alloca(asize * sizeof(*adata));
  +     mpsetx(asize, adata, xsize, xdata);
        if (shift > 0)
  -         mplshift(MPW_SIZE(z), MPW_DATA(z), shift);
  +         mplshift(asize, adata, shift);
  +     z = mpw_FromMPW(asize, adata, 0);
        break;
       case '>':
  -     /* XXX FIXME: enlarge? negative count? sign?. */
  +     /* XXX FIXME: negative count? sign?. */
        shift = (size_t) (msize == 1 ? mdata[0] : 0);
        z = mpw_FromMPW(xsize, xdata, 0);
        if (shift > 0)
  @@ -1605,6 +1617,7 @@
        goto exit;
   
   if (_debug < 0) {
  +fprintf(stderr, "==> %s(%c)\n", __FUNCTION__, (op & 0xff));
   prtmpw("a", x);
   prtmpw("b", y);
   prtmpw("c", m);
  @@ -1870,6 +1883,190 @@
       return ok;
   }
   
  +/** Return eq(x, y). */
  +static JSBool
  +mpw_eq(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL);
  +    JSBool ok = JS_TRUE;
  +
  +_METHOD_DEBUG_ENTRY(_debug);
  +    if (argc == 2) {
  +     mpwObject * x = mpw_j2mpw(cx, argv[0]);
  +     mpwObject * y = mpw_j2mpw(cx, argv[1]);
  +
  +     *rval = ((x->ob_size * y->ob_size) > 0 && mpeqx(MPW_SIZE(x), 
MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y)))
  +             ? JSVAL_TRUE : JSVAL_FALSE;
  +
  +     if (!JSVAL_IS_MPW(cx, argv[0])) x = _free(x);
  +     if (!JSVAL_IS_MPW(cx, argv[1])) y = _free(y);
  +    } else
  +     ok = JS_FALSE;
  +    return ok;
  +}
  +
  +/** Return ne(x, y). */
  +static JSBool
  +mpw_ne(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    JSBool ok = JS_TRUE;
  +    if ((ok = mpw_eq(cx, obj, argc, argv, rval)))
  +     *rval = (*rval == JSVAL_TRUE ? JSVAL_FALSE : JSVAL_TRUE);
  +    return ok;
  +}
  +
  +/** Return lt(x, y). */
  +static JSBool
  +mpw_lt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL);
  +    JSBool ok = JS_TRUE;
  +
  +_METHOD_DEBUG_ENTRY(_debug);
  +    if (argc == 2) {
  +     mpwObject * x = mpw_j2mpw(cx, argv[0]);
  +     mpwObject * y = mpw_j2mpw(cx, argv[1]);
  +
  +     if (x->ob_size < 0 && y->ob_size > 0)
  +         *rval = JSVAL_TRUE;
  +     else
  +     if (x->ob_size > 0 && y->ob_size < 0)
  +         *rval = JSVAL_FALSE;
  +     else
  +     if (x->ob_size < 0 && y->ob_size < 0)
  +         *rval = mpgtx(MPW_SIZE(x), MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y))
  +             ? JSVAL_TRUE : JSVAL_FALSE;
  +     if (x->ob_size > 0 && y->ob_size > 0)
  +         *rval = mpltx(MPW_SIZE(x), MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y))
  +             ? JSVAL_TRUE : JSVAL_FALSE;
  +
  +     if (!JSVAL_IS_MPW(cx, argv[0])) x = _free(x);
  +     if (!JSVAL_IS_MPW(cx, argv[1])) y = _free(y);
  +    } else
  +     ok = JS_FALSE;
  +    return ok;
  +}
  +
  +/** Return ge(x, y). */
  +static JSBool
  +mpw_ge(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    JSBool ok = JS_TRUE;
  +    if ((ok = mpw_lt(cx, obj, argc, argv, rval)))
  +     *rval = (*rval == JSVAL_TRUE ? JSVAL_FALSE : JSVAL_TRUE);
  +    return ok;
  +}
  +
  +/** Return gt(x, y). */
  +static JSBool
  +mpw_gt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL);
  +    JSBool ok = JS_TRUE;
  +
  +_METHOD_DEBUG_ENTRY(_debug);
  +    if (argc == 2) {
  +     mpwObject * x = mpw_j2mpw(cx, argv[0]);
  +     mpwObject * y = mpw_j2mpw(cx, argv[1]);
  +
  +     if (x->ob_size < 0 && y->ob_size > 0)
  +         *rval = JSVAL_FALSE;
  +     else
  +     if (x->ob_size > 0 && y->ob_size < 0)
  +         *rval = JSVAL_TRUE;
  +     else
  +     if (x->ob_size < 0 && y->ob_size < 0)
  +         *rval = mpltx(MPW_SIZE(x), MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y))
  +             ? JSVAL_TRUE : JSVAL_FALSE;
  +     if (x->ob_size > 0 && y->ob_size > 0)
  +         *rval = mpgtx(MPW_SIZE(x), MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y))
  +             ? JSVAL_TRUE : JSVAL_FALSE;
  +
  +     if (!JSVAL_IS_MPW(cx, argv[0])) x = _free(x);
  +     if (!JSVAL_IS_MPW(cx, argv[1])) y = _free(y);
  +    } else
  +     ok = JS_FALSE;
  +    return ok;
  +}
  +
  +/** Return le(x, y). */
  +static JSBool
  +mpw_le(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    JSBool ok = JS_TRUE;
  +    if ((ok = mpw_gt(cx, obj, argc, argv, rval)))
  +     *rval = (*rval == JSVAL_TRUE ? JSVAL_FALSE : JSVAL_TRUE);
  +    return ok;
  +}
  +
  +/** Return min(x, y). */
  +static JSBool
  +mpw_min(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL);
  +    JSBool ok = JS_TRUE;
  +
  +_METHOD_DEBUG_ENTRY(_debug);
  +    /* XXX generalize to N values? */
  +    if (argc == 2) {
  +     mpwObject * x = mpw_j2mpw(cx, argv[0]);
  +     mpwObject * y = mpw_j2mpw(cx, argv[1]);
  +
  +     if (x->ob_size < 0 && y->ob_size > 0)
  +         *rval = argv[0];
  +     else
  +     if (x->ob_size > 0 && y->ob_size < 0)
  +         *rval = argv[1];
  +     else
  +     if (x->ob_size < 0 && y->ob_size < 0)
  +         *rval = mpgex(MPW_SIZE(x), MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y))
  +             ? argv[0] : argv[1];
  +     else
  +     if (x->ob_size > 0 && y->ob_size > 0)
  +         *rval = mplex(MPW_SIZE(x), MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y))
  +             ? argv[0] : argv[1];
  +
  +     if (!JSVAL_IS_MPW(cx, argv[0])) x = _free(x);
  +     if (!JSVAL_IS_MPW(cx, argv[1])) y = _free(y);
  +    } else
  +     ok = JS_FALSE;
  +    return ok;
  +}
  +
  +/** Return max(x, y). */
  +static JSBool
  +mpw_max(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
  +{
  +    void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmpwClass, NULL);
  +    JSBool ok = JS_TRUE;
  +
  +_METHOD_DEBUG_ENTRY(_debug);
  +    /* XXX generalize to N values? */
  +    if (argc == 2) {
  +     mpwObject * x = mpw_j2mpw(cx, argv[0]);
  +     mpwObject * y = mpw_j2mpw(cx, argv[1]);
  +
  +     if (x->ob_size < 0 && y->ob_size > 0)
  +         *rval = argv[1];
  +     else
  +     if (x->ob_size > 0 && y->ob_size < 0)
  +         *rval = argv[0];
  +     else
  +     if (x->ob_size < 0 && y->ob_size < 0)
  +         *rval = mpgex(MPW_SIZE(x), MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y))
  +             ? argv[1] : argv[0];
  +     else
  +     if (x->ob_size > 0 && y->ob_size > 0)
  +         *rval = mplex(MPW_SIZE(x), MPW_DATA(x), MPW_SIZE(y), MPW_DATA(y))
  +             ? argv[1] : argv[0];
  +
  +     if (!JSVAL_IS_MPW(cx, argv[0])) x = _free(x);
  +     if (!JSVAL_IS_MPW(cx, argv[1])) y = _free(y);
  +    } else
  +     ok = JS_FALSE;
  +    return ok;
  +}
  +
   #ifdef DYING
   /** Return random number 1 < r < b-1. */
   static JSBool
  @@ -1898,6 +2095,14 @@
       JS_FS("toString",        mpw_toString,           0,0,0),
       JS_FS("isPrime", mpw_isPrime,            0,0,0),
       JS_FS("randomK", mpw_randomK,            0,0,0),
  +    JS_FS("eq",              mpw_eq,                 0,0,0),
  +    JS_FS("ne",              mpw_ne,                 0,0,0),
  +    JS_FS("lt",              mpw_lt,                 0,0,0),
  +    JS_FS("ge",              mpw_ge,                 0,0,0),
  +    JS_FS("gt",              mpw_gt,                 0,0,0),
  +    JS_FS("le",              mpw_le,                 0,0,0),
  +    JS_FS("min",     mpw_min,                0,0,0),
  +    JS_FS("max",     mpw_max,                0,0,0),
       JS_FS_END
   };
   
  @@ -2194,15 +2399,9 @@
                    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);
  +             freeme[ix] = (!JSVAL_IS_MPW(cx, v) ? 1 : 0);
            }
        }
        if (ix < 0) {
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/js/tscripts/Mpw.js
  ============================================================================
  $ cvs diff -u -r1.18 -r1.19 Mpw.js
  --- rpm/js/tscripts/Mpw.js    9 Aug 2009 15:51:57 -0000       1.18
  +++ rpm/js/tscripts/Mpw.js    13 Aug 2009 13:46:22 -0000      1.19
  @@ -60,8 +60,8 @@
   ack('mpw(x, y, m, "powm").toString(10)', '7');
    
   var zx = 2*3*5*19;
  -zx *= zx;
  -zx *= zx;
  +// zx *= zx;
  +// zx *= zx;
   // FIXME segfault, check gcd scaling for zy
   // zx *= zx;
   var zy = 7*11*13*19;
  @@ -158,6 +158,60 @@
   ack('mpw(wpb, wma, "%").toString(10)', (zpb % zma).toString(10));
   ack('mpw(wpb, wpa, "%").toString(10)', (zpb % zpa).toString(10));
   
  +ack('mpw.eq(wma, wma)', zma == zma);
  +ack('mpw.ne(wma, wma)', zma != zma);
  +ack('mpw.eq(wma, wpa)', zma == zpa);
  +ack('mpw.ne(wma, wpa)', zma != zpa);
  +ack('mpw.eq(wpa, wma)', zpa == zma);
  +ack('mpw.ne(wpa, wma)', zpa != zma);
  +ack('mpw.eq(wpa, wpa)', zpa == zpa);
  +ack('mpw.ne(wpa, wpa)', zpa != zpa);
  +
  +ack('mpw.lt(wma, wma)', zma < zma);
  +ack('mpw.le(wma, wma)', zma <= zma);
  +ack('mpw.gt(wma, wma)', zma > zma);
  +ack('mpw.ge(wma, wma)', zma >= zma);
  +ack('mpw.lt(wma, wpa)', zma < zpa);
  +ack('mpw.le(wma, wpa)', zma <= zpa);
  +ack('mpw.gt(wma, wpa)', zma > zpa);
  +ack('mpw.ge(wma, wpa)', zma >= zpa);
  +ack('mpw.lt(wpa, wma)', zpa < zma);
  +ack('mpw.le(wpa, wma)', zpa <= zma);
  +ack('mpw.gt(wpa, wma)', zpa > zma);
  +ack('mpw.ge(wpa, wma)', zpa >= zma);
  +ack('mpw.lt(wpa, wpa)', zpa < zpa);
  +ack('mpw.le(wpa, wpa)', zpa <= zpa);
  +ack('mpw.gt(wpa, wpa)', zpa > zpa);
  +ack('mpw.ge(wpa, wpa)', zpa >= zpa);
  +
  +ack('mpw.min(zma, zmb)', Math.min(zma, zmb));
  +ack('mpw.min(zma, zpb)', Math.min(zma, zpb));
  +ack('mpw.min(zpa, zmb)', Math.min(zpa, zmb));
  +ack('mpw.min(zpa, zpb)', Math.min(zpa, zpb));
  +ack('mpw.max(zma, zmb)', Math.max(zma, zmb));
  +ack('mpw.max(zma, zpb)', Math.max(zma, zpb));
  +ack('mpw.max(zpa, zmb)', Math.max(zpa, zmb));
  +ack('mpw.max(zpa, zpb)', Math.max(zpa, zpb));
  +
  +var za = 5;
  +var zb = 3;
  +// FIXME
  +// ack('mpw(+za, 0, "%").toString(10)', za.toString(10));
  +ack('mpw(+5, +3, "%").toString(10)', '2');
  +ack('mpw(+5, -3, "%").toString(10)', '-1');
  +ack('mpw(-5, +3, "%").toString(10)', '1');
  +ack('mpw(-5, -3, "%").toString(10)', '-2');
  +function mathmod(x, y) { return (x - y * Math.floor(x/y)); }
  +ack('mpw(+za, +zb, "%").toString(10)', mathmod(+za, +zb).toString(10));
  +ack('mpw(+za, -zb, "%").toString(10)', mathmod(+za, -zb).toString(10));
  +ack('mpw(-za, +zb, "%").toString(10)', mathmod(-za, +zb).toString(10));
  +ack('mpw(-za, -zb, "%").toString(10)', mathmod(-za, -zb).toString(10));
  +
  +ack('mpw(+za, +zb, "%").toString(10)', (+za % +zb).toString(10));
  +ack('mpw(+za, -zb, "%").toString(10)', (+za % -zb).toString(10));
  +ack('mpw(-za, +zb, "%").toString(10)', (-za % +zb).toString(10));
  +ack('mpw(-za, -zb, "%").toString(10)', (-za % -zb).toString(10));
  +
   // ===== Knuth poly
   var lo = 2;
   var hi = 10;
  @@ -267,7 +321,7 @@
        return (mpw(s, this.e, this.n, "powm").toString(10) == hm.toString(10)
                ? true : false);
       }
  -  return true;
  +  return this;
   }
   
   // ===== RSA example (from "Handbook of Applied Cryptography" 11.20 p434).
  @@ -669,7 +723,7 @@
                ? true : false);
       }
   
  -  return true;
  +  return this;
   }
   
   // ===== ElGamal example (from "Handbook of Applied Cryptography" 11.65 
p455).
  @@ -747,7 +801,7 @@
        return (this.v.toString(10) == this.r.toString(10)
                ? true : false);
       }
  -  return true;
  +  return this;
   }
   
   // ===== DSA example (from "Handbook of Applied Cryptography" 11.57 p453).
  @@ -898,33 +952,42 @@
   
   // =======================================================
   function CurveFp(p, a, b) {
  -  this.p = mpw(p);
  -  this.a = mpw(a);
  -  this.b = mpw(b);
  +    this.p = mpw(p);
  +    this.a = mpw(a);
  +    this.b = mpw(b);
   
  -  this.contains =
  +    this.contains =
       function (x, y) {
  +        if (x == undefined && y == undefined)
  +            return true;
        var t1 = mpw(y, y, "*");
        var t2 = mpw(mpw(x, x, "*"), x, "*");
        t1 = mpw(t1, t2, "-");
        t2 = mpw(x, this.a, "*");
        t1 = mpw(t1, t2, "-");
        t1 = mpw(t1, this.b, "-");
  -     t1 = mpw(t1, this.p, "%");
  -     return (t1.toString(10) == "0");
  +     // XXX FIXME negative 0
  +     t1 = mpw(t1, this.p, "%", "abs");
  +     return (mpw.eq(t1, 0));
       }
   
  -  return true;
  +    return this;
   }
   
   // =======================================================
  -function Point(curve, x, y, n) {
  -  this.curve = curve;
  -  this.x = mpw(x);
  -  this.y = mpw(y);
  -  this.z = mpw(1);
  -  this.n = mpw(n);
  -  return true;
  +function PointFp(C, x, y, n) {
  +    this.C = C;
  +    this.x = mpw(x);
  +    this.y = mpw(y);
  +    this.z = mpw(1);
  +    this.n = mpw(n);
  +    return this;
  +}
  +
  +function checkP(C, x, y, n) {
  +    P = new PointFp(C, x, y, n);
  +    ack('C.contains(P.x, P.y)', true);
  +    return P;
   }
   
   // ===== secp 112r1
  @@ -936,13 +999,11 @@
   var gx   = mpw('09487239995a5ee76b55f9c2f098');
   var gy   = mpw('a89ce5af8724c0a23e0e0ff77500');
   
  -c112 = new CurveFp(p, -3, b);
  -ack('c112.contains(gx, gy)', true);
  -p112 = new Point(c112, gx, gy, n);
  -
  -delete c112;
  -delete p112;
  +C = new CurveFp(p, -3, b);
  +G = checkP(C, gx, gy, n);
   
  +delete C;
  +delete G;
   
   // ===== SECP 128r1
   print("===== SECP 128r1");
  @@ -953,12 +1014,11 @@
   var gx   = mpw('161ff7528b899b2d0c28607ca52c5b86');
   var gy   = mpw('cf5ac8395bafeb13c02da292dded7a83');
   
  -c128 = new CurveFp(p, -3, b);
  -ack('c128.contains(gx, gy)', true);
  -p128 = new Point(c128, gx, gy, n);
  +C = new CurveFp(p, -3, b);
  +G = checkP(C, gx, gy, n);
   
  -delete c128;
  -delete p128;
  +delete C;
  +delete G;
   
   // ===== SECP 160r1
   print("===== SECP 160r1");
  @@ -969,12 +1029,11 @@
   var gx   = mpw('4a96b5688ef573284664698968c38bb913cbfc82');
   var gy   = mpw('23a628553168947d59dcc912042351377ac5fb32');
   
  -c160 = new CurveFp(p, -3, b);
  -ack('c160.contains(gx, gy)', true);
  -p160 = new Point(c160, gx, gy, n);
  +C = new CurveFp(p, -3, b);
  +G = checkP(C, gx, gy, n);
   
  -delete c160;
  -delete p160;
  +delete C;
  +delete G;
   
   // ===== ECDSA P-192 example from 
   //   
http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf
  @@ -991,14 +1050,13 @@
   var gx   = mpw('188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012');
   var gy   = mpw('07192b95ffc8da78631011ed6b24cdd573f977a11e794811');
   
  -c192 = new CurveFp(p, -3, b);
  -ack('c192.contains(gx, gy)', true);
  -p192 = new Point(c192, gx, gy, n);
  +C = new CurveFp(p, -3, b);
  +G = checkP(C, gx, gy, n);
   
   var d    = mpw('7891686032fd8057f636b44b1f47cce564d2509923a7465b');
   var qx   = mpw('fba2aac647884b504eb8cd5a0a1287babcc62163f606a9a2');
   var qy   = mpw('dae6d4cc05ef4f27d79ee38b71c9c8ef4865d98850d84aa5');
  -ack('c192.contains(qx, qy)', true);
  +Q = checkP(C, qx, qy, n);
   
   var k    = mpw('d06cb0a0ef2f708b0744f08aa06b6deedea9c0f80a69d847');
   var msg  = "Example of ECDSA with P-192";
  @@ -1016,8 +1074,9 @@
   ack('mpw(r, w, n, "mulm").toString(16)', u2.toString(16));
   var v    = mpw('f0ecba72b88cde399cc5a18e2a8b7da54d81d04fb9802821');
   
  -delete c192;
  -delete p192;
  +delete C;
  +delete G;
  +delete Q;
   
   // ===== ECDSA P-224 example from 
   //   
http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf
  @@ -1035,14 +1094,13 @@
   var gx   = mpw('b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21');
   var gy   = mpw('bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34');
   
  -c224 = new CurveFp(p, -3, b);
  -ack('c224.contains(gx, gy)', true);
  -p224 = new Point(c224, gx, gy, n);
  +C = new CurveFp(p, -3, b);
  +G = checkP(C, gx, gy, n);
   
   var d    = mpw('3f0c488e987c80be0fee521f8d90be6034ec69ae11ca72aa777481e8');
   var qx   = mpw('e84fb0b8e7000cb657d7973cf6b42ed78b301674276df744af130b3e');
   var qy   = mpw('4376675c6fc5612c21a0ff2d2a89d2987df7a2bc52183b5982298555');
  -ack('c224.contains(qx, qy)', true);
  +Q = checkP(C, qx, qy, n);
   
   var k    = mpw('a548803b79df17c40cde3ff0e36d025143bcbba146ec32908eb84937');
   var msg  = "Example of ECDSA with P-224";
  @@ -1060,8 +1118,9 @@
   ack('mpw(r, w, n, "mulm").toString(16)', u2.toString(16));
   var v    = mpw('c3a3f5b82712532004c6f6d1db672f55d931c3409ea1216d0be77380');
   
  -delete c224;
  -delete p224;
  +delete C;
  +delete G;
  +delete Q;
   
   // ===== ECDSA P-256 example from 
   //   
http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf
  @@ -1082,14 +1141,13 @@
   var gx   = 
mpw('6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296');
   var gy   = 
mpw('4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5');
   
  -c256 = new CurveFp(p, -3, b);
  -ack('c256.contains(gx, gy)', true);
  -p256 = new Point(c256, gx, gy, n);
  +C = new CurveFp(p, -3, b);
  +G = checkP(C, gx, gy, n);
   
   var d    = 
mpw('c477f9f65c22cce20657faa5b2d1d8122336f851a508a1ed04e479c34985bf96');
   var qx   = 
mpw('b7e08afdfe94bad3f1dc8c734798ba1c62b3a0ad1e9ea2a38201cd0889bc7a19');
   var qy   = 
mpw('3603f747959dbf7a4bb226e41928729063adc7ae43529e61b563bbc606cc5e09');
  -ack('c256.contains(qx, qy)', true);
  +Q = checkP(C, qx, qy, n);
   
   var k    = 
mpw('7a1a7e52797fc8caaa435d2a4dace39158504bf204fbe19f14dbb427faee50ae');
   var msg  = "Example of ECDSA with P-256";
  @@ -1110,8 +1168,9 @@
   ack('mpw(r, w, "*", n, "%").toString(16)', u2.toString(16));
   var v    = 
mpw('2b42f576d07f4165ff65d1f3b1500f81e44c316f1f0b3ef57325b69aca46104f');
   
  -delete c256;
  -delete p256;
  +delete C;
  +delete G;
  +delete Q;
   
   // ===== ECDSA P-384 example from 
   //   
http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf
  @@ -1133,14 +1192,13 @@
   var gx   = 
mpw('aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7');
   var gy   = 
mpw('3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f');
   
  -c384 = new CurveFp(p, -3, b);
  -ack('c384.contains(gx, gy)', true);
  -p384 = new Point(c384, gx, gy, n);
  +C = new CurveFp(p, -3, b);
  +G = checkP(C, gx, gy, n);
   
   var d    = 
mpw('f92c02ed629e4b48c0584b1c6ce3a3e3b4faae4afc6acb0455e73dfc392e6a0ae393a8565e6b9714d1224b57d83f8a08');
   var qx   = 
mpw('3bf701bc9e9d36b4d5f1455343f09126f2564390f2b487365071243c61e6471fb9d2ab74657b82f9086489d9ef0f5cb5');
   var qy   = 
mpw('d1a358eafbf952e68d533855ccbdaa6ff75b137a5101443199325583552a6295ffe5382d00cfcda30344a9b5b68db855');
  -ack('c384.contains(qx, qy)', true);
  +Q = checkP(C, qx, qy, n);
   
   var k    = 
mpw('2e44ef1f8c0bea8394e3dda81ec6a7842a459b534701749e2ed95f054f0137680878e0749fc43f85edcae06cc2f43fef');
   var msg  = "Example of ECDSA with P-384";
  @@ -1158,8 +1216,9 @@
   ack('mpw(r, w, n, "mulm").toString(16)', u2.toString(16));
   var v    = 
mpw('30ea514fc0d38d8208756f068113c7cada9f66a3b40ea3b313d040d9b57dd41a332795d02cc7d507fcef9faf01a27088');
   
  -delete c384;
  -delete p384;
  +delete C;
  +delete G;
  +delete Q;
   
   // ===== ECDSA P-521 example from 
   //   
http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/ECDSA_Prime.pdf
  @@ -1177,14 +1236,13 @@
   var gx   = 
mpw('c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66');
   var gy   = 
mpw('11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650');
   
  -c512 = new CurveFp(p, -3, b);
  -ack('c512.contains(gx, gy)', true);
  -p512 = new Point(c512, gx, gy, n);
  +C = new CurveFp(p, -3, b);
  +G = checkP(C, gx, gy, n);
   
   var d    = 
mpw('0100085f47b8e1b8b11b7eb33028c0b2888e304bfc98501955b45bba1478dc184eeedf09b86a5f7c21994406072787205e69a63709fe35aa93ba333514b24f961722');
   var qx   = 
mpw('0098e91eef9a68452822309c52fab453f5f117c1da8ed796b255e9ab8f6410cca16e59df403a6bdc6ca467a37056b1e54b3005d8ac030decfeb68df18b171885d5c4');
   var qy   = 
mpw('0164350c321aecfc1cca1ba4364c9b15656150b4b78d6a48d7d28e7f31985ef17be8554376b72900712c4b83ad668327231526e313f5f092999a4632fd50d946bc2e');
  -ack('c512.contains(qx, qy)', true);
  +Q = checkP(C, qx, qy, n);
   
   var k    = 
mpw('c91e2349ef6ca22d2de39dd51819b6aad922d3aecdeab452ba172f7d63e370cecd70575f597c09a174ba76bed05a48e562be0625336d16b8703147a6a231d6bf');
   var msg  = "Example of ECDSA with P-512";
  @@ -1202,8 +1260,9 @@
   ack('mpw(r, w, n, "mulm").toString(16)', u2.toString(16));
   var v    = 
mpw('0140c8edca57108ce3f7e7a240ddd3ad74d81e2de62451fc1d558fdc79269adacd1c2526eeeef32f8c0432a9d56e2b4a8a732891c37c9b96641a9254ccfe5dc3e2ba');
   
  -delete c512;
  -delete p512;
  +delete C;
  +delete G;
  +delete Q;
   
   // ##############################################################
   // Curve K-163
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to