modp_b64: Handle overflow in Base64Encode

Cherry-pick changes on crrev.com/c/3909830.
libchrome will be using the macro MODP_B64_MAX_INPUT_LEN for r1050872
uprev.

BUG=None
TEST=emerge modp_b64 libchrome (r1050872)

Change-Id: I76e221a3c1b3be0c5d0bf3c237716e3f4170af50
Reviewed-on: https://chromium-review.googlesource.com/c/aosp/platform/external/modp_b64/+/3979129
Reviewed-by: David Benjamin <davidben@chromium.org>
Reviewed-by: Georg Neis <neis@chromium.org>
Auto-Submit: Grace Cham <hscham@chromium.org>
Tested-by: Grace Cham <hscham@chromium.org>
Commit-Queue: Georg Neis <neis@chromium.org>
diff --git a/modp_b64/modp_b64.h b/modp_b64/modp_b64.h
index 3270e5f..0a2669d 100644
--- a/modp_b64/modp_b64.h
+++ b/modp_b64/modp_b64.h
@@ -24,6 +24,7 @@
 #ifndef MODP_B64
 #define MODP_B64
 
+#include <limits.h>
 #include <stddef.h>
 
 #ifdef __cplusplus
@@ -81,6 +82,19 @@
 size_t modp_b64_decode(char* dest, const char* src, size_t len);
 
 /**
+ * The maximum input that can be passed into modp_b64_encode. Lengths beyond
+ * this will overflow modp_b64_encode_len.
+ *
+ * This works because modp_b64_encode_len(A) computes:
+ *     ceiling[max_len / 3] * 4 + 1
+ *   = ceiling[floor[(SIZE_MAX-1)/4]*3 / 3] * 4 + 1
+ *   = floor[(SIZE_MAX-1)/4] * 4 + 1
+ *  <= SIZE_MAX-1 + 1
+ *   = SIZE_MAX
+ */
+#define MODP_B64_MAX_INPUT_LEN ((SIZE_MAX - 1) / 4 * 3)
+
+/**
  * Given a source string of length len, this returns the amount of
  * memory the destination string should have.
  *
@@ -89,6 +103,9 @@
  * ceiling[len / 3] * 4 + 1
  *
  * +1 is for any extra null.
+ *
+ * WARNING: This expression will overflow if the A is above
+ * MODP_B64_MAX_INPUT_LEN. The caller must check this bound first.
  */
 #define modp_b64_encode_len(A) ((A+2)/3 * 4 + 1)