# Code Snippet

This section describes how we use the zkPass SDK in our demo code

#### <mark style="color:orange;">Generate Proof</mark>

```rust
use crate::lib_loader::generate_zkpass_proof;

let zkpass_proof_token = unsafe {
    generate_zkpass_proof(credentials, user_data_tokens, dvr_token)
};
```

This code snippet generates a zkPass proof. It requires 3 parameters:

1. `credentials` : Get yours API key and secret at `https://portal.ssi.id`
2. `user_data_tokens` :  stringified signed users data.
3. `dvr_token` : signed Dvr query.

#### <mark style="color:orange;">Verify Proof</mark>

```rust
use crate::lib_loader::verify_zkpass_proof;
use dvr_types::ExpectedDvrMetadataFfi;

//
// Step 1: Create the expected metadata object.
//
let expected_metadata = ExpectedDvrMetadataFfi {
    ttl: some_ttl,
    dvr: expected_dvr_cstring.as_ptr(),
    user_data_verifying_keys: user_data_requests_slice.as_ptr(),
    user_data_verifying_keys_len: user_data_requests_slice.len() as u64,
};

//
// Step 2: Call verify proof.
//
let result = unsafe {
    verify_zkpass_proof(&service_url, zkvm, zkpass_proof_token, expected_metadata)
};
```

This code snippet verifies a zkPass proof token. Components :

1. `zkpass_proof_token` : check [Generate Proof](#generate-proof) section for more details.
2. `expected_metadata` :  this is the expected metadata of the dvr.
3. `zkvm`: zkvm used to generate proof, currently we only support `r0`.
4. `service_url` : you can use `https://playground-zkpass.ssi.id` , or use your own endpoint if you deploy zkPass on your own server.

#### <mark style="color:orange;">Generate User Data Token</mark>

```rust
use crate::lib_loader::generate_user_data_token;

let user_data_token = unsafe {
    generate_user_data_token(signing_key, &data.to_string())
};
```

This code snippet generate user data token. Components :

1. `signing_key` : a private key used to sign user data.
2. `data` : user data in JSON format.

#### <mark style="color:orange;">Generate DVR Token</mark>

```rust
use crate::lib_loader::generate_query_token;

let dvr_token = unsafe { generate_query_token(signing_key, dvr_data) };
```

This code snippet generate DVR token. Components :

1. `signing_key` : a private key used to sign dvr.
2. `dvr_data` : Dvr data to sign.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gl-docs.gitbook.io/zkpass/zkpass-developers-guide/sdk-tutorial/rust/code-snippet.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
