mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
gpg: Accept Ed25519 private key in SOS which reserves leading zeros.
* g10/parse-packet.c (sos_read): Backport from 2.3. (parse_key): Use sos_read for Ed25519 private key. -- Note that we keep the code of sos_read as same as 2.3. Even it is set, the GCRYMPI_FLAG_USER2 flag is not used. GnuPG-bug-id: 5120 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
4cf8bdb048
commit
14de7b1e59
@ -188,6 +188,76 @@ mpi_read (iobuf_t inp, unsigned int *ret_nread, int secure)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Read an external representation of an SOS and return the opaque MPI
|
||||||
|
with GCRYMPI_FLAG_USER2. The external format is a 16-bit unsigned
|
||||||
|
value stored in network byte order giving information for the
|
||||||
|
following octets.
|
||||||
|
|
||||||
|
The caller must set *RET_NREAD to the maximum number of bytes to
|
||||||
|
read from the pipeline INP. This function sets *RET_NREAD to be
|
||||||
|
the number of bytes actually read from the pipeline.
|
||||||
|
|
||||||
|
If SECURE is true, the integer is stored in secure memory
|
||||||
|
(allocated using gcry_xmalloc_secure). */
|
||||||
|
static gcry_mpi_t
|
||||||
|
sos_read (iobuf_t inp, unsigned int *ret_nread, int secure)
|
||||||
|
{
|
||||||
|
int c, c1, c2, i;
|
||||||
|
unsigned int nmax = *ret_nread;
|
||||||
|
unsigned int nbits, nbytes;
|
||||||
|
size_t nread = 0;
|
||||||
|
gcry_mpi_t a = NULL;
|
||||||
|
byte *buf = NULL;
|
||||||
|
byte *p;
|
||||||
|
|
||||||
|
if (!nmax)
|
||||||
|
goto overflow;
|
||||||
|
|
||||||
|
if ((c = c1 = iobuf_get (inp)) == -1)
|
||||||
|
goto leave;
|
||||||
|
if (++nread == nmax)
|
||||||
|
goto overflow;
|
||||||
|
nbits = c << 8;
|
||||||
|
if ((c = c2 = iobuf_get (inp)) == -1)
|
||||||
|
goto leave;
|
||||||
|
++nread;
|
||||||
|
nbits |= c;
|
||||||
|
if (nbits > MAX_EXTERN_MPI_BITS)
|
||||||
|
{
|
||||||
|
log_error ("mpi too large (%u bits)\n", nbits);
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
|
||||||
|
nbytes = (nbits + 7) / 8;
|
||||||
|
buf = secure ? gcry_xmalloc_secure (nbytes) : gcry_xmalloc (nbytes);
|
||||||
|
p = buf;
|
||||||
|
for (i = 0; i < nbytes; i++)
|
||||||
|
{
|
||||||
|
if (nread == nmax)
|
||||||
|
goto overflow;
|
||||||
|
|
||||||
|
c = iobuf_get (inp);
|
||||||
|
if (c == -1)
|
||||||
|
goto leave;
|
||||||
|
|
||||||
|
p[i] = c;
|
||||||
|
nread ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = gcry_mpi_set_opaque (NULL, buf, nbits);
|
||||||
|
gcry_mpi_set_flag (a, GCRYMPI_FLAG_USER2);
|
||||||
|
*ret_nread = nread;
|
||||||
|
return a;
|
||||||
|
|
||||||
|
overflow:
|
||||||
|
log_error ("mpi larger than indicated length (%u bits)\n", 8*nmax);
|
||||||
|
leave:
|
||||||
|
*ret_nread = nread;
|
||||||
|
gcry_free(buf);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Register STRING as a known critical notation name. */
|
/* Register STRING as a known critical notation name. */
|
||||||
void
|
void
|
||||||
register_known_notation (const char *string)
|
register_known_notation (const char *string)
|
||||||
@ -2728,6 +2798,9 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen,
|
|||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
n = pktlen;
|
n = pktlen;
|
||||||
|
if (algorithm == PUBKEY_ALGO_EDDSA)
|
||||||
|
pk->pkey[i] = sos_read (inp, &n, 0);
|
||||||
|
else
|
||||||
pk->pkey[i] = mpi_read (inp, &n, 0);
|
pk->pkey[i] = mpi_read (inp, &n, 0);
|
||||||
pktlen -= n;
|
pktlen -= n;
|
||||||
if (list_mode)
|
if (list_mode)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user