asn1: Add sample from X.690 Appendix A

This helped find a bug fixed in the preceding commit.

This also depends on the earlier fixes to IMPLICT tagging support, thus
implementing a test of that using a test vector from a standard.
This commit is contained in:
Nicolas Williams
2020-12-31 15:59:05 -06:00
parent 426adfa395
commit 7f1cfb0396
5 changed files with 322 additions and 60 deletions

View File

@@ -35,7 +35,8 @@ BUILT_SOURCES = \
$(gen_files_pkcs10:.x=.c) \
$(gen_files_pkcs12:.x=.c) \
$(gen_files_digest:.x=.c) \
$(gen_files_kx509:.x=.c)
$(gen_files_kx509:.x=.c) \
$(gen_files_x690sample:.x=.c)
gen_files_krb5 = asn1_krb5_asn1.x
gen_files_cms = asn1_cms_asn1.x
@@ -54,7 +55,7 @@ gen_files_test_template = test_template_asn1-template.x
gen_files_test = asn1_test_asn1.x
gen_files_digest = asn1_digest_asn1.x
gen_files_kx509 = asn1_kx509_asn1.x
gen_files_tcg = asn1_tcg_asn1.x
gen_files_x690sample = asn1_x690sample_asn1.x
oid_resolution.lo: $(BUILT_SOURCES)
@@ -159,6 +160,7 @@ CLEANFILES = \
$(gen_files_pkcs12) \
$(gen_files_digest) \
$(gen_files_kx509) \
$(gen_files_x690sample) \
$(gen_files_test) \
$(gen_files_test_template) \
$(nodist_check_gen_SOURCES) \
@@ -179,6 +181,7 @@ CLEANFILES = \
pkcs12_asn1_files pkcs12_asn1*.h* pkcs12_asn1*.x \
digest_asn1_files digest_asn1*.h* digest_asn1*.x \
kx509_asn1_files kx509_asn1*.h* kx509_asn1*.x \
x690sample_asn1_files x690sample_asn1*.h* x690sample_asn1*.x \
test_asn1_files test_asn1*.h* test_asn1*.x \
test_template_asn1* \
asn1_*.x
@@ -203,6 +206,7 @@ nodist_include_HEADERS += pkcs10_asn1.h
nodist_include_HEADERS += pkcs12_asn1.h
nodist_include_HEADERS += digest_asn1.h
nodist_include_HEADERS += kx509_asn1.h
nodist_include_HEADERS += x690sample_asn1.h
priv_headers = krb5_asn1-priv.h
priv_headers += pkinit_asn1-priv.h
@@ -219,6 +223,7 @@ priv_headers += pkcs10_asn1-priv.h
priv_headers += pkcs12_asn1-priv.h
priv_headers += digest_asn1-priv.h
priv_headers += kx509_asn1-priv.h
priv_headers += x690sample_asn1-priv.h
priv_headers += test_template_asn1.h test_template_asn1-priv.h
priv_headers += test_asn1.h test_asn1-priv.h
@@ -248,6 +253,7 @@ $(gen_files_rfc4108) rfc4108_asn1.hx rfc4108_asn1-priv.hx: rfc4108_asn1_files
$(gen_files_tcg) tcg_asn1.hx tcg_asn1-priv.hx: tcg_asn1_files
$(gen_files_cms) cms_asn1.hx cms_asn1-priv.hx: cms_asn1_files
$(gen_files_crmf) crmf_asn1.hx crmf_asn1-priv.hx: crmf_asn1_files
$(gen_files_x690sample) x690sample_asn1.hx x690sample_asn1-priv.hx: x690sample_asn1_files
$(gen_files_test) test_asn1.hx test_asn1-priv.hx: test_asn1_files
$(gen_files_test_template) test_template_asn1.hx test_template_asn1-priv.hx: test_template_asn1_files
@@ -296,6 +302,9 @@ digest_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/digest.asn1
kx509_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/kx509.asn1
$(ASN1_COMPILE) --one-code-file $(srcdir)/kx509.asn1 kx509_asn1 || (rm -f kx509_asn1_files ; exit 1)
x690sample_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/x690sample.asn1
$(ASN1_COMPILE) --one-code-file $(srcdir)/x690sample.asn1 x690sample_asn1 || (rm -f x690sample_asn1_files ; exit 1)
test_template_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1
$(ASN1_COMPILE) --template --sequence=TESTSeqOf $(srcdir)/test.asn1 test_template_asn1 || (rm -f test_template_asn1_files ; exit 1)
@@ -329,6 +338,7 @@ EXTRA_DIST = \
rfc4108.asn1 \
tcg.asn1 \
setchgpw2.asn1 \
x690sample.asn1 \
test.asn1 \
test.gen \
version-script.map

