diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Kconfig | 7 | ||||
| -rw-r--r-- | lib/Makefile | 2 | ||||
| -rw-r--r-- | lib/bug.c | 2 | ||||
| -rw-r--r-- | lib/clz_tab.c | 18 | ||||
| -rw-r--r-- | lib/digsig.c | 52 | ||||
| -rw-r--r-- | lib/kstrtox.c | 18 | ||||
| -rw-r--r-- | lib/mpi/longlong.h | 44 | ||||
| -rw-r--r-- | lib/mpi/mpi-bit.c | 19 | ||||
| -rw-r--r-- | lib/mpi/mpi-div.c | 5 | ||||
| -rw-r--r-- | lib/mpi/mpi-pow.c | 2 | ||||
| -rw-r--r-- | lib/mpi/mpicoder.c | 91 | ||||
| -rw-r--r-- | lib/mpi/mpih-div.c | 4 | ||||
| -rw-r--r-- | lib/mpi/mpiutil.c | 5 | ||||
| -rw-r--r-- | lib/pci_iomap.c | 2 |
14 files changed, 114 insertions, 157 deletions
diff --git a/lib/Kconfig b/lib/Kconfig index 169eb7c598e5..028aba9e72af 100644 --- a/lib/Kconfig +++ b/lib/Kconfig | |||
| @@ -19,6 +19,9 @@ config RATIONAL | |||
| 19 | config GENERIC_FIND_FIRST_BIT | 19 | config GENERIC_FIND_FIRST_BIT |
| 20 | bool | 20 | bool |
| 21 | 21 | ||
| 22 | config NO_GENERIC_PCI_IOPORT_MAP | ||
| 23 | bool | ||
| 24 | |||
| 22 | config GENERIC_PCI_IOMAP | 25 | config GENERIC_PCI_IOMAP |
| 23 | bool | 26 | bool |
| 24 | 27 | ||
| @@ -279,6 +282,9 @@ config AVERAGE | |||
| 279 | 282 | ||
| 280 | If unsure, say N. | 283 | If unsure, say N. |
| 281 | 284 | ||
| 285 | config CLZ_TAB | ||
| 286 | bool | ||
| 287 | |||
| 282 | config CORDIC | 288 | config CORDIC |
| 283 | tristate "CORDIC algorithm" | 289 | tristate "CORDIC algorithm" |
| 284 | help | 290 | help |
| @@ -287,6 +293,7 @@ config CORDIC | |||
| 287 | 293 | ||
| 288 | config MPILIB | 294 | config MPILIB |
| 289 | tristate | 295 | tristate |
| 296 | select CLZ_TAB | ||
| 290 | help | 297 | help |
| 291 | Multiprecision maths library from GnuPG. | 298 | Multiprecision maths library from GnuPG. |
| 292 | It is used to implement RSA digital signature verification, | 299 | It is used to implement RSA digital signature verification, |
diff --git a/lib/Makefile b/lib/Makefile index d71aae1b01b3..18515f0267c4 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
| @@ -121,6 +121,8 @@ obj-$(CONFIG_DQL) += dynamic_queue_limits.o | |||
| 121 | obj-$(CONFIG_MPILIB) += mpi/ | 121 | obj-$(CONFIG_MPILIB) += mpi/ |
| 122 | obj-$(CONFIG_SIGNATURE) += digsig.o | 122 | obj-$(CONFIG_SIGNATURE) += digsig.o |
| 123 | 123 | ||
| 124 | obj-$(CONFIG_CLZ_TAB) += clz_tab.o | ||
| 125 | |||
| 124 | hostprogs-y := gen_crc32table | 126 | hostprogs-y := gen_crc32table |
| 125 | clean-files := crc32table.h | 127 | clean-files := crc32table.h |
| 126 | 128 | ||
| @@ -169,7 +169,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs) | |||
| 169 | return BUG_TRAP_TYPE_WARN; | 169 | return BUG_TRAP_TYPE_WARN; |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | printk(KERN_EMERG "------------[ cut here ]------------\n"); | 172 | printk(KERN_DEFAULT "------------[ cut here ]------------\n"); |
| 173 | 173 | ||
| 174 | if (file) | 174 | if (file) |
| 175 | printk(KERN_CRIT "kernel BUG at %s:%u!\n", | 175 | printk(KERN_CRIT "kernel BUG at %s:%u!\n", |
diff --git a/lib/clz_tab.c b/lib/clz_tab.c new file mode 100644 index 000000000000..7287b4a991a7 --- /dev/null +++ b/lib/clz_tab.c | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | const unsigned char __clz_tab[] = { | ||
| 2 | 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, | ||
| 3 | 5, 5, 5, 5, 5, 5, 5, 5, | ||
| 4 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | ||
| 5 | 6, 6, 6, 6, 6, 6, 6, 6, | ||
| 6 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
| 7 | 7, 7, 7, 7, 7, 7, 7, 7, | ||
| 8 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
| 9 | 7, 7, 7, 7, 7, 7, 7, 7, | ||
| 10 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 11 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 12 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 13 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 14 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 15 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 16 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 17 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 18 | }; | ||
diff --git a/lib/digsig.c b/lib/digsig.c index fd2402f67f89..286d558033e2 100644 --- a/lib/digsig.c +++ b/lib/digsig.c | |||
| @@ -34,14 +34,9 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg, | |||
| 34 | unsigned long msglen, | 34 | unsigned long msglen, |
| 35 | unsigned long modulus_bitlen, | 35 | unsigned long modulus_bitlen, |
| 36 | unsigned char *out, | 36 | unsigned char *out, |
| 37 | unsigned long *outlen, | 37 | unsigned long *outlen) |
| 38 | int *is_valid) | ||
| 39 | { | 38 | { |
| 40 | unsigned long modulus_len, ps_len, i; | 39 | unsigned long modulus_len, ps_len, i; |
| 41 | int result; | ||
| 42 | |||
| 43 | /* default to invalid packet */ | ||
| 44 | *is_valid = 0; | ||
| 45 | 40 | ||
| 46 | modulus_len = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0); | 41 | modulus_len = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0); |
| 47 | 42 | ||
| @@ -50,39 +45,30 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg, | |||
| 50 | return -EINVAL; | 45 | return -EINVAL; |
| 51 | 46 | ||
| 52 | /* separate encoded message */ | 47 | /* separate encoded message */ |
| 53 | if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) { | 48 | if ((msg[0] != 0x00) || (msg[1] != (unsigned char)1)) |
| 54 | result = -EINVAL; | 49 | return -EINVAL; |
| 55 | goto bail; | ||
| 56 | } | ||
| 57 | 50 | ||
| 58 | for (i = 2; i < modulus_len - 1; i++) | 51 | for (i = 2; i < modulus_len - 1; i++) |
| 59 | if (msg[i] != 0xFF) | 52 | if (msg[i] != 0xFF) |
| 60 | break; | 53 | break; |
| 61 | 54 | ||
| 62 | /* separator check */ | 55 | /* separator check */ |
| 63 | if (msg[i] != 0) { | 56 | if (msg[i] != 0) |
| 64 | /* There was no octet with hexadecimal value 0x00 | 57 | /* There was no octet with hexadecimal value 0x00 |
| 65 | to separate ps from m. */ | 58 | to separate ps from m. */ |
| 66 | result = -EINVAL; | 59 | return -EINVAL; |
| 67 | goto bail; | ||
| 68 | } | ||
| 69 | 60 | ||
| 70 | ps_len = i - 2; | 61 | ps_len = i - 2; |
| 71 | 62 | ||
| 72 | if (*outlen < (msglen - (2 + ps_len + 1))) { | 63 | if (*outlen < (msglen - (2 + ps_len + 1))) { |
| 73 | *outlen = msglen - (2 + ps_len + 1); | 64 | *outlen = msglen - (2 + ps_len + 1); |
| 74 | result = -EOVERFLOW; | 65 | return -EOVERFLOW; |
| 75 | goto bail; | ||
| 76 | } | 66 | } |
| 77 | 67 | ||
| 78 | *outlen = (msglen - (2 + ps_len + 1)); | 68 | *outlen = (msglen - (2 + ps_len + 1)); |
| 79 | memcpy(out, &msg[2 + ps_len + 1], *outlen); | 69 | memcpy(out, &msg[2 + ps_len + 1], *outlen); |
| 80 | 70 | ||
| 81 | /* valid packet */ | 71 | return 0; |
| 82 | *is_valid = 1; | ||
| 83 | result = 0; | ||
| 84 | bail: | ||
| 85 | return result; | ||
| 86 | } | 72 | } |
| 87 | 73 | ||
| 88 | /* | 74 | /* |
| @@ -96,7 +82,7 @@ static int digsig_verify_rsa(struct key *key, | |||
| 96 | unsigned long len; | 82 | unsigned long len; |
| 97 | unsigned long mlen, mblen; | 83 | unsigned long mlen, mblen; |
| 98 | unsigned nret, l; | 84 | unsigned nret, l; |
| 99 | int valid, head, i; | 85 | int head, i; |
| 100 | unsigned char *out1 = NULL, *out2 = NULL; | 86 | unsigned char *out1 = NULL, *out2 = NULL; |
| 101 | MPI in = NULL, res = NULL, pkey[2]; | 87 | MPI in = NULL, res = NULL, pkey[2]; |
| 102 | uint8_t *p, *datap, *endp; | 88 | uint8_t *p, *datap, *endp; |
| @@ -105,6 +91,10 @@ static int digsig_verify_rsa(struct key *key, | |||
| 105 | 91 | ||
| 106 | down_read(&key->sem); | 92 | down_read(&key->sem); |
| 107 | ukp = key->payload.data; | 93 | ukp = key->payload.data; |
| 94 | |||
| 95 | if (ukp->datalen < sizeof(*pkh)) | ||
| 96 | goto err1; | ||
| 97 | |||
| 108 | pkh = (struct pubkey_hdr *)ukp->data; | 98 | pkh = (struct pubkey_hdr *)ukp->data; |
| 109 | 99 | ||
| 110 | if (pkh->version != 1) | 100 | if (pkh->version != 1) |
| @@ -117,18 +107,23 @@ static int digsig_verify_rsa(struct key *key, | |||
| 117 | goto err1; | 107 | goto err1; |
| 118 | 108 | ||
| 119 | datap = pkh->mpi; | 109 | datap = pkh->mpi; |
| 120 | endp = datap + ukp->datalen; | 110 | endp = ukp->data + ukp->datalen; |
| 111 | |||
| 112 | err = -ENOMEM; | ||
| 121 | 113 | ||
| 122 | for (i = 0; i < pkh->nmpi; i++) { | 114 | for (i = 0; i < pkh->nmpi; i++) { |
| 123 | unsigned int remaining = endp - datap; | 115 | unsigned int remaining = endp - datap; |
| 124 | pkey[i] = mpi_read_from_buffer(datap, &remaining); | 116 | pkey[i] = mpi_read_from_buffer(datap, &remaining); |
| 117 | if (!pkey[i]) | ||
| 118 | goto err; | ||
| 125 | datap += remaining; | 119 | datap += remaining; |
| 126 | } | 120 | } |
| 127 | 121 | ||
| 128 | mblen = mpi_get_nbits(pkey[0]); | 122 | mblen = mpi_get_nbits(pkey[0]); |
| 129 | mlen = (mblen + 7)/8; | 123 | mlen = (mblen + 7)/8; |
| 130 | 124 | ||
| 131 | err = -ENOMEM; | 125 | if (mlen == 0) |
| 126 | goto err; | ||
| 132 | 127 | ||
| 133 | out1 = kzalloc(mlen, GFP_KERNEL); | 128 | out1 = kzalloc(mlen, GFP_KERNEL); |
| 134 | if (!out1) | 129 | if (!out1) |
| @@ -167,10 +162,9 @@ static int digsig_verify_rsa(struct key *key, | |||
| 167 | memset(out1, 0, head); | 162 | memset(out1, 0, head); |
| 168 | memcpy(out1 + head, p, l); | 163 | memcpy(out1 + head, p, l); |
| 169 | 164 | ||
| 170 | err = -EINVAL; | 165 | err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); |
| 171 | pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len, &valid); | ||
| 172 | 166 | ||
| 173 | if (valid && len == hlen) | 167 | if (!err && len == hlen) |
| 174 | err = memcmp(out2, h, hlen); | 168 | err = memcmp(out2, h, hlen); |
| 175 | 169 | ||
| 176 | err: | 170 | err: |
| @@ -178,8 +172,8 @@ err: | |||
| 178 | mpi_free(res); | 172 | mpi_free(res); |
| 179 | kfree(out1); | 173 | kfree(out1); |
| 180 | kfree(out2); | 174 | kfree(out2); |
| 181 | mpi_free(pkey[0]); | 175 | while (--i >= 0) |
| 182 | mpi_free(pkey[1]); | 176 | mpi_free(pkey[i]); |
| 183 | err1: | 177 | err1: |
| 184 | up_read(&key->sem); | 178 | up_read(&key->sem); |
| 185 | 179 | ||
diff --git a/lib/kstrtox.c b/lib/kstrtox.c index 7a94c8f14e29..b1dd3e7d88cb 100644 --- a/lib/kstrtox.c +++ b/lib/kstrtox.c | |||
| @@ -44,12 +44,13 @@ const char *_parse_integer_fixup_radix(const char *s, unsigned int *base) | |||
| 44 | * | 44 | * |
| 45 | * Don't you dare use this function. | 45 | * Don't you dare use this function. |
| 46 | */ | 46 | */ |
| 47 | unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *res) | 47 | unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p) |
| 48 | { | 48 | { |
| 49 | unsigned long long res; | ||
| 49 | unsigned int rv; | 50 | unsigned int rv; |
| 50 | int overflow; | 51 | int overflow; |
| 51 | 52 | ||
| 52 | *res = 0; | 53 | res = 0; |
| 53 | rv = 0; | 54 | rv = 0; |
| 54 | overflow = 0; | 55 | overflow = 0; |
| 55 | while (*s) { | 56 | while (*s) { |
| @@ -64,12 +65,19 @@ unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long | |||
| 64 | 65 | ||
| 65 | if (val >= base) | 66 | if (val >= base) |
| 66 | break; | 67 | break; |
| 67 | if (*res > div_u64(ULLONG_MAX - val, base)) | 68 | /* |
| 68 | overflow = 1; | 69 | * Check for overflow only if we are within range of |
| 69 | *res = *res * base + val; | 70 | * it in the max base we support (16) |
| 71 | */ | ||
| 72 | if (unlikely(res & (~0ull << 60))) { | ||
| 73 | if (res > div_u64(ULLONG_MAX - val, base)) | ||
| 74 | overflow = 1; | ||
| 75 | } | ||
| 76 | res = res * base + val; | ||
| 70 | rv++; | 77 | rv++; |
| 71 | s++; | 78 | s++; |
| 72 | } | 79 | } |
| 80 | *p = res; | ||
| 73 | if (overflow) | 81 | if (overflow) |
| 74 | rv |= KSTRTOX_OVERFLOW; | 82 | rv |= KSTRTOX_OVERFLOW; |
| 75 | return rv; | 83 | return rv; |
diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h index b87487b40a8b..29f98624ef93 100644 --- a/lib/mpi/longlong.h +++ b/lib/mpi/longlong.h | |||
| @@ -1200,18 +1200,40 @@ do { \ | |||
| 1200 | "r" ((USItype)(v)) \ | 1200 | "r" ((USItype)(v)) \ |
| 1201 | : "%g1", "%g2" __AND_CLOBBER_CC) | 1201 | : "%g1", "%g2" __AND_CLOBBER_CC) |
| 1202 | #define UMUL_TIME 39 /* 39 instructions */ | 1202 | #define UMUL_TIME 39 /* 39 instructions */ |
| 1203 | #endif | 1203 | /* It's quite necessary to add this much assembler for the sparc. |
| 1204 | #ifndef udiv_qrnnd | 1204 | The default udiv_qrnnd (in C) is more than 10 times slower! */ |
| 1205 | #ifndef LONGLONG_STANDALONE | ||
| 1206 | #define udiv_qrnnd(q, r, n1, n0, d) \ | 1205 | #define udiv_qrnnd(q, r, n1, n0, d) \ |
| 1207 | do { USItype __r; \ | 1206 | __asm__ ("! Inlined udiv_qrnnd\n\t" \ |
| 1208 | (q) = __udiv_qrnnd(&__r, (n1), (n0), (d)); \ | 1207 | "mov 32,%%g1\n\t" \ |
| 1209 | (r) = __r; \ | 1208 | "subcc %1,%2,%%g0\n\t" \ |
| 1210 | } while (0) | 1209 | "1: bcs 5f\n\t" \ |
| 1211 | extern USItype __udiv_qrnnd(); | 1210 | "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \ |
| 1212 | #define UDIV_TIME 140 | 1211 | "sub %1,%2,%1 ! this kills msb of n\n\t" \ |
| 1213 | #endif /* LONGLONG_STANDALONE */ | 1212 | "addx %1,%1,%1 ! so this can't give carry\n\t" \ |
| 1214 | #endif /* udiv_qrnnd */ | 1213 | "subcc %%g1,1,%%g1\n\t" \ |
| 1214 | "2: bne 1b\n\t" \ | ||
| 1215 | "subcc %1,%2,%%g0\n\t" \ | ||
| 1216 | "bcs 3f\n\t" \ | ||
| 1217 | "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \ | ||
| 1218 | "b 3f\n\t" \ | ||
| 1219 | "sub %1,%2,%1 ! this kills msb of n\n\t" \ | ||
| 1220 | "4: sub %1,%2,%1\n\t" \ | ||
| 1221 | "5: addxcc %1,%1,%1\n\t" \ | ||
| 1222 | "bcc 2b\n\t" \ | ||
| 1223 | "subcc %%g1,1,%%g1\n\t" \ | ||
| 1224 | "! Got carry from n. Subtract next step to cancel this carry.\n\t" \ | ||
| 1225 | "bne 4b\n\t" \ | ||
| 1226 | "addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n\t" \ | ||
| 1227 | "sub %1,%2,%1\n\t" \ | ||
| 1228 | "3: xnor %0,0,%0\n\t" \ | ||
| 1229 | "! End of inline udiv_qrnnd\n" \ | ||
| 1230 | : "=&r" ((USItype)(q)), \ | ||
| 1231 | "=&r" ((USItype)(r)) \ | ||
| 1232 | : "r" ((USItype)(d)), \ | ||
| 1233 | "1" ((USItype)(n1)), \ | ||
| 1234 | "0" ((USItype)(n0)) : "%g1", "cc") | ||
| 1235 | #define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */ | ||
| 1236 | #endif | ||
| 1215 | #endif /* __sparc__ */ | 1237 | #endif /* __sparc__ */ |
| 1216 | 1238 | ||
| 1217 | /*************************************** | 1239 | /*************************************** |
diff --git a/lib/mpi/mpi-bit.c b/lib/mpi/mpi-bit.c index 854c9c6da025..2f526627e4f5 100644 --- a/lib/mpi/mpi-bit.c +++ b/lib/mpi/mpi-bit.c | |||
| @@ -21,25 +21,6 @@ | |||
| 21 | #include "mpi-internal.h" | 21 | #include "mpi-internal.h" |
| 22 | #include "longlong.h" | 22 | #include "longlong.h" |
| 23 | 23 | ||
| 24 | const unsigned char __clz_tab[] = { | ||
| 25 | 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, | ||
| 26 | 5, 5, 5, 5, 5, 5, 5, 5, | ||
| 27 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | ||
| 28 | 6, 6, 6, 6, 6, 6, 6, 6, | ||
| 29 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
| 30 | 7, 7, 7, 7, 7, 7, 7, 7, | ||
| 31 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
| 32 | 7, 7, 7, 7, 7, 7, 7, 7, | ||
| 33 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 34 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 35 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 36 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 37 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 38 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 39 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 40 | 8, 8, 8, 8, 8, 8, 8, 8, | ||
| 41 | }; | ||
| 42 | |||
| 43 | #define A_LIMB_1 ((mpi_limb_t) 1) | 24 | #define A_LIMB_1 ((mpi_limb_t) 1) |
| 44 | 25 | ||
| 45 | /**************** | 26 | /**************** |
diff --git a/lib/mpi/mpi-div.c b/lib/mpi/mpi-div.c index c3087d1390ce..f68cbbb4d4a4 100644 --- a/lib/mpi/mpi-div.c +++ b/lib/mpi/mpi-div.c | |||
| @@ -149,6 +149,9 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den) | |||
| 149 | mpi_ptr_t marker[5]; | 149 | mpi_ptr_t marker[5]; |
| 150 | int markidx = 0; | 150 | int markidx = 0; |
| 151 | 151 | ||
| 152 | if (!dsize) | ||
| 153 | return -EINVAL; | ||
| 154 | |||
| 152 | memset(marker, 0, sizeof(marker)); | 155 | memset(marker, 0, sizeof(marker)); |
| 153 | 156 | ||
| 154 | /* Ensure space is enough for quotient and remainder. | 157 | /* Ensure space is enough for quotient and remainder. |
| @@ -207,6 +210,8 @@ int mpi_tdiv_qr(MPI quot, MPI rem, MPI num, MPI den) | |||
| 207 | * numerator would be gradually overwritten by the quotient limbs. */ | 210 | * numerator would be gradually overwritten by the quotient limbs. */ |
| 208 | if (qp == np) { /* Copy NP object to temporary space. */ | 211 | if (qp == np) { /* Copy NP object to temporary space. */ |
| 209 | np = marker[markidx++] = mpi_alloc_limb_space(nsize); | 212 | np = marker[markidx++] = mpi_alloc_limb_space(nsize); |
| 213 | if (!np) | ||
| 214 | goto nomem; | ||
| 210 | MPN_COPY(np, qp, nsize); | 215 | MPN_COPY(np, qp, nsize); |
| 211 | } | 216 | } |
| 212 | } else /* Put quotient at top of remainder. */ | 217 | } else /* Put quotient at top of remainder. */ |
diff --git a/lib/mpi/mpi-pow.c b/lib/mpi/mpi-pow.c index b04a3cf80080..67f3e79af914 100644 --- a/lib/mpi/mpi-pow.c +++ b/lib/mpi/mpi-pow.c | |||
| @@ -59,7 +59,7 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod) | |||
| 59 | ep = exp->d; | 59 | ep = exp->d; |
| 60 | 60 | ||
| 61 | if (!msize) | 61 | if (!msize) |
| 62 | msize = 1 / msize; /* provoke a signal */ | 62 | return -EINVAL; |
| 63 | 63 | ||
| 64 | if (!esize) { | 64 | if (!esize) { |
| 65 | /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 | 65 | /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 |
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index 716802b774ea..f26b41fcb48c 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c | |||
| @@ -20,78 +20,15 @@ | |||
| 20 | 20 | ||
| 21 | #include "mpi-internal.h" | 21 | #include "mpi-internal.h" |
| 22 | 22 | ||
| 23 | #define DIM(v) (sizeof(v)/sizeof((v)[0])) | ||
| 24 | #define MAX_EXTERN_MPI_BITS 16384 | 23 | #define MAX_EXTERN_MPI_BITS 16384 |
| 25 | 24 | ||
| 26 | static uint8_t asn[15] = /* Object ID is 1.3.14.3.2.26 */ | ||
| 27 | { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, | ||
| 28 | 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 | ||
| 29 | }; | ||
| 30 | |||
| 31 | MPI do_encode_md(const void *sha_buffer, unsigned nbits) | ||
| 32 | { | ||
| 33 | int nframe = (nbits + 7) / 8; | ||
| 34 | uint8_t *frame, *fr_pt; | ||
| 35 | int i = 0, n; | ||
| 36 | size_t asnlen = DIM(asn); | ||
| 37 | MPI a = MPI_NULL; | ||
| 38 | |||
| 39 | if (SHA1_DIGEST_LENGTH + asnlen + 4 > nframe) | ||
| 40 | pr_info("MPI: can't encode a %d bit MD into a %d bits frame\n", | ||
| 41 | (int)(SHA1_DIGEST_LENGTH * 8), (int)nbits); | ||
| 42 | |||
| 43 | /* We encode the MD in this way: | ||
| 44 | * | ||
| 45 | * 0 A PAD(n bytes) 0 ASN(asnlen bytes) MD(len bytes) | ||
| 46 | * | ||
| 47 | * PAD consists of FF bytes. | ||
| 48 | */ | ||
| 49 | frame = kmalloc(nframe, GFP_KERNEL); | ||
| 50 | if (!frame) | ||
| 51 | return MPI_NULL; | ||
| 52 | n = 0; | ||
| 53 | frame[n++] = 0; | ||
| 54 | frame[n++] = 1; /* block type */ | ||
| 55 | i = nframe - SHA1_DIGEST_LENGTH - asnlen - 3; | ||
| 56 | |||
| 57 | if (i <= 1) { | ||
| 58 | pr_info("MPI: message digest encoding failed\n"); | ||
| 59 | kfree(frame); | ||
| 60 | return a; | ||
| 61 | } | ||
| 62 | |||
| 63 | memset(frame + n, 0xff, i); | ||
| 64 | n += i; | ||
| 65 | frame[n++] = 0; | ||
| 66 | memcpy(frame + n, &asn, asnlen); | ||
| 67 | n += asnlen; | ||
| 68 | memcpy(frame + n, sha_buffer, SHA1_DIGEST_LENGTH); | ||
| 69 | n += SHA1_DIGEST_LENGTH; | ||
| 70 | |||
| 71 | i = nframe; | ||
| 72 | fr_pt = frame; | ||
| 73 | |||
| 74 | if (n != nframe) { | ||
| 75 | printk | ||
| 76 | ("MPI: message digest encoding failed, frame length is wrong\n"); | ||
| 77 | kfree(frame); | ||
| 78 | return a; | ||
| 79 | } | ||
| 80 | |||
| 81 | a = mpi_alloc((nframe + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB); | ||
| 82 | mpi_set_buffer(a, frame, nframe, 0); | ||
| 83 | kfree(frame); | ||
| 84 | |||
| 85 | return a; | ||
| 86 | } | ||
| 87 | |||
| 88 | MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread) | 25 | MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread) |
| 89 | { | 26 | { |
| 90 | const uint8_t *buffer = xbuffer; | 27 | const uint8_t *buffer = xbuffer; |
| 91 | int i, j; | 28 | int i, j; |
| 92 | unsigned nbits, nbytes, nlimbs, nread = 0; | 29 | unsigned nbits, nbytes, nlimbs, nread = 0; |
| 93 | mpi_limb_t a; | 30 | mpi_limb_t a; |
| 94 | MPI val = MPI_NULL; | 31 | MPI val = NULL; |
| 95 | 32 | ||
| 96 | if (*ret_nread < 2) | 33 | if (*ret_nread < 2) |
| 97 | goto leave; | 34 | goto leave; |
| @@ -108,7 +45,7 @@ MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread) | |||
| 108 | nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; | 45 | nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB; |
| 109 | val = mpi_alloc(nlimbs); | 46 | val = mpi_alloc(nlimbs); |
| 110 | if (!val) | 47 | if (!val) |
| 111 | return MPI_NULL; | 48 | return NULL; |
| 112 | i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB; | 49 | i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB; |
| 113 | i %= BYTES_PER_MPI_LIMB; | 50 | i %= BYTES_PER_MPI_LIMB; |
| 114 | val->nbits = nbits; | 51 | val->nbits = nbits; |
| @@ -212,30 +149,6 @@ int mpi_fromstr(MPI val, const char *str) | |||
| 212 | EXPORT_SYMBOL_GPL(mpi_fromstr); | 149 | EXPORT_SYMBOL_GPL(mpi_fromstr); |
| 213 | 150 | ||
| 214 | /**************** | 151 | /**************** |
| 215 | * Special function to get the low 8 bytes from an mpi. | ||
| 216 | * This can be used as a keyid; KEYID is an 2 element array. | ||
| 217 | * Return the low 4 bytes. | ||
| 218 | */ | ||
| 219 | u32 mpi_get_keyid(const MPI a, u32 *keyid) | ||
| 220 | { | ||
| 221 | #if BYTES_PER_MPI_LIMB == 4 | ||
| 222 | if (keyid) { | ||
| 223 | keyid[0] = a->nlimbs >= 2 ? a->d[1] : 0; | ||
| 224 | keyid[1] = a->nlimbs >= 1 ? a->d[0] : 0; | ||
| 225 | } | ||
| 226 | return a->nlimbs >= 1 ? a->d[0] : 0; | ||
| 227 | #elif BYTES_PER_MPI_LIMB == 8 | ||
| 228 | if (keyid) { | ||
| 229 | keyid[0] = a->nlimbs ? (u32) (a->d[0] >> 32) : 0; | ||
| 230 | keyid[1] = a->nlimbs ? (u32) (a->d[0] & 0xffffffff) : 0; | ||
| 231 | } | ||
| 232 | return a->nlimbs ? (u32) (a->d[0] & 0xffffffff) : 0; | ||
| 233 | #else | ||
| 234 | #error Make this function work with other LIMB sizes | ||
| 235 | #endif | ||
| 236 | } | ||
| 237 | |||
| 238 | /**************** | ||
| 239 | * Return an allocated buffer with the MPI (msb first). | 152 | * Return an allocated buffer with the MPI (msb first). |
| 240 | * NBYTES receives the length of this buffer. Caller must free the | 153 | * NBYTES receives the length of this buffer. Caller must free the |
| 241 | * return string (This function does return a 0 byte buffer with NBYTES | 154 | * return string (This function does return a 0 byte buffer with NBYTES |
diff --git a/lib/mpi/mpih-div.c b/lib/mpi/mpih-div.c index 87ede162dfab..cde1aaec18da 100644 --- a/lib/mpi/mpih-div.c +++ b/lib/mpi/mpih-div.c | |||
| @@ -217,6 +217,10 @@ mpihelp_divrem(mpi_ptr_t qp, mpi_size_t qextra_limbs, | |||
| 217 | case 0: | 217 | case 0: |
| 218 | /* We are asked to divide by zero, so go ahead and do it! (To make | 218 | /* We are asked to divide by zero, so go ahead and do it! (To make |
| 219 | the compiler not remove this statement, return the value.) */ | 219 | the compiler not remove this statement, return the value.) */ |
| 220 | /* | ||
| 221 | * existing clients of this function have been modified | ||
| 222 | * not to call it with dsize == 0, so this should not happen | ||
| 223 | */ | ||
| 220 | return 1 / dsize; | 224 | return 1 / dsize; |
| 221 | 225 | ||
| 222 | case 1: | 226 | case 1: |
diff --git a/lib/mpi/mpiutil.c b/lib/mpi/mpiutil.c index eefc55d6b7f5..26e4ed31e256 100644 --- a/lib/mpi/mpiutil.c +++ b/lib/mpi/mpiutil.c | |||
| @@ -58,6 +58,9 @@ mpi_ptr_t mpi_alloc_limb_space(unsigned nlimbs) | |||
| 58 | { | 58 | { |
| 59 | size_t len = nlimbs * sizeof(mpi_limb_t); | 59 | size_t len = nlimbs * sizeof(mpi_limb_t); |
| 60 | 60 | ||
| 61 | if (!len) | ||
| 62 | return NULL; | ||
| 63 | |||
| 61 | return kmalloc(len, GFP_KERNEL); | 64 | return kmalloc(len, GFP_KERNEL); |
| 62 | } | 65 | } |
| 63 | 66 | ||
| @@ -135,7 +138,7 @@ int mpi_copy(MPI *copied, const MPI a) | |||
| 135 | size_t i; | 138 | size_t i; |
| 136 | MPI b; | 139 | MPI b; |
| 137 | 140 | ||
| 138 | *copied = MPI_NULL; | 141 | *copied = NULL; |
| 139 | 142 | ||
| 140 | if (a) { | 143 | if (a) { |
| 141 | b = mpi_alloc(a->nlimbs); | 144 | b = mpi_alloc(a->nlimbs); |
diff --git a/lib/pci_iomap.c b/lib/pci_iomap.c index 4b0fdc22e688..0d83ea8a9605 100644 --- a/lib/pci_iomap.c +++ b/lib/pci_iomap.c | |||
| @@ -34,7 +34,7 @@ void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen) | |||
| 34 | if (maxlen && len > maxlen) | 34 | if (maxlen && len > maxlen) |
| 35 | len = maxlen; | 35 | len = maxlen; |
| 36 | if (flags & IORESOURCE_IO) | 36 | if (flags & IORESOURCE_IO) |
| 37 | return ioport_map(start, len); | 37 | return __pci_ioport_map(dev, start, len); |
| 38 | if (flags & IORESOURCE_MEM) { | 38 | if (flags & IORESOURCE_MEM) { |
| 39 | if (flags & IORESOURCE_CACHEABLE) | 39 | if (flags & IORESOURCE_CACHEABLE) |
| 40 | return ioremap(start, len); | 40 | return ioremap(start, len); |
