Introduction

Quorum Vaulting System (QVS) is an open source system of playbooks and tooling which facilitates the creation and maintenance of highly resilient quorum-based key management systems based on a strict threat model which can be used for a variety of different cryptographic algorithms. The system was designed and developed by Distrust, with the generous support of sponsors.

The basic premise of QVS is that primary cryptographic material akin to a root certificate, called Root Entropy (RE), is generated during a secure key derivation ceremony, and then used to derive chosen cryptographic material via different algorithms such as PGP keys, digital asset wallets, web certificates and more.

Currently there is a set of an opinionated set of playbooks for working with OpenPGP and blockchains is in development, and will be extended to digital certificates, FIDO secrets and more in the future.

The RE is sharded using Shamir's Secret Sharing (SSS) to a Quorum in order to protect it from single points of failure, requiring cooperation of multiple individuals - a quorum, and use of cryptographic material stored in separate physical locations with significant access controls in order to reconstruct the secret material, namely the RE.

Use Cases

QVS can be used for a wide range of use-cases which span but are not limited to:

  • Deriving a PGP key pair whose public key can be used as a "one-way deposit box" - for example a company can back up keys for their digital asset wallets by encrypting them to the public key and storing the encrypted ciphertext blobs on multiple cloud storage platforms, or on offline hard drives for redundancy.

  • Deriving PGP keys for multiple individual users in a deterministic manner.

  • Deriving wallets for digital assets using BIP-0032 style derivation as part of a cold signing setup.

  • Decrypting data in a secure, quorum protected, air-gapped environment.

  • Generating digital certificates

Playbooks

QVS can be set up by using a set of highly opinionated playbooks which outline the process. The base documentation should be read in its entirety by all participants of the ceremony in order to ensure that the system is well understood by all to ensure that the integrity of the process is preserved and enforced.

Directives

The documentation uses directives in order to specify the importance of adhering to parts of the specification according to RFC2119 and RFC8174.

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

Method

The reader is encouraged to read through the entire body of documents which should take approximately 30 minutes. If any parts are unclear, they may contact Distrust for clarification, which is welcomed as it will aid in improving the documentation.

Threat Model

QVS is designed according to a high-assurance threat model which ers on the side of making exaggerated, rather than conservative assumptions in order to build a resilient system.

The assumption is made that attackers who target QVS are extremely sophisticated, well funded and patient attackers, and as such, the full arsenal of attacks is on the table. This means that the attacker can purchase and weaponize multiple 0day vulnerabilities, execute physical attacks or deploy moles, target different supply chains of software, firmware and hardware used, and generally attack the system using an array of known and unknown attacks.

One of the guiding principles in the design is the elimination of Single Points of Failure (SPOFs), and relies on a number of different control mechanisms which help reduce risk of any one individual being able to compromise the system, whether it's maintainers of software used in the system, the firmware that's used, or the individuals or locations that hold secret material which is the backbone of the system.

To achieve this, the QVS focuses on reducing the risk by:

  • Only using fully open source software and firmware to allow full verification of their security properties

  • Creating custom purpose specific tooling which eliminates dependencies in order to reduce supply chain attacks, and adds desirable security properties

  • Building as much of the software and firmware deterministically as possible - aiming for 100%

    • The StageX project is the effort towards this end
  • Using computers which either have a hard switch for disabling networking or which had radio networking cards (bluetooth, wifi etc.) removed

  • Leveraging smart cards (personal HSMs) to protect cryptographic material

  • Leveraging cryptographic sharding in order to decentralize risk and physically separate cryptographic material

  • Leveraging tamper evident controls for equipment

  • Leveraging frequency blocking methods such as TEMPEST (Telecommunications Electronics Materials Protected from Emanating Spurious Transmissions) and soundproofing

General Threat Model Assumptions

Some additional assumptions are made to help contextualize the threat model:

  • All screens are visible to an adversary

  • All keyboards are logging to an adversary

  • Any firmware/boot-loaders not verified on every boot are compromised

  • Any host OS with network access is compromised

  • Any guest OS used for any purpose other than prod access is compromised

  • At least one member of the Production Team is always compromised

  • At least one maintainer of third party used in the system is compromised

  • Physical attacks are viable and likely

  • Side-channel attacks are viable and likely

Threat Model Levels

Different threat model levels allow an organization to start benefiting from the security properties of the QVS system immediately, with a clear path to upgrading over time as resources and time become available.

Each subsequent level assumes all threats and mitigations from the previous level, and introduces more sophisticated attacks and mitigations. As such, the levels should for the most part be adhered to one at a time, to ensure comprehensive defenses for all viable threats enumerated herein.

Level 1

Threat Model

Adversary

Low skilled individual targeting many organizations. This implies the adversary is not highly focused on compromising a specific organization, and relies on less sophisticated strategies.

This level focuses on defending against remote adversaries.

Attacks

  • Using phishing to steal data from a random set of custodian end users

  • Injecting malware into the system of a random set of custodian end users

Requirements

  • MUST require hardware anchored login for large withdrawals

  • MUST require hardware anchored signature for large withdrawal requests

  • MUST verify withdrawal requests according to a threshold based policy

Reference Design

  • Ensure all users withdrawing large sums over a short period of time are using FIDO2 or PGP capable smart cards for logging in and authorizing transactions:

    • Hardware based WebAuthN/Passkey/U2F

      • Android 7.0+, iOS 14+, MacOS 10.15+, Win10 1809+, ChromeOS, Yubikey 5, Nitrokey, Ledger, Trezor
    • Consider software-based WebAuthN/Passkey/U2F as backup

  • Ensure backend systems will only approve large withdrawals if signed by known smart card.

  • Ensure all transaction approval keys are stored in a tamper evident append only database.

    • To achieve this storage systems such as AmazonQLDB, git, Datomic etc. can be used
  • Ensure all key additions are authenticated with a quorum of existing keys

  • Consider allowing quorum of support engineer keys to enroll a new key to handle lost keys

  • Use hash of transaction signing request as challenge to be signed by smart-card

  • Blockchain signature only issued after verification a given request is signed by authorized user smart-card(s)

Level 2

Threat Model

Adversary

Adversary is a skilled and resourceful individual targeting one organization. This type of attacker uses a combination of widely used cyber weapons, OSINT, social engineering (spear phishing), exploiting vulnerabilities, MitM attacks.

This level focuses on defending against insider threats.

Attacks

  • Compromise one team member with privileged access

  • Inject code into any OSS library

  • Exploit any vulnerability within 24h of public knowledge

Requirements

  • All production access:

    • MUST NOT be possible by any single engineer

      • Consider a bastion that can enforce m-of-n access over ssh

      • Consider hardened deployment pipeline which requires m-of-n cryptographic signatures to perform action

    • MUST be via dedicated tamper evident workstation

      • Consider: https://github.com/hashbang/book/blob/master/content/docs/security/Production_Engineering.md
    • MUST be anchored to keys in dedicated HSMs held by each administrator

      • Consider OpenPGP or PKCS#11 smart cards that support touch-approval for ssh
  • Any code in the transaction signing trust supply chain:

    • MUST build deterministically

    • MUST have extensive and frequent review

    • MUST be signed in version control systems by well known author keys

    • MUST be signed by separate subject matter expert after security review

      • MUST hash-pin third party code at known reviewed versions
    • MUST be at version with all known related security patches

    • SHOULD be latest versions if security disclosures lag behind releases otherwise N-2

    • MUST be built and signed (and hashes compared) by multiple parties with no management overlay

      • Example: One build by IT, another by Infrastructure team managed CI/CD
    • MUST be signed by well known keys signed by a common CA

      • Example: OpenPGP smart cards signed under OpenPGP-CA.
    • All private keys involved:

      • MUST NOT ever come in contact with network accessible memory
    • All execution environments MUST be able to attest what binary they run

      • Examples:

        • Custom Secure Boot verifies minimum signatures against CA

        • Cloud enclave that can remotely attest it uses a multi-signed image

          • TPM2, AWS Nitro Enclave, Google Shielded VMs etc.
        • App phone stores already anchor to developer held signing keys

Reference Design

  • Create offline CA key(s)

  • Consider OpenPGP key generated on airgap using keyfork, backed up, and copies transmitted to a smart cards such as a Yubikey

  • CA key smart cards are stored in dual-access tamper evident locations

User Key Management System

  • Enclave is created which is immutable with no ingress internet access

  • Enclave has random ephemeral key

  • Remotely attested on boot-up against multi-signed and known deterministically built system image

    • Possible on many PCR based measured boot solutions based on TPM2 and Heads, AWS Nitro Enclaves, or GCP Shielded VMs
  • Ephemeral enclave key is signed with offline CA key(s) on verification.

  • Enclave has ability to validate append only database of keys

  • Enclave will sign new key additions/removals with ephemeral key if:

    • User has no prior keys

    • Key was signed with an existing key

    • Key was signed with 2+ known support engineer keys

Signing Key Generation

  • M-of-N key holder quorum is selected

    • SHOULD be on different teams

    • SHOULD live in different geographical zones to mitigate natural disaster, and war related risks

    • SHOULD have their own OpenPGP smart card with pin and keys only they control

  • Shard keys

    • SHOULD be an additional OpenPGP smart card separate from holder's personal key

    • SHOULD have random PIN, encrypted to a backup shard holder

    • SHOULD be stored in a neutral location only the primary and backup shard holder can access

  • Done in person on air-gapped laptop that has been in dual witnessed custody since procurement

    • Has hardware anchor that can make all parties confident the OS image it is running is expected (Heads, etc)

    • Has two hardware sources of entropy

      • There are devices that can provide an additional source of entropy such as:

        • Computer with another architecture such as RISC-V

        • HSM which can export entropy

        • Quantis QRNG USB

        • TrueRNG

    • Runs known deterministic and immutable OS image compiled by multiple parties

  • Key is generated and stored

    • Split to m-of-n Shamir's Secret Sharing shards

      • Each shard is encrypted to dedicated shard OpenPGP smart card

      • Shard smart card PIN is generated randomly

      • Shard smart card PIN is encrypted to personal smart cards of primary and backup holders

Signing System

  • Uses an enclave which is immutable with no ingress internet access

  • Has enclave bound ephemeral key

  • Remotely attested on boot-up against multi-signed and known deterministically built system image

  • Will accept Shamir's Secret Sharing shards encrypted to enclave bound ephemeral key

  • Will restore signing key to memory when sufficient shards are submitted

  • Will only sign transactions if accompanied by signed request by authorized user according to a quorum specified by a policy

    • Is able to validate signing request via CA key authorized user key management enclave signature
  • Will only sign transactions that meet predefined size and rate limits by company policy and insurance levels

Level 3

Threat Model

Adversary

Adversary is an organized group with significant funding. These groups consist of individuals with different skill sets and often have access to significant funds, drastically expanding their attack capabilities.

This level focuses on defending against adversaries who succeeded in local compromise.

Attacks

  • Compromise one data center engineer into tampering with a target system

  • Use a sophisticated 0 day vulnerability to compromise any one internet connected system

Requirements

  • MUST sign all transactions of significant value by multiple keys in separate geographical locations

  • Consider well vetted open source multi signature, MPC or on-chain threshold signing software

  • MUST use locations separated by hours of travel

  • MUST have independent staff for separate locations

  • Signing locations MUST NOT trust other locations

    • Each location MUST do their own reproducible build validation

    • Each location MUST do their own verifications on all large transactions

Level 4

Threat Model

Adversary

Adversary is a state actor. State actors are the best funded and most sophisticated attackers. They are the highest known threat and have the ability to execute all known attacks. Their well funded operations allow them to pursue goals over long periods of time, relying on subversion, false flags, insider threats via planting moles, compromise of hardware supply and software supply chains, the use of advanced non-commercially available cyber-warfare tools, combining many 0day vulnerabilities to construct highly effective exploit chain. This level of adversary demands the highest known standards of security, which is typically upheld only by the most sophisticated companies and the military.

