Commit Graph

37 Commits

Author SHA1 Message Date
Nicolas Williams
db7763ca7b asn1: X.681/682/683 magic handling of open types
Status:

 - And it works!

 - We have an extensive test based on decoding a rich EK certficate.

   This test exercises all of:

    - decoding
    - encoding with and without decoded open types
    - copying of decoded values with decoded open types
    - freeing of decoded values with decoded open types

   Valgrind finds no memory errors.

 - Added a manual page for the compiler.

 - rfc2459.asn1 now has all three primary PKIX types that we care about
   defined as in RFC5912, with IOS constraints and parameterization:

    - `Extension`       (embeds open type in an `OCTET STRING`)
    - `OtherName`       (embeds open type in an        `ANY`-like type)
    - `SingleAttribute` (embeds open type in an        `ANY`-like type)
    - `AttributeSet`    (embeds open type in a  `SET OF ANY`-like type)

   All of these use OIDs as the open type type ID field, but integer
   open type type ID fields are also supported (and needed, for
   Kerberos).

   That will cover every typed hole pattern in all our ASN.1 modules.

   With this we'll be able to automatically and recursively decode
   through all subject DN attributes even when the subject DN is a
   directoryName SAN, and subjectDirectoryAttributes, and all
   extensions, and all SANs, and all authorization-data elements, and
   PA-data, and...

   We're not really using `SingleAttribute` and `AttributeSet` yet
   because various changes are needed in `lib/hx509` for that.

 - `asn1_compile` builds and recognizes the subset of X.681/682/683 that
   we need for, and now use in, rfc2459.asn1.  It builds the necessary
   AST, generates the correct C types, and generates templating for
   object sets and open types!

 - See READMEs for details.

 - Codegen backend not tested; I won't make it implement automatic open
   type handling, but it should at least not crash by substituting
   `heim_any` for open types not embedded in `OCTET STRING`.

 - We're _really_ starting to have problems with the ITU-T ASN.1
   grammar and our version of it...

   Type names have to start with upper-case, value names with
   lower-case, but it's not enough to disambiguate.

   The fact the we've allowed value and type names to violate their
   respective start-with case rules is causing us trouble now that we're
   adding grammar from X.681/682/683, and we're going to have to undo
   that.

   In preparation for that I'm capitalizing the `heim_any` and
   `heim_any_set` types, and doing some additional cleanup, which
   requires changes to other parts of Heimdal (all in this same commit
   for now).

   Problems we have because of this:

    - We cannot IMPORT values into modules because we have no idea if a
      symbol being imported refers to a value or a type because the only
      clue we would have is the symbol's name, so we assume IMPORTed
      symbols are for types.

      This means we can't import OIDs, for example, which is super
      annoying.

      One thing we might be able to do here is mark imported symbols as
      being of an undetermined-but-not-undefined type, then coerce the
      symbol's type the first time it's used in a context where its type
      is inferred as type, value, object, object set, or class.  (Though
      since we don't generate C symbols for objects or classes, we won't
      be able to import them, especially since we need to know them at
      compile time and cannot defer their handling to link- or
      run-time.)

    - The `NULL` type name, and the `NULL` value name now cause two
      reduce/reduce conflicts via the `FieldSetting` production.

    - Various shift/reduce conflicts involving `NULL` values in
      non-top-level contexts (in constraints, for example).

 - Currently I have a bug where to disambiguate the grammar I have a
   CLASS_IDENTIFIER token that is all caps, while TYPE_IDENTIFIER must
   start with a capital but not be all caps, but this breaks Kerberos
   since all its types are all capitalized -- oof!

   To fix this I made it so class names have to be all caps and
   start with an underscore (ick).

TBD:

 - Check all the XXX comments and address them
 - Apply this treatment to Kerberos!  Automatic handling of authz-data
   sounds useful :)
 - Apply this treatment to PKCS#10 (CSRs) and other ASN.1 modules too.
 - Replace various bits of code in `lib/hx509/` with uses of this
   feature.
 - Add JER.
 - Enhance `hxtool` and `asn1_print`.

Getting there!
2021-02-28 18:13:08 -06:00
Nicolas Williams
24543c4a31 asn1: Improve option handling; help msg
- Giving asn1_compile the name of an ASN.1 module w/o the ".asn1" stem
   will cause the compiler to add the ".asn1" stem, and it will cause
   the compiler to look for a ".opt" file as well.

 - The default C module name substring derivation from the .asn1 file
   name is improved.

 - There is now a --gen-name=NAME option for specifying the C module
   name substring.  This is useful for specifying that in a .opt file.

 - More options now have helpful usage messages.

This will allow simplification of lib/asn1/Makefile.am's invocations of
asn1_compile.

