Subject: [mile] JSON representation of IODEF (FW: New Version Notification for draft-takahashi-mile-jsoniodef-00.txt)

From: "Takeshi Takahashi" <[email-masked]>
Date: Wed, 8 Jun 2016 18:18:53 +0900

Hello all,

In the Yokohama meeting, we had discussion on the JSON representation of IODEF.
Since rfc5070-bis is about to be published as an RFC, I would like to push this discussion again.
For this purpose, I've created its JSON representation draft.

https://datatracker.ietf.org/doc/draft-takahashi-mile-jsoniodef/

The conversion from XML to JSON is very simple, but some classes that exist only for the purpose of semantically grouping subjects could be omitted depending on the discussion. (e.g., Flow class and Record class)

If anybody is interested in authoring or co-authoring this draft, please feel free to contact me.
I would appreciate that very much.
The current draft is prepared for the purpose of raising discussion and checking any interests from potential authors/co-authors.

Thank you, and kind regards.
Take

> -----Original Message-----
> From: [email-masked] [mailto:[email-masked]]
> Sent: Wednesday, June 8, 2016 6:08 PM
> To: Takeshi Takahashi
> Subject: New Version Notification for
> draft-takahashi-mile-jsoniodef-00.txt
> 
> 
> A new version of I-D, draft-takahashi-mile-jsoniodef-00.txt
> has been successfully submitted by Takeshi Takahashi and posted to the IETF
> repository.
> 
> Name:		draft-takahashi-mile-jsoniodef
> Revision:	00
> Title:		JSON representation of IODEF
> Document date:	2016-06-08
> Group:		Individual Submission
> Pages:		58
> URL:
> https://www.ietf.org/internet-drafts/draft-takahashi-mile-jsoniodef-00
> .txt
> Status:
> https://datatracker.ietf.org/doc/draft-takahashi-mile-jsoniodef/
> Htmlized:
> https://tools.ietf.org/html/draft-takahashi-mile-jsoniodef-00
> 
> 
> Abstract:
>    RFC5070-bis provides XML-based data representation on incident
>    information, but the use of the IODEF data model is not limited to
>    XML.  JSON representation is sometimes preferred since it is easy to
>    handle from certain programming environments.  This draft represents
>    the IODEF data model in JSON.  Note that this 00 version draft is
>    prepared for the purpose of encouraging discussion on the need for
>    JSON representation.
> 
> 
> 
> 
> Please note that it may take a couple of minutes from the time of submission
> until the htmlized version and diff are available at tools.ietf.org.
> 
> The IETF Secretariat

---

From: Jerome Athias <[email-masked]>
Date: Wed, 8 Jun 2016 12:24:49 +0300

Great job
I'll look at it...
Well done

Best regards

On Wednesday, 8 June 2016, Takeshi Takahashi <[email-masked]>
wrote:

> The conversion from XML to JSON is very simple, but some classes that
> exist only for the purpose of semantically grouping subjects could be
> omitted depending on the discussion. (e.g., Flow class and Record class)
>
> The current draft is prepared for the purpose of raising discussion and
> checking any interests from potential authors/co-authors.
>
> > From: [email-masked] <javascript:;> [mailto:
> [email-masked] <javascript:;>]
> _______________________________________________
> mile mailing list
> [email-masked] <javascript:;>
> https://www.ietf.org/mailman/listinfo/mile
>

---

From: Carsten Bormann <[email-masked]>
Date: Wed, 08 Jun 2016 18:09:45 +0200

>     https://datatracker.ietf.org/doc/draft-takahashi-mile-jsoniodef/

Nice!

I'm looking at the "JSON Schema" definitions right now, and I'm
grappling with a couple of errors -- which tool did you use for this?

Grüße, Carsten

---

From: Carsten Bormann <[email-masked]>
Date: Wed, 08 Jun 2016 20:06:24 +0200

Carsten Bormann wrote:
>  a couple of errors

I think I worked around most of them.
I fed this into my experimental "JSON-Schema"-to-CDDL converter.
(While CDDL has been designed for CBOR, JSON's data model is a subset of
CBOR's, so CDDL can be used for JSON as well.)

Here are a few observations:

*** Unused rule RegistryHandle
*** Unused rule PostalAddress
*** Unused rule Email
*** Unused rule BusinessImpact
*** Unused rule HistoryItem
*** Unused rule ServiceName
*** Unused rule ApplicationHeader
*** Unused rule EmailData
*** Unused rule RecordPattern
*** Unused rule WindowsRegistryKeysModified
*** Unused rule Key
*** Unused rule Observable
*** Unused rule BulkObservable
*** Unused rule BulkObservableFormat

For your perusal, the CDDL is reproduced below.
Since "JSON-Schema" isn't always very well-defined, I don't know whether
what my tool reads from it indeed was the intended definition.  (See
also a few weird cases marked with @@@.)
I'm not also sure that ExtensionType and Campaign are exactly the two
JSON objects that are extensible, and that Incident's AlternativeID
field is as loosely defined as it seems.  (There are also a lot of "any"
types I have guessed.)  Finally, I can't parse

      "properties": {
        "Signature": {
          "SignatureValue": "xxxxxxxx",
          "id": "xxxxxxxx"
        }
      },

Without further ado, here is the automatically generated CDDL:

Grüße, Carsten

start = iodef

;;; iodef.json: IODEF-Document

iodef = {
 version: text
 ? lang: lang
 ? format-id: text
 ? private-enum-name: text
 ? private-enum-id: text
 Incidents: [* Incident]
 ? AdditionalData: [* ExtensionType]
}

lang = "en" / "jp"
restriction = "public" / "partner" / "need-to-know" / "private" /
              "default" / "white" / "green" / "amber" / "red" /
              "ext-value"
URLtype = text
IDtype = text

ExtensionType  = {
 ? Name: text
 ? dtype: "boolean" / "byte" / "bytes" / "character" / "date-time" /
          "ntpstamp" / "integer" / "portlist" / "real" / "string" / "file" /
          "path" / "frame" / "packet" / "ipv4-packet" / "ipv6-packet" /
"url" /
          "csv" / "winreg" / "xml" / "ext-value"
 ? ext-dtype: text
 ? meaning: text
 ? formatid: text
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 * text => any
}

SoftwareType = {
 ? SoftwareReference: SoftwareReference
 ? URL: URLtype
 ? Description: text
}

SoftwareReference = {
 ? value: text
 spec-name: text
 ? ext-spec-name: text
 ? dtype: text
 ? ext-dtype: text
}

Incident = {
 purpose: "traceback" / "mitigation" / "reporting" / "watch" / "other" /
"ext-value"
 ? ext-purpose: text
 ? status: "blabla"
 ? ext-status: text
 ? lang: lang
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 IncidentID: IncidentID
 ? AlternativeID: anymap ; @@@ object not well-defined @@@
 ? RelatedActivity: [* RelatedActivity]
 ? DetectTime: text
 ? StartTime: text
 ? EndTime: text
 ? RecoveryTime: text
 ? ReportTime: text
 GenerationTime: text
 ? Description: [* text]
 ? Discovery: [* Discovery]
 ? Assessment: [* Assessment]
 ? Methods: [* Method]
 Contacts: [* Contact]
 ? EventData: [* EventData]
 ? IndicatorList: [* Indicator]
 ? History: History
 ? AdditionalData: [* ExtensionType]
}

IncidentID = {
 ? id: text
 name: text
 ? instance: text
 ? restriction: restriction
 ? ext-restriction: text
}

RelatedActivity = {
 ? restriction: restriction
 ? ext-restriction: text
 ? IncidentID: [* IncidentID]
 ? URL: [* URLtype]
 ? ThreatActor: [* ThreatActor]
 ? Campaign: [* Campaign]
 ? IndicatorID: [* IndicatorID]
 ? Confidence: Confidence
 ? Description: [* text]
 ? AdditionalData: [* ExtensionType]
}

ThreatActor = {
 ? restriction: restriction
 ? ext-restriction: text
 ? ThreatActorID: text
 ? Description: text
 ? URL: URLtype
 ? AdditionalData: [* ExtensionType]
}

Campaign  = {
 ? restriction: restriction
 ? ext-restriction: text
 ? CampaignID: any
 ? URL: URLtype
 ? Description: text
 ? AdditionalData: [* ExtensionType]
 * text => any
}

Contact = {
 role: any
 ? ext-role: any
 type: any
 ? ext-type: any
 ? restriction: restriction
 ? ext-restriction: text
 ? ContactName: any
 ? ContactTitle: any
 ? Description: text
 ? RegistryHandle: any
 ? PostalAddress: any
 ? Email: any
 ? Telephone: Telephone
 ? Timezone: any
 ? Contact: Contact
 ? AdditionalData: [* ExtensionType]
}

RegistryHandle = {
 ? RegistryHandleName: any
 registry: any
 ? ext-registry: any
}

PostalAddress = {
 ? type: text
 ? ext-type: text
 PAddress: text
 ? Description: text
}

Email = {
 ? type: any
 ? ext-type: any
 EmailTo: any
 ? Description: text
}

Telephone = {
 ? type: any
 ? ext-type: any
 TelephoneNumber: any
 ? Description: text
}

Discovery = {
 ? source: any
 ? ext-source: any
 ? restriction: restriction
 ? ext-restriction: text
 ? Description: text
 ? Contact: Contact
 ? DetectionPattern: DetectionPattern
}

DetectionPattern = {
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 Application: SoftwareType
 ? Description: text
 ? DetectionConfiguration: any
}

Method = {
 ? restriction: restriction
 ? ext-restriction: text
 ? References: [* Reference]
 ? Description: text
 ? AttackPattern: any
 ? Vulnerability: any
 ? Weakness: any
 ? AdditionalData: [* ExtensionType]
}

Reference = {
 ? observable-id: IDtype
 ? ReferenceName: any
 ? URL: URLtype
 ? Description: text
}

Assessment = {
 ? occurrence: any
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 ? IncidentCategory: any
 ? SystemImpact: SystemImpact
 ? BusinessImpact: any
 ? TimeImpact: TimeImpact
 ? MonetaryImpact: MonetaryImpact
 ? IntendedImpact: any
 ? Counter: Counter
 ? MitigatingFactor: any
 ? Cause: any
 ? Confidence: Confidence
 ? AdditionalData: [* ExtensionType]
}

SystemImpact = {
 ? severity: any
 ? completion: any
 type: any
 ? ext-type: any
 ? Description: text
}

BusinessImpact = {
 ? severity: any
 ? ext-severity: any
 type: any
 ? ext-type: any
 ? Description: text
}

TimeImpact = {
 ? value: any
 ? severity: any
 metric: any
 ? ext-metric: any
 ? duration: any
 ? ext-duration: any
}

MonetaryImpact = {
 ? MonetaryImpactValue: any
 ? severity: any
 ? currency: any
}

Confidence = {
 ? ConfidenceValue: any
 rating: any
 ? ext-rating: any
}

History = {
 ? restriction: restriction
 ? ext-restriction: text
 HistoryItem: any
}

HistoryItem = {
 action: any
 ? ext-action: any
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 DateTime: any
 ? IncidentID: any
 ? Contact: Contact
 ? Description: text
 ? DefinedCOA: any
 ? AdditionalData: [* ExtensionType]
}

EventData = {
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 ? Description: text
 ? DetectTime: any
 ? StartTime: any
 ? EndTime: any
 ? RecoveryTime: any
 ReportTime: text
 ? Contact: Contact
 ? Discovery: Discovery
 ? Assessment: any
 ? Method: Method
 ? System: System
 ? Expectation: Expectation
 ? Record: Record
 ? EventData: EventData
 ? AdditionalData: [* ExtensionType]
}

Expectation = {
 ? action: any
 ? ext-action: any
 ? severity: any
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 ? Description: text
 ? DefinedCOA: any
 ? StartTime: any
 ? EndTime: any
 ? Contact: Contact
}

System = {
 ? category: "source" / "target" / "intermediate" / "sensor" /
"infrastructure" / "ext-value"
 ? ext-category: any
 ? interface: any
 ? spoofed: any
 ? virtual: any
 ? ownership: any
 ? ext-ownership: any
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 Node: Node
 ? NodeRole: NodeRole
 ? Service: Service
 ? OperatingSystem: any
 ? Counter: Counter
 ? AssetID: any
 ? Description: text
 ? AdditionalData: [* ExtensionType]
}

Node = {
 ? DomainData: DomainData
 ? Address: Address
 ? PostalAddress: any
 ? Location: text
 ? Counter: Counter
}

Address = {
 ? AddressValue: any
 category: any
 ? ext-category: any
 ? vlan-name: any
 ? vlan-num: int
 ? observable-id: IDtype
}

NodeRole = {
 category: any
 ? ext-category: any
 ? Description: text
}

Counter = {
 ? value: text
 type: any
 ? ext-type: any
 unit: any
 ? ext-unit: any
 ? meaning: any
 ? duration: any
 ? ext-duration: any
}

DomainData = {
 system-status: any
 ? ext-system-status: any
 domain-status: any
 ? ext-domain-status: any
 ? observable-id: IDtype
 Name: any
 ? DateDomainWasChecked: any
 ? RegistrationDate: any
 ? ExpirationDate: any
 ? RelatedDNS: any
 ? NameServers: NameServers
 ? DomainContacts: DomainContacts
}

NameServers = {
 Server: any
 Address: Address
}

DomainContacts = {
 ? SameDomainContact: any
 Contact: Contact
}

Service = {
 ? ip-protocol: any
 ? observable-id: IDtype
 ? ServiceName: any
 ? Port: any
 ? Portlist: any
 ? ProtoCode: any
 ? ProtoType: any
 ? ProtoField: any
 ? ApplicationHeader: any
 ? EmailData: any
 ? Application: any
}

ServiceName = {
 ? IANAService: any
 ? URL: URLtype
 ? Description: text
}

ApplicationHeader = {
 ? ApplicationHeaderField: any
}

EmailData = {
 ? EmailTo: any
 ? EmailFrom: any
 ? EmailSubject: any
 ? EmailX-Mailer: any
 ? EmailHeaderField: any
 ? EmailHeaders: any
 ? EmailBody: any
 ? EmailMessage: any
 ? HashData: HashData
 ? SignatureData: SignatureData
}

Record = {
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 ? DateTime: any
 ? Description: text
 ? Applicadtion: any
 ? RecordPattern: any
 ? RecordItem: any
 ? URL: URLtype
 ? FileData: FileData
 ? WindowsRegistryKeysModified: any
 ? CertificateData: CertificateData
 ? AdditionalData: [* ExtensionType]
}

RecordPattern = {
 ? RecordPatternValue: any
 type: any
 ? ext-type: any
 ? offset: any
 ? offsetunit: any
 ? ext-offsetunit: any
 ? instance: int
}

WindowsRegistryKeysModified = {
 ? observabile-id: any           ; @@@ typo @@@
 Key: any
}

Key = {
 ? registryaction: any
 ? ext-registryaction: any
 ? observable-id: IDtype
 KeyName: any
 ? KeyValue: any
}

CertificateData = {
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 Certificate: Certificate
}

Certificate = {
 ? observable-id: IDtype
 X509Data: any
 ? Description: text
}

FileData = {
 ? restriction: restriction
 ? ext-restriction: text
 ? observable-id: IDtype
 File: File
}

File = {
 ? FileName: text
 ? FileSize: any
 ? FileType: any
 ? URL: URLtype
 ? HashData: HashData
 ? SignatureData: SignatureData
 ? AssociatedSoftware: any
 ? FileProperties: any
}

HashData = {
 scope: any
 ? HashTargetID: any
 ? Hash: Hash
 ? FuzzyHash: FuzzyHash
}

Hash = {
 DigestMethod: text
 DigestValue: text
 ? CanonicalizationMethod: any
 ? Application: any
}

FuzzyHash = {
 FuzzyHashValue: ExtensionType
 ? Application: any
 ? AdditionalData: [* ExtensionType]
}

; ** unused: {"SignatureValue"=>"xxxxxxxx", "id"=>"xxxxxxxx"}
SignatureData = {
 Signature: any
}

Indicator = {
 ? restriction: restriction
 ? ext-restriction: text
 IndicatorID: IndicatorID
 ? AlternativeIndicatorID: AlternativeIndicatorID
 ? Description: text
 ? StartTime: any
 ? EndTime: any
 ? Confidence: Confidence
 ? Contact: Contact
 ? Observable: any
 ? ObservableReference: ObservableReference
 ? IndicatorExpression: IndicatorExpression
 ? IndicatorReference: IndicatorReference
 ? NodeRole: NodeRole
 ? AttackPhase: AttackPhase
 ? Reference: Reference
 ? AdditionalData: [* ExtensionType]
}

IndicatorID = {
 ? id: any
 name: text
 version: text
}

AlternativeIndicatorID = {
 ? restriction: restriction
 ? ext-restriction: text
 IndicatorReference: IndicatorReference
}

Observable = {
 ? restriction: restriction
 ? ext-restriction: text
 ? System: any
 ? Address: any
 ? DomainData: DomainData
 ? EmailData: any
 ? Service: Service
 ? WindowsRegistryKeysModified: any
 ? FileData: FileData
 ? CertificateData: CertificateData
 ? RegistryHandle: any
 ? Record: Record
 ? EventData: any
 ? Incident: any
 ? Expectation: Expectation
 ? Reference: Reference
 ? Assessment: any
 ? DetectionPattern: any
 ? HistoryItem: any
 ? BulkObservable: text
 ? AdditionalData: [* ExtensionType]
}

BulkObservable = {
 ? type: any
 ? ext-type: any
 ? BulkObservableFormant: any
 ? BulkObservableList: text
 ? AdditionalData: [* ExtensionType]
}

BulkObservableFormat = {
 ? Hash: Hash
 ? AdditionalData: [* ExtensionType]
}

IndicatorExpression = {
 ? operator: any
 ? ext-operator: text
 ? IndicatorExpression: IndicatorExpression
 ? Observable: any
 ? ObservableReference: ObservableReference
 ? IndicatorReference: IndicatorReference
 ? AdditionalData: [* ExtensionType]
}

ObservableReference = {
 uid-ref: any
}

IndicatorReference = {
 ? uid-ref: any
 ? euid-ref: text
 ? version: text
}

AttackPhase = {
 ? AttackPhaseID: text
 ? URL: URLtype
 ? Description: text
 ? AdditionalData: [* ExtensionType]
}

anymap = {
 * text => any
}

---

From: Carsten Bormann <[email-masked]>
Date: Wed, 08 Jun 2016 20:08:57 +0200

Oh, and here is an automatically generated instance that appears to be
valid iodef :-)