This level focuses on defending against adversaries who are nation states.

Attacks

  • Tamper with the supply chain of any single hardware/firmware component

  • Quickly and covertly relocate any device to a lab environment, complete attacks within a short time period, and return the device to its original location

  • Use sophisticated side channel attacks for exfiltrating data, cryptographic material being a high risk target

  • Non-deterministic encryption/signatures/data

  • Differential Fault Analysis (DFA)

  • Data remanence

Requirements

  • All signing systems:

    • MUST have dual implementations of all policy enforcement and signing logic

    • MUST use two or more unrelated hardware supply chains for generating cryptographic material

      • Example: Rust on RISC-V Linux on an FPGA vs C on PPC Gemalto enclave
    • MUST return deterministic results

      • Results are only exported for chain broadcast if identical
    • MUST be stored in near zero emissions vaults a single user can't open

      • See: NSA TEMPEST
    • MUST ensure that individuals are scanned for devices before entering the vault

    • MUST only communicate with outside world via fiber optic serial terminal

    • MUST be housed in Class III bank vault or better

    • MUST have constant environment deviation monitoring

      • Thermal, Acoustic, Air quality, Optical
    • MUST destroy key material on significant environment deviations

      • TODO: methods for doing this
    • MUST be accessible physically with cooperative physical access

      • MAY use FF-L-2740B or better locks with dual pin enforcement

      • MAY use dual biometric enforcement to get near area and disarm security

Additional Threat Model Notes

Smart Cards

The Operator Smart Card uses the default PIN because it is meant to be something a user "has", rather than "knows". On the other hand, the Location Smart Card is protected by a complex PIN, which can only be decrypted using the PGP keys stored on the Operator Smart Card. This is done in order to protect the access to the Location key by anyone except the Operator, but also to allow for adding controls which require more than one individual to access a Location Smart Card. In this way, there is an additional "quorum" which needs to be achieved to access the Location key - more on this in the Location section.

The Smart Cards are used as they are an HSM (Hardware Security Module) which provides excellent protection for the cryptographic material stored on it, and they are portable, which makes them suitable for creating systems where the cards are in separate physical locations, and need to be brought together in order to re-assemble secret material.

Selecting a Quorum

The backbone of QVS is a Quorum which is used to reconstitute or re-assemble cryptographic material, and approve actions. Quorum is a general term referring to a system which requires the collaboration of multiple individuals in order to achieve something, and it is based on a Threshold which determines how many Members of a Quorum there are in total, and the Quorum, which is how Members are required to reach consensus.

The following is a simple Quorum example. Let's assume there are 3 trusted individuals who will be part of Quorum and at least 2 of the Members of the Quorum should be required to reach consensus. In that case the chosen Quorum would be "2 of 3" - in other words, 2 of the total of 3 are required to achieve consensus. These numbers may be adjusted in order to optimize risk tolerance along two axis:

  • Tolerating loss of X members aka "Bus Factor"

  • Tolerating duress of Y members aka "Wrench Factor"

In a "2 of 3" Quorum, the Bus Factor is 1 as we can only afford to lose 1 member of the Quorum before the ability to reach consensus is lost permanently. For that same Quorum, the Wrench Factor is 2, as an adversary has to use their wrench on two different Quorum Members to force them to give them access to their shards before the system is compromised (this is an over-simplification as there are additional security controls in place such as the physical locations which hold Location Keys, and as such the Wrench Factor is hardened).

It is recommended to use a "2 of 3" Threshold at a minimum, but many organizations may choose to go with more resilient Threshold such as "3 of 5", "2 of 6", or "5 of 7", depending on considerations pertaining to:

  • Availability requirements

  • Bus Factor requirements

  • Wrench Factor requirements

System Roles

There are several roles which are required to properly operate the QVS system. While it is possible to have an individual perform multiple roles, typically they should only perform one role at a time. It is also recommended to have at least 2 individuals, or ideally the full quorum be used to make decisions pertaining to QVS. At least 2 individuals are required for level 2.

To better understand why the different roles are required, refer to the selecting a quorum and threat model sections which enumerate a number of assumptions around pertinent threats to the system as well as the use of a quorum.

General Requirements

Individuals who are selected for the roles:

  • MUST have background checks conducted

  • MUST have a clearly defined set of responsibilities

  • MUST be reinvestigated once a year to ensure they meet necessary standards to access restricted information

Procurer

Responsible for tasks such as procuring a location, tamper proofing equipment, hardware, and maintaining inventory.

Provisioner

Responsible for more technical aspects of preparing equipment for ceremonies such as creating air-gapped machines by removing radio cards, and tamper proofing them along with SD cards which are loaded with AirgapOS etc.

Proposer

This is an individual who is a business owner or stakeholder, or a financial controller. Their role is to make fiduciary decisions which protect the financial interest of the organization and its clients. Their role is specifically to propose the movement of funds, specifying the amount, origin and destination.

Approver

This is an administrative role which participates in the decision making capacity, typically as part of a quorum. Additional policies which are not for the QVS system but related decision making may be under the purview of an Approver. While there is 1 proposer per transaction, there may be an arbitrary number of Approvers, and they are required to sign proposed transactions according to a policy which should be well defined.

Operator

Trained on how the QVS system operates, with intimate knowledge of the processes which are required to maintain the integrity, confidentiality and availability (CIA triad) of the system.

Operators conduct ceremonies and ensure that the controls around QVS are in tact. They verify instructions from Approvers and perform different actions which are part of the QVS system, ranging across hardware procurement, accessing SCIFs, preparing field kits, performing ceremonies and more.

As a QVS grows, it may be prudent to create more highly specialized roles whose responsibilities are limited to a more narrow range, creating more isolation across the system, thus enforcing the principle of least privilege and separation of concerns.

Witness

QVS relies of having individuals present to witness that processes which uphold the security of the system are properly followed. Operators make ideal witnesses as their familiarity with the QVS system allows them to detect any deviation from the security-critical processes. While it is not required that a Witness be a trained Operator, it is highly preferred.

PGP Key Types

Personal PGP Keypair

Used for day to day operations such as signing keys being added to keychain, signing tamper evidence, signing transaction requests and approvals etc.

When bootstrapping a system, the initial PGP keys can be generated using this guide.

Requirements

  • MUST not be transferred

  • MUST be generated offline

  • MUST have the root key offline

  • MUST have subkeys maintained on a smartcard

Quorum PGP Keypair

Only used in ceremonies for decrypting shardfile material.

Requirements

  • MUST use smart-card within air-gapped ceremonies

  • MUST not have PII attached to them

  • MUST be generated in a witnessed ceremony

  • MUST only be backed up to a quorum

  • MUST not be transferred in level 4

  • MAY be transferred in levels 1-3

Software

This page outlines the software used for setting up QVS.

[Stageˣ]

All software is built in a deterministic manner and reproduced by multiple individuals on diverse hardware to minimize the risks associated with supply chain attacks.

To achieve this, [Stageˣ] is used - a toolchain for building software using a fully bootstrapped compiler, which itself is built deterministically, and multi-reproduced.

[Stageˣ] was designed and developed by Distrust, with generous sponsorship from Keyternal and Mysten Labs.

AirgapOS

AirgapOS is an operating system built for those that want to be -really- sure that sensitive cryptographic material is managed in a clean environment with an "air gap" between the machine and the internet with high integrity on the supply chain of the firmware and OS used. This OS is hardened and specifically designed as an appliance for working with cryptographic material.

The software was developed by Distrust and has undergone an audit by Cure53 with no significant vulnerabilities found and has since then undergone additional hardening.

The AirgapOS Setup guides the user through verifying and setting up AirgapOS on a bootable disk to use as part of the Key Derivation Ceremony

Keyfork

Keyfork is an opinionated and modular toolchain for generating and managing a wide range of cryptographic keys offline and on Smart Cards from a shared BIP-0039 mnemonic phrase. BIP-0039 phrases are used to calculate a BIP-0032 seed, which is used for hierarchical deterministic key derivation.

This software is the backbone for all cryptographic actions performed as part of QVS. It was developed by Distrust and is included with AirgapOS and has been audited by two firms, NCC and Cure53 with no significant vulnerabilities found.

Icepick

Icepick is a framework for rapidly developing applications to perform transfer and staking cryptocurrency operations. It works synergistically with keyfork which derives keys which are then used by icepick.

Locations

Locations refer to physical points in space which are used for storing cryptographic material or performing actions using the cryptographic material and adhere to a set of criteria which focus on achieving a high level of security - specifically with respect to:

  • Protecting access to devices which store cryptographic material

  • Mitigating the risk stemming from natural disaster and other black swan events such as civil unrest or war.

  • Reducing the risk of exposing cryptographic material, for example via side-channel attacks

There are three sub-types of Locations, one which is used for performing any actions related to the management of the cryptographic material life-cycle and is referred to as the Management Location, one for long term secure storage of cryptographic material such as Smart Cards which are used to decrypt Shards, referred to as a Storage Location, and a location for Ceremonies, known as the Ceremony Location.

Level 1

This level of defenses is largely focused on remote attacks, and as such does not have strict requirements about the location.

Examples

  • Personal domicile

  • Co-working space

  • Regular office (non specific to QVS)

Reference Design

  • SHOULD have ability to control physical access to room

  • SHOULD be a space that's randomly selected to minimize the likelihood of an adversary deploying equipment into the location before it's used

Level 2

This level of defenses is focused on insider threats and as such requires a considerably higher standard as it needs to mitigate threats which stem from individuals who have privileged access.

Examples

  • Purpose specific facility for QVS

  • Short term rental

  • Hotel room

  • Moving vehicle

Reference Design

  • MUST have physical access restrictions which require identification

  • MUST have the ability to require more than 1 person to gain access

    • This control can be both physical, for example in vaults which require 2 keys for access AND/OR process level, where the personnel of the facility may verify the identity of one or more individuals
  • SHOULD have anti-fire systems

  • SHOULD have anti-flood systems

  • SHOULD be in facilities controlled by organizations which are ideally immune to being legally subpoenaed

Level 3

  • MUST have anti-fire systems

  • MUST have anti-flood systems

  • MUST have 24/7 security monitoring

  • MUST be in different geographic locations

    • This ensures that natural disasters are not likely to impact multiple locations simultaneously
  • SHOULD be facilities owned by different organizations to reduce the risk of collusion unless the organization who owns the QVS system has their own facility such as a SCIF.

Level 4 (SCIF)

  • MUST not have cameras installed inside of the room

  • MUST not have windows with direct line of sight to monitors

  • MUST have all walls protected with EM shielding which adheres to the TEMPEST standard NATO SDIP-27 Level A

  • SHOULD have seismic detectors

Glossary

Ciphertext

In cryptography, ciphertext is the result of encryption performed on plaintext using an algorithm, called a cipher.

Entropy

Entropy in cryptography refers to the measure of randomness or unpredictability in data used for generating cryptographic keys and other security elements.

Quorum Key Management (QVS)

A set of highly specified processes and tooling used for setting up a highly resilient quorum-based key management system.

Operator

An individual who manages an Operator Key which is used for protecting the passphrase of a Location key and participates in different aspects of the lifecycle management of the QVS system.

Operator Key

An asymmetric key used for protecting the passphrase of a Location key

Quorum

The chosen M of N threshold used to achieve "quorum", which is a type of agreement or consensus between a group of individuals. In the context of Shamir's Secret Sharing, it refers to the minimum number of shards required to reassemble the Root Entropy.

Wrench Factor

How many people are required to be put under duress (via smacking them with a wrench repeatedly or otherwise to get access to their Shard) before the Disaster Recover Key is compromised.

Bus Factor

