+static int vec2osp(dstr v[])
+{
+ ec_curve *e = *(ec_curve **)v[0].buf;
+ unsigned f = *(int *)v[1].buf;
+ ec *p = (ec *)v[2].buf;
+ size_t n = 1 + 2*e->f->noctets;
+ dstr d = DSTR_INIT, dd = DSTR_INIT;
+ buf b;
+ int ok = 1;
+ int win, wantwin;
+
+ if (strcmp(v[3].buf, "FAIL") == 0) wantwin = 0;
+ else { wantwin = 1; type_hex.cvt(v[3].buf, &d); }
+
+ dstr_ensure(&dd, n); buf_init(&b, dd.buf, n);
+
+ win = !ec_ec2osp(e, f, &b, p);
+ if (!win != !wantwin ||
+ (win && (BLEN(&b) != d.len ||
+ memcmp(BBASE(&b), d.buf, BLEN(&b)) != 0))) {
+ ok = 0;
+ fprintf(stderr, "ec2osp failed");
+ fprintf(stderr, "\ncurve = "); type_ecurve.dump(v, stderr);
+ fprintf(stderr, "\n fmt = 0x%02x", f);
+ fprintf(stderr, "\n p = "); ecdodump(p, stderr);
+ fprintf(stderr, "\n want = ");
+ if (wantwin) type_hex.dump(&d, stderr);
+ else fprintf(stderr, "FAIL");
+ fprintf(stderr, "\nfound = ");
+ if (win) { dd.len = BLEN(&b); type_hex.dump(&dd, stderr); }
+ else fprintf(stderr, "FAIL");
+ fprintf(stderr, "\n");
+ }
+
+ dstr_destroy(&d); dstr_destroy(&dd);
+ EC_DESTROY(p); ecdestroy(e);
+ return (ok);
+}
+
+static int vos2ecp(dstr v[])
+{
+ ec_curve *e = *(ec_curve **)v[0].buf;
+ unsigned f = *(int *)v[1].buf;
+ int remain = *(int *)v[4].buf;
+ dstr d = DSTR_INIT;
+ ec *p, q = EC_INIT;
+ buf b;
+ int ok = 1;
+ int win;
+
+ if (strcmp(v[3].buf, "FAIL") == 0) p = 0;
+ else { type_ec.cvt(v[3].buf, &d); p = (ec *)d.buf; }
+
+ buf_init(&b, v[2].buf, v[2].len);
+ win = !ec_os2ecp(e, f, &b, &q);
+
+ if (!win != !p || (win && (!EC_EQ(p, &q) || BLEFT(&b) != remain))) {
+ ok = 0;
+ fprintf(stderr, "os2ecp failed");
+ fprintf(stderr, "\ncurve = "); type_ecurve.dump(v, stderr);
+ fprintf(stderr, "\n fmt = 0x%02x", f);
+ fprintf(stderr, "\ninput = "); type_hex.dump(&v[2], stderr);
+ fprintf(stderr, "\n want = ");
+ if (p) ecdodump(p, stderr); else fprintf(stderr, "FAIL");
+ fprintf(stderr, "\nfound = ");
+ if (win) ecdodump(&q, stderr); else fprintf(stderr, "FAIL");
+ fprintf(stderr, "\nremain= %d", remain);
+ fprintf(stderr, "\nleft = %d", (int)BLEFT(&b));
+ fprintf(stderr, "\n");
+ }
+
+ if (p) EC_DESTROY(p); EC_DESTROY(&q); ecdestroy(e);
+ dstr_destroy(&d);
+ return (ok);
+}
+