Grüße, Carsten

{
  "version": "copalite",
  "lang": "en",
  "format-id": "endothorax",
  "private-enum-name": "autocollimator",
  "private-enum-id": "throttler",
  "Incidents": [{
    "purpose": "other",
    "ext-purpose": "studentless",
    "lang": "en",
    "IncidentID": {
      "id": "pseudaxis",
      "name": "circumspangle",
      "ext-restriction": "quartetto"
    },
    "AlternativeID": {
      "gnomonic": "embolismic",
      "imitative": "amorphousness",
      "involution": "profitmonger",
      "unpleasantish": "recultivation"
    },
    "RelatedActivity": [],
    "GenerationTime": "decipolar",
    "Discovery": [{
      "source": "soviet",
      "restriction": "green",
      "ext-restriction": "Gompholobium"
    }],
    "Contacts": [{
      "role": "transumpt",
      "ext-role": "metalloid",
      "type": "Plataean",
      "ContactName": "tachygraphical",
      "Description": "anthropic",
      "Telephone": {
        "type": "reconnoitringly",
        "TelephoneNumber": "underreckon"
      },
      "Timezone": "haustorium",
      "Contact": {
        "role": "tubocurarine",
        "type": "cointise",
        "restriction": "amber",
        "Description": "ruesome",
        "PostalAddress": "upholstery",
        "Email": "thieving",
        "Telephone": {
          "type": "serenify",
          "TelephoneNumber": "melodic",
          "Description": "ericetum"
        },
        "Timezone": "wolfberry",
        "Contact": {
          "role": "locomobility",
          "type": "nonirritating",
          "ext-restriction": "weemen",
          "ContactTitle": "intact",
          "Description": "colostomy",
          "RegistryHandle": "fullish",
          "Email": "rintherout",
          "Contact": {
            "role": "Kieffer",
            "ext-role": "headless",
            "type": "microscopy",
            "ext-restriction": "semidiapason",
            "ContactName": "outfeat",
            "Email": "teethily",
            "Contact": {
              "role": "isohel",
              "ext-role": "dished",
              "type": "dexterity",
              "ext-restriction": "lineocircular",
              "ContactName": "plebificate",
              "Description": "Cannstatt",
              "RegistryHandle": "hickory",
              "PostalAddress": "ambuling",
              "Email": "whizziness",
              "Telephone": {
                "type": "pretercanine",
                "TelephoneNumber": "unemerging"
              },
              "Timezone": "abatement",
              "Contact": {
                "role": "ungrand",
                "ext-role": "sparsedly",
                "type": "unmultiplied",
                "ContactName": "dukeling",
                "RegistryHandle": "fanwise",
                "PostalAddress": "prespinal",
                "Email": "trophoplast",
                "Telephone": {
                  "TelephoneNumber": "prayingly"
                },
                "Timezone": "inunctuosity"
              }
            },
            "AdditionalData": [{
              "name": "inheritrice",
              "ext-dtype": "asceticism",
              "meaning": "liquor",
              "formatid": "undistasteful",
              "ext-restriction": "seamless",
              "gastronomic": "suprafeminine"
            }, {
              "meaning": "thirtyfold",
              "formatid": "pavilion",
              "restriction": "amber",
              "observable-id": "librarianship"
            }]
          },
          "AdditionalData": []
        }
      }
    }, {
      "role": "Camorrista",
      "type": "polytony",
      "ext-type": "seditiousness",
      "restriction": "private",
      "ext-restriction": "smooth",
      "ContactName": "Negritize",
      "RegistryHandle": "reappraisal",
      "Telephone": {
        "TelephoneNumber": "pantotactic"
      },
      "Timezone": "antipoverty",
      "Contact": {
        "role": "gastrohysterotomy",
        "type": "inconditionate",
        "restriction": "ext-value",
        "ext-restriction": "nonretiring",
        "ContactName": "autotruck",
        "ContactTitle": "scrotofemoral",
        "Description": "Elonite",
        "PostalAddress": "unregimented",
        "Email": "collectorate",
        "Timezone": "varier",
        "Contact": {
          "role": "hulkage",
          "type": "arcade",
          "ext-type": "perenniality",
          "ContactName": "Apayao",
          "PostalAddress": "torpidness",
          "Email": "phosphine",
          "Contact": {
            "role": "myricin",
            "ext-role": "subalary",
            "type": "tactualist",
            "ContactName": "rhythmizable",
            "ContactTitle": "reactualize",
            "Description": "predictate",
            "RegistryHandle": "filiety",
            "Telephone": {
              "type": "caroline",
              "TelephoneNumber": "testudinous"
            },
            "Contact": {
              "role": "trechmannite",
              "type": "gobbing",
              "ContactName": "aristomonarchy",
              "Description": "palulus",
              "PostalAddress": "bestorm",
              "Telephone": {
                "type": "cholagogic",
                "TelephoneNumber": "usherian",
                "Description": "offsider"
              }
            }
          }
        },
        "AdditionalData": [{
          "name": "irreducibly",
          "dtype": "byte",
          "ext-dtype": "shelflist",
          "meaning": "inditement",
          "observable-id": "naringenin",
          "unstoicize": "almsful"
        }, {
          "dtype": "xml",
          "formatid": "ventrolaterally",
          "restriction": "partner",
          "ext-restriction": "irrationalize",
          "poticary": "pignoration",
          "phrenicopericardiac": "anteoccupation"
        }, {
          "ext-dtype": "inappetible",
          "formatid": "pendecagon",
          "restriction": "public",
          "observable-id": "winterdykes",
          "rehearing": "leisure"
        }, {
          "name": "compilement",
          "meaning": "polygamist",
          "formatid": "unshameful",
          "restriction": "need-to-know",
          "ext-restriction": "simkin"
        }]
      }
    }, {
      "role": "polydisperse",
      "type": "redknees",
      "ext-type": "Gregarinoidea",
      "ext-restriction": "isospore",
      "ContactName": "bornyl",
      "PostalAddress": "demifigure",
      "Email": "choriocele",
      "Telephone": {
        "ext-type": "unfuddled",
        "TelephoneNumber": "perplexing"
      }
    }]
  }]
}