How many members of the Quorum can meet an untimely demise without irretrievably locking access to the Distrust Quroum system.

Root Entropy (RE)

The main entropy/randomness which is used for hierarchical deterministic key derivation of a variety of cryptographic algorithms.

Shard

Cryptographic shard created using Shamir's Secret Sharing algorithm.

Shamir's Secret Sharing (SSS)

An algorithm used to split cryptographic material into shards which can be used to reassemble a secret. The shards can be combined according to a threshold which is set at the time of initial sharding, expressed as M of N, or in other words M shards of the total N shards in existence are required to reveal the secret.

Secure Compartmentalized Information Facility (SCIF)

RFC2119 and RFC8174

Specifications for keywords such as MUST, MUST NOT, SHOULD, SHOULD NOT, MAY etc.

Workstation

Highly secure computer which is used for sensitive operations, typically in the context of Production Engineering.

Minimum

In order to set up a Workstation, as part of a Production Engineering setup, a separate computer only used for carrying out sensitive operations should be used.

Setting up a computer with QubesOS is recommended as it makes it easy to create purpose built environments with minimal surface area for attacks, on the OS, and networking level.

Air-Gapped

Hardware which has no access to radio frequency or cable based networking capabilities in order to reduce area for surface attacks. Typically Air-Gapped computers are laptops which are never connected to the internet or any other networks, and have had their radio frequency hardware permanently disabled or ideally removed.

Key Derivation Ceremony

Highly specified process which is used to secure derivation of cryptographic material, with a focus on ensuring no single party has access to the Disaster Recovery Key. The ceremony includes witnesses who can help attest to the fact that the ceremony was executed properly, as well as instructions on hardware, software and location that should be used. Each step of the ceremony is carefully planned, and executed accordingly.

Location Key

Is a asymmetric key pair which is used for encrypting shards which are used to re-assemble the Root Entropy. Location Keys are stored in Locations which adhere to a strict set of criteria to maximize their security. The location smart card passphrase is encrypted to a Operator Key in order to secure access to it.

M of N

M is the minimum number of shards required to reassemble the secret, and N is the total number of shards that exist. The minimum recommended threshold is 2-of-3.

Organization

An organization which owns the QVS and is responsible for funding the setup and maintenance. The organization is also responsible for ensuring that the Warehouse is properly maintained in order to ensure that the ciphertext blobs associated with the system are redundantly stored and protected.

Witness

An individual who attests the ceremony was performed according to specification in order to have additional assurances the cryptographic material, most importantly the Root Entropy was never exposed.

Warehouse

  • Online storage for encrypted data replicated across multiple providers
  • All data in DR Warehouse can only be decrypted by the DR Key
  • Tolerate loss of any single provider by duplicating data to all of them
  • Storage backends can be any combination of the following:
    • S3 Compatible object stores:
      • AWS, Google Cloud, DigitalOcean, Azure, etc.
  • Version Control Systems:
  • We tolerate a loss of all but one DR storage backend
  • A minimum of three storage backends should be maintained

MICE

A mnemonic device used in counterintelligence training to remind trainees of the four general motivations that could lead someone to commit treason, become an insider threat, or collaborate with a hostile agency or organization. It stands for Money, Ideology, Compromise, and Ego.

Create Ceremony Repository

This repository holds data pertaining to vaults. The primary data consists of:

  • Operation proposals

  • Operation approvals

  • Payloads

  • Trusted PGP keyring

  • Shardfiles

  • Blockchain metadata

  • Policies (such as spending rules)

  • Ceremony logs

Directives

  • MUST be a private repository

  • MUST require signed commits

Repository Structure

keys/
    all/
        fingerprint.asc
<namespace>/
    ceremonies/
        <date>/
            log.txt
            payloads/
                payload_<num>.json
                payload_<num>.json.sig
    blockchain_metadata/
        sol_nonce_address.txt
    policies/
        spending-policy.json [NOT IMPLEMENTED]
    keyring.asc
    shardfile.asc

Procedure: Setting up Repository

  1. Create a git repository using a git system such as Forgejo, GitLab, GitHub etc.

  2. Set appropriate permissions to limit who can write to the repository.

    • Require that all commits are signed using well known PGP keys
  3. Optionally set up a cron job that periodically pulls the data from the repository as a backup.

Personal PGP Key Provisioning

Requirements

  • AirgapOS SD card

  • AirgapOS Laptop

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • 1+ Smart Card

    • At least 1 primary smart card
    • Any number of backup smart cards
  • 1 Transfer SD card

    • Document will assume the card is labelled as "TRANSFER"

