Ethereal-dev: Re: [Ethereal-dev] Questions about the X.411 dissector

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Graeme Lunt <graeme.lunt@xxxxxxxxx>
Date: Mon, 5 Dec 2005 17:53:36 +0100
Hi,

> I was thinking about GeneralText body part (2.6.1.4.11/2.6.1.11.11).
> I suppose it is pretty simple to implement.

Attached is a patch for the X.411, X420 and CMS dissectors to
implement the remaining heading extensions and bodyparts.

This includes GeneralText BP, forwarded content BP (forwarded p22 and
forwarded p772), PKCS#7 BP, and "business class" messaging extensions.

The X.411 extensions using the SIGNATURE macro have also been implemented.
There is also a fix for a bug in the dissection of integer 22 content type.

Graeme
Index: asn1/cms/cms.cnf
===================================================================
--- asn1/cms/cms.cnf	(revision 16673)
+++ asn1/cms/cms.cnf	(working copy)
@@ -39,6 +39,8 @@
 SigningTime		  B "1.2.840.113549.1.9.5"	"id-signingTime"
 Countersignature  B "1.2.840.113549.1.9.6"	"id-counterSignature"
 
+ContentInfo	 B "2.6.1.4.18" "id-et-pkcs7"
+
 #.NO_EMIT
 
 #.TYPE_RENAME
Index: asn1/x411/x411.cnf
===================================================================
--- asn1/x411/x411.cnf	(revision 16673)
+++ asn1/x411/x411.cnf	(working copy)
@@ -23,6 +23,11 @@
 SupplementaryInformation
 TeletexNonBasicParameters
 SecurityLabel
+UniversalOrBMPString
+MessageDeliveryIdentifier
+ProofOfSubmission
+OriginatingMTACertificate
+MessageSubmissionEnvelope
 
 #.TYPE_RENAME
 MTABindArgument/authenticated	AuthenticatedArgument
@@ -142,13 +147,13 @@
 OriginatorCertificate B "x411.extension.15" "originator-certificate"
 
 ContentConfidentialityAlgorithmIdentifier B "x411.extension.17" "content-confidentiality-algorithm-identifier"
-
-
+ContentIntegrityCheck B "x411.extension.18" "content-integrity-check"
+MessageOriginAuthenticationCheck B "x411.extension.19" "message-origin-authentication-check"
 MessageSecurityLabel B "x411.extension.20" "message-security-label"
 ProofOfSubmissionRequest B "x411.extension.21" "proof-of-submission-request"
 ProofOfDeliveryRequest B "x411.extension.22" "proof-of-delivery-request"
 ContentCorrelator B "x411.extension.23" "content-correlator"
-
+ProbeOriginAuthenticationCheck B "x411.extension.24" "probe-origin-authentication-check"
 RedirectionHistory B "x411.extension.25" "redirection-history"
 DLExpansionHistory B "x411.extension.26" "dl-expansion-history"
 PhysicalForwardingAddress B "x411.extension.27" "physical-forwarding-address"
@@ -157,6 +162,8 @@
 OriginatorAndDLExpansionHistory B "x411.extension.30" "originator-and-DL-expansion-history"
 ReportingDLName B "x411.extension.31" "reporting-DL-name"
 ReportingMTACertificate B "x411.extension.32" "reporting-MTA-certificate"
+ReportOriginAuthenticationCheck B "x411.extension.33" "report-origin-authentication-check"
+ProofOfSubmission	B "x411.extension.35" "proof-of-submission"
 
 TraceInformation B "x411.extension.37" "trace-information"
 InternalTraceInformation B "x411.extension.38" "internal-trace-information"
@@ -179,12 +186,13 @@
 PostalCode B "x411.extension-attribute.9" "postal-code"
 PhysicalDeliveryOfficeName B "x411.extension-attribute.10" "physical-delivery-office-name"
 
-
 UniversalCommonName B "x411.extension-attribute.24" "universal-common-name"
 UniversalOrganizationName B "x411.extension-attribute.25" "universal-organization-name"
 UniversalPersonalName B "x411.extension-attribute.26" "universal-personal-name"
 UniversalOrganizationalUnitNames B "x411.extension-attribute.27" "universal-organizational-unit-names"
 
+ReportDeliveryArgument	B	"2.6.1.4.14"	"id-et-report"
+
 #.FN_BODY AdditionalInformation
 /*XXX not implemented yet */
 