We may well end up requiring the automatic .opt file finding feature
when we eventualy add support for parsing multiple modules in a single
invocation for better support of IMPORTs.
2021-01-13 20:17:58 -06:00
Nicolas Williams
83d4c6ddb5 asn1: Circular types and Topo. sort declarations
Many external ASN.1 modules that we have imported over time define types
like this:

  Foo ::= SEQUENCE { bar Bar }
  Bar ::= SEQUENCE { aMember INTEGER }

and before this change one had to re-order the definitions so that the
one for `Bar` came first.  No more.

We can now have out of order definitions in ASN.1 modules and the
compiler will topologically sort output C type declarations so that one
no longer has to manually sort types in ASN.1 modules when importing
them.

Besides that, it is now possible to create circular data types using
OPTIONAL since we generate such fields as pointers (which can then be
pointers to incomplete struct declarations):

  Circular ::= SEQUENCE {
          name UTF8String,
          next Circular OPTIONAL
  }

Circular types aren't necessarily useful, but they have been used in the
past.  E.g., the rpc.mountd protocol uses a circular type as a linked
list -- it should just have used an array, of course, as that's
semantically equivalent but more space efficient in its encoding, but
the point is that such types exist out there.
2021-01-13 20:17:58 -06:00
Nicolas Williams
07d4b1fc74 asn1: Add compiler --enum-prefix=PREFIX option
C enum labels have to be globally unique.  ASN.1 module ENUMERATED and
INTEGER types with named values are not globally unique.  This means
that ASN.1 integer type value names and enumerations can cause conflicts
when compiled to C.

This new option allows the user to specify a prefix to apply to such
names.  Then this:

    Foo ::= ENUMERATED { v1 (0) }

can generate:

    typedef enum Foo {
      prefix_v1 = 0,
    } Foo;

instead of

    typedef enum Foo {
      v1 = 0,
    } Foo;

which is very likely to conflict.

TBD: Add option to use the type name as the prefix?
2021-01-13 20:17:58 -06:00
Love Hornquist Astrand
060474df16 quel 64bit warnings, fixup implicit encoding for template, fix spelling 2013-06-03 21:46:20 -07:00
Roland C. Dowdeswell
cc47c8fa7b Turn on -Wextra -Wno-sign-compare -Wno-unused-paramter and fix issues.
We turn on a few extra warnings and fix the fallout that occurs
when building with --enable-developer.  Note that we get different
warnings on different machines and so this will be a work in
progress.  So far, we have built on NetBSD/amd64 5.99.64 (which
uses gcc 4.5.3) and Ubuntu 10.04.3 LTS (which uses gcc 4.4.3).

Notably, we fixed

	1.  a lot of missing structure initialisers,

	2.  unchecked return values for functions that glibc
	    marks as __attribute__((warn-unused-result)),

	3.  made minor modifications to slc and asn1_compile
	    which can generate code which generates warnings,
	    and

	4.  a few stragglers here and there.

We turned off the extended warnings for many programs in appl/ as
they are nearing the end of their useful lifetime, e.g.  rsh, rcp,
popper, ftp and telnet.

Interestingly, glibc's strncmp() macro needed to be worked around
whereas the function calls did not.