View File

@@ -67,6 +67,8 @@ gen_files_digest = $(OBJ)\asn1_digest_asn1.x
gen_files_kx509 = $(OBJ)\asn1_kx509_asn1.x
gen_files_x690sample = $(OBJ)\asn1_x690sample_asn1.x
ASN1_BINARIES = \
$(LIBEXECDIR)\asn1_compile.exe
@@ -137,6 +139,7 @@ LIBASN1_OBJS= \
$(gen_files_pkcs12:.x=.obj) \
$(gen_files_digest:.x=.obj) \
$(gen_files_kx509:.x=.obj) \
$(gen_files_x690sample:.x=.obj) \
$(OBJ)\asn1_err.obj
$(OBJ)\oid_resolution.obj: $(LIBASN1_OBJS)
@@ -194,6 +197,8 @@ $(gen_files_cms:.x=.c) : $$(@R).x
$(gen_files_crmf:.x=.c) : $$(@R).x
$(gen_files_x690sample:.x=.c) : $$(@R).x
$(gen_files_test:.x=.c) : $$(@R).x
$(gen_files_krb5) $(OBJ)\krb5_asn1.hx: $(BINDIR)\asn1_compile.exe krb5.asn1 krb5.opt
@@ -310,6 +315,14 @@ $(gen_files_crmf) $(OBJ)\crmf_asn1.hx: $(BINDIR)\asn1_compile.exe crmf.asn1 crmf
|| ($(RM) $(OBJ)\crmf_asn1.h ; exit /b 1)
cd $(SRCDIR)
$(gen_files_x690sample) $(OBJ)\x690sample_asn1.hx: $(BINDIR)\asn1_compile.exe x690sample.asn1
cd $(OBJ)
$(BINDIR)\asn1_compile.exe \
--one-code-file \
$(SRCDIR)\x690sample.asn1 x690sample_asn1 \
|| ($(RM) $(OBJ)\x690sample_asn1.h ; exit /b 1)
cd $(SRCDIR)
$(gen_files_test) $(OBJ)\test_asn1.hx: $(BINDIR)\asn1_compile.exe test.asn1
cd $(OBJ)
$(BINDIR)\asn1_compile.exe \
@@ -346,6 +359,7 @@ GENINCFILES= \
$(INCDIR)\rfc4043_asn1.h \
$(INCDIR)\rfc4108_asn1.h \
$(INCDIR)\tcg_asn1.h \
$(INCDIR)\x690sample_asn1.h \
$(OBJ)\krb5_asn1-priv.h \
$(OBJ)\ocsp_asn1-priv.h \
$(OBJ)\pkinit_asn1-priv.h \
@@ -355,6 +369,7 @@ GENINCFILES= \
$(OBJ)\rfc4043_asn1-priv.h \
$(OBJ)\rfc4108_asn1-priv.h \
$(OBJ)\tcg_asn1-priv.h \
$(OBJ)\x690sample_asn1-priv.h \
$(OBJ)\pkcs8_asn1-priv.h \
$(OBJ)\pkcs9_asn1-priv.h \
$(OBJ)\pkcs10_asn1-priv.h \

View File

