• Jethro Beekman's avatar
    Fix parsing of PKCS#8 encoded Elliptic Curve keys. · d2df936e
    Jethro Beekman authored
    The relevant ASN.1 definitions for a PKCS#8 encoded Elliptic Curve key are:
    
    PrivateKeyInfo ::= SEQUENCE {
      version                   Version,
      privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
      privateKey                PrivateKey,
      attributes           [0]  IMPLICIT Attributes OPTIONAL
    }
    
    AlgorithmIdentifier  ::=  SEQUENCE  {
      algorithm   OBJECT IDENTIFIER,
      parameters  ANY DEFINED BY algorithm OPTIONAL
    }
    
    ECParameters ::= CHOICE {
      namedCurve         OBJECT IDENTIFIER
      -- implicitCurve   NULL
      -- specifiedCurve  SpecifiedECDomain
    }
    
    ECPrivateKey ::= SEQUENCE {
      version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
      privateKey     OCTET STRING,
      parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
      publicKey  [1] BIT STRING OPTIONAL
    }
    
    Because of the two optional fields, there are 4 possible variants that need to
    be parsed: no optional fields, only parameters, only public key, and both
    optional fields. Previously mbedTLS was unable to parse keys with "only
    parameters". Also, only "only public key" was tested. There was a test for "no
    optional fields", but it was labelled incorrectly as SEC.1 and not run because
    of a great renaming mixup.
    d2df936e