Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions backend/rs/ic_vetkeys/src/utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,29 @@ use std::array::TryFromSliceError;
use std::ops::Neg;
use zeroize::{Zeroize, ZeroizeOnDrop};

// These are the production master public keys

const MASTER_PUBLIC_KEY_BYTES_KEY_1 : [u8; 96] = hex!("a9caf9ae8af0c7c7272f8a122133e2e0c7c0899b75e502bda9e109ca8193ded3ef042ed96db1125e1bdaad77d8cc60d917e122fe2501c45b96274f43705edf0cfd455bc66c3c060faa2fcd15486e76351edf91fecb993797273bbc8beaa47404");

const MASTER_PUBLIC_KEY_BYTES_TEST_KEY_1 : [u8; 96] = hex!("ad86e8ff845912f022a0838a502d763fdea547c9948f8cb20ea7738dd52c1c38dcb4c6ca9ac29f9ac690fc5ad7681cb41922b8dffbd65d94bff141f5fb5b6624eccc03bf850f222052df888cf9b1e47203556d7522271cbb879b2ef4b8c2bfb1");

// These are the PocketIC keys

const MASTER_PUBLIC_KEY_BYTES_POCKETIC_KEY_1 : [u8; 96] = hex!("8c800b5cff00463d26e8167369168827f1e48f4d8d60f71dd6a295580f65275b5f5f8e6a792c876b2c72492136530d0710a27522ee63977a76216c3cef9e70bfcb45b88736fc62142e7e0737848ce06cbb1f45a4a6a349b142ae5cf7853561e0");

const MASTER_PUBLIC_KEY_BYTES_POCKETIC_TEST_KEY_1 : [u8; 96] = hex!("9069b82c7aae418cef27678291e7f2cb1a008a500eceba7199bffca12421b07c158987c6a22618af3d1958738b2835691028801f7663d311799733286c557c8979184bb62cb559a4d582fca7d2e48b860f08ed6641aef66a059ec891889a6218");

const MASTER_PUBLIC_KEY_BYTES_POCKETIC_DFX_TEST_KEY : [u8; 96] = hex!("b181c14cf9d04ba45d782c0067a44b0aaa9fc2acf94f1a875f0dae801af4f80339a7e6bf8b09fcf993824c8df3080b3f1409b688ca08cbd44d2cb28db9899f4aa3b5f06b9174240448e10be2f01f9f80079ea5431ce2d11d1c8d1c775333315f");

lazy_static::lazy_static! {
static ref G2PREPARED_NEG_G : G2Prepared = G2Affine::generator().neg().into();

static ref G2_KEY_1: G2Affine = G2Affine::from_compressed(&MASTER_PUBLIC_KEY_BYTES_KEY_1).expect("Hardcoded master public key not a valid point");
static ref G2_TEST_KEY_1: G2Affine = G2Affine::from_compressed(&MASTER_PUBLIC_KEY_BYTES_TEST_KEY_1).expect("Hardcoded master public key not a valid point");

static ref POCKETIC_G2_KEY_1: G2Affine = G2Affine::from_compressed(&MASTER_PUBLIC_KEY_BYTES_POCKETIC_KEY_1).expect("Hardcoded master public key not a valid point");
static ref POCKETIC_G2_TEST_KEY_1: G2Affine = G2Affine::from_compressed(&MASTER_PUBLIC_KEY_BYTES_POCKETIC_TEST_KEY_1).expect("Hardcoded master public key not a valid point");
static ref POCKETIC_G2_DFX_TEST_KEY: G2Affine = G2Affine::from_compressed(&MASTER_PUBLIC_KEY_BYTES_POCKETIC_DFX_TEST_KEY).expect("Hardcoded master public key not a valid point");
}

const G1AFFINE_BYTES: usize = 48; // Size of compressed form
Expand Down Expand Up @@ -228,6 +242,22 @@ impl MasterPublicKey {
}
}

/// Return the hardcoded master public key used on IC
///
/// This allows performing public key derivation offline
///
/// Returns None if the provided key_id is not known
pub fn for_pocketic_key(key_id: &VetKDKeyId) -> Option<Self> {
match (key_id.curve, key_id.name.as_str()) {
(VetKDCurve::Bls12_381_G2, "key_1") => Some(Self::new(*POCKETIC_G2_KEY_1)),
(VetKDCurve::Bls12_381_G2, "test_key_1") => Some(Self::new(*POCKETIC_G2_TEST_KEY_1)),
(VetKDCurve::Bls12_381_G2, "dfx_test_key") => {
Some(Self::new(*POCKETIC_G2_DFX_TEST_KEY))
}
(_, _) => None,
}
}

fn new(point: G2Affine) -> Self {
Self { point }
}
Expand Down Expand Up @@ -928,6 +958,11 @@ impl VrfOutput {
&self.dpk
}

/// Return the proof associated with this VRF output
pub fn proof(&self) -> &VetKey {
&self.proof
}

/// Return the VRF output
///
/// This is a random-looking value which was provably generated by some party with
Expand Down
8 changes: 8 additions & 0 deletions examples/verifiable_nft/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Verifiable NFT Example

An example of generating NFTs that are verifiable: anyone can check
that a particular NFT was generated using VetKD for the seed material.

## Additional Resources

- **[What are VetKeys](https://internetcomputer.org/docs/building-apps/network-features/encryption/vetkeys)** - For more information about VetKeys and VetKD.
Loading
Loading