Re: [smime] PKCS#7 v1.5 vs. CMS / ContentInfo vs. EncapsulatedContentInfo based on version (Martin Rex) Fri, 03 November 2017 21:43 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 9D37513FFE4 for <>; Fri, 3 Nov 2017 14:43:31 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -6.92
X-Spam-Status: No, score=-6.92 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id 85vD5yZHW50U for <>; Fri, 3 Nov 2017 14:43:29 -0700 (PDT)
Received: from ( []) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 5C5A213FFE2 for <>; Fri, 3 Nov 2017 14:43:29 -0700 (PDT)
Received: from ( []) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 3yTFnW3NM9z1JWM; Fri, 3 Nov 2017 22:43:27 +0100 (CET)
X-purgate-ID: 152705::1509745407-000040CA-1C2519EC/0/0
X-purgate-size: 3643
X-purgate: clean
X-purgate: This mail is considered clean (visit for further information)
X-purgate-Ad: Categorized by eleven eXpurgate (R)
X-purgate-type: clean
X-SAP-SPAM-Status: clean
Received: from ( []) by (Postfix) with ESMTP id 3yTFnW1f8lzGnyb; Fri, 3 Nov 2017 22:43:27 +0100 (CET)
Received: by (Postfix, from userid 10159) id 2D092404B; Fri, 3 Nov 2017 22:43:27 +0100 (CET)
In-Reply-To: <001101d354d1$1cfdced0$56f96c70$>
References: <> <001101d354d1$1cfdced0$56f96c70$>
To: Jim Schaad <>
Date: Fri, 3 Nov 2017 22:43:27 +0100 (CET)
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="US-ASCII"
Message-Id: <>
From: (Martin Rex)
Archived-At: <>
Subject: Re: [smime] PKCS#7 v1.5 vs. CMS / ContentInfo vs. EncapsulatedContentInfo based on version
X-Mailman-Version: 2.1.22
Precedence: list
List-Id: SMIME Working Group <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Fri, 03 Nov 2017 21:43:32 -0000

Hi Jim,

Thanks for the reply, but this leaves me even more confused now.

Admittedly my personal implementors experience is tiny.  I once patched
support for processing rfc3161 TimeStamps into an existing PKCS#7 v1.5
implementation, and I needed a few tweaks for the ASN.1 encoder & decoder
-- but rfc3161 uses id-ct-TSTInfo content type and version 3 rather than
id-data and version 1, so I needed tweaks for processing of

Jim Schaad <>; wrote:
> To begin with, this is only a problem if you are looking at wrapping
> contents other than id-data, for id-data there is no difference.  In both
> cases there is an OCTET wrapper.

This statement looks like a self-contradiction.  Either there is _no_
difference between PKCS#7 v1.5 SignedData for id-data, then there is
no wrapper.  Or there is a difference, and EncapsulatedContentInfo is used.

> For things which are not id-data, there is going to be a difference between
> the two encodings in that for one an octet wrapper is there and for the
> other case it is not.  I would say that you need to look at the content type
> and the type of the field and then make a decision about what you are doing.

Do you mean that while the PDU encoding for SignedData with id-data
ContentInfo is the same for PKCS#7 v1.5 and CMS, the actual signature
(or more precisely the hash over that id-data) is computed _differently_
for PKCS#7 v1.5 and CMS (covering the 0x04 plus ASN.1 length field for
CMS, and omitting this for PKCS#7 v1.5) ?

I wouldn't like a heuristic on decoding because it results in needlessly
complex code and seems to have an ambituity for certain id-data that
conicidentally matches the beginning of an ASN.1 DER OctetString.

But requiring a heuristic on SignedData would be magnitudes worse,
because of significantly higher CPU cycles impact for computing and
verifying two different hashes.

> I will note that there is a security problem with the PKCS#7 encoding where
> the content and length bytes are not correctly protected.  This is one of
> the reasons that CMS added the OCTET wrapper in all cases rather than just
> in the case of id-data.  

But "in all cases rather than just in the case of id-data" is a contradiction
to the above (with respect to the encoding).  Or is this comment _not_
about the encoding, but rather about the data which gets signed (hashed) ?

> There was never any intent that a version number of one would indicate that
> this was PKCS#7 rather than CMS.

That sounds wrong to me.  At least my copy of PKCS#7 v1.5
(rfc2315) is _explicit_ that this version indicates PDU/protocol, and
version==1 therefore implies PKCS#7 (rfc2315) syntax/encoding
**AND** processing rules (semantics).

   The fields of type SignedData have the following meanings:

        o    version is the syntax version number. It shall be
             1 for this version of the document.

The PKCS#7 v1.5 PDU was *ALWAYS* supposed to be self-describing,
and later revisions of it to identify different syntax as well as
different processing rules by using a different version in the PDU.

For the particular (governmentally mandated) data exchange scenario in
Germany, they're currently using PKCS#7 v1.5 with RSA PKCS#1 v1.5,
and they want to transition to using RSA-PSS (signatures on certs
and PKCS#7/CMS SignedData) and RSA-OAEP (EvelopedData), with
EndEntity certs that carry rsaEncryption keys (so that the keys
can be used for both, signature and encryption).