summaryrefslogtreecommitdiffstats
path: root/crypto/asn1
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2018-03-29 09:17:11 +0100
committerMatt Caswell <matt@openssl.org>2018-04-03 15:52:31 +0100
commitbcc6371443ebc0f104379b0a1068cfca0191b909 (patch)
tree067443ed62df176ae9561ca9e984c1d8872ac80d /crypto/asn1
parent1518c55a796b058eff01f3cbf177f4b726c01d7c (diff)
Fix a text canonicalisation bug in CMS
Where a CMS detached signature is used with text content the text goes through a canonicalisation process first prior to signing or verifying a signature. This process strips trailing space at the end of lines, converts line terminators to CRLF and removes additional trailing line terminators at the end of a file. A bug in the canonicalisation process meant that some characters, such as form-feed, were incorrectly treated as whitespace and removed. This is contrary to the specification (RFC5485). This fix could mean that detached text data signed with an earlier version of OpenSSL 1.1.0 may fail to verify using the fixed version, or text data signed with a fixed OpenSSL may fail to verify with an earlier version of OpenSSL 1.1.0. A workaround is to only verify the canonicalised text data and use the "-binary" flag (for the "cms" command line application) or set the SMIME_BINARY/PKCS7_BINARY/CMS_BINARY flags (if using CMS_verify()). Reviewed-by: Tim Hudson <tjh@openssl.org> Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/5790)
Diffstat (limited to 'crypto/asn1')
-rw-r--r--crypto/asn1/asn_mime.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/crypto/asn1/asn_mime.c b/crypto/asn1/asn_mime.c
index 7f4db6a2f7..aa92a8e115 100644
--- a/crypto/asn1/asn_mime.c
+++ b/crypto/asn1/asn_mime.c
@@ -953,12 +953,14 @@ static int strip_eol(char *linebuf, int *plen, int flags)
for (p = linebuf + len - 1; len > 0; len--, p--) {
c = *p;
- if (c == '\n')
+ if (c == '\n') {
is_eol = 1;
- else if (is_eol && flags & SMIME_ASCIICRLF && c < 33)
+ } else if (is_eol && flags & SMIME_ASCIICRLF && c == 32) {
+ /* Strip trailing space on a line; 32 == ASCII for ' ' */
continue;
- else if (c != '\r')
+ } else if (c != '\r') {
break;
+ }
}
*plen = len;
return is_eol;