--- robots: noindex, nofollow --- # GSTP Extensions for the `envelope` Command Line Tool Wolf McNally, Lead Researcher Blockchain Commons October 30, 2024 These are proposed extensions to the `envelope` command line tool to support GSTP. ## Overview of Required Functionality (Sender) ### Expression Composition - Specify function identifiers as envelope subject. - Specify parameter identifiers as assertion predicates. ### Generating the Request - Wrap an expression in a request with a specific or freshly generated ARID. - Add the 'senderPublicKey' assertion. ### Composing Sender Continuation - Specify the envelope to be encrypted back to the sender. - Specify whether the continuation should include the request ARID. - Specify whether the continuation should include an expiration date. - Add the 'senderContinuation' assertion to the request. ### Adding a Recipient Continuation - Add the 'recipientContinuation' assertion to the request. ### Sign and Encrypt the Request - Sign the request with the sender's private key. - Encrypt the request with the recipient's public key. ## Overview of Required Functionality (Recipient) ### Decrypting the Request - Decrypt the request with the recipient's private key. ### Process the Message Signature - Validate the signature of the request against the 'senderPublicKey' assertion. - Extract the signed request. - Extract the sender's public key. ### Process the Recipient Continuation - Decrypt the recipient continuation. - Validate the expiration date. - Validate the request ARID by comparing it to the response ARID. - Extract the continuation envelope. ### Process the Sender Continuation - Extract the sender continuation. ### Extracting the Request ID and Body Expression - Extract the request ARID. - Extract the body expression. - Extract the function identifier. - Extract the parameters. ## Enhancements to Existing Commands Enhancements to the existing `envelope` command line tool will be made to support function and parameter identifiers directly. ```sh # Creates an envelope with a function identifier as its subject. # Function identifiers can be a number or a string. $ envelope subject type function <FUNCTION> ur:envelope ``` ```sh # Extracts the subject of an envelope as a function identifier. $ envelope extract function [ENVELOPE] <FUNCTION> ``` ```sh # Creates an envelope with a parameter identifier as its subject. # Parameter identifiers can be a number or a string. $ envelope subject type parameter <PARAMETER> ur:envelope ``` ```sh # Extracts the subject of an envelope as a parameter identifier. $ envelope extract parameter [ENVELOPE] <PARAMETER> ``` ```sh # Parameter identifiers can be used as assertion predicates. $ envelope assertion add pred-obj parameter <PARAMETER> <OBJ_TYPE> <OBJ_VALUE> [ENVELOPE] ur:envelope ``` ### New `expression` Subcommand This new subcommand affords the composition and parsing of expression envelopes. ```sh # Creates an envelope with a function identifier as its subject. $ envelope expression function <FUNCTION> ur:envelope ``` ```sh # Add a parameter to an expression envelope. $ envelope expression parameter <PARAMETER> <VALUE_TYPE> <VALUE> [ENVELOPE] ur:envelope ``` ```sh # Returns the function identifier of an expression envelope, followed by the parameters. # Validates the envelope as an expression. # Ignores non-parameter assertions. # Optionally returns error if non-parameter assertions are present. $ envelope expression parse [ENVELOPE] <function> ur:envelope ur:envelope ... ``` ### New `gstp` Subcommand This new subcommand affords the composition and parsing of GSTP messages. ```sh # Creates a complete, ready to send GSTP message. # # If only a sender public key is provided, then the envelope will not be signed, # and the continuation, if present, will not be encrypted. This is primarily for # debugging, testing, and educational purposes. $ envelope gstp compose \ --request | --success | --failure \ # The type of message to send. --id ur:arid \ # Optional for request, if not specified generates a new ARID. --sender ur:crypto-prvkeys | ur:crypto-pubkeys \ # Envelope not signed if only a public key is specified. --sender-continuation ur:envelope \ \ # Optional, no continuation if not specified. --sender-continuation-expiry <DATE> \ # Optional, no expiry if not specified. --sender-continuation-id \ # Optional, no continuation ARID if not specified. --recipient ur:public-key-base # Optional, envelope is not encrypted if not specified. --recipient-continuation <SEALED_ENVELOPE> \ # Optional, no continuation if not specified. [EXPRESSION_ENVELOPE] | [RESULT] | [ERROR] # The body of the request, or the result or error of the response. <GSTP_ENVELOPE> ``` ```sh # Validates, extracts, and returns the components of a received GSTP message, formatted to STDOUT on separate lines. $ envelope gstp parse \ --recipient <PRIVATE_KEY_BASE> \ [<GSTP_ENVELOPE>] "request" | "success" | "failure" \ # The type of message received. <ARID> \ # The message ARID. <PUBLIC_KEY_BASE> \ # The sender's public key. <EXPRESSION_ENVELOPE> | <RESULT> | <ERROR> \ # The body of the request, or the result or error of the response. <ENVELOPE> \ # The recipient's decrypted continuation, if present. <EXPECTED_ARID> \ # The ARID from the recipient continuation, if present. <EXPIRED_AFTER> \ # The continuation expiry from the recipient continuation, if present. <ENCRYPTED_ENVELOPE> \ # The sender's continuation, if present. ```