Process

  1. If using pre-sealed Cold Bundle unseal as follows:

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  2. Boot AirgapOS Laptop

  3. Insert an SD card into the system

  4. Change working directory to SD card mount location

    $ cd /media/TRANSFER
    
  5. Insert all smartcards to be provisioned into the system.

  6. Set expiry time via environment variable - you can update 2y to desired value:

    $ export KEYFORK_OPENPGP_EXPIRE=2y
    
  7. Generate a mnemonic, encrypting to a newly-generated key:

    Ensure the User ID is your name and your email.

    $ keyfork mnemonic generate --encrypt-to-self encrypted.asc --provision openpgp-card --derive='openpgp --public "Your Name <your@email.co>"'
    

    The --provision-count option can be provided to ensure the correct amount of smartcards is provisioned - the program will error if the amount of smartcards available is not equal to the count requested.

    Note: The PIN can't use sequential numbers, characters or repeated patterns.

  8. Power down AirgapOS Laptop

  9. Switch to Linux Workstation

  10. Attach SD card from AirgapOS machine

  11. Attach smartcard provisioned with AirgapOS machine

  12. Import newly generated public key into local keychain

    $ gpg --import /media/TRANSFER/*.pub.asc
    
  13. Retrieve the value of your PGP key ID from smartcard

    gpg --card-status
    
  14. Configure git to sign commits with smartcard

    $ git config --global user.name <name>
    $ git config --global user.email <email>
    $ git config --global user.signingKey <pgp_key_id>
    $ git config --global commit.gpgsign true
    $ git config --global commit.merge true
    
  15. Configure ssh to authenticate with smartcard

    $ echo 'export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"' > ~/.bashrc
    $ source ~/.bashrc
    

    Note: If you use another shell such as zsh, adjust acccordingly

  16. Push new key material to Vaults repository

    a. Clone repository (if not done previously)

    $ git clone <vaults_repository_url> ~/vaults
    

    b. Checkout main branch

    $ cd ~/vaults
    $ git checkout main
    $ git pull origin main
    

    c. Commit and push modifications

    $ cp /media/TRANSFER/*.asc keys/all
    $ git add .
    $ git commit -S -m "add <name> pgp key"
    $ git push origin main
    
  17. Communicate your new key fingerprint to all other participants:

    • Preferred: In person

    • Fallback: via two logically distinct online communications methods (e.g. encrypted chat, and video call)

  18. Get confirmation they have imported your key to their keychains

    • e.g. gpg --import <your_key_id>.asc
    • Confirm this is done for keyrings on workstations used to interact with the Vaults repository

Procurer

The procurer is responsible for:

  • Procuring equipment

  • Creating and maintaining the Inventory

  • Ensuring equipment is properly tamper proofed

  • Minimizing hardware supply chain security risks

Order of Operations

  1. Provisioning Personal PGP Keys

  2. Procuring a facility

  3. Creating a Inventory repository

  4. Procuring tamper proofing equipment

  5. Procuring hardware

    • Laptops

    • SD cards

    • SD card USB adapters

    • Smart cards

Procure Facility

  1. Identify a location which is suitable for Level 2 ceremonies:

    • SHOULD be lockable to prevent inflow and outflow of persons during ceremonies
  2. Procure an enclosure for locking equipment. A simple lockbox or a safe can be used. It should be at least large enough to fit several laptops, with some extra room.

  3. Designate the location as the facility for conducting ceremonies and update documentation and policies to reflect this

Create Inventory Repository

This repository is used to keep track of available inventory and tamper proofing evidence

Repository Structure

computers/
    <num>/
        description.txt
        tamper_evidence_front.jpeg
        tamper_evidence_back.jpeg
bundles/
    <num>/
        description.txt
        tamper_evidence_front.jpeg
        tamper_evidence_back.jpeg
sd_cards/
    <num>
        ...

Procedure: Setting up Repository

  1. Create a git repository using a git system such as Forgejo, GitLab, GitHub etc.

  2. Set appropriate permissions to limit who can write to the repository.

    • Require that all commits are signed using well known PGP keys
  3. Optionally set up a cron job that periodically pulls the data from the repository as a backup.

Procure Tamper Proofing Equipment

The facility will require tamper proofing equipment which will be used to tamper proof items before they are stored in inventory.

These items don't require dual custody and can be purchased at any location.

Vacuum Sealer, plastic roll, filler

Digital camera

  • MUST have >10MP

Polaroid camera

Label Printer

There are two options:

  • Hand-held label printer with a built in keyboard

  • Non-standalone label printer that needs a computer to send it the file to print

Examples

Procure SD Card Pack

Requirements

Procedure

  1. Selecting a Purchase Location

    • Select at multiple stores which carry the type of equipment being purchased, then randomly select one using the roll of a die, or other random method. This is done in order to reduce the likelihood that an insider threat is able to plant a compromised computer in a store ahead of time.
  2. Within the store, identify available adequate device

  3. Purchase the device and place it in a see-through plastic bag which will be used to transport it to a "processing location", which SHOULD be an access controlled space.

    • The bag MUST be a sealable see-through tamper evident bag. It may be necessary to remove the device from it's original packaging to fit it into the sealable bag.
  4. If the equipment does not have to be tamper proofed, simply deliver it to its storage location, and update the inventory repository with the serial number of the device.

  5. If the equipment does require tamper proofing, apply the appropriate level of tamper proofing for the security level you are performing the procurement for.

  6. Remove packaging from each SD card, and place them into High Visibility Storage

  7. Select 5 SD cards to be tamper proofed from High Visibility Storage

  8. Insert object(s) into plastic sealing bag

  9. Fill bag with enough plastic beads that most of the object is surrounded

  10. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  11. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  12. Date and sign the polaroid photographs and store them in a local lock box

  13. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

  14. Label the tamper proofed package "SD Card Pack [date]"

Hardware Procurement

Requirements

Procedure: Local Procurement

  1. Selecting a Purchase Location

    • Select at multiple stores which carry the type of equipment being purchased, then randomly select one using the roll of a die, or other random method. This is done in order to reduce the likelihood that an insider threat is able to plant a compromised computer in a store ahead of time.
  2. Within the store, identify available adequate device

  3. Purchase the device and place it in a see-through plastic bag which will be used to transport it to a "processing location", which SHOULD be an access controlled space.

    • The bag MUST be a sealable see-through tamper evident bag. It may be necessary to remove the device from it's original packaging to fit it into the sealable bag.
  4. If the equipment does not have to be tamper proofed, simply deliver it to its storage location, and update the inventory repository with the serial number of the device.

  5. If the equipment does require tamper proofing, apply the appropriate level of tamper proofing for the security level you are performing the procurement for.

Procedure: Online Procurement

  1. Select a well known and reputable supplier. Establishing a relationship with a hardware supplier that has a reputation for privacy, supply chain security is preferred.

  2. Order the supplies to a registered mailbox, to prevent exposing your organization's location

Tamper Proofing

All hardware:

  • MUST be procured using dual custody methods

  • MUST be tamper proofed using vacuum sealing / stored in tamper evident vault

  • MUST be properly labelled

  • MUST be added to cryptographically signed inventory

Procedure

  1. Insert object(s) into plastic sealing bag

  2. Fill bag with enough plastic beads that most of the object is surrounded

  3. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  4. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  5. Date and sign the polaroid photographs and store them in a local lock box

  6. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Equipment Models

Computers Models

For Level 2 security, air-gapped computers which are used for cryptographic material management and operations are required.

SD Cards & Adapters

SD cards can be tamper proofed in packs of 4 to reduce the amount of tamper proofing that needs to be done.

Any high quality SD equipment can be used but below are some recommended products:

Smart Cards

  • NitroKey 3

  • YubiKey 5

Provisioner

The provisioner is responsible for:

  • Provisioning hardware

  • Provisioning SD Cards (AirapOS, Ceremony etc.)

  • Provisioning bundles (e.g Air-Gapped bundle)

Procedures

Provision Computer

Requirements

Procedure

  1. Unseal a tamper proofed laptop

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  2. Remove all radio cards, storage drive, speakers, and microphone using standard industry laptop repair tactics

  3. Insert object(s) into plastic sealing bag

  4. Fill bag with enough plastic beads that most of the object is surrounded

  5. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  6. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  7. Date and sign the polaroid photographs and store them in a local lock box

  8. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

  9. Apply a new label which indicates the laptop has been provisioned (include date, and any other desired metadata such as a unique ID (e.g Laptop #4))

  10. Place the provisioned laptop in inventory

  11. Update inventory to reflect that this hardware has been provisioned, and including the metadata in the description.txt for that item according to the inventory repository structure

AirgapOS

Requirements

Procedure

  1. Turn on one of the computers - this one will be used for writing the SD cards

  2. Build the software according to the readme in the repository.

  3. Use the make reproduce command

  4. Unseal the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Label each SD card that will be used "AirgapOS [date]"

  6. Place all the SD cards into High Visibility Storage

  7. Retrieve a labelled SD card from High Visibility Storage, and plug it into the computer where AirgapOS will be built

  8. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  9. Flash airgap.iso to an SD Card:

    • dd if=out/airgap.iso of=/dev/<device_name> bs=4M conv=fsync
  10. Reset the computer, and boot the SD card

  11. Once booted, the card needs to be locked using sdtool which is available in AirgapOS:

    • Note: the device will not mount as a proper block device on QubesOS so a different OS has to be used where the device appears as /dev/mmcblk
  12. ./sdtool /dev/<device_name> permlock

  13. Once burned, unplug the SD card

  14. Plug the SD card into a different computer from the one that was used to write the SD card

  15. Boot the computer

  16. Open a terminal

  17. Verify the card can't be written to:

    • echo "42" | dd of=/dev/<device_name>
  18. Insert object(s) into plastic sealing bag

  19. Fill bag with enough plastic beads that most of the object is surrounded

  20. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  21. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  22. Date and sign the polaroid photographs and store them in a local lock box

  23. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Air-Gapped Bundle

Requirements

  • AirgapOS SD Card

  • Air-gapped computer

Procedure

  1. Insert object(s) into plastic sealing bag

  2. Fill bag with enough plastic beads that most of the object is surrounded

  3. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  4. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  5. Date and sign the polaroid photographs and store them in a local lock box

  6. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

  7. Label the tamper proofed package as "Air-Gapped Bundle [num]", for example "Air-Gapped Bundle 2" if one already exists

  8. Update inventory to indicate a new air-gapped bundle is available

Solana: Create Transaction Payload

Requirements

  • Quorum PGP Key

  • Air-Gapped Bundle

    • The proposer should print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The proposer should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the vaults repo

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • Clone the Vaults Repository for your organization to the machine

Procedure

  1. Turn on online linux workstation

  2. Clone the vaults repository if it's not available locally and get the latest changes:

    $ git clone <repository_git_url>
    $ git pull origin main
    
  3. Unseal the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Plug a fresh SD card into the online linux workstation

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Save the vaults repo to the SD card, referred to as the Ceremony SD card

    $ cp -r ~/vaults/ /media
    
  7. Unplug the Ceremony SD card

  8. Unseal the tamper proofed bundle

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  9. Insert the AirgapOS SD card into the airgapped machine and turn it on

  10. Once booted, unplug the AirgapOS SD card and place it in High Visibility Storage

  11. Plug in the Ceremony SD card

  12. Copy the git repo locally from the Ceremony SD card and change to it

    $ cp -r /media/vaults /root
    $ cd /root/vaults
    
  13. Create a new payloads directory in the vaults repository for the date on which the ceremony for the transaction will take place if it doesn't already exist

    • mkdir -p <namespace>/ceremonies/<date>/payloads

    • e.g mkdir -p acme-coin-01/ceremonies/2025-01-01/payloads

  14. Use icepick workflow --help to list the available workflows and options

  15. Plug in the Operator smart card

  16. Use icepick to generate and sign the payload by running one of the following available workflows:

    Transfer

    Transfer native Solana asset - SOL.

    $ icepick workflow sol transfer --to-address <to-address> --from-address <from-address> --amount <amount> --export-for-quorum --sign

    Transfer Token

    Transfer SPL tokens on Solana blockchain.

    The following SPL tokens, provided to --token-name, are supported:

    $ icepick workflow sol transfer-token --from-address <from-address> --to-address <to-address> --token-name <token-name> --token-amount <token-amount> --export-for-quorum --sign

  17. Copy the updated ceremonies repo to the SD card

    $ cp -r /root/vaults /media
    
  18. Transfer the SD card from the air-gapped machine to the online machine

  19. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  20. Copy the updated repository locally and switch to it:

    $ cp -r /media/vaults ~/
    $ cd ~/vaults
    
  21. Stage, sign, commit and push the changes to the ceremonies repository:

    $ git add <namespace>/ceremonies/<date>/payloads/*
    $ git commit -S -m "add payload signature for payload_<num>.json"
    $ git push origin main
    
  22. Notify relevant individuals that there are new transactions queued up, and that a ceremony should be scheduled. This can be automated in the future so that when a commit is made or PR opened, others are notified, for example using a incident management tool.

  23. Tamper proof the AirgapOS and Air-gapped laptop

  24. Insert object(s) into plastic sealing bag

  25. Fill bag with enough plastic beads that most of the object is surrounded

  26. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  27. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  28. Date and sign the polaroid photographs and store them in a local lock box

  29. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Solana: Create Transaction Payload

Requirements

  • Quorum PGP Key

  • Air-Gapped Bundle

    • The proposer should print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The proposer should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the vaults repo

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • Clone the Vaults Repository for your organization to the machine

Procedure

  1. Turn on online linux workstation

  2. Clone the vaults repository if it's not available locally and get the latest changes:

    $ git clone <repository_git_url>
    $ git pull origin main
    
  3. Unseal the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Plug a fresh SD card into the online linux workstation

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Save the vaults repo to the SD card, referred to as the Ceremony SD card

    $ cp -r ~/vaults/ /media
    
  7. Unplug the Ceremony SD card

  8. Unseal the tamper proofed bundle

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  9. Insert the AirgapOS SD card into the airgapped machine and turn it on

  10. Once booted, unplug the AirgapOS SD card and place it in High Visibility Storage

  11. Plug in the Ceremony SD card

  12. Copy the git repo locally from the Ceremony SD card and change to it

    $ cp -r /media/vaults /root
    $ cd /root/vaults
    
  13. Create a new payloads directory in the vaults repository for the date on which the ceremony for the transaction will take place if it doesn't already exist

    • mkdir -p <namespace>/ceremonies/<date>/payloads

    • e.g mkdir -p acme-coin-01/ceremonies/2025-01-01/payloads

  14. Use icepick workflow --help to list the available workflows and options

  15. Plug in the Operator smart card

  16. Use icepick to generate and sign the payload by running one of the following available workflows:

    Transfer Token

    Transfer Pyth on Solana blockchain.

    $ icepick workflow sol transfer-token --from-address <from-address> --to-address <to-address> --token-name PYTH --token-amount <token-amount> --export-for-quorum --sign

  17. Copy the updated ceremonies repo to the SD card

    $ cp -r /root/vaults /media
    
  18. Transfer the SD card from the air-gapped machine to the online machine

  19. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  20. Copy the updated repository locally and switch to it:

    $ cp -r /media/vaults ~/
    $ cd ~/vaults
    
  21. Stage, sign, commit and push the changes to the ceremonies repository:

    $ git add <namespace>/ceremonies/<date>/payloads/*
    $ git commit -S -m "add payload signature for payload_<num>.json"
    $ git push origin main
    
  22. Notify relevant individuals that there are new transactions queued up, and that a ceremony should be scheduled. This can be automated in the future so that when a commit is made or PR opened, others are notified, for example using a incident management tool.

  23. Tamper proof the AirgapOS and Air-gapped laptop

  24. Insert object(s) into plastic sealing bag

  25. Fill bag with enough plastic beads that most of the object is surrounded

  26. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  27. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  28. Date and sign the polaroid photographs and store them in a local lock box

  29. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Cosmos: Create Transaction Payload

Requirements

  • Quorum PGP Key

  • Air-Gapped Bundle

    • The proposer should print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The proposer should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the vaults repo

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • Clone the Vaults Repository for your organization to the machine

Procedure

  1. Turn on online linux workstation

  2. Clone the vaults repository if it's not available locally and get the latest changes:

    $ git clone <repository_git_url>
    $ git pull origin main
    
  3. Unseal the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Plug a fresh SD card into the online linux workstation

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Save the vaults repo to the SD card, referred to as the Ceremony SD card

    $ cp -r ~/vaults/ /media
    
  7. Unplug the Ceremony SD card

  8. Unseal the tamper proofed bundle

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  9. Insert the AirgapOS SD card into the airgapped machine and turn it on

  10. Once booted, unplug the AirgapOS SD card and place it in High Visibility Storage

  11. Plug in the Ceremony SD card

  12. Copy the git repo locally from the Ceremony SD card and change to it

    $ cp -r /media/vaults /root
    $ cd /root/vaults
    
  13. Create a new payloads directory in the vaults repository for the date on which the ceremony for the transaction will take place if it doesn't already exist

    • mkdir -p <namespace>/ceremonies/<date>/payloads

    • e.g mkdir -p acme-coin-01/ceremonies/2025-01-01/payloads

  14. Use icepick workflow --help to list the available workflows and options

  15. Plug in the Operator smart card

  16. Use icepick to generate and sign the payload by running one of the following available workflows:

    All commands in the following sections take --chain-name and (with the exception of withdraw-rewards) --asset-name. These are the "Chain" and "Asset" fields from the table below. For example, Kyve Mainnet tokens would be --chain-name kyve --asset-name KYVE. Seda Mainnet tokens would be --chain-name seda --asset-name SEDA. The table below documents all currently-supported combinations of chain and primary asset.

    Chain NameChainAsset
    SedasedaSEDA
    Seda Devnetseda-devnetSEDA
    KyvekyveKYVE
    Kyve TestnetkaonKYVE
    Kyve DevnetkorelliaKYVE

    Additionally, there may be some difficulty broadcasting a transaction due to the amount of gas consumed, as each Cosmos chain may have different computation power available. The option --gas-factor may be set to a number to multiply the gas by, such as 1.2, to increase the amount of gas for a transaction. The default value is 1, and may be omitted if desired. A value lower than 1 is not recommended.

    Stake

    Stake coins on the provided chain towards a validator operator's address.

    $ icepick workflow cosmos stake --delegate-address <delegate-address> --validator-address <validator-address> --chain-name <chain-name> --asset-name <asset-name> --asset-amount <asset-amount> --gas-factor <gas-factor> --export-for-quorum --sign

    Transfer

    Transfer coins on the cosmos blockchain.

    $ icepick workflow cosmos transfer --from-address <from-address> --to-address <to-address> --chain-name <chain-name> --asset-name <asset-name> --asset-amount <asset-amount> --export-for-quorum --sign

    Withdraw

    Withdraw staked coins from a validator. Staked coins may be held for an unbonding period, depending on the chain upon which they are staked.

    $ icepick workflow cosmos withdraw --delegate-address <delegate-address> --validator-address <validator-address> --chain-name <chain-name> --asset-name <asset-name> --gas-factor <gas-factor> --export-for-quorum-sign

    Withdraw Rewards

    Withdraw rewards gained from staking to a validator.

    $ icepick workflow cosmos withdraw-rewards --delegate-address <delegate-address> --validator-address <validator-address> --chain-name <chain-name> --gas-factor <gas-factor> --export-for-quorum-sign

  17. Copy the updated ceremonies repo to the SD card

    $ cp -r /root/vaults /media
    
  18. Transfer the SD card from the air-gapped machine to the online machine

  19. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  20. Copy the updated repository locally and switch to it:

    $ cp -r /media/vaults ~/
    $ cd ~/vaults
    
  21. Stage, sign, commit and push the changes to the ceremonies repository:

    $ git add <namespace>/ceremonies/<date>/payloads/*
    $ git commit -S -m "add payload signature for payload_<num>.json"
    $ git push origin main
    
  22. Notify relevant individuals that there are new transactions queued up, and that a ceremony should be scheduled. This can be automated in the future so that when a commit is made or PR opened, others are notified, for example using a incident management tool.

  23. Tamper proof the AirgapOS and Air-gapped laptop

  24. Insert object(s) into plastic sealing bag

  25. Fill bag with enough plastic beads that most of the object is surrounded

  26. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  27. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  28. Date and sign the polaroid photographs and store them in a local lock box

  29. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Kyve: Create Transaction Payload

Requirements

  • Quorum PGP Key

  • Air-Gapped Bundle

    • The proposer should print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The proposer should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the vaults repo

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • Clone the Vaults Repository for your organization to the machine

Procedure

  1. Turn on online linux workstation

  2. Clone the vaults repository if it's not available locally and get the latest changes:

    $ git clone <repository_git_url>
    $ git pull origin main
    
  3. Unseal the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Plug a fresh SD card into the online linux workstation

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Save the vaults repo to the SD card, referred to as the Ceremony SD card

    $ cp -r ~/vaults/ /media
    
  7. Unplug the Ceremony SD card

  8. Unseal the tamper proofed bundle

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  9. Insert the AirgapOS SD card into the airgapped machine and turn it on

  10. Once booted, unplug the AirgapOS SD card and place it in High Visibility Storage

  11. Plug in the Ceremony SD card

  12. Copy the git repo locally from the Ceremony SD card and change to it

    $ cp -r /media/vaults /root
    $ cd /root/vaults
    
  13. Create a new payloads directory in the vaults repository for the date on which the ceremony for the transaction will take place if it doesn't already exist

    • mkdir -p <namespace>/ceremonies/<date>/payloads

    • e.g mkdir -p acme-coin-01/ceremonies/2025-01-01/payloads

  14. Use icepick workflow --help to list the available workflows and options

  15. Plug in the Operator smart card

  16. Use icepick to generate and sign the payload by running one of the following available workflows:

    There may be some difficulty broadcasting a transaction due to the amount of gas consumed, as each Cosmos chain may have different computation power available. The option --gas-factor may be set to a number to multiply the gas by, such as 1.2, to increase the amount of gas for a transaction. The default value is 1, and may be omitted if desired. A value lower than 1 is not recommended.

    The option --chain-name can use kyve, kaon (testnet), and korellia (devnet)

    Stake

    Stake coins on the provided chain towards a validator operator's address.

    $ icepick workflow cosmos stake --delegate-address <delegate-address> --validator-address <validator-address> --chain-name kyve --asset-name KYVE --asset-amount <asset-amount> --gas-factor <gas-factor> --export-for-quorum --sign

    Transfer

    Transfer coins on the cosmos blockchain.

    $ icepick workflow cosmos transfer --from-address <from-address> --to-address <to-address> --chain-name kyve --asset-name <asset-name> --asset-amount <asset-amount> --export-for-quorum --sign

    Withdraw

    Withdraw staked coins from a validator. Staked coins may be held for an unbonding period, depending on the chain upon which they are staked.

    $ icepick workflow cosmos withdraw --delegate-address <delegate-address> --validator-address <validator-address> --chain-name kyve --asset-name KYVE --gas-factor <gas-factor> --export-for-quorum-sign

    Withdraw Rewards

    Withdraw rewards gained from staking to a validator.

    $ icepick workflow cosmos withdraw-rewards --delegate-address <delegate-address> --validator-address <validator-address> --chain-name kyve --gas-factor <gas-factor> --export-for-quorum-sign

  17. Copy the updated ceremonies repo to the SD card

    $ cp -r /root/vaults /media
    
  18. Transfer the SD card from the air-gapped machine to the online machine

  19. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  20. Copy the updated repository locally and switch to it:

    $ cp -r /media/vaults ~/
    $ cd ~/vaults
    
  21. Stage, sign, commit and push the changes to the ceremonies repository:

    $ git add <namespace>/ceremonies/<date>/payloads/*
    $ git commit -S -m "add payload signature for payload_<num>.json"
    $ git push origin main
    
  22. Notify relevant individuals that there are new transactions queued up, and that a ceremony should be scheduled. This can be automated in the future so that when a commit is made or PR opened, others are notified, for example using a incident management tool.

  23. Tamper proof the AirgapOS and Air-gapped laptop

  24. Insert object(s) into plastic sealing bag

  25. Fill bag with enough plastic beads that most of the object is surrounded

  26. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  27. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  28. Date and sign the polaroid photographs and store them in a local lock box

  29. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Seda: Create Transaction Payload

Requirements

  • Quorum PGP Key

  • Air-Gapped Bundle

    • The proposer should print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The proposer should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the vaults repo

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • Clone the Vaults Repository for your organization to the machine

Procedure

  1. Turn on online linux workstation

  2. Clone the vaults repository if it's not available locally and get the latest changes:

    $ git clone <repository_git_url>
    $ git pull origin main
    
  3. Unseal the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Plug a fresh SD card into the online linux workstation

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Save the vaults repo to the SD card, referred to as the Ceremony SD card

    $ cp -r ~/vaults/ /media
    
  7. Unplug the Ceremony SD card

  8. Unseal the tamper proofed bundle

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  9. Insert the AirgapOS SD card into the airgapped machine and turn it on

  10. Once booted, unplug the AirgapOS SD card and place it in High Visibility Storage

  11. Plug in the Ceremony SD card

  12. Copy the git repo locally from the Ceremony SD card and change to it

    $ cp -r /media/vaults /root
    $ cd /root/vaults
    
  13. Create a new payloads directory in the vaults repository for the date on which the ceremony for the transaction will take place if it doesn't already exist

    • mkdir -p <namespace>/ceremonies/<date>/payloads

    • e.g mkdir -p acme-coin-01/ceremonies/2025-01-01/payloads

  14. Use icepick workflow --help to list the available workflows and options

  15. Plug in the Operator smart card

  16. Use icepick to generate and sign the payload by running one of the following available workflows:

    There may be some difficulty broadcasting a transaction due to the amount of gas consumed, as each Cosmos chain may have different computation power available. The option --gas-factor may be set to a number to multiply the gas by, such as 1.2, to increase the amount of gas for a transaction. The default value is 1, and may be omitted if desired. A value lower than 1 is not recommended.

    The option --chain-name can use seda or seda-devnet.

    Stake

    Stake coins on the provided chain towards a validator operator's address.

    $ icepick workflow cosmos stake --delegate-address <delegate-address> --validator-address <validator-address> --chain-name seda --asset-name SEDA --asset-amount <asset-amount> --gas-factor <gas-factor> --export-for-quorum --sign

    Transfer

    Transfer coins on the cosmos blockchain.

    $ icepick workflow cosmos transfer --from-address <from-address> --to-address <to-address> --chain-name seda --asset-name <asset-name> --asset-amount <asset-amount> --export-for-quorum --sign

    Withdraw

    Withdraw staked coins from a validator. Staked coins may be held for an unbonding period, depending on the chain upon which they are staked.

    $ icepick workflow cosmos withdraw --delegate-address <delegate-address> --validator-address <validator-address> --chain-name seda --asset-name SEDA --gas-factor <gas-factor> --export-for-quorum-sign

    Withdraw Rewards

    Withdraw rewards gained from staking to a validator.

    $ icepick workflow cosmos withdraw-rewards --delegate-address <delegate-address> --validator-address <validator-address> --chain-name seda --gas-factor <gas-factor> --export-for-quorum-sign

  17. Copy the updated ceremonies repo to the SD card

    $ cp -r /root/vaults /media
    
  18. Transfer the SD card from the air-gapped machine to the online machine

  19. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  20. Copy the updated repository locally and switch to it:

    $ cp -r /media/vaults ~/
    $ cd ~/vaults
    
  21. Stage, sign, commit and push the changes to the ceremonies repository:

    $ git add <namespace>/ceremonies/<date>/payloads/*
    $ git commit -S -m "add payload signature for payload_<num>.json"
    $ git push origin main
    
  22. Notify relevant individuals that there are new transactions queued up, and that a ceremony should be scheduled. This can be automated in the future so that when a commit is made or PR opened, others are notified, for example using a incident management tool.

  23. Tamper proof the AirgapOS and Air-gapped laptop

  24. Insert object(s) into plastic sealing bag

  25. Fill bag with enough plastic beads that most of the object is surrounded

  26. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  27. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  28. Date and sign the polaroid photographs and store them in a local lock box

  29. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Approver - Approve Transaction

The approver is responsible for verifying a transaction proposed by a proposer.

Requirements

  • Quorum PGP Key

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • SD Card Pack

  • Air-Gapped Bundle

    • The approver should print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The approver should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the vaults repo

  • Clone the Vaults Repository for your organization to the machine

Procedure

  1. Turn on online linux workstation

  2. Pull the latest changes from the vaults repository

  3. Unseal the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Plug a fresh SD card into the online linux workstation

  5. Save the vaults repository to the SD card, referred to as the Ceremony SD card

  6. Unplug the Ceremony SD card

  7. Unseal the tamper proofed bundle

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  8. Insert the AirgapOS SD card into the airgapped machine and turn it on

  9. Once booted, unplug the AirgapOS SD card

  10. Plug in the Ceremony SD card

  11. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  12. Copy the git repo locally from the Ceremony SD card and change into it

    $ cp -r /media/vaults /root/vaults
    $ cd /root/vaults
    
  13. Plug in the Operator smart card

  14. Verify the existing signatures and add your own signature:

    • icepick workflow --add-signature-to-quorum <namespace>/ceremonies/<date>/payload_<num>.json --shardfile <shardfile>.asc
  15. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  16. Copy the updated vaults repo to the SD card

    • cp -r /root/vaults /media
  17. Unplug the SD card from the air-gapped machine

  18. Plug in the SD card into the online linux workstation

  19. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  20. Copy the updated repository locally and change into it:

    $ cp -r /media/vaults ~/
    $ cd ~/vaults
    
  21. Stage, sign, commit and push changes to the ceremonies repository:

    $ git add <namespace>/ceremonies/<date>/payloads/*
    $ git commit -S -m "add payload signature for payload_<num>.json"
    $ git push origin main
    
  22. Tamper proof the AirgapOS and Air-gapped laptop

  23. Insert object(s) into plastic sealing bag

  24. Fill bag with enough plastic beads that most of the object is surrounded

  25. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  26. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  27. Date and sign the polaroid photographs and store them in a local lock box

  28. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Operator

Responsibilities

  • Executing ceremonies

  • Managing Shard-bearer PGP keys

    • In addition to signing material, these keys are used for decrypting shards

Quorum Entropy Ceremony

This is a ceremony for generating entropy which is used to derive Quorum PGP keys, load them into smart cards and shard entropy to them.

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Ceremony SD Card

  • SD Card Pack

  • N Smart Cards in the chosen M of N quorum

  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

Procedure

  1. Enter the designated location with required personnel and equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Retrieve Air-Gapped Bundle and polaroid tamper evidence from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Place all materials except for the laptop into High Visibility Storage

  5. Retrieve AirgapOS SD card from High Visibility Storage and plug it into air-gapped laptop

  6. Turn on the machine

  7. Once booted, remove the AirgapOS SD card and place it into High Visibility Storage

  8. Run the relevant keyfork operation to perform the ceremony:

    • Replace the following values: <M>, <N>, <number_of_smart_cards_per_operator>, <pgp_user_id> with appropriate values
    $ keyfork mnemonic generate --shard-to-self shardfile.asc,threshold=<M>,max=<N>,cards_per_shard=<number_of_smartcards_per_operator>,cert_output=keyring.asc --derive='openpgp --public "Your Name <your@email.co>" --output certificate.asc'
    
  9. Unseal an SD card pack by following tamper proofing steps:

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  10. Place all unsealed SD cards into High Visibility Storage

  11. Plug in the Ceremony SD card

  12. Back up the files

    $ cp shardfile.asc /media/vaults/<namespace>/
    $ cp keyring.asc /media/vaults/<namespace>/
    $ cp certificate.asc /media/vaults/<namespace>/
    $ cp -r /media/vaults /root/
    
  13. To create additional backups of the updated vaults repository, plug in SD cards one at a time and use following steps to back up ceremony artifacts

    1. Plug in fresh SD card

    2. cp -r /root/vaults /media/

    3. Unplug the SD card

    4. Label the SD card "Ceremony [date]"

    5. Place the SD card in High Visibility Storage

  14. Power down the air-gapped machine

  15. Transfer the ceremony artifacts to online linux workstation using one of the SD cards and commit the changes made to the vaults repository that's on the Ceremony SD card

  16. Connect SD card to online linux workstation

  17. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  18. If the ~/vaults/ repository already exists, ensure it doesn't have any changes that haven't been committed, then remove it using sudo rm -rf ~/vaults before re-running the previous step

  19. Copy the repository with updated files to an online linux workstation, sign, commit and push to the vaults repository:

    $ cp -r /media/vaults ~/vaults/
    $ cd ~/vaults
    $ git add .
    $ git commit -S -m "<message>"
    $ git push origin HEAD
    
  20. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  21. Insert object(s) into plastic sealing bag

  22. Fill bag with enough plastic beads that most of the object is surrounded

  23. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  24. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  25. Date and sign the polaroid photographs and store them in a local lock box

  26. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Ceremony SD Card Provisioning

Requirements

Procedure

  1. Turn on the computer

  2. Open the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  3. Plug in a fresh SD card into computer

  4. Navigate to the ceremony repository for the ceremony being executed

  • Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)
    • Mount the device using: sudo mount /dev/<your_device> /media
  1. Write the ceremony repo data to the SD card:

    sudo cp -r vaults/ /media

  2. Unplug the SD card

  3. Turn off the computer

Namespace Entropy Ceremony

This is a ceremony for generating and sharding entropy to a set of existing Quorum Keys.

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • SD Card Pack

  • Ceremony SD Card

  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

Procedure

  1. Enter the designated location with required personnel and equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Retrieve Air-Gapped Bundle and polaroid tamper evidence from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Place all materials except for the laptop into High Visibility Storage

  5. Retrieve AirgapOS SD card from High Visibility Storage and plug it into air-gapped laptop

  6. Turn on the machine

  7. Once booted, remove the AirgapOS SD card and place it into High Visibility Storage

  8. Plug the Ceremony SD card into the machine

  9. Run the command to generate new entropy and shard it to quorum of public certificates of the input shardfile:

    • Replace the values: <path_to_input_shard>, <pgp_user_id>
    $ keyfork mnemonic generate --shard-to <path_to_input_shard>,output=shardfile.asc --derive='openpgp --public "Your Name <your@email.co>" --output certificate.asc'
    
  10. Unseal an SD card pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  11. Place all unsealed SD cards into High Visibility Storage

  12. Plug in the Ceremony SD card

  13. Back up the files

    $ cp shardfile.asc /media/vaults/<namespace>/
    $ cp certificate.asc /media/vaults/<namespace>/
    $ cp -r /media/vaults /root/
    
  14. To create additional backups of the updated vaults repository, plug in SD cards one at a time and use following steps to back up ceremony artifacts

    1. Plug in fresh SD card

    2. cp -r /root/vaults /media/

    3. Unplug the SD card

    4. Label the SD card "Ceremony [date]"

    5. Place the SD caard in High Visibility Storage

  15. Power down the air-gapped machine

  16. Transfer the ceremony artifacts to an online machine using one of the SD cards and commit the changes made to the vaults repository that's on the Ceremony SD card

  17. Connect SD card to online linux workstation

  18. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  19. If the ~/vaults/ repository already exists, ensure it doesn't have any changes that haven't been committed, then remove it using sudo rm -rf ~/vaults before re-running the previous step

  20. Copy the repository with updated files to an online linux workstation, sign, commit and push to the vaults repository:

    $ cp -r /media/vaults ~/vaults/
    $ cd ~/vaults
    $ git add .
    $ git commit -S -m "<message>"
    $ git push origin HEAD
    
  21. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  22. Insert object(s) into plastic sealing bag

  23. Fill bag with enough plastic beads that most of the object is surrounded

  24. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  25. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  26. Date and sign the polaroid photographs and store them in a local lock box

  27. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Decrypt Namespace Secret

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Ceremony SD Card

  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

Procedure

  1. Enter the designated location with required personnel and equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Retrieve Air-Gapped Bundle and polaroid tamper evidence from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  4. Place all materials except for the laptop into High Visibility Storage

  5. Retrieve AirgapOS SD card from High Visibility Storage and plug it into air-gapped laptop

  6. Turn on the machine

  7. Once booted, remove the AirgapOS SD card and place it into High Visibility Storage

  8. Retrieve Ceremony SD Card from High Visibility Storage and plug it into the machine

  9. Copy the Ceremony SD Card contents to machine

    • cp -r /media/vaults /root/
  10. Start keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon /root/vaults/<namespace>/shardfile.asc
    
    • Follow on screen prompts
  11. Derive the OpenPGP root certificate:

    $ keyfork derive openpgp > secret_key.asc
    
  12. Decrypt the secret material:

    • sq decrypt --recipient-file secret_key.asc < encrypted.asc --output decrypted
  13. Proceed to transfer the secret (decrypted) to desired location such as hardware wallet, power washed chromebook (via SD card) etc.

  14. Shut down the air gapped machine

  15. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  16. Insert object(s) into plastic sealing bag

  17. Fill bag with enough plastic beads that most of the object is surrounded

  18. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  19. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  20. Date and sign the polaroid photographs and store them in a local lock box

  21. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Encrypt Wallet to Namespace Key

Procedure for importing an arbitrary secret (raw key, mnemonic, state secrets) into a Namespace.

Requirements

Procedure

  1. Access machine which has the secret that should be encrypted available

    • If not on a computer, but a hardware wallet or otherwise, perform the steps on a air-gapped machine
  2. Encrypt the secret to certificate:

    • sq encrypt --without-signature --for-file <certificate> <file_to_encrypt> --output encrypted.asc
  3. Once encrypted, name the file appropriately and add it to an artifacts/ directory in the appropriate namespace subdirectory in the vaults repository

  4. Connect SD card to online linux workstation

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. If the ~/vaults/ repository already exists, ensure it doesn't have any changes that haven't been committed, then remove it using sudo rm -rf ~/vaults before re-running the previous step

  7. Copy the repository with updated files to an online linux workstation, sign, commit and push to the vaults repository:

    $ cp -r /media/vaults ~/vaults/
    $ cd ~/vaults
    $ git add .
    $ git commit -S -m "<message>"
    $ git push origin HEAD
    

Export Namespace Mnemonic

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • SD Card Pack

  • Ceremony SD Card

  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

  6. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  7. Boot the computer

  8. Unplug the AirgapOS SD card and place it in High Visibility Storage

  9. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  10. Recover the mnemonic from an existing shardfile

    • keyfork shard combine /media/vaults/<namespace>/shardfile.asc | keyfork-mnemonic-from-seed > mnemonic.txt
  11. Follow on screen prompts

  12. Unplug the Ceremony SD card and place it in High Visibility Storage

  13. Unseal the SD Card Pack

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  14. Put the mnemonic on an SD card for transport or use cat command to output it in the terminal for entry into a hardware wallet or otherwise

    • WARNING: if displaying on screen, ensure nothing else can see the mnemonic. It is recommended to cover the operator and the machine with a blanket to obstruct the view of the screen.
  15. Shut down the air gapped machine

  16. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  17. Insert object(s) into plastic sealing bag

  18. Fill bag with enough plastic beads that most of the object is surrounded

  19. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  20. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  21. Date and sign the polaroid photographs and store them in a local lock box

  22. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Solana: Generate Address

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Offline Machine: Generate Address

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Turn on air-gapped machine

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Copy the vaults repository to the machine and switch to it

    $ cp -r /media/vaults /root/
    $ cd /root/vaults
    
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon <namespace>/shardfile.asc
    
    • Follow on screen prompts
  7. If the desired <coin> directory doesn't exist for the namespace, create it:

    $ mkdir -p <namespace>/<coin>
    
  8. Connect to the appropriate coin directory:

    $ cd <namespace>/<coin>/
    
  9. Check what the latest address account is:

    $ ls -la .
    
  10. Find what the latest number for the address is, and add 1 to it. This will be the new address account.

    • For example if the latest address file is 42, the new account_id would be 43. The addresses should start at 0

    • Set an environment variable with the new account_id:

      $ account_id=<num>
      
  11. Generate a new address:

    $ icepick workflow sol generate-address --account $account_id > $account_id.json
    
  12. Sign the file using:

    • Import OpenPGP keys:

      • gpg --import /media/vaults/keys/all/*.asc
    • gpg --detach-sign $account_id.json

  13. You may repeat the previous steps, starting at the step where the account_id is set.

  14. Once finished, copy the updated repository back to the Ceremony SD card:

    • cp -rf /root/vaults /media/
  15. Shut down the air gapped machine

  16. Unplug the Ceremony SD card and place it into High Visibility Storage

Online Machine: Generate Nonce Account

  1. Turn on online machine

  2. Retrieve the Ceremony SD card from High Visibility Storage and plug it into the computer

  3. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  4. Copy the vaults repository from the Ceremony SD card:

    $ cp -r /media/vaults ~/
    
    • If the ~/vaults/ repository already exists, ensure it doesn't have any changes that haven't been committed, then remove it using sudo rm -rf ~/vaults before re-running the previous step
  5. Ensure icepick is available on system

  6. Change directory into the desired <namespace>/<coin> directory:

    $ cd ~/vaults/<namespace>/<coin>
    
  7. Select which account you are creating the delegate address by viewing the appropriate <namespace>/<coin>/ directory:

    $ ls -la .
    
  8. Once you have selected the appropriate account, set the account_id variable:

    $ account_id=<num>
    
  9. Use icepick to generate nonce account:

    • If using a non-mainnet-beta cluster, be sure to provide the --cluster argument

    • Set icepick config file:

    $ export ICEPICK_CONFIG_FILE=<path_to_icepick_repositry>/icepick.toml`
    
    $ icepick workflow sol generate-nonce-account --input-file $account_id.json > $account_id-na.json
    
    • Repeat command if returned message is "The transaction was possibly not received by the cluster."
  10. Fund the wallet displayed on-screen with 0.01 SOL

    • Once the funding is done, the nonce account will be created
  11. Stage, commit, sign and push the changes:

    $ git add .
    $ git commit -m -S "<message>"
    $ git push origin HEAD
    

Sealing

  1. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  2. Insert object(s) into plastic sealing bag

  3. Fill bag with enough plastic beads that most of the object is surrounded

  4. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  5. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  6. Date and sign the polaroid photographs and store them in a local lock box

  7. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Solana: Sign and Broadcast Transaction

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Online Machine: Acquire Nonce

  1. Turn on online linux workstation

  2. Retrieve the Ceremony SD card from High Visibility Storage and plug it into the computer

  3. Get the nonce address for the address you are sending from by checking the appropriate <namespace>/<coin>/ directory.

    • e.g vaults/<namespace>/<coin>/0-na.txt

    • Set the nonce address variable:

    $ nonce_address="$(cat vaults/<namespace>/<coin>/<account_id>-na.txt)"
    
  4. Set ICEPICK_DATA_DIRECTORY:

    Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
    $ export ICEPICK_DATA_DIRECTORY=/media/external/
    
  5. set ICEPICK_CONFIG_FILE

    $ export ICEPICK_CONFIG_FILE=<path_to_icepick_repo>/icepick.toml`
    
  6. Run the command:

    $ icepick workflow sol broadcast --nonce-address=$nonce_address
    
    • Await completion message before removing Ceremony SD card

    • This command will set the computer into "awaiting mode", which will broadcast the signed transaction from the SD card once it's plugged back in after the workflow payloads are signed on the offline machine

Offline Machine: Create and Sign Transaction

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Boot the computer

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon /media/<device_name>/vaults/<namespace>/shardfile.asc
    
    • The Shardfile may be named something else. Use find /media/<device_name>/vaults -type f -name '*shardfile*.asc' to list all files.
  7. Follow on screen prompts

  8. Set ICEPICK_DATA_DIRECTORY:

    $ export ICEPICK_DATA_DIRECTORY=/media/<device_name>
    
  9. Run the icepick command with the transaction payload

    • The payload is located in the appropriate vault location (e.g /media/<device_name>/vaults//ceremonies/...)
    $ icepick workflow --run-quorum <payload>.json --shardfile /media/<device_name>/vaults/<namespace>/shardfile.asc
    
    • Follow on screen prompts
  10. Unplug the Ceremony SD card and place it in High Visibility Storage

Broadcast Transaction: Online Machine

  1. Retrieve Ceremony SD from High Visibility Storage and plug it into online machine

  2. The still running broadcast command on the online machine will broadcast the transaction automatically

  3. The url that's found in the response after a successful broadcast should be reviewed and committed to the ceremony repository

  4. Remove the transaction files in ICEPICK_DATA_DIRECTORY

    $ rm $ICEPICK_DATA_DIRECTORY/transaction.json
    $ rm $ICEPICK_DATA_DIRECTORY/nonce.json
    
  5. Unplug the Ceremony SD card and place it in High Visibility Storage

Repeat

  1. You may repeat previous steps as many times as necessary to process all workflow payloads

Finalization

  1. Shut down online machine

  2. Shut down the air gapped machine

Sealing

  1. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  2. Insert object(s) into plastic sealing bag

  3. Fill bag with enough plastic beads that most of the object is surrounded

  4. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  5. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  6. Date and sign the polaroid photographs and store them in a local lock box

  7. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Pyth: Generate Address

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Offline Machine: Generate Address

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Turn on air-gapped machine

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Copy the vaults repository to the machine and switch to it

    $ cp -r /media/vaults /root/
    $ cd /root/vaults
    
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon <namespace>/shardfile.asc
    
    • Follow on screen prompts
  7. If the desired <coin> directory doesn't exist for the namespace, create it:

    $ mkdir -p <namespace>/<coin>
    
  8. Connect to the appropriate coin directory:

    $ cd <namespace>/<coin>/
    
  9. Check what the latest address account is:

    $ ls -la .
    
  10. Find what the latest number for the address is, and add 1 to it. This will be the new address account.

    • For example if the latest address file is 42, the new account_id would be 43. The addresses should start at 0

    • Set an environment variable with the new account_id:

      $ account_id=<num>
      
  11. Generate a new address:

    $ icepick workflow sol generate-address --account $account_id > $account_id.json
    
  12. Sign the file using:

    • Import OpenPGP keys:

      • gpg --import /media/vaults/keys/all/*.asc
    • gpg --detach-sign $account_id.json

  13. You may repeat the previous steps, starting at the step where the account_id is set.

  14. Once finished, copy the updated repository back to the Ceremony SD card:

    • cp -rf /root/vaults /media/
  15. Shut down the air gapped machine

  16. Unplug the Ceremony SD card and place it into High Visibility Storage

Online Machine: Generate Nonce Account

  1. Turn on online machine

  2. Retrieve the Ceremony SD card from High Visibility Storage and plug it into the computer

  3. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  4. Copy the vaults repository from the Ceremony SD card:

    $ cp -r /media/vaults ~/
    
    • If the ~/vaults/ repository already exists, ensure it doesn't have any changes that haven't been committed, then remove it using sudo rm -rf ~/vaults before re-running the previous step
  5. Ensure icepick is available on system

  6. Change directory into the desired <namespace>/<coin> directory:

    $ cd ~/vaults/<namespace>/<coin>
    
  7. Select which account you are creating the delegate address by viewing the appropriate <namespace>/<coin>/ directory:

    $ ls -la .
    
  8. Once you have selected the appropriate account, set the account_id variable:

    $ account_id=<num>
    
  9. Use icepick to generate nonce account:

    • If using a non-mainnet-beta cluster, be sure to provide the --cluster argument

    • Set icepick config file:

    $ export ICEPICK_CONFIG_FILE=<path_to_icepick_repositry>/icepick.toml`
    
    $ icepick workflow sol generate-nonce-account --input-file $account_id.json > $account_id-na.json
    
    • Repeat command if returned message is "The transaction was possibly not received by the cluster."
  10. Fund the wallet displayed on-screen with 0.01 SOL

    • Once the funding is done, the nonce account will be created
  11. Stage, commit, sign and push the changes:

    $ git add .
    $ git commit -m -S "<message>"
    $ git push origin HEAD
    

Sealing

  1. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  2. Insert object(s) into plastic sealing bag

  3. Fill bag with enough plastic beads that most of the object is surrounded

  4. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  5. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  6. Date and sign the polaroid photographs and store them in a local lock box

  7. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Sign and Broadcast Transaction

Cosmos: Generate Address

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Offline Machine: Generate Address

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Turn on air-gapped machine

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Copy the vaults repository to the machine and switch to it

    $ cp -r /media/vaults /root/
    $ cd /root/vaults
    
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon <namespace>/shardfile.asc
    
    • Follow on screen prompts
  7. If the desired <coin> directory doesn't exist for the namespace, create it:

    $ mkdir -p <namespace>/<coin>
    
  8. Connect to the appropriate coin directory:

    $ cd <namespace>/<coin>/
    
  9. Check what the latest address account is:

    $ ls -la .
    
  10. Find what the latest number for the address is, and add 1 to it. This will be the new address account.

    • For example if the latest address file is 42, the new account_id would be 43. The addresses should start at 0

    • Set an environment variable with the new account_id:

      $ account_id=<num>
      
  11. Generate a new address:

    • icepick workflow cosmos generate-address --chain-name <chain-name> --account $account_id > $account_id.json
  12. Sign the file using:

    • Import OpenPGP keys:

      • gpg --import /media/vaults/keys/all/*.asc
    • gpg --detach-sign $account_id.json

  13. You may repeat the previous steps, starting at the step where the account_id is set.

  14. Once finished, copy the updated repository back to the Ceremony SD card:

    • cp -rf /root/vaults /media/
  15. Shut down the air gapped machine

  16. Unplug the Ceremony SD card and place it into High Visibility Storage

Online Machine: Updating Vaults Repository

  1. Turn on online linux workstation

  2. Connect SD card to online linux workstation

  3. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  4. If the ~/vaults/ repository already exists, ensure it doesn't have any changes that haven't been committed, then remove it using sudo rm -rf ~/vaults before re-running the previous step

  5. Copy the repository with updated files to an online linux workstation, sign, commit and push to the vaults repository:

    $ cp -r /media/vaults ~/vaults/
    $ cd ~/vaults
    $ git add .
    $ git commit -S -m "<message>"
    $ git push origin HEAD
    

Solana: Sign and Broadcast Transaction

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Online Machine: Acquire Nonce

  1. Turn on online linux workstation

  2. Retrieve the Ceremony SD card from High Visibility Storage and plug it into the computer

  3. Get the nonce address for the address you are sending from by checking the appropriate <namespace>/<coin>/ directory.

    • e.g vaults/<namespace>/<coin>/0-na.txt

    • Set the nonce address variable:

    $ nonce_address="$(cat vaults/<namespace>/<coin>/<account_id>-na.txt)"
    
  4. Set ICEPICK_DATA_DIRECTORY:

    Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
    $ export ICEPICK_DATA_DIRECTORY=/media/external/
    
  5. set ICEPICK_CONFIG_FILE

    $ export ICEPICK_CONFIG_FILE=<path_to_icepick_repo>/icepick.toml`
    
  6. Run the command:

    $ icepick workflow cosmos broadcast --chain-name <chain-name> --nonce-address=$nonce_address
    
    • Await completion message before removing Ceremony SD card

    • This command will set the computer into "awaiting mode", which will broadcast the signed transaction from the SD card once it's plugged back in after the workflow payloads are signed on the offline machine

Offline Machine: Create and Sign Transaction

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Boot the computer

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon /media/<device_name>/vaults/<namespace>/shardfile.asc
    
    • The Shardfile may be named something else. Use find /media/<device_name>/vaults -type f -name '*shardfile*.asc' to list all files.
  7. Follow on screen prompts

  8. Set ICEPICK_DATA_DIRECTORY:

    $ export ICEPICK_DATA_DIRECTORY=/media/<device_name>
    
  9. Run the icepick command with the transaction payload

    • The payload is located in the appropriate vault location (e.g /media/<device_name>/vaults//ceremonies/...)
    $ icepick workflow --run-quorum <payload>.json --shardfile /media/<device_name>/vaults/<namespace>/shardfile.asc
    
    • Follow on screen prompts
  10. Unplug the Ceremony SD card and place it in High Visibility Storage

Broadcast Transaction: Online Machine

  1. Retrieve Ceremony SD from High Visibility Storage and plug it into online machine

  2. The still running broadcast command on the online machine will broadcast the transaction automatically

  3. The url that's found in the response after a successful broadcast should be reviewed and committed to the ceremony repository

  4. Remove the transaction files in ICEPICK_DATA_DIRECTORY

    $ rm $ICEPICK_DATA_DIRECTORY/transaction.json
    $ rm $ICEPICK_DATA_DIRECTORY/account_info.json
    
  5. Unplug the Ceremony SD card and place it in High Visibility Storage

Repeat

  1. You may repeat previous steps as many times as necessary to process all workflow payloads

Finalization

  1. Shut down online linux workstation

  2. Shut down the air gapped machine

Sealing

  1. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  2. Insert object(s) into plastic sealing bag

  3. Fill bag with enough plastic beads that most of the object is surrounded

  4. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  5. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  6. Date and sign the polaroid photographs and store them in a local lock box

  7. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Kyve: Generate Address

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Offline Machine: Generate Address

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Turn on air-gapped machine

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Copy the vaults repository to the machine and switch to it

    $ cp -r /media/vaults /root/
    $ cd /root/vaults
    
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon <namespace>/shardfile.asc
    
    • Follow on screen prompts
  7. If the desired <coin> directory doesn't exist for the namespace, create it:

    $ mkdir -p <namespace>/<coin>
    
  8. Connect to the appropriate coin directory:

    $ cd <namespace>/<coin>/
    
  9. Check what the latest address account is:

    $ ls -la .
    
  10. Find what the latest number for the address is, and add 1 to it. This will be the new address account.

    • For example if the latest address file is 42, the new account_id would be 43. The addresses should start at 0

    • Set an environment variable with the new account_id:

      $ account_id=<num>
      
  11. Generate a new address:

    • icepick workflow cosmos generate-address --chain-name kyve --account $account_id > $account_id.json

    The option --chain-name can use kyve, kaon (testnet), and korellia (devnet)

  12. Sign the file using:

    • Import OpenPGP keys:

      • gpg --import /media/vaults/keys/all/*.asc
    • gpg --detach-sign $account_id.json

  13. You may repeat the previous steps, starting at the step where the account_id is set.

  14. Once finished, copy the updated repository back to the Ceremony SD card:

    • cp -rf /root/vaults /media/
  15. Shut down the air gapped machine

  16. Unplug the Ceremony SD card and place it into High Visibility Storage

Online Machine: Updating Vaults Repository

  1. Turn on online linux workstation

  2. Connect SD card to online linux workstation

  3. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  4. If the ~/vaults/ repository already exists, ensure it doesn't have any changes that haven't been committed, then remove it using sudo rm -rf ~/vaults before re-running the previous step

  5. Copy the repository with updated files to an online linux workstation, sign, commit and push to the vaults repository:

    $ cp -r /media/vaults ~/vaults/
    $ cd ~/vaults
    $ git add .
    $ git commit -S -m "<message>"
    $ git push origin HEAD
    

Kyve: Sign and Broadcast Transaction

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Online Machine: Acquire Nonce

  1. Turn on online linux workstation

  2. Retrieve the Ceremony SD card from High Visibility Storage and plug it into the computer

  3. Get the nonce address for the address you are sending from by checking the appropriate <namespace>/<coin>/ directory.

    • e.g vaults/<namespace>/<coin>/0-na.txt

    • Set the nonce address variable:

    $ nonce_address="$(cat vaults/<namespace>/<coin>/<account_id>-na.txt)"
    
  4. Set ICEPICK_DATA_DIRECTORY:

    Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
    $ export ICEPICK_DATA_DIRECTORY=/media/external/
    
  5. set ICEPICK_CONFIG_FILE

    $ export ICEPICK_CONFIG_FILE=<path_to_icepick_repo>/icepick.toml`
    
  6. Run the command:

    $ icepick workflow cosmos broadcast --chain-name kyve  --nonce-address=$nonce_address
    

    The option --chain-name can use kyve, kaon (testnet), and korellia (devnet)

    • Await completion message before removing Ceremony SD card

    • This command will set the computer into "awaiting mode", which will broadcast the signed transaction from the SD card once it's plugged back in after the workflow payloads are signed on the offline machine

Offline Machine: Create and Sign Transaction

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Boot the computer

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon /media/<device_name>/vaults/<namespace>/shardfile.asc
    
    • The Shardfile may be named something else. Use find /media/<device_name>/vaults -type f -name '*shardfile*.asc' to list all files.
  7. Follow on screen prompts

  8. Set ICEPICK_DATA_DIRECTORY:

    $ export ICEPICK_DATA_DIRECTORY=/media/<device_name>
    
  9. Run the icepick command with the transaction payload

    • The payload is located in the appropriate vault location (e.g /media/<device_name>/vaults//ceremonies/...)
    $ icepick workflow --run-quorum <payload>.json --shardfile /media/<device_name>/vaults/<namespace>/shardfile.asc
    
    • Follow on screen prompts
  10. Unplug the Ceremony SD card and place it in High Visibility Storage

Broadcast Transaction: Online Machine

  1. Retrieve Ceremony SD from High Visibility Storage and plug it into online machine

  2. The still running broadcast command on the online machine will broadcast the transaction automatically

  3. The url that's found in the response after a successful broadcast should be reviewed and committed to the ceremony repository

  4. Remove the transaction files in ICEPICK_DATA_DIRECTORY

    $ rm $ICEPICK_DATA_DIRECTORY/transaction.json
    $ rm $ICEPICK_DATA_DIRECTORY/account_info.json
    
  5. Unplug the Ceremony SD card and place it in High Visibility Storage

Repeat

  1. You may repeat previous steps as many times as necessary to process all workflow payloads

Finalization

  1. Shut down online linux workstation

  2. Shut down the air gapped machine

Sealing

  1. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  2. Insert object(s) into plastic sealing bag

  3. Fill bag with enough plastic beads that most of the object is surrounded

  4. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  5. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  6. Date and sign the polaroid photographs and store them in a local lock box

  7. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.

Seda: Generate Address

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Offline Machine: Generate Address

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Turn on air-gapped machine

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Copy the vaults repository to the machine and switch to it

    $ cp -r /media/vaults /root/
    $ cd /root/vaults
    
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon <namespace>/shardfile.asc
    
    • Follow on screen prompts
  7. If the desired <coin> directory doesn't exist for the namespace, create it:

    $ mkdir -p <namespace>/<coin>
    
  8. Connect to the appropriate coin directory:

    $ cd <namespace>/<coin>/
    
  9. Check what the latest address account is:

    $ ls -la .
    
  10. Find what the latest number for the address is, and add 1 to it. This will be the new address account.

    • For example if the latest address file is 42, the new account_id would be 43. The addresses should start at 0

    • Set an environment variable with the new account_id:

      $ account_id=<num>
      
  11. Generate a new address:

    • icepick workflow cosmos generate-address --chain-name seda --account $account_id > $account_id.json

    The option --chain-name can use seda or seda-devnet.

  12. Sign the file using:

    • Import OpenPGP keys:

      • gpg --import /media/vaults/keys/all/*.asc
    • gpg --detach-sign $account_id.json

  13. You may repeat the previous steps, starting at the step where the account_id is set.

  14. Once finished, copy the updated repository back to the Ceremony SD card:

    • cp -rf /root/vaults /media/
  15. Shut down the air gapped machine

  16. Unplug the Ceremony SD card and place it into High Visibility Storage

Online Machine: Updating Vaults Repository

  1. Turn on online linux workstation

  2. Connect SD card to online linux workstation

  3. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  4. If the ~/vaults/ repository already exists, ensure it doesn't have any changes that haven't been committed, then remove it using sudo rm -rf ~/vaults before re-running the previous step

  5. Copy the repository with updated files to an online linux workstation, sign, commit and push to the vaults repository:

    $ cp -r /media/vaults ~/vaults/
    $ cd ~/vaults
    $ git add .
    $ git commit -S -m "<message>"
    $ git push origin HEAD
    

Seda: Sign and Broadcast Transaction

Requirements

  • For ALL tamper proofed hardware used in the ceremony, both operators MUST print photographic evidence from digital cameras which is stored in a PGP signed repository. The photographs should be of the top and underside of the vacuum sealed object.

    • The operators should verify the commit signatures of the photographs they are printing against a list of permitted PGP keys found in the "ceremonies" repo
  • AirgapOS SD card

  • AirgapOS Laptop

  • Minimum of 1 Operator and 1 Witness

  • Tamper-proofing equipment

  • Linux Workstation (online machine)

    • Any internet connected computer with a Linux shell will suffice
  • High Visibility Storage: plastic container or bag that's used to keep items while not in use in a visible location like the middle of a desk.

  • Quorum PGP key pairs

  • Ceremony SD card

Procedure

  1. Enter the designated location with the quorum of operators and all required equipment

  2. Lock access to the location - there should be no inflow or outflow of people during the ceremony

  3. Place Ceremony SD card in High Visibility Storage

  4. Retrieve sealed Air-Gapped bundle, polaroid of tamper evidence, and online laptop from locked storage

    a. Retrieve digital/physical photographs of both sides of sealed bundle

    b. Compare all photographs to object for differences

    c. Proceed with unsealing the object if no differences are detected

  5. Place all contents except for the laptop into High Visibility Storage

Online Machine: Acquire Nonce

  1. Turn on online linux workstation

  2. Retrieve the Ceremony SD card from High Visibility Storage and plug it into the computer

  3. Get the nonce address for the address you are sending from by checking the appropriate <namespace>/<coin>/ directory.

    • e.g vaults/<namespace>/<coin>/0-na.txt

    • Set the nonce address variable:

    $ nonce_address="$(cat vaults/<namespace>/<coin>/<account_id>-na.txt)"
    
  4. Set ICEPICK_DATA_DIRECTORY:

    Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
    $ export ICEPICK_DATA_DIRECTORY=/media/external/
    
  5. set ICEPICK_CONFIG_FILE

    $ export ICEPICK_CONFIG_FILE=<path_to_icepick_repo>/icepick.toml`
    
  6. Run the command:

    $ icepick workflow cosmos broadcast --chain-name seda  --nonce-address=$nonce_address
    

    The option --chain-name can use seda or seda-devnet.

    • Await completion message before removing Ceremony SD card

    • This command will set the computer into "awaiting mode", which will broadcast the signed transaction from the SD card once it's plugged back in after the workflow payloads are signed on the offline machine

Offline Machine: Create and Sign Transaction

  1. Retrieve AirgapOS SD card and plug it into the air-gapped machine

  2. Boot the computer

  3. Unplug the AirgapOS SD card and place it in High Visibility Storage

  4. Retrieve Ceremony SD card from High Visibility Storage and plug it into the air-gapped machine

  5. Look for your SD card device name (<device_name>) in the output of the lsblk command. It will typically be listed as /dev/sdX or /dev/mmcblk<num>, where X is a letter (e.g., /dev/sdb, /dev/sdc). You can identify it by its size or by checking if it has a partition (like /dev/sdX1)

    • Mount the device using: sudo mount /dev/<your_device> /media
  6. Start Keyfork using the relevant Shardfile:

    $ keyfork recover shard --daemon /media/<device_name>/vaults/<namespace>/shardfile.asc
    
    • The Shardfile may be named something else. Use find /media/<device_name>/vaults -type f -name '*shardfile*.asc' to list all files.
  7. Follow on screen prompts

  8. Set ICEPICK_DATA_DIRECTORY:

    $ export ICEPICK_DATA_DIRECTORY=/media/<device_name>
    
  9. Run the icepick command with the transaction payload

    • The payload is located in the appropriate vault location (e.g /media/<device_name>/vaults//ceremonies/...)
    $ icepick workflow --run-quorum <payload>.json --shardfile /media/<device_name>/vaults/<namespace>/shardfile.asc
    
    • Follow on screen prompts
  10. Unplug the Ceremony SD card and place it in High Visibility Storage

Broadcast Transaction: Online Machine

  1. Retrieve Ceremony SD from High Visibility Storage and plug it into online machine

  2. The still running broadcast command on the online machine will broadcast the transaction automatically

  3. The url that's found in the response after a successful broadcast should be reviewed and committed to the ceremony repository

  4. Remove the transaction files in ICEPICK_DATA_DIRECTORY

    $ rm $ICEPICK_DATA_DIRECTORY/transaction.json
    $ rm $ICEPICK_DATA_DIRECTORY/account_info.json
    
  5. Unplug the Ceremony SD card and place it in High Visibility Storage

Repeat

  1. You may repeat previous steps as many times as necessary to process all workflow payloads

Finalization

  1. Shut down online linux workstation

  2. Shut down the air gapped machine

Sealing

  1. Gather all the original items that were in the air-gapped bundle:

    • Air-gapped computer

    • AirgapOS SD card

  2. Insert object(s) into plastic sealing bag

  3. Fill bag with enough plastic beads that most of the object is surrounded

  4. Use vacuum sealer to remove air from the bag until the beads are no longer able to move

  5. Take photographs of both sides of the sealed object using both the digital and polaroid camera

  6. Date and sign the polaroid photographs and store them in a local lock box

  7. Take the SD card to an online connected device, ensuring continued dual custody, and commit the tamper evidence photographs to a repository. If two individuals are present, have one create a PR with a signed commit, and the other do a signed merge commit.