@@ -45,6 +45,7 @@
#include <krb5_asn1.h>
#include <heim_asn1.h>
#include <rfc2459_asn1.h>
#include <x690sample_asn1.h>
#include <test_asn1.h>
#include <cms_asn1.h>
@@ -1497,6 +1498,7 @@ check_TESTMechTypeList(void)
errx(1, "TESTMechTypeList: %d", ret);
if (len != size)
abort();
free(ptr);
return 0;
}
@@ -1770,6 +1772,68 @@ test_seqof5(void)
return ret;
}
static int
test_x690sample(void)
{
/* Taken from X.690, Appendix A */
X690SamplePersonnelRecord r;
heim_octet_string os;
unsigned char encoded_sample[] = {
0x60, 0x81, 0x85, 0x61, 0x10, 0x1a, 0x04, 0x4a, 0x6f, 0x68, 0x6e, 0x1a,
0x01, 0x50, 0x1a, 0x05, 0x53, 0x6d, 0x69, 0x74, 0x68, 0xa0, 0x0a, 0x1a,
0x08, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x01, 0x33,
0xa1, 0x0a, 0x43, 0x08, 0x31, 0x39, 0x37, 0x31, 0x30, 0x39, 0x31, 0x37,
0xa2, 0x12, 0x61, 0x10, 0x1a, 0x04, 0x4d, 0x61, 0x72, 0x79, 0x1a, 0x01,
0x54, 0x1a, 0x05, 0x53, 0x6d, 0x69, 0x74, 0x68, 0xa3, 0x42, 0x31, 0x1f,
0x61, 0x11, 0x1a, 0x05, 0x52, 0x61, 0x6c, 0x70, 0x68, 0x1a, 0x01, 0x54,
0x1a, 0x05, 0x53, 0x6d, 0x69, 0x74, 0x68, 0xa0, 0x0a, 0x43, 0x08, 0x31,
0x39, 0x35, 0x37, 0x31, 0x31, 0x31, 0x31, 0x31, 0x1f, 0x61, 0x11, 0x1a,
0x05, 0x53, 0x75, 0x73, 0x61, 0x6e, 0x1a, 0x01, 0x42, 0x1a, 0x05, 0x53,
0x6d, 0x69, 0x74, 0x68, 0xa0, 0x0a, 0x43, 0x08, 0x31, 0x39, 0x35, 0x39,
0x30, 0x37, 0x31, 0x37
};
size_t sz = 0;
int ret;
memset(&r, 0, sizeof(r));
if (decode_X690SamplePersonnelRecord(encoded_sample, sizeof(encoded_sample), &r, &sz))
return 1;
if (sz != sizeof(encoded_sample))
return 1;
free_X690SamplePersonnelRecord(&r);
memset(&r, 0, sizeof(r));
r.name.givenName = strdup("John");
r.name.initial = strdup("P");
r.name.familyName = strdup("Smith");
r.title = strdup("Director");
r.dateOfHire = strdup("19710917");
r.number = 51;
r.nameOfSpouse.givenName = strdup("Mary");
r.nameOfSpouse.initial = strdup("T");
r.nameOfSpouse.familyName = strdup("Smith");
r.children.val = calloc(2, sizeof(r.children.val[0]));
r.children.len = 2;
r.children.val[0].name.givenName = strdup("Ralph");
r.children.val[0].name.initial = strdup("T");
r.children.val[0].name.familyName = strdup("Smith");
r.children.val[0].dateOfBirth = strdup("19571111");
r.children.val[1].name.givenName = strdup("Susan");
r.children.val[1].name.initial = strdup("B");
r.children.val[1].name.familyName = strdup("Smith");
r.children.val[1].dateOfBirth = strdup("19590717");
os.length = 0;
os.data = 0;
ASN1_MALLOC_ENCODE(X690SamplePersonnelRecord, os.data, os.length, &r, &sz,
ret);
if (ret || sz != sizeof(encoded_sample) || sz != os.length ||
memcmp(encoded_sample, os.data, sz) != 0)
return 1;
free_X690SamplePersonnelRecord(&r);
free(os.data);
return 0;
}
int
main(int argc, char **argv)
{
@@ -1808,5 +1872,7 @@ main(int argc, char **argv)
ret += test_seq4();
ret += test_seqof5();
ret += test_x690sample();
return ret;
}

