Package: libpolarssl7
Version: 1.3.9-2.1
Severity: normal
Tags: upstream patch

dhm_parse_dhmfile() fails to parse a valid PCKS#3 file.

The file i'm testing is in DER format, attached here.

Here's example code to test it:

-----------
#include <stdio.h>
#include <polarssl/dhm.h>

int main(int argc, const char* argv[]) {
  dhm_context dh;
  int err;
  
  dhm_init(&dh);

  err = dhm_parse_dhmfile( &dh, argv[1] )  ;
  printf("error -0x%x when parsing %s\n", -err, argv[1]);
  
  return 0;
}
-----------

This example code works fine for other DER-formatted files,
particularly those that don't have the third integer
(privateValueLength) included.  Maybe polarssl needs to learn about
this third parameter?

the PKCS#3 spec:

ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-3.asc

declares it this way:

DHParameter ::= SEQUENCE {
  prime INTEGER, -- p
  base INTEGER, -- g
  privateValueLength INTEGER OPTIONAL }



This file was generated with:

   certtool --generate-dh-params > dh.pem
   openssl dhparam -inform PEM -outform DER < dh.pem >dh.der

It works fine in /usr/bin/certtool (from gnutls-bin) and openssl
dhparam:

0 dkg@alice:~/tmp$ certtool --inder --dh-info < ~/src/polarssl/testdhm/dh.der 

Recommended key length: 256 bits

generator:
        df:b1:4c:70:00:ba:e8:6a:c5:3b:4b:e9:ba:29:3f:
        1b:fe:93:a6:6b:80:e7:b9:c1:cf:94:e4:2e:3f:47:
        59:ea:be:20:bd:06:c3:b5:31:72:91:37:f8:9f:05:
        82:84:f8:84:56:8d:d1:48:c6:bc:9b:3d:0c:cf:01:
        c5:7a:51:06:26:d5:38:c6:e8:9e:fa:77:a2:34:11:
        ce:51:12:e2:aa:e7:c1:0a:6b:63:5a:4b:e2:3e:1f:
        28:15:ba:10:3a:b3:6a:69:99:d6:67:54:c1:d3:2d:
        42:29:2c:61:71:70:b8:49:6a:7a:bd:fa:79:4e:c6:
        89:e9:88:23:dc:d3:32:52:28:95:34:27:7b:75:a2:
        67:99:de:08:35:59:a6:c7:ff:66:46:a4:98:45:85:
        20:07:8b:df:c1:7f:69:2e:1a:b6:5b:b5:38:29:da:
        3d:0e:8c:23:53:e6:ab:6d:93:67:19:29:14:8a:21:
        fe:18:7d:4e:a0:e2:58:a8:3c:58:a8:e1:08:a7:a1:
        14:fc:05:49:f0:b4:af:cf:f9:db:bd:29:35:4c:86:
        9b:66:58:6b:ad:15:f6:9d:9f:1e:94:db:a5:78:67:
        a5:19:d7:44:a4:a3:dc:e0:2e:89:f1:c0:45:d5:df:
        a2:cc:7d:90:f5:78:2c:45:cb:72:ce:35:3d:bb:d4:
        35:

prime:
        f0:fe:52:ad:3c:25:3d:71:2e:6c:b5:98:77:7b:f0:
        6a:85:fa:c3:de:37:72:ea:90:3c:b9:e7:61:65:69:
        02:4c:f2:11:f0:c7:91:c5:1d:61:7f:23:6c:b9:e2:
        21:8a:ea:d9:e1:9d:f9:02:02:13:84:aa:c3:28:b2:
        ea:6c:cc:c4:ed:b4:07:ff:1b:d4:3c:ea:77:c9:7e:
        49:c1:d2:43:66:ca:ee:ea:e0:1f:ef:5f:07:d3:e2:
        e5:bb:64:7d:28:b0:8f:df:8b:5a:2c:9d:9f:e5:6b:
        e2:fb:54:0a:60:60:ed:5d:c3:95:c8:22:66:63:3c:
        96:c5:7c:ba:21:17:ac:ec:f6:6e:f8:29:4a:57:af:
        41:c6:65:a6:3d:99:34:54:05:1c:ed:05:aa:68:c1:
        6c:7b:99:b6:6d:38:97:54:b9:c7:67:9b:2b:5f:84:
        b0:38:6d:72:82:70:a8:cb:fa:9d:b2:39:64:9c:0c:
        eb:c1:52:5f:34:38:35:73:b2:c9:dd:82:bd:8f:62:
        0e:0d:1a:b5:c0:41:43:8a:84:4d:4c:db:47:c8:61:
        ab:db:77:b8:d9:8d:75:4c:27:69:8a:a6:f8:1f:2f:
        60:67:19:9b:a3:ee:97:68:ae:79:e1:6e:93:ac:80:
        c9:06:ef:e3:16:c6:73:67:6a:9f:ab:75:a5:bc:b6:
        29:


-----BEGIN DH PARAMETERS-----
MIICDgKCAQEA8P5SrTwlPXEubLWYd3vwaoX6w943cuqQPLnnYWVpAkzyEfDHkcUd
YX8jbLniIYrq2eGd+QICE4Sqwyiy6mzMxO20B/8b1Dzqd8l+ScHSQ2bK7urgH+9f
B9Pi5btkfSiwj9+LWiydn+Vr4vtUCmBg7V3DlcgiZmM8lsV8uiEXrOz2bvgpSlev
QcZlpj2ZNFQFHO0FqmjBbHuZtm04l1S5x2ebK1+EsDhtcoJwqMv6nbI5ZJwM68FS
XzQ4NXOyyd2CvY9iDg0atcBBQ4qETUzbR8hhq9t3uNmNdUwnaYqm+B8vYGcZm6Pu
l2iueeFuk6yAyQbv4xbGc2dqn6t1pby2KQKCAQEA37FMcAC66GrFO0vpuik/G/6T
pmuA57nBz5TkLj9HWeq+IL0Gw7UxcpE3+J8FgoT4hFaN0UjGvJs9DM8BxXpRBibV
OMbonvp3ojQRzlES4qrnwQprY1pL4j4fKBW6EDqzammZ1mdUwdMtQiksYXFwuElq
er36eU7GiemII9zTMlIolTQne3WiZ5neCDVZpsf/ZkakmEWFIAeL38F/aS4atlu1
OCnaPQ6MI1Pmq22TZxkpFIoh/hh9TqDiWKg8WKjhCKehFPwFSfC0r8/5270pNUyG
m2ZYa60V9p2fHpTbpXhnpRnXRKSj3OAuifHARdXfosx9kPV4LEXLcs41PbvUNQIC
AQA=
-----END DH PARAMETERS-----
0 dkg@alice:~/tmp$ openssl dhparam -text -inform DER < 
~/src/polarssl/testdhm/dh.der 
    PKCS#3 DH Parameters: (2048 bit)
        prime:
            00:f0:fe:52:ad:3c:25:3d:71:2e:6c:b5:98:77:7b:
            f0:6a:85:fa:c3:de:37:72:ea:90:3c:b9:e7:61:65:
            69:02:4c:f2:11:f0:c7:91:c5:1d:61:7f:23:6c:b9:
            e2:21:8a:ea:d9:e1:9d:f9:02:02:13:84:aa:c3:28:
            b2:ea:6c:cc:c4:ed:b4:07:ff:1b:d4:3c:ea:77:c9:
            7e:49:c1:d2:43:66:ca:ee:ea:e0:1f:ef:5f:07:d3:
            e2:e5:bb:64:7d:28:b0:8f:df:8b:5a:2c:9d:9f:e5:
            6b:e2:fb:54:0a:60:60:ed:5d:c3:95:c8:22:66:63:
            3c:96:c5:7c:ba:21:17:ac:ec:f6:6e:f8:29:4a:57:
            af:41:c6:65:a6:3d:99:34:54:05:1c:ed:05:aa:68:
            c1:6c:7b:99:b6:6d:38:97:54:b9:c7:67:9b:2b:5f:
            84:b0:38:6d:72:82:70:a8:cb:fa:9d:b2:39:64:9c:
            0c:eb:c1:52:5f:34:38:35:73:b2:c9:dd:82:bd:8f:
            62:0e:0d:1a:b5:c0:41:43:8a:84:4d:4c:db:47:c8:
            61:ab:db:77:b8:d9:8d:75:4c:27:69:8a:a6:f8:1f:
            2f:60:67:19:9b:a3:ee:97:68:ae:79:e1:6e:93:ac:
            80:c9:06:ef:e3:16:c6:73:67:6a:9f:ab:75:a5:bc:
            b6:29
        generator:
            00:df:b1:4c:70:00:ba:e8:6a:c5:3b:4b:e9:ba:29:
            3f:1b:fe:93:a6:6b:80:e7:b9:c1:cf:94:e4:2e:3f:
            47:59:ea:be:20:bd:06:c3:b5:31:72:91:37:f8:9f:
            05:82:84:f8:84:56:8d:d1:48:c6:bc:9b:3d:0c:cf:
            01:c5:7a:51:06:26:d5:38:c6:e8:9e:fa:77:a2:34:
            11:ce:51:12:e2:aa:e7:c1:0a:6b:63:5a:4b:e2:3e:
            1f:28:15:ba:10:3a:b3:6a:69:99:d6:67:54:c1:d3:
            2d:42:29:2c:61:71:70:b8:49:6a:7a:bd:fa:79:4e:
            c6:89:e9:88:23:dc:d3:32:52:28:95:34:27:7b:75:
            a2:67:99:de:08:35:59:a6:c7:ff:66:46:a4:98:45:
            85:20:07:8b:df:c1:7f:69:2e:1a:b6:5b:b5:38:29:
            da:3d:0e:8c:23:53:e6:ab:6d:93:67:19:29:14:8a:
            21:fe:18:7d:4e:a0:e2:58:a8:3c:58:a8:e1:08:a7:
            a1:14:fc:05:49:f0:b4:af:cf:f9:db:bd:29:35:4c:
            86:9b:66:58:6b:ad:15:f6:9d:9f:1e:94:db:a5:78:
            67:a5:19:d7:44:a4:a3:dc:e0:2e:89:f1:c0:45:d5:
            df:a2:cc:7d:90:f5:78:2c:45:cb:72:ce:35:3d:bb:
            d4:35
        recommended-private-length: 256 bits
