crypto: ecc - Prevent ecc_digits_from_bytes from reading too many bytes
[linux-2.6-block.git] / crypto / ecc.c
index c1d2e884be1e99ed66458dc6524f7b75fd0d1cbb..fe761256e335b79de479a4ea3454efe923780860 100644 (file)
@@ -68,6 +68,28 @@ const struct ecc_curve *ecc_get_curve(unsigned int curve_id)
 }
 EXPORT_SYMBOL(ecc_get_curve);
 
+void ecc_digits_from_bytes(const u8 *in, unsigned int nbytes,
+                          u64 *out, unsigned int ndigits)
+{
+       int diff = ndigits - DIV_ROUND_UP(nbytes, sizeof(u64));
+       unsigned int o = nbytes & 7;
+       __be64 msd = 0;
+
+       /* diff > 0: not enough input bytes: set most significant digits to 0 */
+       if (diff > 0) {
+               ndigits -= diff;
+               memset(&out[ndigits - 1], 0, diff * sizeof(u64));
+       }
+
+       if (o) {
+               memcpy((u8 *)&msd + sizeof(msd) - o, in, o);
+               out[--ndigits] = be64_to_cpu(msd);
+               in += o;
+       }
+       ecc_swap_digits(in, out, ndigits);
+}
+EXPORT_SYMBOL(ecc_digits_from_bytes);
+
 static u64 *ecc_alloc_digits_space(unsigned int ndigits)
 {
        size_t len = ndigits * sizeof(u64);