View File

@@ -594,6 +594,11 @@ EXPORTS
copy_VendorLoadErrorCode
copy_Version
copy_WrappedFirmwareKey
copy_X690SampleChildInformation
copy_X690SampleDate
copy_X690SampleEmployeeNumber
copy_X690SampleName
copy_X690SamplePersonnelRecord
decode_AccessDescription
decode_AD_AND_OR
decode_AD_IF_RELEVANT
@@ -927,6 +932,11 @@ EXPORTS
decode_VendorLoadErrorCode
decode_Version
decode_WrappedFirmwareKey
decode_X690SampleChildInformation
decode_X690SampleDate
decode_X690SampleEmployeeNumber
decode_X690SampleName
decode_X690SamplePersonnelRecord
der_copy_bit_string
der_copy_bmp_string
der_copy_generalized_time
@@ -1388,6 +1398,11 @@ EXPORTS
encode_VendorLoadErrorCode
encode_Version
encode_WrappedFirmwareKey
encode_X690SampleChildInformation
encode_X690SampleDate
encode_X690SampleEmployeeNumber
encode_X690SampleName
encode_X690SamplePersonnelRecord
FastOptions2int
free_AccessDescription
free_AD_AND_OR
@@ -1722,6 +1737,11 @@ EXPORTS
free_VendorLoadErrorCode
free_Version
free_WrappedFirmwareKey
free_X690SampleChildInformation
free_X690SampleDate
free_X690SampleEmployeeNumber
free_X690SampleName
free_X690SamplePersonnelRecord
heim_any_cmp
_heim_der_set_sort
_heim_fix_dce
@@ -2077,6 +2097,11 @@ EXPORTS
length_VendorLoadErrorCode
length_Version
length_WrappedFirmwareKey
length_X690SampleChildInformation
length_X690SampleDate
length_X690SampleEmployeeNumber
length_X690SampleName
length_X690SamplePersonnelRecord
remove_AttributeValues
remove_AuthorizationData
remove_CertificatePolicies

146
lib/asn1/x690sample.asn1 Normal file
View File

