bc-community
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Help
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # Gordian Envelope Introduction Video by Wolf McNally, Blockchain Commons July 23, 2024 DRAFT *This is the narration of a forthcoming video. Each short paragraph is approximately one slide or visual that the video will contain, so be sure to use your visual imagination as you read it.* ## Links - [https://www.blockchaincommons.com/introduction/Envelope-Intro/](An Introduction to Gordian Envelope) - [https://www.blockchaincommons.com](Blockchain Commons) - [https://www.blockchaincommons.com/home/sponsors.html](Sustaining Sponsors) - [https://github.com/sponsors/BlockchainCommons](GitHub Sponsorship) - [https://btcpay.blockchaincommons.com/](Donate via BTCPay) ## Introduction --- I’m Wolf McNally, Lead Researcher for Blockchain Commons. If you are a developer, system architect, or CIO, then this video is for you. I’m going to give you a high-level, visual introduction to the Gordian Envelope format. --- Gordian Envelope is a “smart document” architecture, designed to fulfill a number of current and emerging requirements for storing and transporting data in ways that are secure, verifiable, and privacy-respecting. --- In this video, we'll start with a conceptual overview, to ground you in the concepts upon which Envelope is built, Then we'll touch on the high-level architecture of Envelope, And finally we'll review a number of the exciting features that Envelope supports. By then end of this video, you should have a good idea of the many ways Envelope can be applied to various applications. Blockchain Commons has a wealth of additional documentaion, and examples of practical use cases for Envelope. Links are in the video description, or you can scan the QR codes that appear throughout this video, like this one. --- Blockchain Commons is proudly a “not-for-profit” social benefit corporation, domiciled in Wyoming but operating world-wide. We have a strong commitment to open source and a defensive patent strategy: anyone can use or improve our tools, and no one can take them away. --- We work with developer communities to develop and publish specifications, reference implementations, and tooling that support secure and compassionate decentralized architectures and tools for digital assets and digital identity. --- Please help support Blockchain Commons by becoming a becoming a sustaining sponsor, GitHub sponsor, or making a BTCPay donation. --- ## The Envelope Metaphor So first, I want to explain why we chose the "envelope" as the central metaphor for next-generation digital smart documents. --- An envelope is a pretty simple thing we’re all familiar with. So why did we choose the *envelope* as a metaphor for the next generation of smart documents? --- An envelope is a pretty simple thing we’re all familiar with. But envelopes have a lot of capabilities we might easily overlook! --- We think of envelopes as simple document containers, and that's definitely a primary purpose. --- Of course, we can write _on_ them. In this sense, envelopes don’t just *contain* documents, they are _themselves_ documents. --- In fact, the exterior can be as complex as needed, including routing information. --- The exterior hides the contents, but can also verify the credentials of the sender. --- Or it can give you a just a peek at just some of the information it contains. --- We often think of envelopes as holding only small amounts of information. --- But the capacity of digital envelopes is unlimited. --- And that information can be eassily be encrypted to specific receivers… --- Or can be readable by anyone, except for parts that are specifically redacted. --- But even when redacted, you can still verify a document’s credentials and signatures. --- Envelopes can hold goods of monetary value… --- And highly sensitive personal information. --- Obviously, you want to use envelopes that can keep important things secure. --- And envelopes can even contain other envelopes from different senders, with different credentials and contents. --- Depending on your application, you might need special-purpose envelopes that can combine any of these capabilities exactly the way you need. --- Wouldn’t it be nice to have a digital envelope that lets you easily do _any_ of these things? --- It exists right now! Welcome to **Gordian Envelope**. --- ## Key Concepts In this section we're going to cover a few key concepts you should understand before we get into the details of Gordian Envelope itself. They are: Hash Algorithms, Elision and redaction, Determinism, and dCBOR. --- ### Hash Algorithms A key concept for understanding Gordian Envelope is cryptographic hash functions. --- One of the most common and secure hash algorithms is SHA-256. Such functions take an input of any size called the *image*... and produce a fixed-size string of numbers called a *digest*, or *hash*. Here we're showing the hex representation of hashing the text string. With SHA-256 a digest is always 256 bits (or 32 bytes) long. But throughout this video, we'll often represent hashes not as long strings of numbers, but as unique icons like this, called a LifeHash. LifeHash is another Blockchain Commons open source tool, and you can learn more about it by visiting LifeHash.info. --- Cryptographic hash functions have a number of useful properties. First of all, they are *deterministic*. If you put the same image in, you always get exactly the same digest out. We'll have more to say about determinism later in the video. --- But even the tiniest change in the image, like capitalizing a letter... --- ...drastically changes the entire digest. In this case all but two of the original digits of the digest are different, and the LifeHash also looks completely different. Big changes in output from small changes in input like this are known as the *avalanche effect*. --- In addition, it’s impossible to reverse the process and use the digest to find the original image. This is called *pre-image resistance*. --- And a good hash algorithm also has the property that if you know an image and the digest it produces, it's essentially impossible to find a *different* image that yields the *same* output. This property is known as *Second pre-image resistance* --- Finally, it’s astronomically unlikely for two different inputs to produce the same output. This is called *collision resistance*. --- This combination of features makes it possible to use document digests as unique “fingerprints.” Digests are essential for verifying that a document has remained unaltered through transmission, encryption, digital signing, compression, and elision. --- ### Elision and Redaction But what is “elision”? --- You’ve certainly seen documents with black bars over parts of the text. This is *redaction*: the deliberate removal or obscuring of information to prevent the disclosure of sensitive or confidential content. In documents, redaction is primarily used for security, privacy, or legal reasons. --- *Elision* is a more general term. To "elide" something is an intentional omission of information, without giving a specific reason. --- For example, information might be elided that is considered redundant of irrelevant for the purpose at hand. --- Or a long document might be elided to shorten or simplify it, either to save storage space or target it at a particular audience— hopefully without altering the overall meaning too much. So they’re basically the same operation: removing information. --- But while redaction is about confidentiality and security, elision can be for any number of reasons including redaction. This is why Gordian Envelope adopts the general term "elision", and you can use elision for any purpose you choose --- The use of elision will frequently be redaction. For example, the set of informaion on a typical printed document might be a lot more than is needed for a particular purpose. --- And digital documents may contain much more sensitive personal information and details than a printed document can hold. Because it's digital, once it is copied it's very easy to lose control of it. --- But Gordian Envelope is a smart digital document that makes it easy for the holder to *elide* any part of it, whether brevity or privacy. --- Elision upholds the principle of *minimal disclosure*, which is the practice of revealing only the necessary information required for a specific purpose while keeping all other details hidden, thereby reducing the risk of unauthorized access or misuse of the remaining data. The cool thing about elision with Gordian Envelope is that the holder can elide parts of the document that have been digitally signed *without* invalidating signatures. How does this work? --- Every part of a Gordian Envelope is node in a tree, --- and every node in that tree has a unique digest, --- including the root of the tree, which is the digest representing the envelope as a whole. --- It is this digest that is signed. --- Now when parts of an envelope are elided, the information itself is removed, but the digests of the elided data are left behind. So the receiver can verify that the signature is valid without knowing everything that was signed. --- At a later date, a document holder can choose to reveal more of the document covered by the signature, --- proving additional claims about the signed content. --- One important thing to note is that since hash algorithms are deterministic, a simple piece of data like a field name or a person's first name will always have a unique digest. This means an assertion like this will also have a unique digest. If the space of possibilities is small enough, then an attacker might be able to guess what has been elided by just knowing the digest. This property is called *correlation*. There are times when correlation is desirable. But sometimes like in this case, not so much. In a few minutes, we'll discuss a mechanism Envelope provides for removing the possibility of this sort of "educated guessing" at what has been elided. --- ### Determinism One concept you’ll hear discussed around Gordian Envelope is *determinism*. This concept is crucial for systems where consistent, reproducible results are necessary, such as in cryptographic applications, distributed systems, and secure document exchange. A deterministic algorithm, when executed with a given input, will always follow the same sequence of operations and produce the same output. --- Hash functions like SHA-256 are deterministic: given a specific binary input, the *digest* will always be the same. --- Complex data structures like documents can also be designed to maintain deterministic behavior. --- The basic idea is that two agents, separated in time or space, when given the same information, --- and even when the information is presented in a different order, will arrive at exactly the same encoding, and hence produce the same digest. --- One example of a deterministic structure would be the Merkle Tree. Merkle Trees are used in blockchain and other cryptographic systems, In a Merkle Tree a set of documents like transactions are hashed, And then those first level digests are themselves hashed together, And this continues until there is only a single digest: the root. Since this process is deterministic, another agent with the same set of transactions would always come up with the same Merkle tree. --- And if another agent only has the root hash and a transaction but not the full list of transactions, --- It could ask another agent that has all the transaction to proove that the transaction is definitely in the tree, just by sending the minimal digests required to show that the transaction must exist in the block. This is called a Merkle Proof. --- Popular formats for encoding structured data like JSON present a number of obstacles when trying to implement determinism. If you want to encode a JSON document such that it produces a deterministic digest, --- even a tiny change in the placement of whitespace or how a number is written— changes that have no impact on the document’s semantics— completely change the digest. To use JSON in a deterministic way, a separate process called *canonicalization* must be applied, which transforms the document into a specific form. Things like normalizing how numeric values are expressed... --- How Unicode strings are written... --- The order that dictionary keys are listed... --- And of course, removing all the whitespace... --- To finally arrive at a canonical version of the document that can be hashed deterministically. --- Unfortunately, there isn’t a single agreed-upon standard for canonicalizing JSON. Various specifications and libraries exist, but they differ in details regarding how they handle numeric precision, special floating-point values, the normalization of strings, and many other edge cases. --- Goridian Envelope is designed to support determinism at every level. It's designed around a tree structure similar to a Merkle Tree, in that every node has an associated digest. But in an Envelope, the leaves of the tree can be any data type, while the internal nodes of the tree provide structure, like grouping a predicate and object of an assertion, or grouping the envelope's subject with its assertions. And everything that *can* have an order, such as the order of assertions, and how numeric values and strings are normalized, is well-defined and handled automatically. --- Every node in an envelope has a digest, but the only time a digest is actually serialized as part of an envelope are in cases like elision, where the transformation of the document preserves the digest tree. This is how Envelope allows elision, encryption, or compression of parts of the document while preserving digital signatures. With Gordian Envelope, no separate canonicalization step is ever necessary: when you encode the same semantics, you reliably get the same digest tree. Many applications don’t require determinism, and Gordian Envelope is designed such that if your application doesn’t need it, it doesn’t cost you anything. In fact, this is an important aspect of Envelope’s design philosophy: you only pay for what you use. --- ### CBOR and dCBOR Gordian Envelope is built on CBOR: the Concise Binary Object Representation. --- CBOR is a standard data format similar to JSON but designed for binary encoding, making it more compact and efficient to process. CBOR also offers a richer type system, including a wealth of community-defined tagged data types. --- CBOR tags are a namespace of numbers that identify data types. IANA, the Internet Assigned Numbers Authority, keeps the registry of CBOR tags. Gordian Envelope and dCBOR have been issued tag 200 and 201, both of which are used in Envelope's formal specification. --- Since CBOR is a binary format, you can't just open it in a text editor and make sense of it, like JSON. --- But tools and libraries exist for every operating system and programming language for decoding and encoding CBOR. --- And CBOR defines a JSON-like "diagnostic notation" which *is* human readable. --- CBOR also supports binary data directly, eliminating the need for workarounds like Base64 encoding used with JSON. --- However, like JSON, standard CBOR doesn't directly support deterministic encoding. Determinism isn’t an easy goal to achieve, so Gordian Envelope is designed to support determinism at every level, starting with dCBOR. dCBOR is a set of opinionated restrictions on CBOR that support deterministic encoding. All dCBOR is valid CBOR that can be read by any CBOR decoder, and written by any CBOR encoder as long as the additional restrictions of dCBOR’s profile are followed. --- dCBOR specifies rules for how certain kinds of commonly used data like numbers and strings must be encoded to help ensure that the same semantic content always produces the same binary output. Importantly, it also requires that the rules are enforced on encoding *and* decoding, to ensure that only properly encoded dCBOR is processed. Naturally, Envelope and documents created with Envelope further restrict the type of data that is allowed in any particular field, but dCBOR helps reduce the cognitive burden on document designers, therefore reducing the likelihood of costly interoperability errors. --- ### Knowledge Representation Now that we've laid the conceptual foundation for Envelope, let's explore more specifics of Envelope's architecture. --- At its core, Gordian Envelope represents knowledge using a simple yet powerful structure: a *subject* with a set of *assertions* about it. --- Since Envelope is a binary format, its tools provide a human-readable *Envelope Notation*. In this notation, the subject is always first, followed by an optional list of one or more assertions in square brackets. --- An assertion is a statement about the subject, consisting of a *predicate* (a property or relationship) and an *object* (the value or related entity). In Envelope Notation, the predicate and object of each assertion are separated by a colon. --- This structure is similar to "subject-predicate-object" triples used in semantic web technologies like RDF, making Envelope familiar to those working with linked data. --- Here's what a similar structure would look like in Envelope Notation. --- Think of an envelope as a whole: a subject with an optional list of assertions. Now here's the cool part: each part of an envelope: it’s subject, it’s assertions, and the specific predicates and objects of its assertions, are also *themselves* envelopes that are can be as simple as strings, but that can also be as complex as necessary, providing for rich metadata and as much complexity as you need for your application. --- What do we mean by rich metadata? Here's an example of an envelope containing information about a written work. Notice that there is more than one `hasName` assertion, and each of the names of the book contains its own assertion declaring the language of the title string itself. --- This is the same envelope viewed as a tree. As you can see, Envelope is a recursive structure, where envelopes contain other envelopes, creating a hierarchical representation of arbitrarily complex information. Each node of the tree, and the envelope as a whole, are characterized by a unique digest. This is similar to a Merkle tree, but the leaves of an envelope can be any dCBOR data, and the internal nodes provide its structure. But Gordian Envelope’s design doesn’t limit it to trees: Envelope can be used to represent everything from simple lists of key-value pairs— to collections of related documents containing signed claims, attestations, and selective redactions— to complex, interconnected knowledge graphs. --- ## The Structure of Gordian Envelope Let’s look a bit at the elegant but powerful architecture of the Envelope data type itself. --- At its core, Gordian Envelope is implemented as an enumerated type with just five cases: Leaf, Node, Assertion, Elided, and Wrapped. Every one of these cases can stand alone as a complete envelope, or participate in the structure of a more complex envelope. In addition, documented extensions to the Envelope base specification add three additional cases: Encrypted, Known Value, and Compressed, for a total of eight. --- Notice that three of these cases are drawn with a fuzzier border. These are the "obscured" cases; called that because the original data has been transformed in such a way as to not be directly accessible. These three cases are the only ones that actually declare the digest of the original data. In the Elided case, the original data is entirely absent from the envelope. In the Encrypted case, the data is present, but has been encrypted using a symmetric key and the digest of the original data is declared as "authenticated data", which means it can be read but can't be altered without being detectable. And in the Compressed case, the data has been compressed and the declared digest can be checked by decompressing the data and recomputing the digest. These three transformations preserve the digest tree and make it impossible to tamper with their contents without invalidating signatures. They are also completely reversible: by replacing the original data in the Elided case, decrypting it in the Encrypted case, and uncompressing it in the Compressed case. --- In the discussion that follows, text of this kind indicates that *any* of these eight cases may appear where you see it. --- So now let's look at the cases in the base specification. We'll come back to the other three cases when we talk about extensions. --- First there's the *leaf* case. Leaves hold any valid dCBOR data, allowing Envelope to encapsulate a wide range of information types. --- For example, the CBOR diagnostic notation a leaf holding a string is just the CBOR string tagged 201, representing dCBOR. In Envelopes, all leaves are tagged 201, and this tag is what distinguishes leaves from the other cases. --- To make this a complete envelope, just tag the leaf 200, representing Gordian Envelope. --- That's it! A complete, simple Gordian Envelope that adds only 4 bytes to the CBOR text string it encapsulates. --- When this envelope is printed in Envelope Notation, it just displays as a string. --- In the general case, the tagged dCBOR is displayed in CBOR diagnostic notation. --- The *node* case groups a subject, which can be any envelope case called the *subject*, and one or more assertions. The Node case forms the backbone of Envelope's hierarchical knowledge representation structure. The CBOR for a Node is simply a CBOR array with the subject as its first element, and each assertion as a subsequent element. To ensure determinism, assertions are always sorted in order by their computed digest. In Envelope Notation, the subject is displayed before a pair of square brackets, with the assertions inside the brackets. In Envelope Notation, the assertions are sorted for easier reading, and not according to their digest. --- The *assertion* case groups two other envelopes: its *predicate* and *object*. Together the predicate and object make a statement of fact about the subject of the Node that contains them. The CBOR for an assertion is just a CBOR map, analogous to a JSON dictionary, with the predicate as the key and the object as the value. Like JSON dictionaries, CBOR maps can have multiple entries, but in Envelope's Assertion case, it always has exactly one. In Envelope Notation, an Assertion is printed with the predicate, then a colon, then the object. --- The *elided* case is a placeholder for information that has been removed, represented by its digest. The CBOR for the Elided case is a binary string containing the digest of the elided case. This digest is a cryptographic commitment to everything that the node and its child nodes (if any) contain. In Envelope Notation, this case is simply displayed as the word ELIDED. --- Finally, the *wrapped* case encapsulates an entire Envelope, enabling the addition of meta-statements about entire nested document structure. --- Recall that each assertion makes a statement of fact or claim about the subject of an envelope. --- So adding a new signature assertion this this envelope would only sign the subject. But in this case we don't want to sign only the subject, but the subject and all of its assertions. --- We do this by first *wrapping* this envelope in a new, outer envelope. --- --- Now that the envelope is wrapped, the subject is literally the entire envelope, which currently has no assertions of its own. --- So when we add a new assertion with our signature, the entire original envelope, including its assertions, are signed. --- And now nothing in the wrapped envelope can be altered without invalidating the signature. --- Recall that an envelope case when tagged 200 becomes a complete Envelope. --- The CBOR for the Wrapped case is composed by simply wrapping that in *another* 200 tag. And in Envelope Notation, the Wrapped case is printed by enclosing the indented text of the wrapped case in curly braces. --- That's it! Now you know the essentials of how Gordian Envelopes are structured. --- ## Specifications The specifications for dCBOR and Gordian Envelope are in the early stages of standardization, and are currently published as IETF Internet Drafts (I-Ds), with the aim of publishing them later as RFCs. While we expect these specifications will undergo further refinements on this path, we consider them both to be stable and ready for use. ## Reference Implementations Blockchain Commons currently has open source reference implementations of Envelope in Rust and Swift that implement the full base specification as well as the extensions described later. Parts of our stack have already been ported to other languages by the open source community, and we rely on our community and our donors to make our ongoing research and development efforts possible. ## Tooling The `envelope` command line tool is written in Rust and can be used to construct, investigate the contents of, and extract information from envelopes, either by typing commands directly or in complex shell scripts. ## Envelope Extensions Numerous extensions to the base Envelope specification are documented in the Blockchain Commons `Research` repo on GitHub, and we’ll briefly show you some of them here. ### Digital Signatures Envelopes may be signed by one or more private keys, and verified by the corresponding public keys. To sign a whole envelope including its assertions, first wrap the envelope, then sign it. Now even though parts of the wrapped envelope can still be *elided* by the holder, no part of the wrapped envelope can actually be *modified* without invalidating the signatures on the envelope. ### Symmetric Encryption Envelopes can be encrypted using a symmetric key. Encrypting an envelope leaves its digest declared in a tamper-proof way, which means that like elision, signatures on envelopes can remain valid even when a branch of the tree has been encrypted. ### Public Key Encryption By using the public keys of one or more recipients, assertions may be added to an encrypted envelope that allow only those recipients, using their private keys, to retrieve the symmetric key used to encrypt the envelope. ### Compression Envelopes may be easily compressed using the DEFLATE algorithm, which is the core compressor of the open source Zip format. For branches of large envelopes where you prefer space savings over immediate access, you can simply compress those branches. And like elision and symmetric encryption, a compressed envelope declares the digest of the decompressed content. Thus, elision, encryption, and compression are all ways to transform parts of an envelope without invalidating signatures, or other references to an envelope that depend on its overall digest tree. ### Decorrelation But sometimes you *want* to encrypt or elide something, and ensure that the digest left behind does not inadvertently match known data. This potential matching of data to digest is called *correlation* and is often, but not always desirable. For instance, a short “first name” field like “John” will have an easily guessable digest. Of course, the larger the branch of the Envelope tree you’re considering the more variance there is likely to be in the data, hence making the elided branch harder to guess from its digest alone. But when you want to avoid correlation entirely, envelope provides a simple extension for *decorrelation* by adding assertions called *salts* that contain random data. Because the data is random, it ensures that the branch of the Envelope tree containing the salt, all the way back to the root, is universally unique. As long as the salt itself is part of what is elided or encrypted, nobody can correlate the remaining digest to its content. ### Known Values Envelope is based on a semantic subject-predicate-object format. In formats used for knowledge representation like RDF, ontological concepts like relationships, classes, and properties are often represented using URIs, but these can be verbose and potentially manipulated or stated in semantically equivalent ways that break determinism. Known Values offer a compact, deterministic alternative by assigning values from a space of 64-bit integers to represent various concepts. Using Known Values in Envelopes reduces the size of encoded data and enhances security by eliminating the surface for URI manipulation attacks, as well as making it simpler to implement determinism. The Gordian Envelope Known Values extension provides for efficient representation of common predicates and concepts. For example, the concept of "type" (analogous to RDF's "rdf:type") can be represented by the Known Value '1' or 'isA'. Declaring a type is so common it only takes a single byte to encode. Known Values assignments are managed through a centralized registry, ensuring consistency across different systems and applications. Over time we plan to expand the registry to include values from various major ontologies like RDF and OWL as well as allow third parties to register Known Values for domain-specific ontologies. Known Values can be used in any part of an Envelope: as subjects, predicates, or objects, providing flexibility in knowledge representation. ### Attachments Gordian Envelope's attachment extension allows for the addition of vendor-specific information to an Envelope without altering its core structure or content. Designers of envelope-based schemas may declare that they support attachments. Attachments serve as a method to extend the functionality of Envelopes in domain-specific ways while maintaining interoperability with systems that may not understand these extensions. The attachment mechanism uses a standardized format within the Envelope structure. It includes a payload, which can be any valid Envelope content, along with metadata identifying the vendor and optionally specifying the format of the attachment. Multiple attachments from different vendors can coexist within a single Envelope, allowing for complex, multi-party interactions like attestations and supply chain tracking, while maintaining the integrity of the core data. Importantly, attachments inherit Gordian Envelope's privacy and security features. They can be selectively shared, encrypted, or elided without invalidating the digest tree, providing fine-grained control over the disclosure of such additional information. ### Existence Proofs A top-level digest of a completely elided envelope is unique and therefore a cryptographic commitment to everything inside it. After having sent such an elided envelope, the sender may use this extension to construct an *existence proof*, which is analogous to a Merkle proof. The existence proof reveals only the minimal digests in the tree leading to the data which is to be proved. When the proof is applied to the original commitment, it shows that the information *must* be present at the described position in the original unelided envelope. ### Envelope Diffing Given two envelopes A and B, the *diff* A → B is an incremental set of transformations that transform A into B. The Diffing extension provides a way to compare two envelopes and produce a diff (which is also an envelope) and then apply a received diff to the source envelope to transform it into the target. ### SSKR: Sharded Secret Key Reconstruction SSKR can be used to implement social recovery of sensitive information using Shamir’s Secret Sharing. Any envelope can be *sharded* to a set of *shares*, each of which contains the encrypted envelope and a single share of the key used to encrypt it. These shares are then sent to trustees in the event of loss of the original information. No single share can be used to recover the original data. Rather, a quorum of shares (for example, 3 of 5) must be recovered in order to recover the key and hence the entire original envelope. ### GSTP: Gordian Sealed Transaction Protocol Gordian Sealed Transaction Protocol (GSTP), is a secure message-passing architecture that combines numerous features of Gordian Envelope to enable secure, scalable and efficient communication between peers, or clients and servers. The system utilizes encrypted and signed requests and responses, encrypted state continuations (ESC), and idempotent actions to provide a robust and scalable communication model. It also includes mechanisms to prevent the misuse, malicious manipulation, or replay of responses. GSTP is channel agnostic, and can be used in secure communication protocols that switch channels between Internet, NFC, Bluetooth, and even QR codes. ## Use Cases The functionality of Gordian Envelope can be used to support numerous data-management use cases. We've worked the most closely so far on use cases for health care, journalism, credentials, and software releases. Health care deals with incredibly sensitive and personal data. Gordian Envelope allows for the encryption of health data when it's sent to providers and the redaction of personally identifiable information when data is submitted to clinical studies or for other public health purposes. Yet, all of this data remains provable, allowing providers or clinical studies to ensure the validity of the content. Journalism can often be dangerous for sources and journalists alike. Gordian Envelope can redact personally identifying information, from a source's name to the location where a picture was taken. Again, the data remains provable for checks made by a publisher (and later for court cases, if needed). Digital credentials are growing increasingly important, but they often contain an excess of personally identifiable information. Gordian Envelope allows a holder of a credential to redact information to allow data minimization, releasing only the data actually needed from the credential. Gordian Envelopes also allow for the creation of herd privacy, where a credential is released as part of a large set and only acknowledged and used by a the credential's subject if they so desire. Software releases create issues of trust, where a release administrator might want to hide their personally identifiable information, but later acknowledge it, or where one release administrator might want to empower another. Gordian Envelope enables the first through its provable redaction and the second through its signatures of keys. Overall, any use case where some data is sensitive or where it is personal, where data minimization is desired, or where trust is important might be improved by Gordian Envelope. These are just the tip of the iceberg. ## Summary **Forthcoming**

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully