return val;
}
+/**
+ * \brief Checks if the given char in a byte array is Base64 alphabet
+ *
+ * \param Char that needs to be checked
+ *
+ * \return True if the char was Base64 alphabet, False otherwise
+ */
+bool IsBase64Alphabet(uint8_t encoded_byte)
+{
+ if (GetBase64Value(encoded_byte) < 0 && encoded_byte != '=') {
+ return false;
+ }
+ return true;
+}
+
/**
* \brief Decodes a 4-byte base64-encoded block into a 3-byte ascii-encoded block
*
/* Function prototypes */
Base64Ecode DecodeBase64(uint8_t *dest, uint32_t dest_size, const uint8_t *src, uint32_t len,
uint32_t *consumed_bytes, uint32_t *decoded_bytes, Base64Mode mode);
+bool IsBase64Alphabet(uint8_t encoded_byte);
#endif
/* Strip spaces in remainder */
for (uint8_t i = 0; i < state->bvr_len; i++) {
- if (state->bvremain[i] != ' ') {
+ if (IsBase64Alphabet(state->bvremain[i])) {
block[cnt++] = state->bvremain[i];
}
}
/* if we don't have 4 bytes see if we can fill it from `buf` */
if (buf && len > 0 && cnt != B64_BLOCK) {
for (uint32_t i = 0; i < len && cnt < B64_BLOCK; i++) {
- if (buf[i] != ' ') {
+ if (IsBase64Alphabet(buf[i])) {
block[cnt++] = buf[i];
}
buf_consumed++;
return MIME_DEC_ERR_DATA;
for (uint32_t i = offset; i < buf_len; i++) {
- if (buf[i] != ' ') {
+ // Skip any characters outside of the base64 alphabet as per RFC 2045
+ if (IsBase64Alphabet(buf[i])) {
DEBUG_VALIDATE_BUG_ON(state->bvr_len >= B64_BLOCK);
if (state->bvr_len >= B64_BLOCK)
return MIME_DEC_ERR_DATA;