@@ -314,10 +322,10 @@
   /* convert integer content type to oid for dispatch when the content is found */
   switch(ict) {
 	case 2:
-	object_identifier_id = ep_strdup("2.6.1.10.0");
+	content_type_id = ep_strdup("2.6.1.10.0");
 	break;
 	case 22:
-	object_identifier_id = ep_strdup("2.6.1.10.1");
+	content_type_id = ep_strdup("2.6.1.10.1");
 	break;
 	default:
 	break;
Index: asn1/x411/x411-exp.cnf
===================================================================
--- asn1/x411/x411-exp.cnf	(revision 16673)
+++ asn1/x411/x411-exp.cnf	(working copy)
@@ -1,9 +1,14 @@
 #.IMPORT_TAG
+MessageSubmissionEnvelope BER_CLASS_UNI BER_UNI_TAG_SET
 OtherMessageDeliveryFields BER_CLASS_UNI BER_UNI_TAG_SET
+MessageDeliveryIdentifier BER_CLASS_APP 4
 MessageDeliveryTime      BER_CLASS_UNI BER_UNI_TAG_UTCTime
 SupplementaryInformation BER_CLASS_UNI BER_UNI_TAG_PrintableString
+OriginatingMTACertificate BER_CLASS_UNI BER_UNI_TAG_SEQUENCE
+ProofOfSubmission        BER_CLASS_UNI BER_UNI_TAG_SEQUENCE
 ExtendedCertificates     BER_CLASS_UNI BER_UNI_TAG_SET
 ORName                   BER_CLASS_APP 0
+UniversalOrBMPString     BER_CLASS_UNI BER_UNI_TAG_SET
 EncodedInformationTypes  BER_CLASS_APP 5
 G3FacsimileNonBasicParameters BER_CLASS_UNI BER_UNI_TAG_BITSTRING
 TeletexNonBasicParameters BER_CLASS_UNI BER_UNI_TAG_SET
@@ -11,11 +16,16 @@
 #.END
 
 #.TYPE_ATTR
+MessageSubmissionEnvelope TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
 OtherMessageDeliveryFields TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
+MessageDeliveryIdentifier TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
 MessageDeliveryTime      TYPE = FT_STRING  DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
 SupplementaryInformation TYPE = FT_STRING  DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
+OriginatingMTACertificate TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
+ProofOfSubmission        TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
 ExtendedCertificates     TYPE = FT_UINT32  DISPLAY = BASE_DEC   STRINGS = NULL  BITMASK = 0
 ORName                   TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
+UniversalOrBMPString     TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
 EncodedInformationTypes  TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
 G3FacsimileNonBasicParameters TYPE = FT_BYTES   DISPLAY = BASE_HEX   STRINGS = NULL  BITMASK = 0
 TeletexNonBasicParameters TYPE = FT_NONE    DISPLAY = BASE_NONE  STRINGS = NULL  BITMASK = 0
Index: asn1/x411/x411.asn
===================================================================
--- asn1/x411/x411.asn	(revision 16673)
+++ asn1/x411/x411.asn	(working copy)
@@ -763,10 +763,10 @@
 ResponderCredentials ::= Credentials
 
 Credentials ::= CHOICE {
-  simple     Password
+  simple     Password,
 --  strong     [0]  StrongCredentials,
 --  ...,
---  protected  [1]  ProtectedPassword
+  protected  [1]  ProtectedPassword
 }
 
 Password ::= CHOICE {
@@ -781,19 +781,25 @@
 --  certificate-selector     [2]  CertificateAssertion OPTIONAL
 --}
 
---ProtectedPassword ::= SET {
---  signature
+ProtectedPassword ::= SET {
+  signature
 --    SIGNATURE{SET {password  Password,
 --                   time1     [0]  UTCTime OPTIONAL,
 --                   time2     [1]  UTCTime OPTIONAL,
 --                   random1   [2]  BIT STRING OPTIONAL,
 --                   random2   [3]  BIT STRING OPTIONAL}},
---  time1      [0]  UTCTime OPTIONAL,
---  time2      [1]  UTCTime OPTIONAL,
---  random1    [2]  BIT STRING OPTIONAL,
---  random2    [3]  BIT STRING OPTIONAL
---}
+  Signature,
+  time1      [0]  UTCTime OPTIONAL,
+  time2      [1]  UTCTime OPTIONAL,
+  random1    [2]  BIT STRING OPTIONAL,
+  random2    [3]  BIT STRING OPTIONAL
+}
 
+Signature ::= SEQUENCE {
+  algorithmIdentifier	AlgorithmIdentifier,
+  encrypted		BIT STRING
+}
+
 SecurityContext ::= SET --SIZE (1..ub-security-labels)-- OF SecurityLabel
 
 --	Submission Port
@@ -1016,7 +1022,7 @@
 
 MessageDeliveryResult ::= SET {
   recipient-certificate  [0]  RecipientCertificate OPTIONAL,
---  proof-of-delivery      [1] IMPLICIT ProofOfDelivery OPTIONAL,
+  proof-of-delivery      [1] IMPLICIT ProofOfDelivery OPTIONAL,
   ...,
   extensions
     [2]  SET OF ExtensionField --{{MessageDeliveryResultExtensions}}-- DEFAULT {}
@@ -1142,7 +1148,7 @@
 --	Delivery Port Parameters
 RecipientCertificate ::= Certificates
 
---ProofOfDelivery ::=
+ProofOfDelivery ::= Signature
 --  SIGNATURE
 --    {SEQUENCE {algorithm-identifier
 --                 ProofOfDeliveryAlgorithmIdentifier,
@@ -1945,7 +1951,7 @@
 --  IDENTIFIED BY            standard-extension:18
 --}
 
---ContentIntegrityCheck ::=
+ContentIntegrityCheck ::= Signature
 --  SIGNATURE
 --    {SEQUENCE {algorithm-identifier
 --                 ContentIntegrityAlgorithmIdentifier OPTIONAL,
@@ -1959,7 +1965,7 @@
 --  IDENTIFIED BY            standard-extension:19
 --}
 
---MessageOriginAuthenticationCheck ::=
+MessageOriginAuthenticationCheck ::= Signature
 --  SIGNATURE
 --    {SEQUENCE {algorithm-identifier
 --                 MessageOriginAuthenticationAlgorithmIdentifier,
@@ -2013,7 +2019,7 @@
 --  IDENTIFIED BY            standard-extension:24
 --}
 
---ProbeOriginAuthenticationCheck ::=
+ProbeOriginAuthenticationCheck ::= Signature
 --  SIGNATURE
 --    {SEQUENCE {algorithm-identifier
 --                 ProbeOriginAuthenticationAlgorithmIdentifier,
@@ -2110,7 +2116,7 @@
 --  IDENTIFIED BY            standard-extension:33
 --}
 
---ReportOriginAuthenticationCheck ::=
+ReportOriginAuthenticationCheck ::= Signature
 --  SIGNATURE
 --    {SEQUENCE {algorithm-identifier
 --                 ReportOriginAuthenticationAlgorithmIdentifier,
@@ -2154,7 +2160,7 @@
 --  IDENTIFIED BY  standard-extension:35
 --}
 
---ProofOfSubmission ::=
+ProofOfSubmission ::= Signature
 --  SIGNATURE
 --    {SEQUENCE {algorithm-identifier
 --                 ProofOfSubmissionAlgorithmIdentifier,
@@ -2163,7 +2169,7 @@
 --               message-submission-identifier  MessageSubmissionIdentifier,
 --               message-submission-time        MessageSubmissionTime}}
 
-ProofOfSubmissionAlgorithmIdentifier ::= AlgorithmIdentifier
+--ProofOfSubmissionAlgorithmIdentifier ::= AlgorithmIdentifier
 
 --reporting-MTA-name EXTENSION ::= {
 --  ReportingMTAName,
Index: asn1/x420/x420.cnf
===================================================================
--- asn1/x420/x420.cnf	(revision 16673)
+++ asn1/x420/x420.cnf	(working copy)
@@ -1,10 +1,12 @@
 #.MODULE_IMPORT
 MTSAbstractService	x411
 AuthenticationFramework	x509af
+CertificateExtensions	x509ce
 ACSE-1			acse
 
 #.INCLUDE ../x411/x411-exp.cnf
 #.INCLUDE ../x509af/x509af-exp.cnf
+#.INCLUDE ../x509ce/x509ce-exp.cnf
 #.INCLUDE ../acse/acse-exp.cnf
 
 #.EXPORTS
@@ -33,6 +35,9 @@
 TeletexParameters/non-basic-parameters		teletex_non_basic_parameters
 G3FacsimileParameters/non-basic-parameters	g3facsimile_non_basic_parameters
 
+BodyPart/encrypted		encrypted_bp
+CirculationSignatureData/algorithm-identifier	circulation-signature-algorithm-identifier
+
 #.PDU
 OriginatingUA
 AbsenceAdvice
@@ -45,6 +50,59 @@
 ChangeOfAddressAdvice	B "2.6.1.19.1"  "id-on-change-of-address-advice"
 IPMAssemblyInstructions	B "2.6.1.17.2"  "id-mst-assembly-instructions"
 
+IncompleteCopy			B "2.6.1.5.0"	"id-hex-languages"
+Languages			B "2.6.1.5.1"	"id-hex-languages"
+AutoSubmitted			B "2.6.1.5.2"	"id-hex-auto-submitted"
+BodyPartSignatures		B "2.6.1.5.3"	"id-hex-body-part-signatures"
+IPMSecurityLabel		B "2.6.1.5.4"	"id-hex-ipm-security-label"
+AuthorizationTime		B "2.6.1.5.5"	"id-hex-authorization-time"
+CirculationList			B "2.6.1.5.6"	"id-hex-circulation-list-recipients"
+CirculationListIndicator	B "2.6.1.20.0"	"id-rex-circulation-list-indicator"
+DistributionCodes		B "2.6.1.5.7"	"id-hex-distribution-codes"
+ExtendedSubject			B "2.6.1.5.8"	"id-hex-extended-subject"
+InformationCategories		B "2.6.1.5.9"	"id-hex-information-categories"
+ManualHandlingInstructions	B "2.6.1.5.10" 	"id-hex-manual-handling-instructions"
+OriginatorsReference		B "2.6.1.5.11"	"id-hex-originators-reference"
+PrecedencePolicyIdentifier	B "2.6.1.5.12"	"id-hex-precedence-policy-id"
+Precedence			B "2.6.1.20.1"	"id-rex-precedence"
+
+IA5TextData 			B "2.6.1.4.0" 	"id-et-ia5-text"
+IA5TextParameters 		B "2.6.1.11.0" 	"id-ep-ia5-text"
+G3FacsimileData 		B "2.6.1.4.2" 	"id-et-g3-facsimile"
+G3FacsimileParameters 		B "2.6.1.11.2" 	"id-ep-g3-facsimile"
+G4Class1Data 			B "2.6.1.4.3" 	"id-et-g4-class1"
+TeletexData 			B "2.6.1.4.4" 	"id-et-teletex"
+TeletexParameters 		B "2.6.1.11.4" 	"id-ep-teletex"
+VideotexData 			B "2.6.1.4.5" 	"id-et-videotex"
+VideotexParameters 		B "2.6.1.11.5" 	"id-ep-videotex"
+EncryptedData 			B "2.6.1.4.6" 	"id-et-encrypted"
+EncryptedParameters 		B "2.6.1.11.6" 	"id-ep-encrypted"
+MessageData 			B "2.6.1.4.7" 	"id-et-message"
+MessageParameters 		B "2.6.1.11.7" 	"id-ep-message"
+MixedModeData 			B "2.6.1.4.8" 	"id-et-mixed-mode"
+BilaterallyDefinedBodyPart 	B "2.6.1.4.9" 	"id-et-bilaterally-defined"
+
+GeneralTextParameters		B "2.6.1.11.11"	"id-ep-general-text"
+GeneralTextData			B "2.6.1.4.11"	"id-et-general-text"
+# FileTransferBodyPart {id-et 12} in a separate dissector (ftbp)
+# {id-et 13} is no longer defined
+# ForwardedReportBodyPart {id-et 14} defined in x411.cnf
+MessageParameters 		B "2.6.1.11.15" "id-ep-notification"
+IPN				B "2.6.1.4.15" 	"id-et-notification"
+VoiceParameters 		B "2.6.1.11.16" "id-ep-voice"
+VoiceData			B "2.6.1.4.16" 	"id-et-voice"
+# P22
+ForwardedContentParameters 	B "2.6.1.11.17.2.6.1.10.1" 	"id-ep-content-p22"
+InformationObject		B "2.6.1.4.17.2.6.1.10.1" 	"id-et-content-p22"
+#p2
+ForwardedContentParameters 	B "2.6.1.11.17.2.6.1.10.0" 	"id-ep-content-p2"
+InformationObject		B "2.6.1.4.17.2.6.1.10.0" 	"id-et-content-p2"
+#p722
+ForwardedContentParameters 	B "2.6.1.11.17.1.3.26.0.4406.0.4.1" 	"id-ep-content-p772"
+# this will display as P22 for now
+InformationObject	 	B "2.6.1.4.17.1.3.26.0.4406.0.4.1" 	"id-et-content-p772"
+# PKCS#7Bodypart {id-et 18} defined in cms.cnf
+
 #.FN_PARS IPMSExtension/type
 	FN_VARIANT = _str  VAL_PTR = &object_identifier_id
 
@@ -86,10 +144,21 @@
   if(subject && check_col(pinfo->cinfo, COL_INFO))
    col_append_fstr(pinfo->cinfo, COL_INFO, " (%%s)", tvb_format_text(subject, 0, tvb_length(subject)));
 
+#.FN_PARS CharacterSetRegistration
+  VAL_PTR=&crs
 
+#.FN_BODY CharacterSetRegistration
+  guint32 crs;
+  proto_item *pi;
+  %(DEFAULT_BODY)s
+
+  if((pi = get_ber_last_created_item()))
+    proto_item_append_text(pi, " (%%s)", val_to_str(crs, charsetreg_vals, "unknown"));
+
 #.FN_BODY Interchange_Data_Element
 /* XXX Not implemented yet */
 
 #.FN_BODY NationallyDefinedBodyPart
 /* XXX Not implemented yet */
 
+
Index: asn1/x420/packet-x420-template.c
===================================================================
--- asn1/x420/packet-x420-template.c	(revision 16673)
+++ asn1/x420/packet-x420-template.c	(working copy)
@@ -39,6 +39,7 @@
 #include "packet-ros.h"
 
 #include "packet-x509af.h"
+#include "packet-x509ce.h"
 #include "packet-x411.h"
 
 #include "packet-x420.h"
@@ -52,6 +53,35 @@
 
 static const char *object_identifier_id; /* content type identifier */
 
+static const value_string charsetreg_vals [] = {
+  { 1, "C0: (ISO/IEC 6429)"},
+  { 6, "G0: ASCII (ISO/IEC 646)"},
+  { 77, "C1: (ISO/IEC 6429)"},
+  { 100, "Gn: Latin Alphabet No.1, Western European Supplementary Set (GR area of ISO-8859-1)"},
+  { 101, "Gn: Latin Alphabet No.2, Central EuropeanSupplementary Set (GR area of ISO-8859-2)"},
+  { 104, "C0: (ISO/IEC 4873)"},
+  { 105, "C1: (ISO/IEC 4873)"},
+  { 106, "C0: Teletex (CCITT T.61)"},
+  { 107, "C1: Teletex (CCITT T.61)"},
+  { 109, "Gn: Latin Alphabet No.3, Southern European Supplementary Set (GR area of ISO-8859-3)"},
+  { 110, "Gn: Latin Alphabet No.4, Baltic Supplementary Set (GR area of ISO-8859-4)"},
+  { 126, "Gn: Greek Supplementary Set (GR area of ISO-8859-7)"},
+  { 127, "Gn: Arabic Supplementary Set (GR area of ISO-8859-6)"},
+  { 138, "Gn: Hebrew Supplementary Set (GR area of ISO-8859-8)"},
+  { 144, "Gn: Cyrillic Supplementary Set (GR area of ISO-8859-5)"},
+  { 148, "Gn: Latin Alphabet No.5, Cyrillic Supplementary Set (GR area of ISO-8859-9)"},
+  { 154, "Gn: Supplementary Set for Latin Alphabets No.1 or No.5, and No.2"},
+  { 157, "Gn: Latin Alphabet No.6, Arabic Supplementary Set (GR area of ISO-8859-10)"},
+  { 158, "Gn: Supplementary Set for Sami (Lappish) to complement Latin Alphabet No.6 (from Annex A  of ISO-8859-10)"},
+  { 166, "Gn: Thai Supplementary Set (GR area of ISO-8859-11)"},
+  { 179, "Gn: Latin Alphabet No.7, Baltic Rim Supplementary Set (GR area of ISO-8859-13)"},
+  { 182, "Gn: Welsh Variant of Latin Alphabet No.1, Supplementary Set (GR area of ISO-8859-1)"},
+  { 197, "Gn: Supplementary Set for Sami to complement Latin Alphabet No.6 (from Annex A  of ISO-8859-10)"},
+  { 199, "Gn: Latin Alphabet No.8, Celtic Supplementary Set (GR area of ISO-8859-14)"},
+  { 203, "Gn: Latin Alphabet No.9, European Rim Supplementary Set (GR area of ISO-8859-15)"},
+  { 0, NULL}
+};
+
 #include "packet-x420-hf.c"
 
 /* Initialize the subtree pointers */
Index: asn1/x420/x420.asn
===================================================================
--- asn1/x420/x420.asn	(revision 16673)
+++ asn1/x420/x420.asn	(working copy)
@@ -68,7 +68,9 @@
   EncodedInformationTypes, ExtendedCertificates, EXTENSION,
     G3FacsimileNonBasicParameters, MessageDeliveryTime, ORName,
     OtherMessageDeliveryFields, SupplementaryInformation,
-    TeletexNonBasicParameters
+    TeletexNonBasicParameters, UniversalOrBMPString, SecurityLabel,
+    MessageDeliveryIdentifier, ProofOfSubmission, OriginatingMTACertificate,
+    MessageSubmissionEnvelope
     --==
     FROM MTSAbstractService {joint-iso-itu-t mhs(6) mts(3) modules(0)
       mts-abstract-service(1) version-1999(1)}
@@ -93,8 +95,13 @@
 --    FROM IPMSObjectIdentifiers {joint-iso-itu-t mhs(6) ipms(1) modules(0)
 --      object-identifiers(0) version-1999(1)} ; --
     EXTERNAL 
-    FROM ACSE-1;
+    FROM ACSE-1
+  CertificateAssertion
+    --==
+    FROM CertificateExtensions {joint-iso-itu-t ds(5) module(1)
+      certificateExtensions(26) 0};
 
+
 Time ::= UTCTime
 
 -- Information object
@@ -344,10 +351,14 @@
 G3FacsimileData ::= SEQUENCE OF BIT STRING
 
 -- G4 Class 1 and Mixed-mode body parts
-G4Class1BodyPart ::= SEQUENCE OF Interchange-Data-Element
+G4Class1BodyPart ::= G4Class1Data
 
-MixedModeBodyPart ::= SEQUENCE OF Interchange-Data-Element
+G4Class1Data ::= SEQUENCE OF Interchange-Data-Element
 
+MixedModeBodyPart ::= MixedModeData
+
+MixedModeData ::= SEQUENCE OF Interchange-Data-Element
+
 -- Teletex body part
 TeletexBodyPart ::= SEQUENCE {
   parameters  TeletexParameters,
@@ -388,7 +399,7 @@
   ...
 }
 
-EncryptedData ::= BIT STRING(CONSTRAINED BY {BodyPart})
+EncryptedData ::= BIT STRING --(CONSTRAINED BY {BodyPart})
 
 -- Message body part
 MessageBodyPart ::= SEQUENCE {
@@ -601,10 +612,10 @@
 BodyPartReference ::= CHOICE {
   stored-entry         [0]  SequenceNumber,
   stored-content       [1]  SequenceNumber,
-  submitted-body-part  [2]  INTEGER(1..MAX),
+  submitted-body-part  [2]  INTEGER--(1..MAX)--,
   stored-body-part
     [3]  SEQUENCE {message-entry     SequenceNumber,
-                   body-part-number  INTEGER(1..MAX)}
+                   body-part-number  --INTEGER(1..MAX)-- BodyPartNumber}
 }
 
 --originator-body-part-encryption-token MS-EXTENSION ::= {
@@ -637,7 +648,396 @@
 -- cannot refer to basic types in .cnf .#REGISTER - so we create an intermediate type
 OriginatingUA ::= IA5String
 
-END -- of IPMSInformationObjects
+-- END - - of IPMSInformationObjects
 
+
+-- Module IPMSHeadingExtensions (X.420:06/1999)
+--IPMSHeadingExtensions {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--  heading-extensions(6) version-1999(1)} DEFINITIONS IMPLICIT TAGS ::=
+--BEGIN
+
+-- Prologue
+-- Exports everything.
+--IMPORTS
+  -- IPMS Information Objects
+--  IPMS-EXTENSION, ORDescriptor, RecipientSpecifier, ThisIPMField, BodyPart
+    --==
+--    FROM IPMSInformationObjects {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      information-objects(2) version-1999(1)}
+  -- MTS Abstract Service
+--  ExtendedCertificates, SecurityLabel, UniversalOrBMPString{}
+    --==
+--    FROM MTSAbstractService {joint-iso-itu-t mhs(6) mts(3) modules(0)
+--      mts-abstract-service(1) version-1999(1)}
+  -- Directory Authentication Framework
+--  AlgorithmIdentifier, SIGNATURE{}, SIGNED{}
+    --==
+--    FROM AuthenticationFramework {joint-iso-itu-t ds(5) module(1)
+--      authenticationFramework(7) 3}
+  -- Directory Certificate Extensions
+--  CertificateAssertion
+    --==
+--    FROM CertificateExtensions {joint-iso-itu-t ds(5) module(1)
+--      certificateExtensions(26) 0}
+  -- IPMS upper bounds
+--  ub-alpha-code-length, ub-circulation-list-members, ub-distribution-codes,
+--    ub-extended-subject-length, ub-information-categories,
+--    ub-information-category-length, ub-manual-handling-instruction-length,
+--    ub-manual-handling-instructions, ub-originators-reference-length,
+--    ub-precedence
+    --==
+--    FROM IPMSUpperBounds {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      upper-bounds(10) version-1999(1)}
+  -- IPMS Object Identifiers
+--  id-hex-authorization-time, id-hex-auto-submitted,
+--    id-hex-body-part-signatures, id-hex-circulation-list-recipients,
+--    id-hex-distribution-codes, id-hex-extended-subject, id-hex-incomplete-copy,
+--    id-hex-information-category, id-hex-ipm-security-label, id-hex-languages,
+--    id-hex-manual-handling-instructions, id-hex-originators-reference,
+--    id-hex-precedence-policy-id, id-rex-circulation-list-indicator,
+--    id-rex-precedence
+    --==
+--    FROM IPMSObjectIdentifiers {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      object-identifiers(0) version-1999(1)};
+
+-- Incomplete Copy
+--incomplete-copy IPMS-EXTENSION ::= {
+--  VALUE          IncompleteCopy,
+--  IDENTIFIED BY  id-hex-incomplete-copy
+--}
+
+IncompleteCopy ::= NULL
+
+-- Languages
+--languages IPMS-EXTENSION ::= {
+--  VALUE          SET OF Language,
+--  IDENTIFIED BY  id-hex-languages
+--}
+
+Languages ::= SET OF Language
+
+Language ::= PrintableString --(SIZE (2 | 5))
+
+-- Auto-submitted
+--auto-submitted IPMS-EXTENSION ::= {
+--  VALUE          AutoSubmitted,
+--  IDENTIFIED BY  id-hex-auto-submitted
+--}
+
+AutoSubmitted ::= ENUMERATED {
+  not-auto-submitted(0), auto-generated(1), auto-replied(2)}
+
+--body-part-signatures IPMS-EXTENSION ::= {
+--  VALUE          BodyPartSignatures,
+--  IDENTIFIED BY  id-hex-body-part-signatures
+--}
+
+Signature ::= SEQUENCE {
+  algorithmIdentifier	AlgorithmIdentifier,
+  encrypted		BIT STRING
+}
+
+
+BodyPartSignatures ::=
+  SET OF
+    SET {body-part-number                 BodyPartNumber,
+         body-part-signature              BodyPartSignature,
+         originator-certificate-selector  [1]  CertificateAssertion OPTIONAL,
+         originator-certificates          [0]  ExtendedCertificates OPTIONAL --,
+--         ... --}
+
+BodyPartNumber ::= INTEGER --(1..MAX)
+
+BodyPartSignature ::= Signature
+--  SIGNATURE
+--    {SEQUENCE {signature-algorithm-identifier  AlgorithmIdentifier,
+--               body-part                       BodyPart,
+--               body-part-security-label        SecurityLabel OPTIONAL
+--    }}
+
+--ipm-security-label IPMS-EXTENSION ::= {
+--  VALUE          IPMSecurityLabel,
+--  IDENTIFIED BY  id-hex-ipm-security-label
+--}
+
+IPMSecurityLabel ::= SEQUENCE {
+  content-security-label     [0]  SecurityLabel,
+  heading-security-label     [1]  SecurityLabel OPTIONAL,
+  body-part-security-labels  [2]  SEQUENCE OF BodyPartSecurityLabel OPTIONAL
+}
+
+BodyPartSecurityLabel ::= CHOICE {
+  body-part-unlabelled      [0]  NULL,
+  body-part-security-label  [1]  SecurityLabel
+}
+
+-- Authorization Time
+--authorization-time IPMS-EXTENSION ::= {
+--  VALUE          AuthorizationTime,
+--  IDENTIFIED BY  id-hex-authorization-time
+--}
+
+AuthorizationTime ::= GeneralizedTime
+
+-- Circulation List
+--circulation-list-recipients IPMS-EXTENSION ::= {
+--  VALUE          CirculationList,
+--  IDENTIFIED BY  id-hex-circulation-list-recipients
+--}
+
+CirculationList ::=
+  SEQUENCE (SIZE (2..ub-circulation-list-members)) OF CirculationMember
+
+CirculationMember ::= SET {
+  circulation-recipient
+    RecipientSpecifier
+--      (WITH COMPONENTS {
+--         ...,
+--         recipient  (WITH COMPONENTS {
+--                       ...,
+--                       formal-name  PRESENT
+--                     })
+--       })--,
+  checked                Checkmark OPTIONAL
+}
+
+Checkmark ::= CHOICE {
+  simple       NULL,
+  timestamped  CirculationTime,
+  signed       CirculationSignature
+}
+
+CirculationTime ::= GeneralizedTime
+
+CirculationSignatureData ::= 
+--  SIGNED
+--    { --SEQUENCE {algorithm-identifier  CirculationSignatureAlgorithmIdentifier,
+               this-IPM              ThisIPMField,
+               timestamp             CirculationTime} --}
+
+-- expand SIGNED macro
+
+CirculationSignature ::= SEQUENCE {
+  circulation-signature-data	CirculationSignatureData,
+  algorithm-identifier		AlgorithmIdentifier,
+  encrypted			BIT STRING
+}
+
+
+
+CirculationSignatureAlgorithmIdentifier ::= AlgorithmIdentifier
+
+-- Circulation List Indicator
+--circulation-list-indicator IPMS-EXTENSION ::= {
+--  VALUE          NULL,
+--  IDENTIFIED BY  id-rex-circulation-list-indicator
+--}
+
+CirculationListIndicator ::= NULL
+
+-- Distribution Codes
+--distribution-codes IPMS-EXTENSION ::= {
+--  VALUE          DistributionCodes,
+--  IDENTIFIED BY  id-hex-distribution-codes
+--}
+
+DistributionCodes ::=
+  SEQUENCE --(SIZE (1..ub-distribution-codes))-- OF DistributionCode
+
+DistributionCode ::= SEQUENCE {
+  oid-code           OBJECT IDENTIFIER OPTIONAL,
+  alphanumeric-code  AlphaCode OPTIONAL,
+  or-descriptor      [0]  ORDescriptor OPTIONAL
+}
+
+AlphaCode ::= UniversalOrBMPString --{ub-alpha-code-length}
+
+-- Extended Subject
+--extended-subject IPMS-EXTENSION ::= {
+--  VALUE          ExtendedSubject,
+--  IDENTIFIED BY  id-hex-extended-subject
+--}
+
+ExtendedSubject ::= UniversalOrBMPString--{ub-extended-subject-length}
+
+-- Information category
+--information-category IPMS-EXTENSION ::= {
+--  VALUE          InformationCategories,
+--  IDENTIFIED BY  id-hex-information-category
+--}
+
+InformationCategories ::=
+  SEQUENCE --(SIZE (1..ub-information-categories))-- OF InformationCategory
+
+InformationCategory ::= SEQUENCE {
+  reference    [0]  OBJECT IDENTIFIER OPTIONAL,
+  description  [1]  DescriptionString OPTIONAL
+}
+
+DescriptionString ::= UniversalOrBMPString --{ub-information-category-length}
+
+-- Manual handling Instructions
+--manual-handling-instructions IPMS-EXTENSION ::= {
+--  VALUE          ManualHandlingInstructions,
+--  IDENTIFIED BY  id-hex-manual-handling-instructions
+--}
+
+ManualHandlingInstructions ::=
+  SEQUENCE --(SIZE (1..ub-manual-handling-instructions))-- OF
+    ManualHandlingInstruction
+
+ManualHandlingInstruction ::=
+  UniversalOrBMPString --{ub-manual-handling-instruction-length}
+
+-- Originator's Reference
+--originators-reference IPMS-EXTENSION ::= {
+--  VALUE          OriginatorsReference,
+--  IDENTIFIED BY  id-hex-originators-reference
+--}
+
+OriginatorsReference ::= UniversalOrBMPString--{ub-originators-reference-length}
+
+-- Precedence Policy Identifier
+--precedence-policy-identifier IPMS-EXTENSION ::= {
+--  VALUE          PrecedencePolicyIdentifier,
+--  IDENTIFIED BY  id-hex-precedence-policy-id
+--}
+
+PrecedencePolicyIdentifier ::= OBJECT IDENTIFIER
+
+-- Precedence
+--precedence IPMS-EXTENSION ::= {
+--  VALUE          Precedence,
+--  IDENTIFIED BY  id-rex-precedence
+--}
+
+Precedence ::= INTEGER(0..ub-precedence)
+
+-- END - - of IPMSHeadingExtensions
+
+-- Module IPMSExtendedBodyPartTypes2 (X.420:06/1999)
+-- IPMSExtendedBodyPartTypes2 {iso standard mhs(10021) ipms(7) modules(0)
+--   extended-body-part-types-2(1)} DEFINITIONS IMPLICIT TAGS ::=
+--BEGIN
+
+-- Prologue
+-- Exports everything.
+--IMPORTS
+  -- IPMS Information Objects
+--  EXTENDED-BODY-PART-TYPE
+    --==
+--    FROM IPMSInformationObjects {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      information-objects(2) version-1999(1)}
+  -- IPMS Object Identifiers
+--  id-ep-general-text, id-et-general-text
+    --==
+--    FROM IPMSObjectIdentifiers {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      object-identifiers(0) version-1999(1)};
+
+-- General Text body part
+--general-text-body-part EXTENDED-BODY-PART-TYPE ::= {
+--  PARAMETERS  {GeneralTextParameters
+--               IDENTIFIED BY  id-ep-general-text},
+--  DATA        {GeneralTextData
+--               IDENTIFIED BY  id-et-general-text}
+--}
+
+GeneralTextParameters ::= SET OF CharacterSetRegistration
+
+GeneralTextData ::= GeneralString
+
+CharacterSetRegistration ::= INTEGER(1..32767)
+
+--END - - of IPMSExtendedBodyPartTypes2
+
+-- Module IPMSExtendedVoiceBodyPartType (X.420:06/1999)
+--IPMSExtendedVoiceBodyPartType {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--  extended-voice-body-part-type(11)} DEFINITIONS IMPLICIT TAGS ::=
+--BEGIN
+
+-- Prologue
+-- Exports everything.
+--IMPORTS
+  -- IPMS Information Objects
+--  EXTENDED-BODY-PART-TYPE
+    --==
+--    FROM IPMSInformationObjects {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      information-objects(2) version-1999(1)}
+  -- IPMS Object Identifiers
+--  id-ep-voice, id-et-voice
+    --==
+--    FROM IPMSObjectIdentifiers {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      object-identifiers(0) version-1999(1)};
+
+-- Extended Voice body part
+--voice-body-part EXTENDED-BODY-PART-TYPE ::= {
+--  PARAMETERS  {VoiceParameters
+--               IDENTIFIED BY  id-ep-voice},
+--  DATA        {VoiceData
+--               IDENTIFIED BY  id-et-voice}
+--}
+
+VoiceParameters ::= SEQUENCE {
+  voice-message-duration     [0]  INTEGER OPTIONAL, -- In seconds
+  voice-encoding-type        [1]  OBJECT IDENTIFIER,
+  supplementary-information  [2]  IA5String OPTIONAL
+}
+
+VoiceData ::= OCTET STRING
+
+--END - - of IPMSExtendedVoiceBodyPartType
+
+-- Module IPMSForwardedContentBodyPartType (X.420:06/1999)
+--IPMSForwardedContentBodyPartType {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--  forwarded-content-body-part-type(15)} DEFINITIONS IMPLICIT TAGS ::=
+--BEGIN
+
+-- Prologue
+-- Exports everything.
+--IMPORTS
+  -- MTS Abstract Service
+--  Content, ExtendedContentType, MessageDeliveryIdentifier, MessageDeliveryTime,
+--    MessageSubmissionEnvelope, OriginatingMTACertificate,
+--    OtherMessageDeliveryFields, ProofOfSubmission
+    --==
+--    FROM MTSAbstractService {joint-iso-itu-t mhs(6) mts(3) modules(0)
+--      mts-abstract-service(1) version-1999(1)}
+  -- IPMS Information Objects
+--  EXTENDED-BODY-PART-TYPE
+    --==
+--    FROM IPMSInformationObjects {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      information-objects(2) version-1999(1)}
+  -- IPMS Object Identifiers
+--  id-ep-content, id-et-content
+    --==
+--    FROM IPMSObjectIdentifiers {joint-iso-itu-t mhs(6) ipms(1) modules(0)
+--      object-identifiers(0) version-1999(1)};
+
+-- Forwarded Content body part
+--content-body-part{ExtendedContentType:content-type} EXTENDED-BODY-PART-TYPE ::=
+--  {
+--  PARAMETERS
+--    {ForwardedContentParameters
+--     IDENTIFIED BY  {id-ep-content  content-type}},
+--  DATA        {Content
+--               IDENTIFIED BY  {id-et-content  content-type}}
+--}
+
+ForwardedContentParameters ::= SET {
+  delivery-time      [0]  MessageDeliveryTime OPTIONAL,
+  delivery-envelope  [1]  OtherMessageDeliveryFields OPTIONAL,
+  mts-identifier     [2]  MessageDeliveryIdentifier OPTIONAL,
+  submission-proof   [3]  SubmissionProof OPTIONAL
+}
+
+SubmissionProof ::= SET {
+  proof-of-submission          [0]  ProofOfSubmission,
+  originating-MTA-certificate  [1]  OriginatingMTACertificate,
+  message-submission-envelope  MessageSubmissionEnvelope
+}
+
+END -- of IPMSForwardedContentBodyPartType
+
 -- Generated by Asnp, the ASN.1 pretty-printer of France Telecom R&D
 
+