-----BEGIN DH PARAMETERS-----
MIICDgKCAQEA8P5SrTwlPXEubLWYd3vwaoX6w943cuqQPLnnYWVpAkzyEfDHkcUd
YX8jbLniIYrq2eGd+QICE4Sqwyiy6mzMxO20B/8b1Dzqd8l+ScHSQ2bK7urgH+9f
B9Pi5btkfSiwj9+LWiydn+Vr4vtUCmBg7V3DlcgiZmM8lsV8uiEXrOz2bvgpSlev
QcZlpj2ZNFQFHO0FqmjBbHuZtm04l1S5x2ebK1+EsDhtcoJwqMv6nbI5ZJwM68FS
XzQ4NXOyyd2CvY9iDg0atcBBQ4qETUzbR8hhq9t3uNmNdUwnaYqm+B8vYGcZm6Pu
l2iueeFuk6yAyQbv4xbGc2dqn6t1pby2KQKCAQEA37FMcAC66GrFO0vpuik/G/6T
pmuA57nBz5TkLj9HWeq+IL0Gw7UxcpE3+J8FgoT4hFaN0UjGvJs9DM8BxXpRBibV
OMbonvp3ojQRzlES4qrnwQprY1pL4j4fKBW6EDqzammZ1mdUwdMtQiksYXFwuElq
er36eU7GiemII9zTMlIolTQne3WiZ5neCDVZpsf/ZkakmEWFIAeL38F/aS4atlu1
OCnaPQ6MI1Pmq22TZxkpFIoh/hh9TqDiWKg8WKjhCKehFPwFSfC0r8/5270pNUyG
m2ZYa60V9p2fHpTbpXhnpRnXRKSj3OAuifHARdXfosx9kPV4LEXLcs41PbvUNQIC
AQA=
-----END DH PARAMETERS-----
0 dkg@alice:~/tmp$ dumpasn1 ~/src/polarssl/testdhm/dh.der 
  0 526: SEQUENCE {
  4 257:   INTEGER
       :     00 F0 FE 52 AD 3C 25 3D 71 2E 6C B5 98 77 7B F0
       :     6A 85 FA C3 DE 37 72 EA 90 3C B9 E7 61 65 69 02
       :     4C F2 11 F0 C7 91 C5 1D 61 7F 23 6C B9 E2 21 8A
       :     EA D9 E1 9D F9 02 02 13 84 AA C3 28 B2 EA 6C CC
       :     C4 ED B4 07 FF 1B D4 3C EA 77 C9 7E 49 C1 D2 43
       :     66 CA EE EA E0 1F EF 5F 07 D3 E2 E5 BB 64 7D 28
       :     B0 8F DF 8B 5A 2C 9D 9F E5 6B E2 FB 54 0A 60 60
       :     ED 5D C3 95 C8 22 66 63 3C 96 C5 7C BA 21 17 AC
       :             [ Another 129 bytes skipped ]
265 257:   INTEGER
       :     00 DF B1 4C 70 00 BA E8 6A C5 3B 4B E9 BA 29 3F
       :     1B FE 93 A6 6B 80 E7 B9 C1 CF 94 E4 2E 3F 47 59
       :     EA BE 20 BD 06 C3 B5 31 72 91 37 F8 9F 05 82 84
       :     F8 84 56 8D D1 48 C6 BC 9B 3D 0C CF 01 C5 7A 51
       :     06 26 D5 38 C6 E8 9E FA 77 A2 34 11 CE 51 12 E2
       :     AA E7 C1 0A 6B 63 5A 4B E2 3E 1F 28 15 BA 10 3A
       :     B3 6A 69 99 D6 67 54 C1 D3 2D 42 29 2C 61 71 70
       :     B8 49 6A 7A BD FA 79 4E C6 89 E9 88 23 DC D3 32
       :             [ Another 129 bytes skipped ]
526   2:   INTEGER 256
       :   }

0 warnings, 0 errors.
0 dkg@alice:~/tmp$ 

This is upstream's https://github.com/ARMmbed/mbedtls/pull/186

The attached patch against the head of mbedtls development should
apply to polarssl as well (may need a bit of fiddling).

Regards,

        --dkg

-- System Information:
Debian Release: 8.0
  APT prefers testing
  APT policy: (500, 'testing'), (200, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages libpolarssl7 depends on:
ii  libc6  2.19-17

libpolarssl7 recommends no packages.

libpolarssl7 suggests no packages.

-- debconf-show failed

Attachment: dh.der
Description: Binary data

>From 4b39b8c84eed871177a88cd9bc2648e158b15161 Mon Sep 17 00:00:00 2001
From: Daniel Kahn Gillmor <d...@fifthhorseman.net>
Date: Fri, 3 Apr 2015 13:09:24 -0400
Subject: [PATCH] accept PKCS#3 DH parameters with privateValueLength included

library/dhm.c: accept (and ignore) optional privateValueLength for
PKCS#3 DH parameters.

PKCS#3 defines the ASN.1 encoding of a DH parameter set like this:

----------------
DHParameter ::= SEQUENCE {
  prime INTEGER, -- p
  base INTEGER, -- g
  privateValueLength INTEGER OPTIONAL }

The fields of type DHParameter have the following meanings:

     o    prime is the prime p.

     o    base is the base g.

     o    privateValueLength is the optional private-value
          length l.
----------------

See: ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-3.asc

This optional parameter was added in PKCS#3 version 1.4, released
November 1, 1993.

dhm.c currently doesn't cope well with PKCS#3 files that have this
optional final parameter included. i see errors like:

------------
dhm_parse_dhmfile returned -0x33E6

Last error was: -0x33E6 - DHM - The ASN.1 data is not formatted correctly : ASN1 - Actual length differs from expected lengt
------------

You can generate PKCS#3 files with this final parameter with recent
versions of certtool from GnuTLS:

 certtool --generate-dh-params > dh.pem
---
 library/dhm.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/library/dhm.c b/library/dhm.c
index 9fb7a21..0a4f820 100644
--- a/library/dhm.c
+++ b/library/dhm.c
@@ -444,8 +444,9 @@ int dhm_parse_dhm( dhm_context *dhm, const unsigned char *dhmin,
 
     /*
      *  DHParams ::= SEQUENCE {
-     *      prime            INTEGER,  -- P
-     *      generator        INTEGER,  -- g
+     *      prime              INTEGER,  -- P
+     *      generator          INTEGER,  -- g
+     *      privateValueLength INTEGER OPTIONAL
      *  }
      */
     if( ( ret = asn1_get_tag( &p, end, &len,
@@ -466,9 +467,23 @@ int dhm_parse_dhm( dhm_context *dhm, const unsigned char *dhmin,
 
     if( p != end )
     {
-        ret = POLARSSL_ERR_DHM_INVALID_FORMAT +
-              POLARSSL_ERR_ASN1_LENGTH_MISMATCH;
-        goto exit;
+        /* this might be the optional privateValueLength; If so, we
+         can cleanly discard it; */
+        mpi rec;
+        mpi_init( &rec );
+        ret = asn1_get_mpi( &p, end, &rec );
+        mpi_free( &rec );
+        if ( ret != 0 )
+        {
+            ret = POLARSSL_ERR_DHM_INVALID_FORMAT + ret;
+            goto exit;
+        }
+        if ( p != end )
+        {
+            ret = POLARSSL_ERR_DHM_INVALID_FORMAT +
+                POLARSSL_ERR_ASN1_LENGTH_MISMATCH;
+            goto exit;
+        }
     }
 
     ret = 0;
-- 
2.1.4

Reply via email to