We have not yet tried this on 32 bit platforms, so there will be
a few more warnings when we do.
2012-02-20 19:45:41 +00:00
Love Hornquist Astrand
0879b9831a remove trailing whitespace 2011-05-21 11:57:31 -07:00
Love Hornquist Astrand
b939943b07 first stange of asn1 table driven compiler 2009-11-21 10:24:56 -08:00
Love Hornquist Astrand
90ed2b6790 Check result of calloc [CID-181] 2009-07-30 09:44:44 +02:00
Love Hornquist Astrand
3f802d359f Use right variable [CID-181] 2009-07-30 09:41:42 +02:00
Love Hörnquist Åstrand
0e6b5c5c22 remove trailing whitespace
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@25232 ec53bebd-3082-4978-b11e-865c3cabbd6b
2009-05-28 01:17:17 +00:00
Love Hörnquist Åstrand
b29554715f rename dce-stype to support_ber
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24605 ec53bebd-3082-4978-b11e-865c3cabbd6b
2009-02-04 22:08:41 +00:00
Love Hörnquist Åstrand
c779be5138 set len too
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24372 ec53bebd-3082-4978-b11e-865c3cabbd6b
2009-01-25 00:33:19 +00:00
Love Hörnquist Åstrand
86a97737e3 make work
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24368 ec53bebd-3082-4978-b11e-865c3cabbd6b
2009-01-25 00:32:40 +00:00
Love Hörnquist Åstrand
e0c70c6906 make work
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24347 ec53bebd-3082-4978-b11e-865c3cabbd6b
2009-01-25 00:29:08 +00:00
Love Hörnquist Åstrand
e5c70370c9 --option-file
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24346 ec53bebd-3082-4978-b11e-865c3cabbd6b
2009-01-25 00:28:59 +00:00
Love Hörnquist Åstrand
0179e12d54 remove -DHAVE_CONFIG_H, add --one-source-file, rename krb5 and cms to "better" file names
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24337 ec53bebd-3082-4978-b11e-865c3cabbd6b
2009-01-25 00:23:39 +00:00
Love Hörnquist Åstrand
6937d41a02 remove trailing whitespace
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@23815 ec53bebd-3082-4978-b11e-865c3cabbd6b
2008-09-13 09:21:03 +00:00
Love Hörnquist Åstrand
e172367898 switch to utf8 encoding of all files
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@23814 ec53bebd-3082-4978-b11e-865c3cabbd6b
2008-09-13 08:53:55 +00:00
Love Hörnquist Åstrand
cd004f4ff3 fclose file, not string.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@20858 ec53bebd-3082-4978-b11e-865c3cabbd6b
2007-06-03 18:56:41 +00:00
Love Hörnquist Åstrand
2f1cc7b5fd Close asn1 file while done.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@20855 ec53bebd-3082-4978-b11e-865c3cabbd6b
2007-06-03 18:13:41 +00:00
Love Hörnquist Åstrand
bdd32566a1 add --sequence
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@18006 ec53bebd-3082-4978-b11e-865c3cabbd6b
2006-09-05 12:27:29 +00:00
Love Hörnquist Åstrand
c6dc7f253e Const poision.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@15959 ec53bebd-3082-4978-b11e-865c3cabbd6b
2005-08-23 10:50:12 +00:00
Love Hörnquist Åstrand
b838707d0e Commit much improved ASN.1 compiler from joda-choice-branch.
Highlighs for the compiler is support for CHOICE and in general better
support for tags. This compiler support most of what is needed for
PK-INIT, LDAP, X.509, PKCS-12 and many other protocols.


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@15617 ec53bebd-3082-4978-b11e-865c3cabbd6b
2005-07-12 06:27:42 +00:00
Love Hörnquist Åstrand
4eaa507264 rename optind to optidx
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@15441 ec53bebd-3082-4978-b11e-865c3cabbd6b
2005-06-16 20:05:31 +00:00
Love Hörnquist Åstrand
381c3f8b41 const poison
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@14706 ec53bebd-3082-4978-b11e-865c3cabbd6b
2005-03-31 00:37:42 +00:00
Assar Westerlund
67422a6b02 s/[gs]et_progname/[gs]etprogname/
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9704 ec53bebd-3082-4978-b11e-865c3cabbd6b
2001-02-20 01:44:56 +00:00
Johan Danielsson
c5b916ca6f remove advertising clause
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7464 ec53bebd-3082-4978-b11e-865c3cabbd6b
1999-12-02 17:05:13 +00:00
Johan Danielsson
1dfddd5226 use getargs
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5810 ec53bebd-3082-4978-b11e-865c3cabbd6b
1999-04-01 09:00:39 +00:00
Assar Westerlund
8970733922 (main): always set `name'
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5296 ec53bebd-3082-4978-b11e-865c3cabbd6b
1999-01-30 18:20:38 +00:00
Johan Danielsson
c6a6c25430 argv[2] is basename of the headerfile
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2477 ec53bebd-3082-4978-b11e-865c3cabbd6b
1997-07-20 00:10:17 +00:00
Johan Danielsson
5a32a5c8e7 Add copyright notice.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2389 ec53bebd-3082-4978-b11e-865c3cabbd6b
1997-07-16 21:40:05 +00:00
Assar Westerlund
c1439d2cd8 changed asn1_locl.h to gen_locl.h and der_locl.h
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2328 ec53bebd-3082-4978-b11e-865c3cabbd6b
1997-07-15 20:02:05 +00:00
Assar Westerlund
0b51fffea2 use `err'
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2273 ec53bebd-3082-4978-b11e-865c3cabbd6b
1997-07-14 11:39:03 +00:00
Johan Danielsson
2f2da77dc3 Fix include file mess.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1454 ec53bebd-3082-4978-b11e-865c3cabbd6b
1997-03-17 10:40:52 +00:00
Assar Westerlund
93dbc8da93 Id
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1427 ec53bebd-3082-4978-b11e-865c3cabbd6b
1997-03-14 10:22:48 +00:00
Assar Westerlund
b55aed018f Now uses generated ASN1-code.
kinit should be able to get a initial message from FOO.SE.


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@844 ec53bebd-3082-4978-b11e-865c3cabbd6b
1996-10-13 21:13:38 +00:00