diff --git a/README.md b/README.md
index af64dc3..30ba4d5 100644
--- a/README.md
+++ b/README.md
@@ -1,83 +1,134 @@
-# Trusted Data Format Specification
+# OpenTDF Specification
-Trusted Data Format (TDF) is an Open, Interoperable data format for implementing Data Centric Security for objects (such as files or emails). This repository specifies the protocols and schemas required for TDF operation. Versioning of this spec follows the [Semver standard](https://semver.org/).
+**The Open, Interoperable Standard for Data-Centric Security**
-OpenTDF derives its modern JSON-encoded format from the [TDF XML Specification](https://www.dni.gov/index.php/who-we-are/organizations/ic-cio/ic-cio-related-menus/ic-cio-related-links/ic-technical-specifications/trusted-data-format). If you are interested in interoperability between OpenTDF and Base TDF XML or community-specific implementations, please [contact us](mailto:support@opentdf.io).
+[](https://semver.org/spec/v2.0.1.html)
+## Introduction
-## Documentation
-* [Schema](schema/) - Schema definitions for common TDF data objects.
-* [Protocol](protocol/) - High-level design of the TDF architecture and process workflows.
+OpenTDF (Trusted Data Format) defines an open and interoperable format for embedding data protection directly into data objects themselves (like files or emails). This enables robust **data-centric security**, ensuring data remains protected wherever it travels.
-## Contributions
-Please see the [contribution guidelines](CONTRIBUTING.md) for proposing changes and submitting feedback.
+This repository contains the official specification for OpenTDF, including the data format, cryptography, and protocols. It serves as the definitive reference for:
-## Features and Capabilities
+* **Developers** building applications or SDKs that create, consume, or manage TDF objects.
+* **Organizations** implementing data protection solutions needing a standard for interoperability and integration.
+* **Partners** participating in federated ecosystems where consistent data protection across organizational boundaries is crucial.
-### 1. Strong Encryption
-TDF supports strong encryption of the data as well as strong protections for the encryption keys.
+[Client SDKs and server-side services](https://github.com/opentdf/platform) can be built upon this OpenTDF specification, ensuring standards-based security and enabling seamless interaction between different systems and organizations in a federated environment.
-### 2. Attribute Based Access Control (ABAC)
-TDF protocol supports ABAC. This allows TDF protocol to implement policy driven and highly scalable access control mechanism.
+OpenTDF derives its modern JSON-encoded format from the original [TDF XML Specification](https://www.dni.gov/index.php/who-we-are/organizations/ic-cio/ic-cio-related-menus/ic-cio-related-links/ic-technical-specifications/trusted-data-format). For details on interoperability with legacy TDF XML formats, please [contact us](mailto:support@opentdf.io).
-### 3. Control
-TDF allows the data owner (or org's administrator) to revoke or expire access to data, even after it has left your org's boundaries.
+**Versioning:** This specification adheres to the [Semantic Versioning 2.0.0](https://semver.org/) standard.
-### 4. End to end auditability
-TDF protocol and infrastructure enables logging every key request - effectively adding the most reliable auditing and tracking of access requests.
+## Navigation
-### 5. Streaming and Support for Large Files
-TDF supports protection (encryption and decryption) of very large files. This is done by supporting streaming.
+- [Specification Details](#specification-details)
+ - [Schema (`schema/`)](schema/)
+ - [Protocol (`protocol/`)](protocol/protocol.md)
+ - [Concepts (`concepts/`)](concepts/)
+- [Lineage and Usage](#lineage-and-usage)
+- [Key Concepts](#key-concepts)
+- [Core Features & Capabilities](#core-features--capabilities)
+- [Security Principles: The C.I.A. Triad](#security-principles-the-cia-triad)
+- [TDF Structure](#tdf-structure)
+- [NanoTDF](#nanotdf-a-compact-binary-format)
+- [Reference Implementation & SDKs](#reference-implementation--sdks)
+- [Contact](#contact)
-### 6. Policy Binding
-TDF format provides support for cryptographic binding between payload and metadata via public key-based signatures. This guarantees that the Policy Object has not been tampered with.
+## Specification Details
-### 7. Offline Create
-Thanks to the assurances provided by `Policy Binding` described above, TDF-enabled clients can create TDFs without actively connecting to the key server (in other words, no access to the internet). The offline created TDF can be sent to anyone via offline methods or when the device has access to internet again.
+The detailed technical specification is organized into the following sections:
-### 8. Key Server Federation
-Multiple KAS servers, each hosted by a different organization, can jointly control access to a TDF file. This enables organizations to jointly own, control, audit files in a zero trust manner.
+* **[Schema (`schema/`)](schema/):** Defines the JSON schemas for the `manifest.json` and its constituent objects (like `EncryptionInformation`, `KeyAccess`, `PolicyObject`, etc.). This is the reference for the data structure format.
+* **[Protocol (`protocol/`)](protocol/):** Describes the high-level architecture, process workflows (e.g., key requests, unwrapping), and interactions between clients, Key Access Servers (KAS), and Identity Providers.
+* **[Concepts (`concepts/`)](concepts/):** Contains detailed explanations of core concepts including access control and security principles.
+Developers should consult these sections for implementation details regarding data formats, cryptographic operations, and protocol interactions.
-## Meet TDF
-A TDF file at rest can be in one of the two forms:
+## Lineage and Usage
-* As a Zip file with extension of `.tdf`. For example, if you are trying to protect a file named `demo.jpeg`, the file will be stored as `demo.jpeg.tdf` after encryption.
-* As a HTML file with extension of `.html`. For example, if you are trying to protect a file named `demo.jpeg`, the file will be stored as `demo.jpeg.html` after encryption. An example HTML file is (here)[https://github.com/opentdf/spec/blob/master/schema/HtmlProtocolExample.html].
+OpenTDF represents a modernization of data-centric security concepts originally established in the **IC-TDF** (Intelligence Community Trusted Data Format) specification. While IC-TDF utilized an XML-based structure, OpenTDF adopts a more contemporary approach using JSON for its manifest, enhancing flexibility and ease of integration with modern web technologies.
-### Components of a TDF file
-Irrespective of whether the TDF file is composed as a Zip or HTML, there are always two components in a TDF file:
-* A `manifest.json` component. The `manifest.json` data structure has all the information anyone would need to request access to decryption key. Be sure to check out the [TDF3 Schemas](schema/) for a detailed reference on `manifest.json`
-* Encrypted Payload component. This is simply the encrypted version of the object (say a file or email) being protected.
-
-
+Furthermore, OpenTDF serves as the foundational layer for other specialized data formats. Notably, **ZTDF** (Zero Trust Data Format), developed within NATO contexts, builds directly upon the OpenTDF specification. ZTDF extends OpenTDF by mandating the inclusion of specific cryptographic assertions required for NATO use cases, ensuring compliance with their operational requirements.
-_TDF composed as Zip and HTML file._
+The detailed specifications for IC-TDF and ZTDF are maintained separately and are not covered within this document.
-### Principle Elements in manifest.json file
+## Key Concepts
-There are three principle element types within a TDF's `manifest.json` component:
-* Encryption Information: for encrypting, signing, or integrity binding of Payloads and Assertions
-* Payload Reference(s): reference(s) to the encrypted payload
-* Assertion(s): statement(s) about payload(s); this is optional and not shown below.
+At its core, OpenTDF wraps sensitive data within a protective layer. This layer includes:
-
+1. **Encrypted Payload:** The original data, strongly encrypted.
+2. **Metadata Manifest:** A `manifest.json` file containing crucial information, such as:
+ * How the payload was encrypted.
+ * Where to retrieve the decryption key (Key Access information).
+ * The access control policy governing the data.
+ * Optionally, cryptographic assertions about the data or policy.
-_A TDF file with manifest.json component and encrypted payload component._
+This structure allows fine-grained control and auditing, independent of underlying storage or transport systems.
+To learn more about access control, and what makes OpenTDF secure, reference the following sections:
+* [Access Control](./concepts/access_control.md)
+* [Security](./concepts/security.md)
-## What's new in TDF3? A deeper look.
-TDF's newest version, TDF3 adds powerful new features on top of existing capabilities. Below is a summary of what capabilities are unlocked by each new top level element within encryption information.
+## Core Features & Capabilities
-### 1. Streaming and Support for Large Files"
-In order to support large file use cases, including streamability with high integrity, we added integrityInformation as an element to Encryption Information. Below is a look at what it looks like in TDF3 `manifest.json` file.
+OpenTDF is designed to provide comprehensive data security through the following features:
-
+* **Strong Encryption:** Utilizes robust, modern cryptographic algorithms to protect both the data payload and the encryption keys themselves.
+* **Attribute-Based Access Control (ABAC):** Enables highly scalable and flexible access control based on attributes of users, data, and the environment, defined within the TDF's policy.
+* **Persistent Policy Enforcement:** Access policies are bound to the data, allowing data owners or administrators to manage access even after the data has been shared outside organizational boundaries.
+* **End-to-End Auditability:** The protocol facilitates comprehensive logging of key requests, providing a reliable audit trail of data access attempts.
+* **Large File & Streaming Support:** Efficiently handles large data objects through secure streaming mechanisms, maintaining integrity throughout the process.
+* **Policy Integrity:** Cryptographically binds the access policy defined in the manifest to the key access information, preventing policy tampering after creation.
+* **Offline Creation:** Allows TDF objects to be created securely by clients even without immediate network connectivity to a key server, thanks to policy binding assurances.
+* **Federated Key Management:** Supports scenarios where multiple Key Access Servers (KAS), potentially hosted by different organizations, can collaboratively manage access to a single TDF object, enabling secure cross-domain collaboration in a zero-trust manner.
-### 2. Policy Binding and Offline Create
-With embedding cryptographically bound policy and wrapped keys, we enable a high assurance key server.
+## Security Principles: The C.I.A. Triad
-
+OpenTDF is designed with the fundamental security principles of Confidentiality, Integrity, and Availability (C.I.A.) at its core:
-### 3. Key Server Federation
-Want to protect files such that two (or more) organizations control the keys? It is now possible with TDF3. [keyAccess](schema/tdf/KeyAccessObject.md) object in particular allows for array of objects, which can allow for multiple KAS servers to participate in an object key grant.
+* **Confidentiality:** Ensures that sensitive data is only accessible to authorized users through strong encryption and attribute-based access control.
+* **Integrity:** Maintains data authenticity and prevents unauthorized modifications through cryptographic binding of policies and payloads.
+* **Availability:** Enables secure access to protected data through distributed key management and offline creation capabilities.
+
+These principles work together to provide comprehensive data protection while maintaining usability and accessibility for authorized users.
+
+## TDF Structure
+
+By default, a TDF object is packaged as a standard Zip archive file, typically using the `.tdf` extension appended to the original filename. This archive contains two primary components:
+
+1. **`manifest.json`:** The metadata manifest described in the Key Concepts section. It holds instructions for decryption and access control.
+2. **`payload`:** The encrypted data payload itself.
+
+However, a TDF can be encoded in other ways. For example, as an HTML document:
+
+
+_A TDF object can be packaged as a standard ZIP, or as an HTML document_
+
+## NanoTDF: A Compact Binary Format
+
+Alongside the primary OpenTDF specification based on JSON manifests, this project also defines **NanoTDF**. NanoTDF is a **compact binary format** designed specifically for resource-constrained environments (e.g., IoT devices, scenarios with limited bandwidth, storage, or processing power) where the overhead of the standard Zip/JSON format might be prohibitive.
+
+It achieves minimal size by using a highly optimized binary structure and relying exclusively on Elliptic Curve Cryptography (ECC).
+
+While OpenTDF offers flexibility and rich metadata, NanoTDF prioritizes size efficiency for specific use cases.
+
+**➡️ For details, please refer to the [NanoTDF Specification](../schema/nanotdf/README.md).**
+
+## Reference Implementation & SDKs
+
+A robust, open-source reference implementation of the OpenTDF specification is actively developed and maintained at **[opentdf/platform](https://github.com/opentdf/platform)**.
+
+This platform provides:
+
+* **Client SDKs:** Ready-to-use libraries for integrating TDF capabilities into applications:
+ * **Java**
+ * **JavaScript**
+ * **Go**
+* **Server Components:** Example implementations of backend services like the Key Access Server (KAS).
+
+Developers can use this platform as a practical guide, a starting point for their own implementations, or directly leverage the provided SDKs.
+
+## Contact
+
+For questions regarding OpenTDF, interoperability, or the specification, please reach out to [support@opentdf.io](mailto:support@opentdf.io).
\ No newline at end of file
diff --git a/concepts/access_control.md b/concepts/access_control.md
new file mode 100644
index 0000000..80f9c0e
--- /dev/null
+++ b/concepts/access_control.md
@@ -0,0 +1,72 @@
+# OpenTDF Access Control Concepts (ABAC)
+
+OpenTDF implements a sophisticated access control model known as **Attribute-Based Access Control (ABAC)**. This approach provides fine-grained, flexible, and scalable authorization for data protection.
+
+## What is ABAC?
+
+Attribute-Based Access Control is a security paradigm where access rights are granted based on the evaluated **attributes** of entities involved in an access request, rather than solely on roles or explicit permissions lists. Key components include:
+
+* **Subject Attributes:** Characteristics of the entity requesting access (e.g., user's clearance, department, nationality, group memberships).
+* **Resource Attributes:** Characteristics of the data or resource being accessed (e.g., data classification, sensitivity level, project code).
+* **Policies:** Rules that define allowable actions by comparing subject, resource, and potentially environment attributes (e.g., "Allow access if subject's clearance >= resource's classification AND subject is in department 'X'").
+* **Policy Enforcement Point (PEP):** The logical component that evaluates the policies against the attributes and makes the final access decision (grant or deny).
+
+ABAC offers significant advantages over traditional models, enabling dynamic access decisions that adapt to changing conditions without needing constant updates to user roles or access control lists (ACLs).
+
+## OpenTDF's Implementation of ABAC
+
+OpenTDF embeds ABAC directly into the data's protection layer. Here's how its components map to ABAC concepts:
+
+* **Subject Attributes:** Represented by **Entity Entitlements**. These are the attribute instances asserted by the identity system or client about the user/entity requesting access. They are provided *to* the PEP during an access request.
+* **Resource Attributes:** Defined within the TDF's [Policy Object](../schema/OpenTDF/policy.md) in the `dataAttributes` array. These specify the attribute instances *required* to access this specific piece of data.
+* **Policies:** Defined by the combination of:
+ * The `dataAttributes` required by the specific TDF.
+ * The optional `dissem` list in the TDF's [Policy Object](../schema/OpenTDF/policy.md) acting as an initial filter.
+ * **Attribute Definitions** managed externally by Attribute Authorities, which specify the *rules* (e.g., AllOf, AnyOf, Hierarchy) for comparing subject and resource attributes.
+* **Policy Enforcement Point (PEP):** Typically resides within the Key Access Server (KAS) or associated logic. It receives the TDF's policy requirements, the subject's entitlements, retrieves the relevant Attribute Definitions, and makes the authorization decision before releasing a key.
+
+## OpenTDF Attribute Representation
+
+To ensure interoperability and clarity, OpenTDF represents attributes as **URIs (Uniform Resource Identifiers)**.
+
+The standard structure is:
+`{Attribute Namespace}/attr/{Attribute Name}/value/{Attribute Value}`
+
+**Components:**
+
+| Component | Example Value | Description | Globally Unique? |
+| :--------------------------- | :----------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------- | :--------------- |
+| **Attribute Namespace** | `https://example.com` | Typically a domain controlled by the authoritative source of the attribute definition. Recommended to use a stable, controlled namespace. | No (by itself) |
+| **Attribute Canonical Name** | `https://example.com/attr/classification` | Combination of Namespace and Name (`{Namespace}/attr/{Name}`). **This MUST be globally unique** and identifies the specific attribute *type*. | **Yes** |
+| **Attribute Instance** | `https://example.com/attr/classification/value/secret` | The full URI (`{Canonical Name}/value/{Value}`). This represents a specific, actionable attribute assertion used in policies or entitlements. | **Yes** |
+
+## Attribute Definitions (External Rules)
+
+Crucially, the *rules* governing how attributes are compared are defined in **Attribute Definitions**, which are associated with the globally unique **Attribute Canonical Name**. These definitions are managed by the attribute authority and are stored **outside** the TDF manifest itself.
+
+An Attribute Definition typically includes:
+
+* **Rule Type:** How multiple values or comparisons should be handled (e.g., `AllOf` - entity must have all specified values, `AnyOf` - entity must have at least one, `Hierarchy` - values have an order).
+* **Allowed Values:** An optional enumeration or pattern restricting valid attribute values.
+* **Order/Rank (for Hierarchy):** Defines the relationship between values in a hierarchical attribute (e.g., Confidential < Secret < TopSecret).
+
+The PEP retrieves these definitions at access decision time based on the Canonical Names found in the TDF's `dataAttributes` and the entity's entitlements.
+
+## Access Control Flow in OpenTDF
+
+When an entity requests access to an OpenTDF object:
+
+1. **Request Initiation:** The client presents the relevant [Key Access Object(s)](../schema/OpenTDF/key_access_object.md) from the TDF manifest to the appropriate KAS, along with the client's credentials and asserted **Entity Entitlements** (Subject Attributes).
+2. **PEP Evaluation:** The KAS performs the following checks based on the TDF's embedded [Policy Object](../schema/OpenTDF/policy.md) (extracted from the `policy` field):
+ * **Dissemination Check (if applicable):** If the policy's `dissem` list is present and non-empty, the PEP verifies if the requesting entity's identifier is in the list. If not, access is **denied**.
+ * **Attribute Check:**
+ * The PEP examines the required `dataAttributes` (Resource Attributes) listed in the policy.
+ * For each required attribute, it retrieves the corresponding external **Attribute Definition** based on the attribute's Canonical Name.
+ * It compares the required `dataAttributes` against the provided **Entity Entitlements** using the comparison logic (AllOf, AnyOf, Hierarchy) specified in the retrieved Attribute Definitions.
+ * If the entity's entitlements **do not satisfy** the requirements of *all* `dataAttributes` according to their rules, access is **denied**.
+3. **Key Release (if authorized):** If *both* the Dissemination Check (if applicable) and the Attribute Check pass, the PEP considers the entity authorized. It then proceeds with verifying the [Policy Binding](./security.md#3-policy-binding) and, if valid, unwraps and provides the requested key share(s) to the client.
+
+> **Policy Logic Clarification:** The relationship between the `dissem` list and the `dataAttributes` is effectively an **AND**. An entity MUST be on the `dissem` list (if it's used) **AND** MUST satisfy the `dataAttributes` requirements.
+> If the `dissem` list is empty or omitted, then *only* the `dataAttributes` requirements need to be met. The `dissem` list acts as an additional filter to narrow the audience beyond what the attributes alone define.
+
+By combining embedded policy requirements with externally defined attribute rules, OpenTDF achieves a powerful and flexible ABAC implementation for data-centric security.
\ No newline at end of file
diff --git a/concepts/security.md b/concepts/security.md
new file mode 100644
index 0000000..10f5720
--- /dev/null
+++ b/concepts/security.md
@@ -0,0 +1,56 @@
+# OpenTDF Security Concepts
+
+OpenTDF is designed with security and tamper evidence as core principles, enabling data-centric protection where security travels with the data itself. This document outlines the key conceptual mechanisms that provide these guarantees.
+
+## 1. Payload Encryption
+
+The most fundamental layer of protection is **payload encryption**. The original data within a TDF is encrypted using strong, authenticated symmetric encryption algorithms (typically AES-256-GCM). This ensures the confidentiality of the data – it cannot be read without the correct decryption key. The management and protection of this decryption key are handled by other mechanisms described below.
+
+## 2. Payload Integrity Verification
+
+While encryption protects confidentiality, it doesn't inherently prevent undetected modification of the *ciphertext*. An attacker could potentially flip bits in the encrypted data. OpenTDF addresses this using the **`integrityInformation`** object within the manifest.
+
+* **Purpose:** To allow recipients to verify that the encrypted payload has not been altered since its creation. This is especially critical for streamed data.
+* **Mechanism:**
+ 1. **Segmentation:** The plaintext payload is processed in chunks (segments).
+ 2. **Segment Hashing/Tagging:** As each segment is encrypted (using AES-GCM, for example), a cryptographic integrity tag (like a GMAC) is generated for that encrypted segment using the *payload encryption key*. This tag is stored (as `hash`) in the corresponding [Segment Object](../schema/OpenTDF/integrity_information.md#encryptioninformationintegrityinformationsegment).
+ 3. **Root Signature:** All the individual segment tags/hashes are concatenated in order. A final HMAC (e.g., HMAC-SHA256) is calculated over this concatenated string of hashes, again using the *payload encryption key*. This result is stored as the `rootSignature.sig`.
+* **Result:** Any modification to even a single bit of the encrypted payload will invalidate the integrity tag of the affected segment *and* consequently invalidate the final `rootSignature`. During decryption, the receiving client MUST verify the integrity tag of each segment and the overall `rootSignature`. Failure indicates tampering.
+
+## 3. Policy Binding
+
+It's crucial that the access policy defined for a TDF cannot be detached from the key required to decrypt it. An attacker shouldn't be able to take a wrapped key associated with a strict policy and attach it to a TDF manifest that specifies a weaker policy. The **`policyBinding`** object within *each* [Key Access Object](../schema/OpenTDF/key_access_object.md) prevents this.
+
+* **Purpose:** To cryptographically link the specific access policy (defined in `encryptionInformation.policy`) to a particular wrapped key share held by a specific Key Access Server (KAS).
+* **Mechanism:**
+ 1. The client retrieves the full, Base64-encoded `policy` string from the `encryptionInformation` section of the manifest it is constructing.
+ 2. For *each* key share it prepares to wrap for a specific KAS, the client takes the *plaintext key share* itself.
+ 3. It calculates an HMAC (e.g., HMAC-SHA256, specified by `policyBinding.alg`) using the **plaintext key share** as the secret key and the **Base64-encoded policy string** as the message data.
+ 4. This resulting HMAC hash is Base64 encoded and stored as `policyBinding.hash` within the *same* `keyAccess` object that contains the corresponding wrapped key share.
+* **Result:** When a recipient requests key access from a KAS, they provide the `keyAccess` object (including the `policyBinding`). The KAS decrypts the `wrappedKey` to get the plaintext key share. It then *recalculates* the policy binding HMAC using this key share and the policy string provided (or referenced) in the request. If the calculated hash matches the `policyBinding.hash` received from the client, the KAS knows the policy presented corresponds to the one originally bound to this key share. If they don't match, it indicates tampering or a mismatch, and the KAS MUST deny the request.
+
+## 4. Key Splitting (Multi-Party Access Control)
+
+To enhance security and enable multi-party control, OpenTDF supports **key splitting**. Instead of a single KAS holding the complete (wrapped) key, the key can be divided into multiple shares distributed across different KAS instances.
+
+* **Purpose:** To require authorization from multiple, independent KAS entities before a client can reconstruct the full payload decryption key. This prevents a single compromised KAS from leaking the key and enforces multi-party access control logic.
+* **Mechanism:**
+ 1. The client generates the payload encryption key.
+ 2. It splits the key into multiple cryptographic shares (e.g., using XOR with random nonces such that `Share1 ⊕ Share2 ⊕ ... ⊕ ShareN = FullKey`).
+ 3. Each share is treated as an independent key: it's wrapped using the public key of its designated KAS and associated with its own [Policy Binding](#policy-binding).
+ 4. Each wrapped share is stored in a separate [Key Access Object](../schema/OpenTDF/key_access_object.md) within the `encryptionInformation.keyAccess` array. Crucially, each of these objects is assigned a unique **Split ID** (`sid`).
+ 5. To decrypt, a client must contact *each* KAS responsible for a required share (identified via the `sid` and `url`).
+ 6. Each KAS independently verifies the request against its bound policy (using the [Policy Binding](#policy-binding)).
+ 7. If all necessary KASes grant access, the client receives the unwrapped *shares*.
+ 8. The client reconstructs the full payload key by combining the shares (e.g., XORing them together).
+* **Result:** Access requires successfully authenticating and satisfying the policy constraints at *multiple* independent KAS instances. No single KAS holds enough information to decrypt the data alone.
+
+## Summary: Layered Security
+
+These mechanisms work together:
+* **Encryption** protects confidentiality.
+* **Payload Integrity** ensures the encrypted data hasn't been undetectably modified.
+* **Policy Binding** ensures the access policy cannot be decoupled from the key access grant for a specific KAS.
+* **Key Splitting** enforces multi-party authorization, preventing single points of failure or compromise for key access.
+
+This layered approach provides robust, data-centric security and tamper evidence for data protected by OpenTDF.
\ No newline at end of file
diff --git a/diagrams/filecontents.svg b/diagrams/filecontents.svg
new file mode 100644
index 0000000..6059a07
--- /dev/null
+++ b/diagrams/filecontents.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/protocol/protocol.md b/protocol/protocol.md
new file mode 100644
index 0000000..7baa0c5
--- /dev/null
+++ b/protocol/protocol.md
@@ -0,0 +1,162 @@
+# OpenTDF Protocols
+
+This section describes the interaction protocols between OpenTDF clients (SDKs) and Key Access Servers (KAS) for securely managing access to the Data Encryption Keys (DEKs) used to protect TDF payloads.
+
+## Protocol Selection and Crypto-Agility
+
+A core design principle of OpenTDF is **crypto-agility**. The specific cryptographic algorithms and protocols used for key wrapping and KAS communication are not rigidly fixed by the core TDF structure. Instead, each [Key Access Object](./opentdf/key_access.md) within a TDF's manifest specifies:
+
+1. The **URL** of the responsible KAS.
+2. The **protocol** identifier (e.g., `wrapped`) indicating how to interact with that KAS.
+3. A **Key Identifier (`kid`)** referencing a specific KAS public key.
+4. A **Split Identifier (`sid`)** uniquely identifying a key share when the DEK is split across multiple KAS instances for multi-party access control
+
+This allows different `keyAccess` objects within the *same* TDF to potentially use different key wrapping mechanisms (e.g., one KAS using RSA, another using ECIES based on Elliptic Curve Cryptography) or evolve independently to adopt new algorithms, such as post-quantum cryptography, without breaking the overall TDF format.
+
+The client SDK MUST interpret the details within a specific `keyAccess` object to determine how to interact with the corresponding KAS.
+
+## General Interaction Flow
+
+While specific protocols vary, the high-level interaction generally follows these phases:
+
+1. **TDF Creation:** The SDK encrypts the payload with a generated DEK, defines the access policy, wraps the DEK using the target KAS's public key(s) according to the chosen protocol(s), calculates policy bindings, and constructs the manifest.
+2. **Access Request:** A client SDK parses the TDF manifest, identifies the relevant `keyAccess` object(s), and sends a request to the specified KAS URL(s). This request includes the wrapped key(s), policy binding information, the policy itself, and client authentication/authorization context (including the client's public key for rewrapping).
+3. **KAS Verification:** The KAS authenticates the client, decrypts the wrapped DEK share(s) using its private key, validates the policy binding against the provided policy and the decrypted DEK share, and performs the authorization check (evaluating the policy against the client's authenticated attributes).
+4. **Key Rewrap & Response:** If all checks pass, the KAS re-encrypts ("rewraps") the DEK share using the client's public key provided in the request and returns it. If any check fails, the KAS returns an error.
+5. **Payload Decryption:** The client SDK decrypts the rewrapped DEK share(s) using its private key, reconstructs the full DEK (if key splitting was used), and uses the DEK to decrypt the TDF payload, verifying payload integrity simultaneously.
+
+## Example Protocol: RSA Key Wrapping
+
+The [OpenTDF reference implementation (opentdf/platform)](https://github.com/opentdf/platform) demonstrates specific protocols. Below is a detailed example flow using **RSA** for wrapping the DEK. This assumes a scenario with a single KAS for simplicity.
+
+### TDF Creation (Encryption Flow)
+
+*Executed by the OpenTDF Client/SDK*
+
+1. **Generate DEK:** Generate a cryptographically strong symmetric Data Encryption Key (DEK) (e.g., AES-256).
+2. **Encrypt Payload:** Encrypt the original payload data using the DEK and an authenticated encryption mode (e.g., AES-256-GCM), generating an Initialization Vector (IV) and integrity tags per segment. Store the IV and segment information.
+3. **Define Policy:** Construct the [Policy Object](../schema/OpenTDF/policy.md) JSON defining the required attributes (`dataAttributes`) and dissemination list (`dissem`). Base64 encode this JSON string.
+4. **Generate Policy Binding:** Calculate the policy binding hash: `HMAC(DEK, Base64(policyJSON))` using a standard algorithm like HMAC-SHA256. Base64 encode the resulting hash.
+5. **Prepare Optional Metadata:** If client-specific metadata needs to be passed securely to the KAS during decryption, prepare this data.
+6. **Encrypt Optional Metadata:** Encrypt the prepared metadata using the DEK (e.g., AES-GCM). Base64 encode the ciphertext. The encypted metadata is always passed to the KAS for processing, but from the perspective of a developer using the SDK, it is optional.
+7. **Fetch KAS Public Key:** Obtain the target KAS's RSA public key (identified by the KAS URL and potentially a `kid`). This might involve a separate discovery step or be pre-configured.
+8. **Wrap DEK:** Encrypt the plaintext DEK using the KAS's RSA public key (e.g., using RSAES-OAEP). Base64 encode the resulting ciphertext.
+9. **Construct Key Access Object:** Create the [Key Access Object](../schema/OpenTDF/key_access_object.md) including:
+ * `type`: "wrapped"
+ * `url`: KAS URL
+ * `protocol`: "kas" (or a more specific identifier if needed)
+ * `kid`: Identifier of the KAS key used.
+ * `wrappedKey`: Base64 encoded wrapped DEK from step 8.
+ * `policyBinding`: Object containing `alg` (e.g., "HS256") and the Base64 encoded `hash` from step 4.
+ * `encryptedMetadata`: (Optional) Base64 encoded encrypted metadata from step 6.
+10. **Construct Manifest:** Assemble the full `manifest.json` including the `payload`, `encryptionInformation` (containing the `keyAccess` object(s), `method`, `integrityInformation`, and `policy` string), and any `assertions`.
+11. **Package TDF:** Create the Zip archive containing `manifest.json` and the encrypted payload file.
+12. **Securely Discard DEK:** Erase the plaintext DEK from memory immediately after it has been wrapped and used for metadata encryption/bindings. It should *never* be stored persistently by the encrypting client.
+
+### TDF Access (Decryption Flow)
+
+*Involves interaction between Client/SDK and KAS*
+
+```mermaid
+sequenceDiagram
+ participant ClientSDK as Client SDK
+ participant KAS
+
+ %% Phase 1: Client Preparation & Request
+ activate ClientSDK
+ ClientSDK-->>ClientSDK: Parse Manifest
+ ClientSDK-->>ClientSDK: Identify KAS Target & Extract Info (WrappedKey, Policy, Binding, etc.)
+ ClientSDK-->>ClientSDK: Prepare Client Context (Authn, Client PubKey)
+ ClientSDK-->>ClientSDK: Construct Rewrap Request Body
+ ClientSDK->>KAS: POST /v1/rewrap (Request Body)
+ deactivate ClientSDK
+
+ %% Phase 2: KAS Processing & Verification
+ activate KAS
+ Note over KAS: Phase 2: KAS Processing
+ KAS-->>KAS: 7. Authenticate Client Request
+ alt Authentication Failed
+ KAS->>ClientSDK: Error Response (401/403 Authn Failure)
+ end
+ KAS-->>KAS: 8. Decrypt DEK Share (using KAS Private Key)
+ KAS-->>KAS: 9. Validate Policy Binding (recalculate HMAC, compare)
+ alt Policy Binding Invalid
+ KAS->>ClientSDK: Error Response (400/403 Binding Failure)
+ end
+ KAS-->>KAS: 10. (Optional) Decrypt Metadata
+ KAS-->>KAS: 11. Perform Authorization Check (Evaluate Policy/Attributes)
+ alt Authorization Failed
+ KAS->>ClientSDK: Error Response (403 Authz Failure)
+ end
+ Note over KAS: All Checks Passed!
+ KAS-->>KAS: 12. Rewrap DEK Share (using Client Public Key)
+ KAS->>ClientSDK: 13. Success Response (Rewrapped DEK Share)
+ deactivate KAS
+
+ %% Phase 3: Client Decryption
+ activate ClientSDK
+ Note over ClientSDK: Phase 3: Client Decryption
+ ClientSDK-->>ClientSDK: 14. Receive & Process Response
+ alt Success Response
+ ClientSDK-->>ClientSDK: 15. Decrypt DEK Share (using Client Private Key)
+ ClientSDK-->>ClientSDK: 16. Reconstruct Full DEK (if key splitting used)
+ ClientSDK-->>ClientSDK: 17. Decrypt Payload & Verify Integrity
+ ClientSDK-->>ClientSDK: 18. Securely Discard DEK
+ else Error Response
+ ClientSDK-->>ClientSDK: Handle KAS Error
+ end
+ deactivate ClientSDK
+```
+
+**Phase 1: Client Preparation & Request** *(Executed by SDK)*
+
+1. **Parse Manifest:** Read the TDF's `manifest.json`.
+2. **Identify KAS Target(s):** Select the appropriate [Key Access Object](./opentdf/key_access.md)(s) based on desired KAS or required key shares (`sid` if splitting).
+3. **Extract Information:** From the selected `keyAccess` object(s), extract the KAS `url`, `wrappedKey`, `policyBinding` object, and optionally `encryptedMetadata`. Extract the Base64 `policy` string from `encryptionInformation`.
+4. **Prepare Client Context:** Obtain the client's authentication credentials (e.g., OAuth token) and the client's public key (corresponding to the private key the client will use for decryption).
+5. **Construct Rewrap Request:** Create a request payload (typically JSON) containing:
+ * The `wrappedKey` to be rewrapped.
+ * The `policyBinding` object (`alg` and `hash`).
+ * The Base64 `policy` string.
+ * (Optional) The `encryptedMetadata`.
+ * The client's public key (for the KAS to rewrap the DEK).
+ * Client authentication/authorization information (e.g., in HTTP headers).
+6. **Send Request:** POST the request payload to the KAS endpoint (e.g., `{KAS_URL}/v1/rewrap`).
+
+**Phase 2: KAS Processing & Verification** *(Executed by KAS)*
+
+7. **Authenticate Client:** Verify the client's authentication credentials. If invalid, return an authentication error.
+8. **Decrypt DEK Share:** Use the KAS's *private* RSA key (corresponding to the public key used for wrapping, identified by `kid`) to decrypt the `wrappedKey` provided in the request, yielding the plaintext DEK share.
+9. **Validate Policy Binding:**
+ * Recalculate the HMAC: `HMAC(DEK share, policy string from request)` using the algorithm specified in the request's `policyBinding.alg`.
+ * Compare the recalculated HMAC hash with the `policyBinding.hash` provided in the request.
+ * If they do not match, return a policy binding error (indicates tampering or mismatch).
+10. **(Optional) Decrypt Metadata:** If `encryptedMetadata` was provided, decrypt it using the plaintext DEK share. This metadata might inform policy decisions or logging.
+11. **Perform Authorization Check:**
+ * Retrieve the requesting client's validated attributes/entitlements (based on their authenticated identity).
+ * Parse the `policy` string from the request to get the required `dataAttributes` and `dissem` list.
+ * Evaluate the policy rules (potentially retrieving external Attribute Definitions) against the client's attributes.
+ * Check if the client is in the `dissem` list (if applicable).
+ * If authorization fails (policy requirements not met), return an authorization error.
+12. **Rewrap DEK Share:** If all checks pass, encrypt the plaintext DEK share using the client's public key provided in the request (e.g., using RSAES-OAEP if the client key is RSA). Base64 encode the result.
+13. **Send Response:** Return a success response containing the Base64 encoded, rewrapped DEK share.
+
+**Phase 3: Client Decryption** *(Executed by SDK)*
+
+14. **Receive Response:** Get the response from the KAS. Check for errors (authentication, binding, authorization failures).
+15. **Decrypt DEK Share:** If the request was successful, use the client's *private* key to decrypt the rewrapped DEK share received from the KAS.
+16. **(If Key Splitting) Reconstruct DEK:** If multiple shares were required (`sid` was used), combine the decrypted shares (e.g., via XOR) to reconstruct the full plaintext DEK.
+17. **Decrypt Payload:** Use the plaintext DEK and the parameters from `encryptionInformation.method` (IV) to decrypt the TDF payload. During decryption (especially with AES-GCM or streaming), simultaneously verify the integrity of each segment using the `hash` from the [Segment Object](./opentdf/segment.md) and finally verify the `rootSignature` from [`integrityInformation`](./opentdf/integrity_information.md). If any integrity check fails, abort decryption and report an error.
+18. **Securely Discard DEK:** Once the payload is decrypted or decryption fails, securely erase the plaintext DEK and any intermediate shares from memory.
+
+## Error Handling
+
+KAS implementations SHOULD return standard HTTP error codes and informative error messages (without revealing sensitive internal state) for failed requests, clearly distinguishing between:
+
+* Authentication failures (401/403)
+* Policy Binding validation failures (e.g., 400 Bad Request or 403 Forbidden)
+* Authorization failures (policy denied) (403 Forbidden)
+* Invalid input or malformed requests (400 Bad Request)
+* Internal server errors (500)
+
+Clients MUST handle these errors appropriately.
\ No newline at end of file
diff --git a/schema/OpenTDF/README.md b/schema/OpenTDF/README.md
new file mode 100644
index 0000000..1b92b5e
--- /dev/null
+++ b/schema/OpenTDF/README.md
@@ -0,0 +1,50 @@
+# OpenTDF Specification Overview
+
+This section details the **OpenTDF** format, the primary specification for general-purpose Trusted Data Format (TDF) implementations. It utilizes a JSON-based manifest packaged with the encrypted payload within a standard Zip archive.
+
+## Core Concepts
+
+Before diving into specific object definitions, understand these core OpenTDF concepts:
+
+* **Security:** Learn about what makes OpenTDF secure. See [Security Concepts](../../concepts/security.md).
+* **Key Access and Wrapping:** How access control is defined using ABAC. See [Access Control](../../concepts/access_control.md).
+
+## Format Structure
+
+An OpenTDF file is a Zip archive, typically using the `.tdf` extension (e.g., `document.pdf.tdf`). It MUST contain the following components:
+
+1. **`manifest.json`:** A JSON file containing all metadata required for decryption and access control. This is the core of the TDF structure.
+2. **`payload`:** The encrypted original data. The filename within the archive is referenced by the `manifest.json` (commonly `0.payload`).
+
+
+
+## Key Components of `manifest.json`
+
+The `manifest.json` file orchestrates the TDF. Its main sections are:
+
+* **Payload Description:** Information about the encrypted payload (type, reference, protocol, encryption status). See [Payload Object](./payload.md).
+* **Encryption Information:** Details on how the payload was encrypted, how to access the key, integrity checks, and the access policy. See [Encryption Information](./encryption_information.md). This includes:
+ * [Key Access Objects](./key_access_object.md): How and where to get the decryption key.
+ * [Method](./method.md): Symmetric encryption algorithm details.
+ * [Integrity Information](./integrity_information.md): Hashes/signatures for payload integrity.
+ * [Policy](./policy.md): The access control policy (embedded as a Base64 string).
+* **Assertions:** Optional, verifiable statements about the TDF or payload. See [Assertions](./assertion.md).
+
+## Manifest Schema
+
+Use the links below to explore the detailed structure of each component:
+
+* [**Manifest Structure (`manifest.json`)**](./manifest.md)
+* [Payload Object](./payload.md)
+* [Encryption Information Object](./encryption_information.md)
+ * [Key Access Object](./key_access_object.md)
+ * [Method Object](./method.md)
+ * [Integrity Information Object](./integrity_information.md)
+ * [Segment Object](./segment.md)
+* [Assertions](./assertion.md)
+ * [Statement Object](./assertion_statement.md)
+ * [Binding Object](./assertion_binding.md)
+* [**Conceptual Guides:**](./)
+ * [Security](../../concepts/security.md)
+ * [Access Control](../../concepts/access_control.md)
+
diff --git a/schema/OpenTDF/assertion.md b/schema/OpenTDF/assertion.md
new file mode 100644
index 0000000..5deb87c
--- /dev/null
+++ b/schema/OpenTDF/assertion.md
@@ -0,0 +1,31 @@
+# Assertions Array
+
+The `assertions` array, an optional top-level property in the [manifest](./manifest.md), contains assertion objects. Assertions are verifiable statements about the TDF or its payload, often used for security labeling or handling instructions.
+
+## Example (Array containing one Assertion Object)
+
+```json
+"assertions": [
+ {
+ "id": "handling-assertion-1",
+ "type": "handling",
+ "scope": "payload",
+ "appliesToState": "encrypted",
+ "statement": { /* See Statement Object */ },
+ "binding": { /* See Binding Object */ }
+ }
+]
+```
+
+## Assertion Object Structure
+
+Each object within the assertions array represents a single assertion and has the following fields:
+
+| Parameter | Type | Description | Required? |
+| -------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
+| id | String | A unique identifier for this assertion within this TDF manifest. Used for internal referencing. | Yes |
+| type | String | Categorizes the assertion's purpose. Common values include handling (e.g., caveats, dissemination controls) or metadata (general information). | Yes |
+| scope | String | Specifies whether the assertion applies to the entire TDF object (tdo) or just the payload. | Yes |
+| appliesToState | String | Indicates if the assertion's statement applies to the data in its encrypted state or its unencrypted state (after decryption). Default is encrypted. | No |
+| statement | Object | The actual content of the assertion. See [Statement Object](./assertion_statement.md). | Yes |
+| binding | Object | A cryptographic signature ensuring the assertion's integrity and preventing it from being moved to another TDF. See [Assertion Binding](./assertion_binding.md) | |
\ No newline at end of file
diff --git a/schema/OpenTDF/assertion_binding.md b/schema/OpenTDF/assertion_binding.md
new file mode 100644
index 0000000..1526306
--- /dev/null
+++ b/schema/OpenTDF/assertion_binding.md
@@ -0,0 +1,19 @@
+# Binding Object (Assertion)
+
+The `binding` object, nested within an [Assertion Object](./assertion.md), contains a cryptographic signature binding the assertion to the TDF context, ensuring its integrity and preventing replay on other TDFs.
+
+## Example
+
+```json
+"binding": {
+ "method": "jws",
+ "signature": "eyJhbGciOiJSUzI1NiJ9..." // Base64URL encoded JWS string
+}
+```
+
+## Fields
+
+| Parameter | Type | Description | Required? |
+| --------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
+| method | String | The cryptographic method used for the signature. jws (JSON Web Signature) is commonly used, implying standard JWS processing rules apply. | Yes |
+| signature | String | The Base64URL encoded signature value (e.g., a JWS Compact Serialization string). The signature calculation MUST include the assertion content and sufficient TDF context (like policy or key info hash) to prevent replay. | Yes |
\ No newline at end of file
diff --git a/schema/OpenTDF/assertion_statement.md b/schema/OpenTDF/assertion_statement.md
new file mode 100644
index 0000000..147e5b2
--- /dev/null
+++ b/schema/OpenTDF/assertion_statement.md
@@ -0,0 +1,25 @@
+# Statement Object
+
+The `statement` object, nested within an [Assertion Object](./assertion.md), contains the core information or claim of the assertion.
+
+## Example
+
+```json
+"statement": {
+ "schema": "urn:nato:stanag:4774:confidentialitymetadatalabel:1:0",
+ "format": "json-structured",
+ "value": {
+ "Xmlns": "urn:nato:stanag:4774:confidentialitymetadatalabel:1:0",
+ "CreationTime": "2015-08-29T16:15:00Z",
+ "ConfidentialityInformation": { /* ... specific assertion info ... */ }
+ }
+}
+```
+
+## Fields
+
+| Parameter | Type | Description | Required? |
+| --------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
+| schema | String | An optional URI identifying the schema or standard that defines the structure and semantics of the value. | No |
+| format | String | Describes how the value is encoded. Common values: json-structured (value is a JSON object), base64binary (value is Base64 encoded binary), string. | Yes |
+| value | Any | The assertion content itself, formatted according to the format field. Can be a string, number, boolean, object, or array (if format is json-structured). | Yes |
\ No newline at end of file
diff --git a/schema/OpenTDF/attributes.md b/schema/OpenTDF/attributes.md
new file mode 100644
index 0000000..8ba481b
--- /dev/null
+++ b/schema/OpenTDF/attributes.md
@@ -0,0 +1,18 @@
+# Attribute Object (Structure)
+
+This document describes the JSON structure representing an Attribute Instance when embedded within a [Policy Object](./policy.md). For a conceptual overview of attributes, and their role in access control, see [Access Control Concepts](../../concepts/access_control.md).
+
+An Attribute Object represents a single required attribute instance needed to access the data.
+
+## Example
+
+```json
+{
+ "attribute": "https://example.com/attr/classification/value/topsecret"
+}
+```
+## Fields
+
+| Parameter | Type | Description | Required? |
+| --------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
+| attribute | String | The full Attribute Instance URI, composed of {Namespace}/attr/{Name}/value/{Value}. See [Access Control concepts](../../concepts/access_control.md). | |
diff --git a/schema/OpenTDF/encryption_information.md b/schema/OpenTDF/encryption_information.md
new file mode 100644
index 0000000..dfde331
--- /dev/null
+++ b/schema/OpenTDF/encryption_information.md
@@ -0,0 +1,25 @@
+# Encryption Information Object
+
+The `encryptionInformation` object, part of the [manifest](./manifest.md), aggregates all information related to the encryption of the payload, policy enforcement, and key management.
+
+## Example
+
+```json
+"encryptionInformation": {
+ "type": "split",
+ "keyAccess": [ { /* See Key Access Object */ } ],
+ "method": { /* See Method Object */ },
+ "integrityInformation": { /* See Integrity Information Object */ },
+ "policy": "eyJ1dWlkIjoiNGYw...vbSJdfX0=" // Base64 encoded Policy Object JSON
+}
+```
+
+## Fields
+
+| Parameter | Type | Description | Required? |
+| -------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
+| type | String | Specifies the key management scheme. split is the primary scheme, allowing key sharing or splitting across multiple keyAccess entries. | Yes |
+| keyAccess | Array | An array of one or more [Key Access Objects](./key_access_object.md). Each object describes how to obtain the payload decryption key (or a key split) from a specific Key Access Server (KAS). | Yes |
+| method | Object | Describes the symmetric encryption algorithm used on the payload. See [Method Object](./method.md). | Yes |
+| integrityInformation | Object | Contains information for verifying the integrity of the payload, especially for streamed TDFs. See [Integrity Information Object](./integrity_information.md). | Yes |
+| policy | String | A Base64 encoding of the JSON string representing the [Policy Object](./policy.md). Defines the access control rules for the TDF. For conceptual details, see [Access Control](../../concepts/access_control.md). | |
\ No newline at end of file
diff --git a/schema/OpenTDF/integrity_information.md b/schema/OpenTDF/integrity_information.md
new file mode 100644
index 0000000..e7cfb13
--- /dev/null
+++ b/schema/OpenTDF/integrity_information.md
@@ -0,0 +1,48 @@
+# Integrity Information Object
+
+The `integrityInformation` object, nested within [`encryptionInformation`](./encryption_information.md), provides mechanisms to verify the integrity of the encrypted payload, essential for streaming and detecting tampering.
+
+## Example
+
+```json
+"integrityInformation": {
+ "rootSignature": {
+ "alg": "HS256",
+ "sig": "M2E2MTI5YmMxMW...WNlMWVjYjlmODUzNmNiZQ==" // Base64 encoded signature
+ },
+ "segmentHashAlg": "GMAC",
+ "segments": [ { /* See Segment Object */ } ],
+ "segmentSizeDefault": 1000000,
+ "encryptedSegmentSizeDefault": 1000028
+}
+```
+
+## Fields
+
+| Parameter | Type | Description | Required? |
+| --------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
+| rootSignature | Object | Contains a cryptographic signature or HMAC over the combined integrity hashes of all segments, providing overall payload integrity. | Yes |
+| rootSignature.alg | String | Algorithm used for the rootSignature.sig. HS256 (HMAC-SHA256 using the payload key) is commonly used. | Yes |
+| rootSignature.sig | String | The Base64 encoded signature or HMAC value. Calculated over the concatenation of all segment hashes/tags in order. E.g., Base64(HMAC-SHA256(PayloadKey, Concat(SegmentHash1, SegmentHash2, ...))). | Yes |
+| segmentHashAlg | String | The algorithm used to generate the hash for each segment in the segments array. GMAC (using the AES-GCM payload key) is commonly used when method.algorithm is AES-256-GCM. | Yes |
+| segments | Array | An array of [Segment Objects](#encryptionInformation.integrityInformation.segment), one for each chunk of the payload if method.isStreamable is true. Order MUST match payload order. | Yes |
+| segmentSizeDefault | Number | The default size (in bytes) of the plaintext payload segments. Allows omitting segmentSize in individual segment objects if they match this default. | Yes |
+| encryptedSegmentSizeDefault | Number | The default size (in bytes) of the encrypted payload segments (including any authentication tag overhead, like from AES-GCM). Allows omitting encryptedSegmentSize in segments. | |
+
+## encryptionInformation.integrityInformation.segment
+
+Object containing integrity information about a segment of the payload, including its hash.
+
+```json
+{
+ "hash": "NzhlZDg5OWMwZWVhZDBjMWEzZTQyYmFlODA0NjNlMDM=",
+ "segmentSize": 14056,
+ "encryptedSegmentSize": 14084
+}
+```
+
+|Parameter|Type|Description|
+|---|---|---|
+|`hash`|String|A hash generated using the specified `segmentHashAlg`.
`Base64.encode(HMAC(segment, payloadKey))`|
+|`segmentSize`|Number|The size of the segment. This field is optional. The size of the segment is inferred from 'segmentSizeDefault' defined above, but in the event that a segment were modified and re-encrypted, the segment size would change.|
+|`encryptedSegmentSize`|Number|The size of the segment (in bytes) after the payload segment has been encrypted.|
\ No newline at end of file
diff --git a/schema/tdf/json-schema/schema.json b/schema/OpenTDF/json-schema/schema.json
similarity index 100%
rename from schema/tdf/json-schema/schema.json
rename to schema/OpenTDF/json-schema/schema.json
diff --git a/schema/OpenTDF/key_access_object.md b/schema/OpenTDF/key_access_object.md
new file mode 100644
index 0000000..1daffbe
--- /dev/null
+++ b/schema/OpenTDF/key_access_object.md
@@ -0,0 +1,44 @@
+# Key Access Object
+
+A Key Access Object, found within the `keyAccess` array in [`encryptionInformation`](./encryption_information.md), stores information about how a specific payload encryption key (or key split/share) is stored and accessed, typically via a Key Access Server (KAS).
+
+## Example
+
+```json
+{
+ "type": "wrapped",
+ "url": "https://kas.example.com:5000",
+ "kid": "6f3b6a82-2f30-4c8a-aef3-57c65b8e7387", // Optional KAS Key ID
+ "sid": "split-id-1", // Optional Split ID
+ "protocol": "kas",
+ "wrappedKey": "OqnOE...B82uw==", // Base64 encoded wrapped key
+ "policyBinding": {
+ "alg": "HS256",
+ "hash": "BzmgoIxZzMmIF42qzbdD4Rw30GtdaRSQL2Xlfms1OPs=" // Base64 encoded hash
+ },
+ "encryptedMetadata": "ZoJTNW24UMhnXIif0mSnqLVCU=" // Base64 encoded encrypted metadata
+}
+```
+
+## Fields
+
+| Parameter | Type | Description | Required? |
+| ----------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
+| type | String | Specifies how the key is stored/accessed.
**Possible Values:**
Possible Values:
Note: `encryptedMetadata` is stored as [a base64-encoded string](https://en.wikipedia.org/wiki/Base64#Base64_table). One example of the metadata, decoded and decrypted, could be, depending on specific needs:
{authHeader:"sd9f8dfkjhwkej8sdfj",connectOptions:{url:'http://localhost:4010'}}
| Yes | | No |
-
-## policyBinding
-| Parameter | Type | Description | Required? |
-|-----------|--------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|
-| `alg` | String | The algorithm used to generate the policy binding hash. | Yes |
-| `hash` | String | A Base64 encoding of HMAC(POLICY,KEY), where: