1 /* mpicoder.c - Coder for the external representation of MPIs
2 * Copyright (C) 1998, 1999 Free Software Foundation, Inc.
4 * This file is part of GnuPG.
6 * GnuPG is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * GnuPG is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
21 #include <linux/bitops.h>
22 #include <linux/count_zeros.h>
23 #include <linux/byteorder/generic.h>
24 #include <linux/scatterlist.h>
25 #include <linux/string.h>
26 #include "mpi-internal.h"
28 #define MAX_EXTERN_SCAN_BYTES (16*1024*1024)
29 #define MAX_EXTERN_MPI_BITS 16384
32 * mpi_read_raw_data - Read a raw byte stream as a positive integer
33 * @xbuffer: The data to read
34 * @nbytes: The amount of data to read
36 MPI
mpi_read_raw_data(const void *xbuffer
, size_t nbytes
)
38 const uint8_t *buffer
= xbuffer
;
40 unsigned nbits
, nlimbs
;
44 while (nbytes
> 0 && buffer
[0] == 0) {
50 if (nbits
> MAX_EXTERN_MPI_BITS
) {
51 pr_info("MPI: mpi too large (%u bits)\n", nbits
);
55 nbits
-= count_leading_zeros(buffer
[0]) - (BITS_PER_LONG
- 8);
57 nlimbs
= DIV_ROUND_UP(nbytes
, BYTES_PER_MPI_LIMB
);
58 val
= mpi_alloc(nlimbs
);
66 i
= BYTES_PER_MPI_LIMB
- nbytes
% BYTES_PER_MPI_LIMB
;
67 i
%= BYTES_PER_MPI_LIMB
;
68 for (j
= nlimbs
; j
> 0; j
--) {
70 for (; i
< BYTES_PER_MPI_LIMB
; i
++) {
80 EXPORT_SYMBOL_GPL(mpi_read_raw_data
);
82 MPI
mpi_read_from_buffer(const void *xbuffer
, unsigned *ret_nread
)
84 const uint8_t *buffer
= xbuffer
;
85 unsigned int nbits
, nbytes
;
89 return ERR_PTR(-EINVAL
);
90 nbits
= buffer
[0] << 8 | buffer
[1];
92 if (nbits
> MAX_EXTERN_MPI_BITS
) {
93 pr_info("MPI: mpi too large (%u bits)\n", nbits
);
94 return ERR_PTR(-EINVAL
);
97 nbytes
= DIV_ROUND_UP(nbits
, 8);
98 if (nbytes
+ 2 > *ret_nread
) {
99 pr_info("MPI: mpi larger than buffer nbytes=%u ret_nread=%u\n",
101 return ERR_PTR(-EINVAL
);
104 val
= mpi_read_raw_data(buffer
+ 2, nbytes
);
106 return ERR_PTR(-ENOMEM
);
108 *ret_nread
= nbytes
+ 2;
111 EXPORT_SYMBOL_GPL(mpi_read_from_buffer
);
114 * Fill the mpi VAL from the hex string in STR.
116 int mpi_fromstr(MPI val
, const char *str
)
119 int prepend_zero
= 0;
121 unsigned int nbits
, nbytes
, nlimbs
;
129 /* Skip optional hex prefix. */
130 if (*str
== '0' && str
[1] == 'x')
134 if (nbits
> MAX_EXTERN_SCAN_BYTES
) {
142 nbytes
= (nbits
+7) / 8;
143 nlimbs
= (nbytes
+BYTES_PER_MPI_LIMB
-1) / BYTES_PER_MPI_LIMB
;
145 if (val
->alloced
< nlimbs
)
146 mpi_resize(val
, nlimbs
);
148 i
= BYTES_PER_MPI_LIMB
- (nbytes
% BYTES_PER_MPI_LIMB
);
149 i
%= BYTES_PER_MPI_LIMB
;
150 j
= val
->nlimbs
= nlimbs
;
154 for (; i
< BYTES_PER_MPI_LIMB
; i
++) {
170 if (c1
>= '0' && c1
<= '9')
172 else if (c1
>= 'a' && c1
<= 'f')
174 else if (c1
>= 'A' && c1
<= 'F')
181 if (c2
>= '0' && c2
<= '9')
183 else if (c2
>= 'a' && c2
<= 'f')
185 else if (c2
>= 'A' && c2
<= 'F')
200 EXPORT_SYMBOL_GPL(mpi_fromstr
);
202 MPI
mpi_scanval(const char *string
)
210 if (mpi_fromstr(a
, string
)) {
217 EXPORT_SYMBOL_GPL(mpi_scanval
);
219 static int count_lzeros(MPI a
)
224 for (i
= a
->nlimbs
- 1; i
>= 0; i
--) {
227 lzeros
+= sizeof(mpi_limb_t
);
229 lzeros
+= count_leading_zeros(alimb
) / 8;
237 * mpi_read_buffer() - read MPI to a bufer provided by user (msb first)
239 * @a: a multi precision integer
240 * @buf: bufer to which the output will be written to. Needs to be at
241 * leaset mpi_get_size(a) long.
242 * @buf_len: size of the buf.
243 * @nbytes: receives the actual length of the data written on success and
244 * the data to-be-written on -EOVERFLOW in case buf_len was too
246 * @sign: if not NULL, it will be set to the sign of a.
248 * Return: 0 on success or error code in case of error
250 int mpi_read_buffer(MPI a
, uint8_t *buf
, unsigned buf_len
, unsigned *nbytes
,
254 #if BYTES_PER_MPI_LIMB == 4
256 #elif BYTES_PER_MPI_LIMB == 8
259 #error please implement for this limb size.
261 unsigned int n
= mpi_get_size(a
);
270 lzeros
= count_lzeros(a
);
272 if (buf_len
< n
- lzeros
) {
273 *nbytes
= n
- lzeros
;
278 *nbytes
= n
- lzeros
;
280 for (i
= a
->nlimbs
- 1 - lzeros
/ BYTES_PER_MPI_LIMB
,
281 lzeros
%= BYTES_PER_MPI_LIMB
;
283 #if BYTES_PER_MPI_LIMB == 4
284 alimb
= cpu_to_be32(a
->d
[i
]);
285 #elif BYTES_PER_MPI_LIMB == 8
286 alimb
= cpu_to_be64(a
->d
[i
]);
288 #error please implement for this limb size.
290 memcpy(p
, (u8
*)&alimb
+ lzeros
, BYTES_PER_MPI_LIMB
- lzeros
);
291 p
+= BYTES_PER_MPI_LIMB
- lzeros
;
296 EXPORT_SYMBOL_GPL(mpi_read_buffer
);
299 * mpi_get_buffer() - Returns an allocated buffer with the MPI (msb first).
300 * Caller must free the return string.
301 * This function does return a 0 byte buffer with nbytes set to zero if the
302 * value of A is zero.
304 * @a: a multi precision integer.
305 * @nbytes: receives the length of this buffer.
306 * @sign: if not NULL, it will be set to the sign of the a.
308 * Return: Pointer to MPI buffer or NULL on error
310 void *mpi_get_buffer(MPI a
, unsigned *nbytes
, int *sign
)
324 buf
= kmalloc(n
, GFP_KERNEL
);
329 ret
= mpi_read_buffer(a
, buf
, n
, nbytes
, sign
);
337 EXPORT_SYMBOL_GPL(mpi_get_buffer
);
340 * mpi_write_to_sgl() - Funnction exports MPI to an sgl (msb first)
342 * This function works in the same way as the mpi_read_buffer, but it
343 * takes an sgl instead of u8 * buf.
345 * @a: a multi precision integer
346 * @sgl: scatterlist to write to. Needs to be at least
347 * mpi_get_size(a) long.
348 * @nbytes: the number of bytes to write. Leading bytes will be
350 * @sign: if not NULL, it will be set to the sign of a.
352 * Return: 0 on success or error code in case of error
354 int mpi_write_to_sgl(MPI a
, struct scatterlist
*sgl
, unsigned nbytes
,
358 #if BYTES_PER_MPI_LIMB == 4
360 #elif BYTES_PER_MPI_LIMB == 8
363 #error please implement for this limb size.
365 unsigned int n
= mpi_get_size(a
);
366 struct sg_mapping_iter miter
;
376 nents
= sg_nents_for_len(sgl
, nbytes
);
380 sg_miter_start(&miter
, sgl
, nents
, SG_MITER_ATOMIC
| SG_MITER_TO_SG
);
381 sg_miter_next(&miter
);
382 buf_len
= miter
.length
;
386 i
= min_t(unsigned, nbytes
- n
, buf_len
);
393 sg_miter_next(&miter
);
394 buf_len
= miter
.length
;
399 for (i
= a
->nlimbs
- 1; i
>= 0; i
--) {
400 #if BYTES_PER_MPI_LIMB == 4
401 alimb
= a
->d
[i
] ? cpu_to_be32(a
->d
[i
]) : 0;
402 #elif BYTES_PER_MPI_LIMB == 8
403 alimb
= a
->d
[i
] ? cpu_to_be64(a
->d
[i
]) : 0;
405 #error please implement for this limb size.
409 for (x
= 0; x
< sizeof(alimb
); x
++) {
412 sg_miter_next(&miter
);
413 buf_len
= miter
.length
;
419 sg_miter_stop(&miter
);
422 EXPORT_SYMBOL_GPL(mpi_write_to_sgl
);
425 * mpi_read_raw_from_sgl() - Function allocates an MPI and populates it with
428 * This function works in the same way as the mpi_read_raw_data, but it
429 * takes an sgl instead of void * buffer. i.e. it allocates
430 * a new MPI and reads the content of the sgl to the MPI.
432 * @sgl: scatterlist to read from
433 * @nbytes: number of bytes to read
435 * Return: Pointer to a new MPI or NULL on error
437 MPI
mpi_read_raw_from_sgl(struct scatterlist
*sgl
, unsigned int nbytes
)
439 struct sg_mapping_iter miter
;
440 unsigned int nbits
, nlimbs
;
441 int x
, j
, z
, lzeros
, ents
;
447 ents
= sg_nents_for_len(sgl
, nbytes
);
451 sg_miter_start(&miter
, sgl
, ents
, SG_MITER_ATOMIC
| SG_MITER_FROM_SG
);
456 while (len
&& !*buff
) {
465 sg_miter_next(&miter
);
473 miter
.consumed
= lzeros
;
477 if (nbits
> MAX_EXTERN_MPI_BITS
) {
478 sg_miter_stop(&miter
);
479 pr_info("MPI: mpi too large (%u bits)\n", nbits
);
484 nbits
-= count_leading_zeros(*buff
) - (BITS_PER_LONG
- 8);
486 sg_miter_stop(&miter
);
488 nlimbs
= DIV_ROUND_UP(nbytes
, BYTES_PER_MPI_LIMB
);
489 val
= mpi_alloc(nlimbs
);
495 val
->nlimbs
= nlimbs
;
502 z
= BYTES_PER_MPI_LIMB
- nbytes
% BYTES_PER_MPI_LIMB
;
503 z
%= BYTES_PER_MPI_LIMB
;
505 while (sg_miter_next(&miter
)) {
509 for (x
= 0; x
< len
; x
++) {
512 if (((z
+ x
+ 1) % BYTES_PER_MPI_LIMB
) == 0) {
522 EXPORT_SYMBOL_GPL(mpi_read_raw_from_sgl
);
524 /* Perform a two's complement operation on buffer P of size N bytes. */
525 static void twocompl(unsigned char *p
, unsigned int n
)
529 for (i
= n
-1; i
>= 0 && !p
[i
]; i
--)
533 p
[i
] = (((p
[i
] ^ 0xfe) | 0x01) & 0xff);
534 else if ((p
[i
] & 0x02))
535 p
[i
] = (((p
[i
] ^ 0xfc) | 0x02) & 0xfe);
536 else if ((p
[i
] & 0x04))
537 p
[i
] = (((p
[i
] ^ 0xf8) | 0x04) & 0xfc);
538 else if ((p
[i
] & 0x08))
539 p
[i
] = (((p
[i
] ^ 0xf0) | 0x08) & 0xf8);
540 else if ((p
[i
] & 0x10))
541 p
[i
] = (((p
[i
] ^ 0xe0) | 0x10) & 0xf0);
542 else if ((p
[i
] & 0x20))
543 p
[i
] = (((p
[i
] ^ 0xc0) | 0x20) & 0xe0);
544 else if ((p
[i
] & 0x40))
545 p
[i
] = (((p
[i
] ^ 0x80) | 0x40) & 0xc0);
549 for (i
--; i
>= 0; i
--)
554 int mpi_print(enum gcry_mpi_format format
, unsigned char *buffer
,
555 size_t buflen
, size_t *nwritten
, MPI a
)
557 unsigned int nbits
= mpi_get_nbits(a
);
559 size_t dummy_nwritten
;
563 nwritten
= &dummy_nwritten
;
565 /* Libgcrypt does no always care to set clear the sign if the value
566 * is 0. For printing this is a bit of a surprise, in particular
567 * because if some of the formats don't support negative numbers but
568 * should be able to print a zero. Thus we need this extra test
569 * for a negative number.
571 if (a
->sign
&& mpi_cmp_ui(a
, 0))
578 if (format
== GCRYMPI_FMT_STD
) {
583 tmp
= mpi_get_buffer(a
, &n
, NULL
);
589 if (!(*tmp
& 0x80)) {
590 /* Need to extend the sign. */
594 } else if (n
&& (*tmp
& 0x80)) {
595 /* Positive but the high bit of the returned buffer is set.
596 * Thus we need to print an extra leading 0x00 so that the
597 * output is interpreted as a positive number.
603 if (buffer
&& n
> len
) {
604 /* The provided buffer is too short. */
609 unsigned char *s
= buffer
;
615 memcpy(s
, tmp
, n
-!!extra
);
620 } else if (format
== GCRYMPI_FMT_USG
) {
621 unsigned int n
= (nbits
+ 7)/8;
623 /* Note: We ignore the sign for this format. */
624 /* FIXME: for performance reasons we should put this into
625 * mpi_aprint because we can then use the buffer directly.
628 if (buffer
&& n
> len
)
633 tmp
= mpi_get_buffer(a
, &n
, NULL
);
636 memcpy(buffer
, tmp
, n
);
641 } else if (format
== GCRYMPI_FMT_PGP
) {
642 unsigned int n
= (nbits
+ 7)/8;
644 /* The PGP format can only handle unsigned integers. */
648 if (buffer
&& n
+2 > len
)
653 unsigned char *s
= buffer
;
658 tmp
= mpi_get_buffer(a
, &n
, NULL
);
666 } else if (format
== GCRYMPI_FMT_SSH
) {
671 tmp
= mpi_get_buffer(a
, &n
, NULL
);
677 if (!(*tmp
& 0x80)) {
678 /* Need to extend the sign. */
682 } else if (n
&& (*tmp
& 0x80)) {
687 if (buffer
&& n
+4 > len
) {
693 unsigned char *s
= buffer
;
703 memcpy(s
, tmp
, n
-!!extra
);
708 } else if (format
== GCRYMPI_FMT_HEX
) {
714 tmp
= mpi_get_buffer(a
, &n
, NULL
);
717 if (!n
|| (*tmp
& 0x80))
720 if (buffer
&& 2*n
+ extra
+ negative
+ 1 > len
) {
725 unsigned char *s
= buffer
;
734 for (i
= 0; i
< n
; i
++) {
735 unsigned int c
= tmp
[i
];
737 *s
++ = (c
>> 4) < 10 ? '0'+(c
>>4) : 'A'+(c
>>4)-10;
739 *s
++ = c
< 10 ? '0'+c
: 'A'+c
-10;
742 *nwritten
= s
- buffer
;
744 *nwritten
= 2*n
+ extra
+ negative
+ 1;
751 EXPORT_SYMBOL_GPL(mpi_print
);