Skip to content

Commit 52b81c9

Browse files
david-waltermireaj-stein-nistwendellpiezRene2mt
committedOct 18, 2022
Updates to OSCAL Metaschema documentation and constraints (#1263)
* completed partial update of the Metadata object documentation. * adjustments to roles * adjusted the cardinality of location/address to make address optional. * Improved documentation and constraints related to location and parties * addressed the remainder of metadata and control feedback from @Rene2mt. * Improved the introductory remarks for a profile to better describe what a profile is and what it does. * Fixed a broken constraint that was not targeting the right node. * started refining descriptions and adding properties to describe identifier attributes. * Addressed feedback from AJ during 20220718-20220722. (#48) * Week 30 feedback on SSP model. (#49) * Proposed metaschema docs updates (#50) * Addressed feedback based on #1392 * Adjustments based on model review feedback on 8/12. * Removed outdated merge phase remarks. Created issue #53 to address this. * Addressed A.J. Stein's Week 32 Feedback for Model Review (#52) * Addressed AJ Stein's week 32 feedback for #1331. * Addressed DRAFT: Update catalog & profile metaschema documentation (#51) * Update catalog & profile metaschema documentation * Add props to control identifier * Fixed broken syntax and addressed consistency in wording within the Profile 'merge' construct. * Adjustments to alter, moving to to an inline definition * cleaned up empty remark. * Removed redundant constraints * removed some redundant constraints * Preliminary work on URI documentation to address #1249. * More work on document URI use in OSCAL * Updating data types related to usnistgov/metaschema#224. * Improved consistency of how URI concepts are discussed. * Added note about party locations * Updated Metaschema instances of `uri` and `uri-reference` data types to indicate their URI semantics. Resolves #1249. * Added identifier props to control layer metaschemas (#55) * Responding to #1066: metaschema edits; CSS enhancement (#56) * Whitespace cleanup in metadata metaschema * Apply suggestions from code review Co-authored-by: Alexander Stein <alexander.stein@nist.gov> Co-authored-by: Wendell Piez <wapiez@wendellpiez.com> Co-authored-by: Rene Tshiteya <rene-claude.tshiteya@gsa.gov>
1 parent 02ab6fc commit 52b81c9

15 files changed

+1311
-658
lines changed
 

‎docs/content/concepts/identifier-use/_index.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ By design, OSCAL supports [*machine-oriented*](#machine-oriented) and [*human-or
2020

2121
[*Machine-oriented*](#machine-oriented) identifiers provide a persistent identity for an entity within the OSCAL models, which can be used in other locations within related OSCAL models to reference the associated entity.
2222

23-
These identifiers are intended to be auto-generated by tools when the entity is initially created. In OSCAL, a machine-oriented identifier is implemented using a Universally Unique Identifier (UUID) as defined by [RFC 4122](https://tools.ietf.org/html/rfc4122). A UUID is represented in OSCAL using the [UUID datatype](/reference/datatypes/#uuid).
23+
These identifiers are intended to be auto-generated by tools when the entity is initially created. In OSCAL, a machine-oriented identifier is implemented using a Universally Unique Identifier (UUID) as defined by [RFC 4122](https://tools.ietf.org/html/rfc4122). A UUID is represented in OSCAL using the [`uuid`](/reference/datatypes/#uuid) data type.
2424
UUIDs were chosen because:
2525
- Programming interfaces exist in most programming environments to generate a UUID
2626
- UUIDs can be issued without a central authority
@@ -32,7 +32,7 @@ The [OSCAL XML Reference Index](/reference/latest/complete/xml-index/#/@uuid) an
3232

3333
#### Human-Oriented
3434

35-
A [*human-oriented*](#human-oriented) identifier incorporates semantic that support readability and processing by humans. OSCAL implements [*human-oriented*](#human-oriented) identifiers as [token](/reference/datatypes/#token) data types, which are non-colonized names. For example, control identifiers in a catalog may use a nomenclature that is familiar to the intended audience, allowing them to quickly determine what security control is being referred to, simply by its identifier value.
35+
A [*human-oriented*](#human-oriented) identifier supports readability and use by human consumers. OSCAL implements [*human-oriented*](#human-oriented) identifiers as [`token`](/reference/datatypes/#token) data types. For example, control identifiers in a catalog may use a nomenclature that is familiar to the intended audience, allowing them to quickly determine what security control is being referred to, simply by its identifier value.
3636

3737
The [OSCAL XML Reference Index](/reference/latest/complete/xml-index/#/@id) and [OSCAL JSON Reference Index](/reference/latest/complete/json-index/#/id) provide a comprehensive listing of the [*human-oriented*](#human-oriented) IDs in the core OSCAL models. References to these IDs are typically named according to the referenced object type (e.g., control) followed by “-id”, as seen here in the [XML Reference Index](/reference/latest/complete/xml-index/#/@control-id) (and likewise [JSON Reference Index](/reference/latest/complete/json-index/#/control-id) in the JSON reference index).
3838

‎docs/content/concepts/uri-use.md

+171
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
---
2+
title: URI Usage
3+
description: Provides information on the use of URIs in OSCAL.
4+
weight: 40
5+
---
6+
7+
According to [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986) a Uniform Resource Identifier (URI) "is a compact sequence of characters that identifies an abstract or physical resource." URIs are an important concept, which are used extensively in OSCAL.
8+
9+
## Uniform Resource Identifier Overview
10+
11+
According to RFC 3986, a URI has the following syntax, which is represented in [Augmented Backus-Naur Form (ABNF)](https://www.rfc-editor.org/rfc/rfc5234.html) below.
12+
13+
> ```
14+
> URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
15+
> hier-part = "//" authority path-abempty
16+
> / path-absolute
17+
> / path-rootless
18+
> / path-empty
19+
> ```
20+
>
21+
> The scheme and path components are required, though the path may be empty (no characters). When authority is present, the path must either be empty or begin with a slash ("/") character. When authority is not present, the path cannot begin with two slash characters ("//"). These restrictions result in five different ABNF rules for a path ([Section 3.3](https://www.rfc-editor.org/rfc/rfc3986#section-3.3)), only one of which will match any given URI reference.
22+
>
23+
> The following are two example URIs and their component parts:
24+
>
25+
> ```
26+
> foo://example.com:8042/over/there?name=ferret#nose
27+
> \_/ \______________/\_________/ \_________/ \__/
28+
> | | | | |
29+
> scheme authority path query fragment
30+
> | _____________________|__
31+
> / \ / \
32+
> urn:example:animal:ferret:nose
33+
> ```
34+
35+
According to RFC 3986, a URI can be used in a few different ways. Recognizing these URI forms is important in understanding how URIs are used in OSCAL.
36+
37+
### URI with a Required Scheme
38+
39+
As indicated above with the required scheme and path components.
40+
41+
### Relative Reference
42+
43+
A URI that is a relative reference, references a resource relative to another *[base URI](https://www.rfc-editor.org/rfc/rfc3986#section-5.1)*. Such a URI is resolved using [reference resolution](https://www.rfc-editor.org/rfc/rfc3986#section-5).
44+
45+
The [syntax of a relative reference](https://www.rfc-editor.org/rfc/rfc3986#section-4.2) is:
46+
47+
> ```
48+
> relative-ref = relative-part [ "?" query ] [ "#" fragment ]
49+
>
50+
> relative-part = "//" authority path-abempty
51+
> / path-absolute
52+
> / path-noscheme
53+
> / path-empty
54+
> ```
55+
56+
### URI Reference
57+
58+
A typical use of a URI, allowing a [URI with a required scheme](#uri-with-a-required-scheme) or a [relative reference](#relative-reference) to be used.
59+
60+
The [syntax of a URI reference](https://www.rfc-editor.org/rfc/rfc3986#section-4.1) is:
61+
62+
> URI-reference = URI / relative-ref
63+
64+
### Absolute URI
65+
66+
According to RFC 3986, the [syntax of an absolute URI](https://www.rfc-editor.org/rfc/rfc3986#section-4.3) is:
67+
68+
> ```
69+
> absolute-URI = scheme ":" hier-part [ "?" query ]
70+
> ```
71+
72+
## URI vs URL vs URN
73+
74+
According to RFC 3986 section [1.1.3](https://www.rfc-editor.org/rfc/rfc3986#section-1.1.3), "a URI can be further classified as a *locator*, a *name*, or *both*." A given URI scheme is not limited to being only a name or a locator; both characteristics can be associated.
75+
76+
- To be a *locator*, the resource pointed to by a URI needs to have persistence.
77+
78+
- To be a *name*, the URI needs to be used consistently to refer to the thing that is named. A URI used only as a name is not required to resolve to a location. URIs schemes requiring an [*authority*](https://www.rfc-editor.org/rfc/rfc3986#section-3.2) element provide a means to use a registered DNS name to assert organizational control over a naming value space or namespace.
79+
80+
A *Uniform Resource Locator (URL)* "refers to the subset of URIs that, in addition to identifying a resource, provide a means of locating the resource by describing its primary access mechanism (e.g., its network "location")."
81+
82+
A URL, when applied consistently, can be used as a *name*. Optionally in such cases, the resource it resolves to can provide information about how to use the URL as a name.
83+
84+
A *Uniform Resource Name (URN)* "has been used historically to refer to both URIs under the `urn` scheme [RFC2141](https://www.rfc-editor.org/rfc/rfc2141), which are required to remain globally unique and persistent even when the resource ceases to exist or becomes unavailable, and to any other URI with the properties of a name.
85+
86+
A URN is often not a good fit for use as a *locator*, since it requires a secondary resolution process that maps the URN's *name* to a specific *location*.
87+
88+
Due to the specific characteristics of a URL or URN, the term URI is often used to refer more broadly to all types of resource identifiers.
89+
90+
## URIs in OSCAL
91+
92+
The following sections discuss how URIs are used in OSCAL.
93+
94+
### OSCAL URI Data Types
95+
96+
OSCAL uses two data types for representing URIs.
97+
98+
1. [`uri`](/reference/datatypes/#uri) - A URI which must provide the required scheme and path components. This means the URI will point directly to a resolvable resource.
99+
100+
The `uri` data type is used in cases where a [*URI with a required scheme*](#uri-with-a-required-scheme) or an *absolute URI* is required. As a result, a [*relative reference*](#relative-reference) or a [*URI reference*](#uri-reference) is not allowed for use with this data type.
101+
102+
2. [`uri-reference`](/reference/datatypes/#uri-reference) - A [*URI reference*](#uri-reference), which may be a [*URI with a required scheme*](#uri-with-a-required-scheme) or a [*relative reference*](#relative-reference). This allows all forms of URIs.
103+
104+
### Common OSCAL URI Use Cases
105+
106+
URIs are used in OSCAL to provide pointers to resources in the following ways.
107+
108+
#### Linking to a network resolvable resource
109+
110+
URIs are used to point directly to a network resolvable resource.
111+
112+
In such cases, the URI may be:
113+
114+
- A [*URI with a required scheme*](#uri-with-a-required-scheme), where the scheme will likely be `https` indicating the resource can be accessed using the [Hypertext Transfer Protocol](https://www.rfc-editor.org/rfc/rfc2616.html) (HTTP) using [Transport Layer Security](https://www.rfc-editor.org/rfc/rfc8446) (TLS). Data fields supporting only this use case will have the `uri` data type.
115+
116+
OSCAL examples include:
117+
118+
- `threat-id` - ([JSON/YAML](/reference/latest/complete/json-index/#/threat-id)) ([XML](/reference/latest/complete/xml-index/#/@threat-id))
119+
- `url` - ([JSON/YAML](/reference/latest/complete/json-index/#/url)) ([XML](/reference/latest/complete/xml-index/#/urls))
120+
121+
- A [*relative reference*](#relative-reference), pointing to a resource that can resolved using the current document resource as the *base URI*. Data fields supporting this use case will have the `uri-reference` data type.
122+
123+
OSCAL examples include:
124+
125+
- `href` - ([JSON/YAML](/reference/latest/complete/json-index/#/href)) ([XML](/reference/latest/complete/xml-index/#/@href))
126+
- `source` - ([JSON/YAML](/reference/latest/complete/json-index/#/source)) ([XML](/reference/latest/complete/xml-index/#/@source))
127+
- `filename` - ([JSON/YAML](/reference/latest/complete/json-index/#/filename)) ([XML](/reference/latest/complete/xml-index/#/@filename))
128+
129+
URIs serving this purpose need to be used as a *locator*. URLs are typically used for this purpose since the URI must resolve to a specific location.
130+
131+
#### Linking to another OSCAL object
132+
133+
A pointer to an OSCAL object identified by the referenced identifier, may be a [human-oriented](/concepts/identifier-use/#human-oriented) [`token`](/reference/datatypes/#token) or a [machine-oriented](/concepts/identifier-use/#machine-oriented) [`uuid`](https://pages.nist.gov/OSCAL/reference/datatypes/#uuid).
134+
135+
This approach uses a [*relative reference*](#relative-reference) consisting of only a URI *fragment* containing the identifier or UUID of the referenced object within the current documents effective data model. The effective data model of a document includes all objects identified with the document and any directly or transitively imported documents. Identifiers with a *cross-instance* [scope](/concepts/identifier-use/#scope) are available to importing documents.
136+
137+
URIs serving this purpose need to be used as a *locator*.
138+
139+
Any data fields supporting this use case will have the `uri-reference` data type.
140+
141+
A typical use of OSCAL object identifier linking is referencing a `resource` in the document's `back-matter` or an imported document's `back-matter`. For example, the back-matter resource identified by the UUID `f5a2bdb3-55ad-431e-a7ea-c0fd28fc08a0` can be referenced as follows.
142+
143+
```
144+
<link rel="related" href="#f5a2bdb3-55ad-431e-a7ea-c0fd28fc08a0"/>
145+
```
146+
147+
More information about the use of links to reference back-matter resources can be found in the [*Referencing Back-Matter Resources*](/learn/tutorials/general/extension/#referencing-back-matter-resources) section of the [*Extending OSCAL Models with Props and Links*](/learn/tutorials/general/extension/) tutorial.
148+
149+
#### Use as a naming system identifier
150+
151+
An absolute URI that identifies the naming system. URIs serving this purpose are used as a *name*. Data fields supporting this use case will have the `uri` data type.
152+
153+
OSCAL supports a number of name/value and other controlled value collections. To allow independent organization to organize these value collections, namespaces are used to partition the value spaces on an organization-by-organization basis. An [*absolute URI*](#absolute-uri) is used as the namespace identifier for these situations.
154+
155+
When used in this way, the authority component of the URI must use a value that the organization has control over. Typically, a DNS domain name controlled by the organization is used for this purpose.
156+
157+
OSCAL examples include:
158+
159+
- `ns` - ([JSON/YAML](/reference/latest/complete/json-index/#/ns)) ([XML](/reference/latest/complete/xml-index/#/@ns))
160+
- `system` - ([JSON/YAML](/reference/latest/complete/json-index/#/system)) ([XML](/reference/latest/complete/xml-index/#/@system))
161+
- `scheme` - ([JSON/YAML](/reference/latest/complete/json-index/#/scheme)) ([XML](/reference/latest/complete/xml-index/#/@scheme))
162+
163+
A key example of this approach is how property names are partitioned using a `ns` data element.
164+
165+
For example, the namespace `http://example.com/ns/oscal` is used in an OSCAL property as follows.
166+
167+
```
168+
<prop ns="http://example.com/ns/oscal" name="example-name" value="example-value"/>
169+
```
170+
171+
To learn more about the use of namespaces in properties, refer to the [*Extending Existing Prop Values*](/learn/tutorials/general/extension/#extending-existing-prop-values) section of the [*Extending OSCAL Models with Props and Links*](/learn/tutorials/general/extension/) tutorial.

‎docs/content/learn/tutorials/general/extension.md

+51-33
Large diffs are not rendered by default.

‎docs/content/reference/datatypes.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ In XML Schema this is represented as a restriction on the built-in type [dateTim
273273
<xs:simpleType name="DateTimeDatatype">
274274
<xs:restriction base="xs:dateTime">
275275
<xs:pattern
276-
value="(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T((2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?)(Z|[+-][0-9]{2}:[0-9]{2})?"
276+
value="(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]*[1-9])?(Z|(-((0[0-9]|1[0-2]):00|0[39]:30)|\+((0[0-9]|1[0-4]):00|(0[34569]|10):30|(0[58]|12):45)))?"
277277
/>
278278
</xs:restriction>
279279
</xs:simpleType>
@@ -284,7 +284,7 @@ In JSON Schema, this is represented as:
284284
```JSON
285285
{
286286
"type": "string",
287-
"pattern": "^(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]+)?(Z|[+-][0-9]{2}:[0-9]{2})?$"
287+
"pattern": "^(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]*[1-9])?(Z|(-((0[0-9]|1[0-2]):00|0[39]:30)|\\+((0[0-9]|1[0-4]):00|(0[34569]|10):30|(0[58]|12):45)))?$"
288288
}
289289
```
290290

@@ -306,7 +306,7 @@ In XML Schema this is represented as a restriction on the built in type [dateTim
306306
<xs:simpleType name="DateWithTimezoneDatatype">
307307
<xs:restriction base="DateDatatype">
308308
<xs:pattern
309-
value="(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))(Z|[+-][0-9]{2}:[0-9]{2})"
309+
value="(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]*[1-9])?(Z|(-((0[0-9]|1[0-2]):00|0[39]:30)|\+((0[0-9]|1[0-4]):00|(0[34569]|10):30|(0[58]|12):45)))"
310310
/>
311311
</xs:restriction>
312312
</xs:simpleType>
@@ -318,7 +318,7 @@ In JSON Schema, this is represented as:
318318
{
319319
"type": "string",
320320
"format": "date-time",
321-
"pattern": "^(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]+)?(Z|[+-][0-9]{2}:[0-9]{2})$"
321+
"pattern": "^(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\.[0-9]*[1-9])?(Z|(-((0[0-9]|1[0-2]):00|0[39]:30)|\\+((0[0-9]|1[0-4]):00|(0[34569]|10):30|(0[58]|12):45)))$"
322322
}
323323
```
324324

‎src/metaschema/metaschema-author.css

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
METASCHEMA { font-family: Calibri, Verdana, sans-serif }
2+
3+
* { display: block }
4+
5+
pre { color: darkgrey }
6+
7+
tag { color: black; font-family: monospace; font-size: 80%; font-weight: bold }
8+
9+
METASCHEMA { }
10+
11+
title { }
12+
13+
import:before
14+
{ content: 'import module ' oxy_urlChooser(edit, '@href', columns 60) }
15+
16+
17+
18+
define-assembly,
19+
define-field,
20+
define-flag { margin-top: 1ex; margin-bottom: 1ex; border: thin inset black; padding: 0.5em }
21+
22+
23+
define-assembly:before,
24+
define-field:before,
25+
define-flag:before
26+
{ content:
27+
oxy_name()
28+
oxy_textfield(edit, '@name', columns, 12)
29+
}
30+
31+
root-name:before { content: "Root name: " }
32+
33+
34+
prop:before
35+
{ content: 'property '
36+
oxy_textfield(edit, '@name', columns, 25)
37+
oxy_textfield(edit, '@value', columns, 30)
38+
}
39+
40+
41+
define-assembly[group-as]:before,
42+
define-field[group-as]:before,
43+
define-flag[group-as]:before
44+
{ content:
45+
oxy_name()
46+
oxy_textfield(edit, '@name', columns, 12) }
47+
define-assembly *,
48+
define-field *,
49+
define-flag * { margin: 0em }
50+
51+
define-assembly > * { margin-top: 1em }
52+
53+
pre { padding: 0.5em; background-color: gainsboro }
54+
55+
define-assembly { }
56+
57+
define-field { }
58+
59+
define-flag { }
60+
61+
flag { }
62+
63+
formal-name { font-size: 120%; font-weight: bold; margin: 0.5em 0em }
64+
65+
description, remarks { max-width: 60em }
66+
67+
remarks { border-left: thin solid black; padding-left: 1em; margin-left: 1em }
68+
remarks p { margin-top: 1em }
69+
70+
71+
example { }
72+
73+
prose { }
74+
75+
76+
p { }
77+
78+
code { display: inline; font-family: monospace }
79+
q { display: inline; background-color: lemonchiffon }
80+
em, i { display: inline; font-style: italic }
81+
strong, b { display: inline; font-weight: bold }
82+
83+
example { background-color: lavender; white-space: pre; }
84+
85+
example *:before { content: '<' oxy_name() '>'; font-family: monospace; font-size: 80% }
86+
example *:after { content: '</' oxy_name() '>'; font-family: monospace; font-size: 80% }
87+
88+
model { padding-left: 0.5em; border-left: medium solid blue; font-size: 80%; padding-right: 2em }
89+
90+
model model { font-size: 100%; }
91+
92+
flag:before { content:
93+
oxy_name()
94+
' ref: ' oxy_textfield(edit, '@ref', columns, 12)
95+
}
96+
97+
assembly:before, field:before {
98+
content:
99+
oxy_name() ' named '
100+
oxy_textfield(edit, '@ref', columns, 12) }
101+
102+
group-as { margin-left: 2em }
103+
104+
group-as:before { content: 'group as '
105+
oxy_textfield(edit, '@name', columns, 12) }
106+
107+
108+
choice:before { content:
109+
'a choice between'
110+
}
111+
112+
prose:before { font-weight: bold; content:
113+
'prose'
114+
}
115+
116+
choice > * { margin-left: 2em }
117+
118+
a { display: inline; color: blue }
119+
a:before { content: oxy_urlChooser(
120+
edit, "@href",
121+
columns 42); }
122+
123+
124+
/* CONSTRAINTS */
125+
126+
constraint > * { border: thin solid black; padding: 0.6em }
127+
128+
allowed-values:before { content: "Allowed values"
129+
' level: ' oxy_combobox(edit, '@level', editable, false, values, "ERROR, WARNING" ) }
130+
131+
enum { margin-left: 2em; display: list-item;
132+
font-size: 90%; padding-left: 1em }
133+
enum:before { content: oxy_textfield(edit, '@value', columns, 24); }
134+
135+
index { }
136+
index:before { content: "Index: "
137+
' name: ' oxy_textfield(edit, '@name', columns, 24)
138+
' target: ' oxy_textfield(edit, '@target', columns, 52)
139+
' level: ' oxy_combobox(edit, '@level', editable, false, values, "ERROR, WARNING" ); }
140+
141+
key-field { margin-left: 2em }
142+
key-field:before { content: "Key field "
143+
' target: ' oxy_textfield(edit, '@target', columns, 52)
144+
' level: ' oxy_combobox(edit, '@level', editable, false, values, "ERROR, WARNING" ); }
145+
146+
expect { }
147+
expect:before { content: "Expect "
148+
' target: ' oxy_textfield(edit, '@target', columns, 52)
149+
' test: ' oxy_textfield(edit, '@test', columns, 36)
150+
' level: ' oxy_combobox(edit, '@level', editable, false, values, "ERROR, WARNING" ); }
151+
152+
index-has-key { }
153+
154+
index-has-key:before { content: "Index has key: "
155+
' name: ' oxy_textfield(edit, '@name', columns, 24)
156+
' target: ' oxy_textfield(edit, '@target', columns, 52)
157+
' level: ' oxy_combobox(edit, '@level', editable, false, values, "ERROR, WARNING" ); }
158+
159+

‎src/metaschema/oscal_assessment-common_metaschema.xml

+32-12
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@
1919
<define-assembly name="import-ssp">
2020
<formal-name>Import System Security Plan</formal-name>
2121
<description>Used by the assessment plan and POA&amp;M to import information about the system.</description>
22-
<define-flag name="href" required="yes" as-type="uri-reference">
22+
<define-flag name="href" as-type="uri-reference" required="yes">
2323
<formal-name>System Security Plan Reference</formal-name>
2424
<description>A resolvable URL reference to the system security plan for the system being assessed.</description>
2525
<remarks>
26-
<p>The value of the <code>href</code> can be an internet resource, or a local reference using a fragment e.g. #fragment that points to a <code>back-matter</code> <code>resource</code> in the same document.</p>
27-
<p>If a local reference using a fragment is used, this will be indicated by a fragment "#" followed by an identifier which references an identified <code>resource</code> in the document's <code>back-matter</code> or another object that is <a href="/concepts/layer/assessment/assessment-plan/#key-concepts">within the scope of the containing OSCAL document</a>.</p>
28-
<p>If an internet resource is used, the <code>href</code> value will be an absolute or relative URI pointing to the location of the referenced resource. A relative URI will be resolved relative to the location of the document containing the link.</p>
26+
<p>This value may be one of:</p>
27+
<ol>
28+
<li>an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that points to a network resolvable resource,</li>
29+
<li>a <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#relative-reference">relative reference</a> pointing to a network resolvable resource whose base URI is the URI of the containing document, or</li>
30+
<li>a bare URI fragment (i.e., `#uuid`) pointing to a <code>back-matter</code> resource in this or an imported document (see <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#linking-to-another-oscal-object">linking to another OSCAL object</a>).</li>
31+
</ol>
2932
</remarks>
3033
</define-flag>
3134

@@ -59,7 +62,7 @@
5962
<field ref="remarks" in-xml="WITH_WRAPPER" min-occurs="0" max-occurs="1"/>
6063
</model>
6164
<constraint>
62-
<allowed-values target="part[has-oscal-namespace('http://csrc.nist.gov/ns/oscal')]">
65+
<allowed-values target="part[has-oscal-namespace('http://csrc.nist.gov/ns/oscal')]/@name">
6366
<enum value="objective" deprecated="1.0.1">**(deprecated)** Use 'assessment-objective' instead.</enum>
6467
<enum value="assessment" deprecated="1.0.1">**(deprecated)** Use 'assessment-method' instead.</enum>
6568
<enum value="assessment-objective">The part defines an assessment objective.</enum>
@@ -853,13 +856,16 @@
853856
<formal-name>Relevant Evidence</formal-name>
854857
<description>Links this observation to relevant evidence.</description>
855858
<group-as name="relevant-evidence" in-json="ARRAY"/>
856-
<define-flag name="href" required="no" as-type="uri-reference">
859+
<define-flag name="href" as-type="uri-reference">
857860
<formal-name>Relevant Evidence Reference</formal-name>
858861
<description>A resolvable URL reference to relevant evidence.</description>
859862
<remarks>
860-
<p>The value of the <code>href</code> can be an internet resource, or a local reference using a fragment e.g. #fragment that points to a <code>back-matter</code> <code>resource</code> in the same document.</p>
861-
<p>If a local reference using a fragment is used, this will be indicated by a fragment "#" followed by an identifier which references an identified <code>resource</code> in the document's <code>back-matter</code> or another object that is <a href="/concepts/layer/assessment/assessment-plan/#key-concepts">within the scope of the containing OSCAL document</a>.</p>
862-
<p>If an internet resource is used, the <code>href</code> value will be an absolute or relative URI pointing to the location of the referenced resource. A relative URI will be resolved relative to the location of the document containing the link.</p>
863+
<p>This value may be one of:</p>
864+
<ol>
865+
<li>an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that points to a network resolvable resource,</li>
866+
<li>a <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#relative-reference">relative reference</a> pointing to a network resolvable resource whose base URI is the URI of the containing document, or</li>
867+
<li>a bare URI fragment (i.e., `#uuid`) pointing to a <code>back-matter</code> resource in this or an imported document (see <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#linking-to-another-oscal-object">linking to another OSCAL object</a>).</li>
868+
</ol>
863869
</remarks>
864870
</define-flag>
865871
<model>
@@ -1019,10 +1025,22 @@
10191025
<enum value="http://fedramp.gov/ns/oscal">The value conforms to FedRAMP definitions.</enum>
10201026
</allowed-values>
10211027
</constraint>
1028+
<remarks>
1029+
<p>This value must be an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that serves as a <a href="/OSCAL/concepts/uri-use/#use-as-a-naming-system-identifier">naming system identifier</a>.</p>
1030+
</remarks>
10221031
</define-flag>
10231032
<define-flag name="href" as-type="uri-reference">
1033+
<!-- TODO: consider deprecating this in favor of a link -->
10241034
<formal-name>Threat Information Resource Reference</formal-name>
10251035
<description>An optional location for the threat data, from which this ID originates.</description>
1036+
<remarks>
1037+
<p>This value may be one of:</p>
1038+
<ol>
1039+
<li>an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that points to a network resolvable resource,</li>
1040+
<li>a <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#relative-reference">relative reference</a> pointing to a network resolvable resource whose base URI is the URI of the containing document, or</li>
1041+
<li>a bare URI fragment (i.e., `#uuid`) pointing to a <code>back-matter</code> resource in this or an imported document (see <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#linking-to-another-oscal-object">linking to another OSCAL object</a>).</li>
1042+
</ol>
1043+
</remarks>
10261044
</define-flag>
10271045
</define-field>
10281046

@@ -1299,6 +1317,9 @@
12991317
<enum value="http://www.first.org/cvss/v3.1"/>
13001318
</allowed-values>
13011319
</constraint>
1320+
<remarks>
1321+
<p>This value must be an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that serves as a <a href="/OSCAL/concepts/uri-use/#use-as-a-naming-system-identifier">naming system identifier</a>.</p>
1322+
</remarks>
13021323
</define-flag>
13031324
<define-flag name="value" as-type="string" required="yes">
13041325
<formal-name>Facet Value</formal-name>
@@ -1640,13 +1661,12 @@
16401661
</allowed-values>
16411662
</constraint>
16421663
</define-flag>
1643-
<define-flag name="ns" as-type="uri">
1664+
<define-flag name="ns" as-type="uri" default="http://csrc.nist.gov/ns/oscal">
16441665
<!-- CHANGED: data type to uri -->
16451666
<formal-name>Part Namespace</formal-name>
16461667
<description>A namespace qualifying the part's name. This allows different organizations to associate distinct semantics with the same name.</description>
16471668
<remarks>
1648-
<p>Provides a means to segment the value space for the <code>name</code>, so that different organizations and individuals can assert control over the allowed names and associated text used in a part. This allows the semantics associated with a given name to be defined on an organization-by-organization basis.</p>
1649-
<p>An organization MUST use a URI that they have control over. e.g., a domain registered to the organization in a URI, a registered uniform resource names (URN) namespace.</p>
1669+
<p>This value must be an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that serves as a <a href="/OSCAL/concepts/uri-use/#use-as-a-naming-system-identifier">naming system identifier</a>.</p>
16501670
<p>When a <code>ns</code> is not provided, its value should be assumed to be <code>http://csrc.nist.gov/ns/oscal</code> and the name should be a name defined by the associated OSCAL model.</p>
16511671
</remarks>
16521672
</define-flag>

‎src/metaschema/oscal_assessment-results_metaschema.xml

+6-5
Original file line numberDiff line numberDiff line change
@@ -322,11 +322,12 @@
322322
<formal-name>Assessment Plan Reference</formal-name>
323323
<description>A resolvable URL reference to the assessment plan governing the assessment activities.</description>
324324
<remarks>
325-
<p>The value of the <code>href</code> can be an internet resource, or a local reference using a fragment e.g. #fragment that points to a <code>back-matter</code>
326-
<code>resource</code> in the same document.</p>
327-
<!-- TODO: Add a link to "within the scope of the containing OSCAL document" to point to documentation of identification scopes" -->
328-
<p>If a local reference using a fragment is used, this will be indicated by a fragment "#" followed by an identifier which references an identified <code>resource</code> in the document's <code>back-matter</code> or another object that is within the scope of the containing OSCAL document.</p>
329-
<p>If an internet resource is used, the <code>href</code> value will be an absolute or relative URI pointing to the location of the referenced resource. A relative URI will be resolved relative to the location of the document containing the link.</p>
325+
<p>This value may be one of:</p>
326+
<ol>
327+
<li>an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that points to a network resolvable resource,</li>
328+
<li>a <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#relative-reference">relative reference</a> pointing to a network resolvable resource whose base URI is the URI of the containing document, or</li>
329+
<li>a bare URI fragment (i.e., `#uuid`) pointing to a <code>back-matter</code> resource in this or an imported document (see <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#linking-to-another-oscal-object">linking to another OSCAL object</a>).</li>
330+
</ol>
330331
</remarks>
331332
</define-flag>
332333
<model>

‎src/metaschema/oscal_catalog_metaschema.xml

+126-60
Large diffs are not rendered by default.

‎src/metaschema/oscal_component_metaschema.xml

+57-15
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
<namespace>http://csrc.nist.gov/ns/oscal/1.0</namespace>
2020
<json-base-uri>http://csrc.nist.gov/ns/oscal</json-base-uri>
2121
<remarks>
22-
<p>The OSCAL Component Definition Model can be used to describe the implementation of controls in a <code>component</code> or a set of components grouped as a <code>capability</code>. A component can be either a <em>technical component</em>, or a <em>documentary component</em>. A technical component is a component that is implemented in hardware (physical or virtual) or software. A documentary component is a component implemented in a document, such as a process, procedure, or policy.</p>
23-
<p>The root of the OSCAL Implementation Component format is <code>component-definition</code>.
24-
</p>
25-
<p>NOTE: This documentation is a work in progress. As a result, documentation for many of the information elements is missing or incomplete.</p>
22+
<p>The OSCAL Component Definition Model can be used to describe the implementation of controls in a <code>component</code> or a set of components grouped as a <code>capability</code>. A component can be either a <em>technical component</em>, or a <em>documentary component</em>.</p>
23+
<p>A technical component is a component that is implemented in hardware (physical or virtual) or software. Suppliers may document components in an OSCAL component definition that describes the implementation of controls in their hardware and software.</p>
24+
<p>A documentary component is a component implemented for a documented process, procedure, or policy. Suppliers may document components in an OSCAL component definition that describes the implementation of controls in their process, procedure, or policy.</p>
25+
<p>The information provided by a technical or documentary component can be used by component consumers to provide starting narratives for documenting control implementations in an OSCAL SSP.</p>
26+
<p>The root of the OSCAL Implementation Layer Component Definition model is <code>component-definition</code>.</p>
2627
</remarks>
2728

2829
<import href="oscal_implementation-common_metaschema.xml"/>
@@ -34,7 +35,12 @@
3435
<define-flag name="uuid" as-type="uuid" required="yes">
3536
<formal-name>Component Definition Universally Unique Identifier</formal-name>
3637
<!-- Identifier Declaration -->
37-
<description>A <a href="/concepts/identifier-use/#machine-oriented">machine-oriented</a>, <a href="/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this component definition elsewhere in <a href="/concepts/identifier-use/#component-definition-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>component definition</code> can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance). This UUID should be assigned <a href="/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.</description>
38+
<description>Provides a globally unique means to identify a given component definition instance.</description>
39+
<prop name="value-type" value="identifier"/>
40+
<prop name="identifier-type" value="machine-oriented"/>
41+
<prop name="identifier-uniqueness" value="global"/>
42+
<prop name="identifier-scope" value="cross-instance"/>
43+
<prop name="identifier-persistence" value="change-on-write"/>
3844
</define-flag>
3945
<model>
4046
<assembly ref="metadata" min-occurs="1"/>
@@ -72,6 +78,14 @@
7278
<define-flag name="href" as-type="uri-reference" required="yes">
7379
<formal-name>Hyperlink Reference</formal-name>
7480
<description>A link to a resource that defines a set of components and/or capabilities to import into this collection.</description>
81+
<remarks>
82+
<p>This value may be one of:</p>
83+
<ol>
84+
<li>an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that points to a network resolvable resource,</li>
85+
<li>a <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#relative-reference">relative reference</a> pointing to a network resolvable resource whose base URI is the URI of the containing document, or</li>
86+
<li>a bare URI fragment (i.e., `#uuid`) pointing to a <code>back-matter</code> resource in this or an imported document (see <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#linking-to-another-oscal-object">linking to another OSCAL object</a>).</li>
87+
</ol>
88+
</remarks>
7589
</define-flag>
7690
</define-assembly>
7791

@@ -81,7 +95,12 @@
8195
<define-flag name="uuid" as-type="uuid" required="yes">
8296
<formal-name>Component Identifier</formal-name>
8397
<!-- Identifier Declaration -->
84-
<description>A <a href="/concepts/identifier-use/#machine-oriented">machine-oriented</a>, <a href="/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this component elsewhere in <a href="/concepts/identifier-use/#component-definition-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>component</code> can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance). This UUID should be assigned <a href="/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.</description>
98+
<description>Provides a globally unique means to identify a given component.</description>
99+
<prop name="value-type" value="identifier"/>
100+
<prop name="identifier-type" value="machine-oriented"/>
101+
<prop name="identifier-uniqueness" value="global"/>
102+
<prop name="identifier-scope" value="cross-instance"/>
103+
<prop name="identifier-persistence" value="per-subject"/>
85104
</define-flag>
86105
<flag ref="defined-component-type" required="yes">
87106
<use-name>type</use-name>
@@ -252,7 +271,12 @@
252271
<define-flag required="yes" name="uuid" as-type="uuid">
253272
<formal-name>Capability Identifier</formal-name>
254273
<!-- Identifier Declaration -->
255-
<description>A <a href="/concepts/identifier-use/#machine-oriented">machine-oriented</a>, <a href="/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this capability elsewhere in <a href="/concepts/identifier-use/#component-definition-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>capability</code> can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance).This UUID should be assigned <a href="/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.</description>
274+
<description>Provides a globally unique means to identify a given capability.</description>
275+
<prop name="value-type" value="identifier"/>
276+
<prop name="identifier-type" value="machine-oriented"/>
277+
<prop name="identifier-uniqueness" value="global"/>
278+
<prop name="identifier-scope" value="cross-instance"/>
279+
<prop name="identifier-persistence" value="per-subject"/>
256280
</define-flag>
257281
<define-flag name="name" as-type="string" required="yes">
258282
<formal-name>Capability Name</formal-name>
@@ -284,12 +308,13 @@
284308
<p>A given <code>component</code> must not be referenced more than once within the same <code>capability</code>.</p>
285309
</remarks>
286310
</is-unique>
311+
<!-- Feature Request: add constraint ensuring a capability's incorporates-component references //component-definition/component/@uuid in the same component definition instance or an imported instance-->
287312
</constraint>
288313
</define-assembly>
289314
<define-assembly name="incorporates-component">
290315
<formal-name>Incorporates Component</formal-name>
291316
<!-- TODO: needs a description -->
292-
<description>TBD</description>
317+
<description>The collection of components comprising this capability.</description>
293318
<define-flag required="yes" name="component-uuid" as-type="uuid">
294319
<formal-name>Component Reference</formal-name>
295320
<!-- Identifier Reference -->
@@ -309,13 +334,25 @@
309334
<define-flag name="uuid" as-type="uuid" required="yes">
310335
<formal-name>Control Implementation Set Identifier</formal-name>
311336
<!-- Identifier Declaration -->
312-
<description>A <a href="/concepts/identifier-use/#machine-oriented">machine-oriented</a>, <a href="/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference a set of implemented controls elsewhere in <a href="/concepts/identifier-use/#component-definition-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>control implementation set</code> can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance). This UUID should be assigned <a href="/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.</description>
337+
<description>Provides a means to identify a set of control implementations that are supported by a given component or capability.</description>
338+
<prop name="value-type" value="identifier"/>
339+
<prop name="identifier-type" value="machine-oriented"/>
340+
<prop name="identifier-uniqueness" value="global"/>
341+
<prop name="identifier-scope" value="cross-instance"/>
342+
<prop name="identifier-persistence" value="per-subject"/>
313343
</define-flag>
314-
<flag ref="source" required="yes">
344+
<define-flag name="source" as-type="uri-reference" required="yes">
345+
<formal-name>Source Resource Reference</formal-name>
346+
<description>A reference to an OSCAL catalog or profile providing the referenced control or subcontrol definition.</description>
315347
<remarks>
316-
<p>A URL reference to the source catalog or profile for which this component is implementing controls for.</p>
348+
<p>This value may be one of:</p>
349+
<ol>
350+
<li>an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that points to a network resolvable resource,</li>
351+
<li>a <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#relative-reference">relative reference</a> pointing to a network resolvable resource whose base URI is the URI of the containing document, or</li>
352+
<li>a bare URI fragment (i.e., `#uuid`) pointing to a <code>back-matter</code> resource in this or an imported document (see <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#linking-to-another-oscal-object">linking to another OSCAL object</a>).</li>
353+
</ol>
317354
</remarks>
318-
</flag>
355+
</define-flag>
319356
<model>
320357
<define-field name="description" as-type="markup-multiline" min-occurs="1" in-xml="WITH_WRAPPER">
321358
<formal-name>Control Implementation Description</formal-name>
@@ -352,13 +389,18 @@
352389
<define-flag name="uuid" as-type="uuid" required="yes">
353390
<formal-name>Control Implementation Identifier</formal-name>
354391
<!-- Identifier Declaration -->
355-
<description>A <a href="/concepts/identifier-use/#machine-oriented">machine-oriented</a>, <a href="/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference a specific control implementation elsewhere in <a href="/concepts/identifier-use/#component-definition-identifiers">this or other OSCAL instances</a>. The locally defined <em>UUID</em> of the <code>control implementation</code> can be used to reference the data item locally or globally (e.g., in an imported OSCAL instance).This UUID should be assigned <a href="/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same subject across revisions of the document.</description>
392+
<description>Provides a globally unique means to identify a given control implementation by a component.</description>
393+
<prop name="value-type" value="identifier"/>
394+
<prop name="identifier-type" value="machine-oriented"/>
395+
<prop name="identifier-uniqueness" value="global"/>
396+
<prop name="identifier-scope" value="cross-instance"/>
397+
<prop name="identifier-persistence" value="per-subject"/>
356398
</define-flag>
357399
<flag ref="control-id" required="yes"/>
358400
<model>
359401
<define-field name="description" as-type="markup-multiline" min-occurs="1" in-xml="WITH_WRAPPER">
360402
<formal-name>Control Implementation Description</formal-name>
361-
<description>A suggestion for how the specified control may be implemented if the containing component or capability is instantiated in a system security plan.</description>
403+
<description>A suggestion from the supplier (e.g., component vendor or author) for how the specified control may be implemented if the containing component or capability is instantiated in a system security plan.</description>
362404
</define-field>
363405
<assembly ref="property" max-occurs="unbounded">
364406
<group-as name="props" in-json="ARRAY"/>
@@ -398,7 +440,7 @@
398440
</is-unique>
399441
</constraint>
400442
<remarks>
401-
<p>Implemented requirements within a component or capability in a component definition provide a means to suggest possible control implementation details, which may be used by a different party when authoring a system security plan. Thus, these requirements defined in a component definition are only a suggestion of how to implement, which may be adopted wholesale, changed, or ignored by a person defining an information system implementation.</p>
443+
<p>Implemented requirements within a component or capability in a component definition provide a means for component suppliers to suggest possible control implementation details, which may be used by a different party (e.g., component consumers) when authoring a system security plan. Thus, these requirements defined in a component definition are only a suggestion of how to implement, which may be adopted wholesale, changed, or ignored by a person defining an information system implementation.</p>
402444
<p>Use of <code>set-parameter</code> in this context, sets the parameter for the referenced control and any associated statements.</p>
403445
</remarks>
404446
</define-assembly>

‎src/metaschema/oscal_control-common_metaschema.xml

+61-55
Large diffs are not rendered by default.

‎src/metaschema/oscal_implementation-common_metaschema.xml

+11-4
Original file line numberDiff line numberDiff line change
@@ -604,10 +604,7 @@
604604
</define-assembly>
605605

606606

607-
<define-flag name="source" as-type="uri-reference">
608-
<formal-name>Source Resource Reference</formal-name>
609-
<description>A reference to an OSCAL catalog or profile providing the referenced control or subcontrol definition.</description>
610-
</define-flag>
607+
611608
<!-- <define-assembly name="only-statement">
612609
<formal-name>Specific Statement</formal-name>
613610
<description>Describes which specific statements are addressed by a requirement, by pointing to a specific requirement statement within a control.</description>
@@ -666,6 +663,13 @@
666663
<!-- This is an id because the idenfier is assigned and managed by humans. -->
667664
<formal-name>System Identification</formal-name>
668665
<!-- Identifier Declaration -->
666+
<!--
667+
TODO: Given feedback, we need to update Metaschema with usnistgov/metaschema#222
668+
with props like in https://github.com/david-waltermire-nist/OSCAL/commit/3aafc080b3dc5f488c15b763f707326e77a61f5d#diff-4176d3cf694dd36b02a94207426934306ec0fdaecc54d1bb96f50f52cd7ceae6R27-R32.
669+
670+
We need to determine if both identifier-type='machine-oriented' and identifier-type='human-oriented'.
671+
Option 2 is identifier-type='unspecified'.
672+
-->
669673
<description>A <a href="/concepts/identifier-use/#human-oriented">human-oriented</a>, <a href="/concepts/identifier-use/#globally-unique">globally unique</a> identifier with <a href="/concepts/identifier-use/#cross-instance">cross-instance</a> scope that can be used to reference this system identification property elsewhere in <a href="/concepts/identifier-use/#scope">this or other OSCAL instances</a>. When referencing an externally defined <code>system identification</code>, the <code>system identification</code> must be used in the context of the external / imported OSCAL instance (e.g., uri-reference). This string should be assigned <a href="/concepts/identifier-use/#consistency">per-subject</a>, which means it should be consistently used to identify the same system across revisions of the document.</description>
670674
<json-value-key>id</json-value-key>
671675
<define-flag name="identifier-type" as-type="uri">
@@ -679,6 +683,9 @@
679683
<enum value="http://ietf.org/rfc/rfc4122">A Universally Unique Identifier (UUID) as defined by RFC4122.</enum>
680684
</allowed-values>
681685
</constraint>
686+
<remarks>
687+
<p>This value must be an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that serves as a <a href="/OSCAL/concepts/uri-use/#use-as-a-naming-system-identifier">naming system identifier</a>.</p>
688+
</remarks>
682689
</define-flag>
683690
</define-field>
684691

‎src/metaschema/oscal_mapping-common_metaschema.xml

+9-8
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@
2828
<formal-name>Mapping Entry Relationship</formal-name>
2929
<description>The relationship type for the mapping entry, which describes the relationship between the effective requirements of the specified source and target sets.</description>
3030
<json-value-key>type</json-value-key>
31-
<define-flag name="ns" as-type="uri">
31+
<define-flag name="ns" as-type="uri" default="http://csrc.nist.gov/ns/oscal">
3232
<formal-name>Relationship Value Namespace</formal-name>
3333
<description>A namespace qualifying the relationship's value. This allows different organizations to associate distinct semantics for relationships with the same name.</description>
3434
<remarks>
35-
<p>An organization MUST use a URI that they have control over. e.g., a domain registered to the organization in a URI, a registered uniform resource names (URN) namespace.</p>
35+
<p>This value must be an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that serves as a <a href="/OSCAL/concepts/uri-use/#use-as-a-naming-system-identifier">naming system identifier</a>.</p>
3636
<p>When a <code>ns</code> is not provided, its value should be assumed to be <code>http://csrc.nist.gov/ns/oscal</code> and the name should be a name defined by the associated OSCAL model.</p>
3737
</remarks>
3838
</define-flag>
@@ -90,7 +90,7 @@
9090

9191
<define-assembly name="mapping-resource-reference">
9292
<formal-name>Mapped Resource Reference</formal-name>
93-
<description>A reference to a back-matter resource that is either the source or target of a mapping.</description>
93+
<description>A reference to a resource that is either the source or target of a mapping.</description>
9494
<define-flag name="type" as-type="token" required="yes">
9595
<formal-name>Resource Type</formal-name>
9696
<description>The semantic type of the resource.</description>
@@ -104,11 +104,12 @@
104104
<formal-name>Catalog or Profile Reference</formal-name>
105105
<description>A resolvable URL reference to the base catalog or profile that this profile is tailoring.</description>
106106
<remarks>
107-
<p>The value of the <code>href</code> can be an internet resource, or a local reference using a fragment e.g. #fragment that points to a <code>back-matter</code>
108-
<code>resource</code> in the same document.</p>
109-
<!-- TODO: Add a link to "within the scope of the containing OSCAL document" to point to documentation of identification scopes" -->
110-
<p>If a local reference using a fragment is used, this will be indicated by a fragment "#" followed by an identifier which references an identified <code>resource</code> in the document's <code>back-matter</code> or another object that is within the scope of the containing OSCAL document.</p>
111-
<p>If an internet resource is used, the <code>href</code> value will be an absolute or relative URL pointing to the location of the referenced resource. A relative URL will be resolved relative to the location of the document containing the link.</p>
107+
<p>This value may be one of:</p>
108+
<ol>
109+
<li>an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that points to a network resolvable resource,</li>
110+
<li>a <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#relative-reference">relative reference</a> pointing to a network resolvable resource whose base URI is the URI of the containing document, or</li>
111+
<li>a bare URI fragment (i.e., `#uuid`) pointing to a <code>back-matter</code> resource in this or an imported document (see <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#linking-to-another-oscal-object">linking to another OSCAL object</a>).</li>
112+
</ol>
112113
</remarks>
113114
</define-flag>
114115
<model>

‎src/metaschema/oscal_metadata_metaschema.xml

+505-389
Large diffs are not rendered by default.

‎src/metaschema/oscal_profile_metaschema.xml

+96-62
Large diffs are not rendered by default.

‎src/metaschema/oscal_ssp_metaschema.xml

+21-9
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,13 @@
5757
<formal-name>Profile Reference</formal-name>
5858
<description>A resolvable URL reference to the profile or catalog to use as the system's control baseline.</description>
5959
<remarks>
60-
<p>The value of the <code>href</code> can be an internet resource, or a local reference using a fragment e.g. #fragment that points to a <code>back-matter</code>
61-
<code>resource</code> in the same document.</p>
62-
<!-- TODO: Add a link to "within the scope of the containing OSCAL document" to point to documentation of identification scopes" -->
63-
<p>If a local reference using a fragment is used, this will be indicated by a fragment "#" followed by an identifier which references an identified <code>resource</code> in the document's <code>back-matter</code> or another object that is within the scope of the containing OSCAL document. The identified resource will be used instead as the target resource.</p>
64-
<p>If an internet resource is used, the <code>href</code> value will be an absolute or relative URI pointing to the location of the target resource. A relative URI will be resolved relative to the location of the document containing the link.</p>
65-
<p>If the resource is an OSCAL profile, it is expected that a tool will resolve the profile according to the OSCAL [profile resolution specification](https://pages.nist.gov/OSCAL/concepts/processing/profile-resolution/) to produce a resolved profile for use when processing the containing system security plan. This allows a system security plan processor to use the baseline as a catalog of controls.</p>
60+
<p>This value may be one of:</p>
61+
<ol>
62+
<li>an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that points to a network resolvable resource,</li>
63+
<li>a <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#relative-reference">relative reference</a> pointing to a network resolvable resource whose base URI is the URI of the containing document, or</li>
64+
<li>a bare URI fragment (i.e., `#uuid`) pointing to a <code>back-matter</code> resource in this or an imported document (see <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#linking-to-another-oscal-object">linking to another OSCAL object</a>).</li>
65+
</ol>
66+
<p>If the resource is an OSCAL profile, it is expected that a tool will resolve the profile according to the OSCAL <a href="https://pages.nist.gov/OSCAL/concepts/processing/profile-resolution/">profile resolution specification</a> to produce a resolved profile for use when processing the containing system security plan. This allows a system security plan processor to use the baseline as a catalog of controls.</p>
6667
<p>While it is possible to reference a previously resolved OSCAL profile as a catalog, this practice is discouraged since the unresolved form of the profile communicates more information about selections and changes to the underlying catalog. Furthermore, the underlying catalog can be maintained separately from the profile, which also has maintenance advantages for distinct maintainers, ensuring that the best available information is produced through profile resolution.</p>
6768
</remarks>
6869
</define-flag>
@@ -88,6 +89,9 @@
8889
<define-field name="system-name-short" as-type="string">
8990
<formal-name>System Name - Short</formal-name>
9091
<description>A short name for the system, such as an acronym, that is suitable for display in a data table or summary list.</description>
92+
<remarks>
93+
<p>Since <code>system-name-short</code> is optional, if the <code>system-name-short</code> is not provided, the <code>system-name</code> can be used as a substitute.</p>
94+
</remarks>
9195
</define-field>
9296
<define-field name="description" as-type="markup-multiline" min-occurs="1" in-xml="WITH_WRAPPER">
9397
<formal-name>System Description</formal-name>
@@ -218,6 +222,9 @@
218222
<enum value="http://doi.org/10.6028/NIST.SP.800-60v2r1">Based on the section identifiers in NIST <a href="https://doi.org/10.6028/NIST.SP.800-60v2r1">Special Publication 800-60 Volume II Revision 1</a>.</enum>
219223
</allowed-values>
220224
</constraint>
225+
<remarks>
226+
<p>This value must be an <a href="https://pages.nist.gov/OSCAL/concepts/uri-use/#absolute-uri">absolute URI</a> that serves as a <a href="/OSCAL/concepts/uri-use/#use-as-a-naming-system-identifier">naming system identifier</a>.</p>
227+
</remarks>
221228
</define-flag>
222229
<model>
223230
<define-field name="information-type-id" as-type="string" max-occurs="unbounded">
@@ -274,6 +281,10 @@
274281
<index-has-key name="index-back-matter-resource" target="link[@rel='privacy-impact-assessment' and starts-with(@href,'#')]">
275282
<key-field target="@href" pattern="#(.*)"/>
276283
</index-has-key>
284+
<!--
285+
TODO: Per discussion in usnisgov/OSCAL#1331 review on 29 July 2022,
286+
add the path target to security-sensitivity-level as well.
287+
-->
277288
<matches target="link[@rel='privacy-impact-assessment']/@href[not(starts-with(.,'#'))]" datatype="uri"/>
278289
<allowed-values target="information-type/(confidentiality-impact|integrity-impact|availability-impact)/(base|selected)">
279290
<enum value="fips-199-low">A 'low' sensitivity level as defined in <a href="https://doi.org/10.6028/NIST.FIPS.199">FIPS-199</a>.
@@ -319,18 +330,19 @@
319330
<formal-name>Security Impact Level</formal-name>
320331
<description>The overall level of expected impact resulting from unauthorized disclosure, modification, or loss of access to information.</description>
321332
<model>
333+
<!--
334+
TODO: Per discussion in usnisgov/OSCAL#1331 review on 29 July 2022,
335+
add the path target to security-impact-level as well for fips-199-low/mod/high.
336+
-->
322337
<define-field name="security-objective-confidentiality" as-type="string" min-occurs="1">
323-
<!-- CHANGED: cardinality to min 1 -->
324338
<formal-name>Security Objective: Confidentiality</formal-name>
325339
<description>A target-level of confidentiality for the system, based on the sensitivity of information within the system.</description>
326340
</define-field>
327341
<define-field name="security-objective-integrity" as-type="string" min-occurs="1">
328-
<!-- CHANGED: cardinality to min 1 -->
329342
<formal-name>Security Objective: Integrity</formal-name>
330343
<description>A target-level of integrity for the system, based on the sensitivity of information within the system.</description>
331344
</define-field>
332345
<define-field name="security-objective-availability" as-type="string" min-occurs="1">
333-
<!-- CHANGED: cardinality to min 1 -->
334346
<formal-name>Security Objective: Availability</formal-name>
335347
<description>A target-level of availability for the system, based on the sensitivity of information within the system.</description>
336348
</define-field>

0 commit comments

Comments
 (0)
Please sign in to comment.