- int rc;
-
- /* --- Sort out some space --- */
-
- dstr_ensure(d, n);
- p = (octet *)d->buf + d->len;
- p[0] = 0;
-
- /* --- Do the packing --- */
-
- if ((rc = e(m, sz, p, n, earg)) < 0)
- return (rc);
-
- /* --- Do the encryption --- */
-
- x = mp_loadb(MP_NEWSEC, p, n);
- x = rsa_pubop(rp, x, x);
- mp_storeb(x, p, n);
- d->len += n;
- mp_drop(x);
- return (n);
+ unsigned long nb = mp_bits(rp->rp->n);
+ size_t n = (nb + 7)/8;
+ arena *a = d && d->a ? d->a->a : arena_global;
+
+ p = x_alloc(a, n);
+ d = e(d, m, msz, p, n, nb, earg);
+ x_free(a, p);
+ return (d ? rsa_pubop(rp, d, d) : 0);