@@ -0,0 +1,146 @@
x690sample DEFINITIONS ::= BEGIN
IMPORTS heim_any,
heim_any_set FROM heim;
-- This is taken from Appendix A of X.690.
--
-- This doesn't exercise every feature, like OPTIONAL, not really DEFAULT, not
-- EXPLICIT tagging, extensibility markers, etc., but it exercises some hard
-- ones like SET and IMPLICIT tagging.
--
-- Because we don't yet have an option to add a namespace prefix to generated
-- symbols, to avoid conflicts with rfc2459's Name we're prefixing the type
-- names here manually.
X690SamplePersonnelRecord ::= [APPLICATION 0] IMPLICIT SET {
name X690SampleName,
title [0] VisibleString,
number X690SampleEmployeeNumber,
dateOfHire [1] X690SampleDate,
nameOfSpouse [2] X690SampleName,
-- Heimdal's ASN.1 compiler doesn't handle DEFAULT values for types for
-- which it doesn't support literal values.
children [3] IMPLICIT SEQUENCE OF X690SampleChildInformation -- DEFAULT {}
}
X690SampleChildInformation ::= SET {
name X690SampleName,
dateOfBirth [0] X690SampleDate
}
X690SampleName ::= [APPLICATION 1] IMPLICIT SEQUENCE {
givenName VisibleString,
initial VisibleString,
familyName VisibleString
}
-- Range added for test convenience.
X690SampleEmployeeNumber ::= [APPLICATION 2] IMPLICIT INTEGER (0..4294967295)
X690SampleDate::= [APPLICATION 3] IMPLICIT VisibleString --YYYYMMDD
-- The following is value syntax for the above, but Heimdal's ASN.1 compiler
-- does not yet support value syntax for anything other than OIDs, booleans,
-- integers, and UTF-8 strings:
--
-- { name { givenName "John", initial "P", familyName "Smith" },
-- title "Director",
-- number 51,
-- dateOfHire "19710917",
-- nameOfSpouse {givenName "Mary", initial "T", familyName "Smith" },
-- children {
-- {name {givenName "Ralph", initial "T", familyName "Smith" },
-- dateOfBirth "19571111"},
-- {name {givenName "Susan", initial "B", familyName "Jones" },
-- I dateOfBirth "19590717"}
-- }
-- }
--
-- The encoding of this value is supposed to be (all hex) (adapted from X.690
-- Appendix A):
--
-- 60818561101A044A6F686E1A01501A05536D697468A00A1A084469726563746F
-- 72420133A10A43083139373130393137A21261101A044D6172791A01541A0553
-- 6D697468A342311F61111A0552616C70681A01541A05536D697468A00A430831
-- 39353731313131311F61111A05537573616E1A01421A05536D697468A00A4308
-- 3139353930373137
--
-- And a rough visualization of this is (adapted from X.690 Appendix A):
--
-- T L
-- 60 8185 # 3
-- Name
-- T L
-- 61 10 # 2
-- T L "John"
-- 1A 04 4A6F686E # 6
-- T L "P"
-- 1A 01 50 # 3
-- T L "Smith"
-- 1A 05 536D697468 # 7
-- Title
-- T L T L "Director"
-- A0 0A 1A 08 4469726563746F72 #12
-- Emp. #
-- 42 01 33 # 3
-- Date of hire
-- A1 0A 43 08 3139373130393137 #12
-- Spouse
-- A2 12 # 2
-- Name
-- 61 10 # 2
-- 1A 04 4D617279 # 6
-- 1A 01 54 # 3
-- 1A 05 536D697468 # 7
-- Children
-- A3 42 # 2
-- 31 1F # 2
-- Name
-- 61 11 1A 05 52616C7068 # 9
-- 1A 01 54 # 3
-- 1A 05 536D697468 # 7
-- DoB
-- A0 0A 43 08 3139353731313131 #12
-- 31 1F # 2 bytes
-- 61 11 1A 05 537573616E # 9 bytes
-- 1A 01 42 # 3 bytes
-- 1A 05 536D697468 # 7 bytes
-- A0 0A 43 08 3139353930373137 #12 bytes
--
-- Our asn1_print program dumps this as follows, which looks correct:
--
-- APPL CONS tag 0 = 133 bytes [0]
-- APPL CONS tag 1 = 16 bytes [1]
-- UNIV PRIM VisibleString = "John"
-- UNIV PRIM VisibleString = "P"
-- UNIV PRIM VisibleString = "Smith"
-- CONTEXT CONS tag 0 = 10 bytes [0]
-- UNIV PRIM VisibleString = "Director"
-- APPL PRIM tag 2 = 1 bytes [2] IMPLICIT content
-- CONTEXT CONS tag 1 = 10 bytes [1]
-- APPL PRIM tag 3 = 8 bytes [3] IMPLICIT content
-- CONTEXT CONS tag 2 = 18 bytes [2]
-- APPL CONS tag 1 = 16 bytes [1]
-- UNIV PRIM VisibleString = "Mary"
-- UNIV PRIM VisibleString = "T"
-- UNIV PRIM VisibleString = "Smith"
-- CONTEXT CONS tag 3 = 66 bytes [3]
-- UNIV CONS Set = 31 bytes {
-- APPL CONS tag 1 = 17 bytes [1]
-- UNIV PRIM VisibleString = "Ralph"
-- UNIV PRIM VisibleString = "T"
-- UNIV PRIM VisibleString = "Smith"
-- CONTEXT CONS tag 0 = 10 bytes [0]
-- APPL PRIM tag 3 = 8 bytes [3] IMPLICIT content
-- }
-- UNIV CONS Set = 31 bytes {
-- APPL CONS tag 1 = 17 bytes [1]
-- UNIV PRIM VisibleString = "Susan"
-- UNIV PRIM VisibleString = "B"
-- UNIV PRIM VisibleString = "Smith"
-- CONTEXT CONS tag 0 = 10 bytes [0]
-- APPL PRIM tag 3 = 8 bytes [3] IMPLICIT content
-- }
END