---

From: "Takeshi Takahashi" <[email-masked]>
Date: Thu, 9 Jun 2016 17:15:56 +0900

Hi Carsten and Jerome,

Thank you for your prompt replies.
It is great to see that there are people who are interested in the topic.

Carsten, thank you very much for your kind feedback.
Especially, the IODEF json instance you provided is very useful.
Since current version is immature (with lots of place holders), let me start rewriting the draft.

I am currently using the web tool: http://www.jsonschemavalidator.net/  .
Instead of converting an XML into JSON, I have walked through the rfc5070-bis draft and manually typed the json file. (I also wanted to do the final check of rfc5070-bis draft this time.)
If there are any nice tools I should be using, please kindly let me know; it would be very helpful to me.

Thank you, and kind regards,
Take

PS: I'm thinking to use a github for developing this draft, but for now, the files are available below.
https://www.dropbox.com/sh/76dyodjpv4r6jpf/AACT_tURG2wJqyKbDDruLpbXa?dl=0

> From: Carsten Bormann [mailto:[email-masked]]
> Sent: Thursday, June 9, 2016 3:09 AM
> To: Takeshi Takahashi <[email-masked]>
> Cc: [email-masked]
> Subject: Re: [mile] JSON representation of IODEF (FW: New Version Notification
> for draft-takahashi-mile-jsoniodef-00.txt)
> 
> Oh, and here is an automatically generated instance that appears to be valid
> iodef :-)
> 
> Grüße, Carsten
> 
> 
> {
>   "version": "copalite",
>   "lang": "en",

---

From: Carsten Bormann <[email-masked]>
Date: Thu, 09 Jun 2016 11:27:29 +0200

> If there are any nice tools I should be using, please kindly let me know; it would be very helpful to me.

Good question.

We just had a discussion in the JSON WG about JSON "schema languages"
(or, more generally, ways to describe the JSON data models that we want
to interchange).  "JSON schema" was not necessarily the favorite tool of
all participants of that discussion.

Obviously, I'm a bit biased here (CDDL has been developed by students I
supervised, and I have also written an implementation).  I like CDDL
because it has much less noise than other approaches:

https://www.iab.org/wp-content/IAB-uploads/2016/03/Noise-in-specifications-hurts.pdf

(For those who know XML, this is a bit like Relax-NG compact vs. W3C
Schema.)

There are a few tools for working with CDDL, please see Appendix F of
the draft:

https://tools.ietf.org/html/draft-greevenbosch-appsawg-cbor-cddl-08#appendix-F

While CDDL is still work in progress, its core is quite stable as it is
based on the concepts of ABNF and Relax-NG.

(And you now have a CDDL version of your "JSON schema" draft :-)

Grüße, Carsten

---

From: Jerome Athias <[email-masked]>
Date: Fri, 10 Jun 2016 09:44:31 +0300

I'm sorry, but this is dope! :p