First, let me prefix that while I don't want to badmouth anybody, even 
incompetence cannot excuse deliberately generating bad/unparsable encoding. 
That's one of the cases when the cure is clearly worse than the disease.

On 3/21/19, 13:58, "openssl-users on behalf of Viktor Dukhovni" 
<openssl-users-boun...@openssl.org on behalf of openssl-us...@dukhovni.org> 
wrote:
    > > On the OpenSSL side, having found that we emit dubious encodings
    > > of structures with an (unspecified) null OID element, I am considering
    > > whether it would make sense to encode them as a zero-length (invalid,
    > > but faithful) ASN.1 OBJECT:
    > > 
    > >    06 00
    > > 
    > > *and* decode these back to a zero length NID_undef object.
    
    After discussing this idea with a friend, I am less enthusiastic
    about this option.  His point is that if OpenSSL starts emitting
    invalid empty OIDs as a way to support encoding incompletely
    initialized structures, this could contaminate the ecosystem with
    subsequent new downstream work-arounds in other implementations.

I don't see how it is worse than what's there now.
    
    His order of "preference" is:
    
        1.  Return failure from i2d_ASN_OBJECT(), which then percolates
        up to failure to encode the containing structure.

That would be the correct but strict behavior: OID is required, therefore no 
OID -> no encoding. Just fail (hopefully with an explanatory error code, and 
documented!)

            2.  Emit a "harmless" default OID (such as 0.0), returning to
        the behaviour prior to 1.0.1i

I'm OK with that, and it's probably more acceptable than (1), though OID "0.0" 
is not the same as "no-OID". I wonder if there's ever a case when OID "0.0" can 
appear in this construct? If so, then (2) is unacceptable, otherwise I don't 
know.

But the original "fix" (can't call it that but in quotes and with big 
tongue-in-cheek) was there for a reason, however misguided the actual change 
turned out to be. What was the reason for changing this (original) behavior? 
Just desire for "purity" (....), or something more tangible/reasonable?
    
        3.  Emit the invalid empty OID (06 00) in the expectation that
        this would not be something that other decoders would have
        to support.  That is, it would only be used, as in this case,
        to serialize and deserialize objects *within* an application,
        and there would be no pressure on other implementations to
        follow suit.

I'm OK with (3) too. In fact, this would probably be my first preference - and 
yes, implementations that care to support use cases with no-OID would have to 
support this. But at least they won't have a broken parser on their hands.
    
    Failing in i2d_ASN1_OBJECT() is unlikely to do harm, because the
    current invalid output is not better, and we've not seen any
    complaints until now in ~5 years of OpenSSL 1.0.2 deployment.
    So use of i2d on partially created objects looks rather rare,
    and perhaps explicit failure is better than any ad-hoc output?

Failing in i2d_ASN1_OBJECT() would be my second preference. My first preference 
would be your (3). I can live with (2), but I don't like it much because 
substituting a valid OID for a no-OID is "slippery".
 

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to