1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//! # google-cloud-kms
//!
//! Google Cloud Platform Key Management Service Client library.
//!
//! ## Quickstart
//!
//! ### Authentication
//! There are two ways to create a client that is authenticated against the google cloud.
//!
//! #### Automatically
//!
//! The function `with_auth()` will try and read the credentials from a file specified in the environment variable `GOOGLE_APPLICATION_CREDENTIALS`, `GOOGLE_APPLICATION_CREDENTIALS_JSON` or
//! from a metadata server.
//!
//! This is also described in [google-cloud-auth](https://github.com/yoshidan/google-cloud-rust/blob/main/foundation/auth/README.md)
//!
//! ```rust
//! use google_cloud_kms::client::{Client, ClientConfig};
//!
//! async fn run() {
//! let config = ClientConfig::default().with_auth().await.unwrap();
//! let client = Client::new(config);
//! }
//! ```
//!
//! #### Manually
//!
//! When you can't use the `gcloud` authentication but you have a different way to get your credentials (e.g a different environment variable)
//! you can parse your own version of the 'credentials-file' and use it like that:
//!
//! ```rust
//! use google_cloud_auth::credentials::CredentialsFile;
//! // or google_cloud_kms::client::google_cloud_auth::credentials::CredentialsFile
//! use google_cloud_kms::client::{Client, ClientConfig};
//!
//! async fn run(cred: CredentialsFile) {
//! let config = ClientConfig::default().with_credentials(cred).await.unwrap();
//! let client = Client::new(config);
//! }
//! ```
//!
//! ### Usage
//!
//! #### Key ring operations
//!
//! ```
//! use std::collections::HashMap;
//! use prost_types::FieldMask;
//! use google_cloud_googleapis::cloud::kms::v1::{CreateKeyRingRequest, GetKeyRingRequest, ListKeyRingsRequest};
//! use google_cloud_kms::client::{Client, ClientConfig};
//!
//! async fn run(config: ClientConfig) {
//!
//! // Create client
//! let client = Client::new(config).await.unwrap();
//!
//! // Key ring
//! // create
//! match client
//! .create_key_ring(
//! CreateKeyRingRequest {
//! parent: "projects/qovery-gcp-tests/locations/europe-west9".to_string(),
//! key_ring_id: "123-456".to_string(),
//! key_ring: None,
//! },
//! None,
//! )
//! .await
//! {
//! Ok(mut r) => println!("Created key ring {:?}", r),
//! Err(err) => panic!("err: {:?}", err),
//! };
//!
//! // list
//! match client
//! .list_key_rings(
//! ListKeyRingsRequest {
//! parent: "projects/qovery-gcp-tests/locations/europe-west9".to_string(),
//! page_size: 5,
//! page_token: "".to_string(),
//! filter: "".to_string(),
//! order_by: "".to_string(),
//! },
//! None,
//! )
//! .await
//! {
//! Ok(response) => {
//! println!("List key rings");
//! for r in response.key_rings {
//! println!("- {:?}", r);
//! }
//! }
//! Err(err) => panic!("err: {:?}", err),
//! };
//!
//! // get
//! match client
//! .get_key_ring(
//! GetKeyRingRequest {
//! name: "projects/qovery-gcp-tests/locations/europe-west9/keyRings/key-ring-for-documentation"
//! .to_string(),
//! },
//! None,
//! )
//! .await
//! {
//! Ok(response) => {
//! println!("Get keyring: {:?}", response);
//! }
//! Err(err) => panic!("err: {:?}", err),
//! }
//!}
//!```
//!
//! ### Ethereum Integration
//!
//! Enable 'eth' feature.
//! google-cloud-kms = { version="version", features=["eth"] }
//!
//! ```
//! use ethers::prelude::SignerMiddleware;
//! use ethers::providers::{Http, Middleware, Provider};
//! use ethers_core::types::{TransactionReceipt, TransactionRequest};
//! use ethers_signers::Signer as EthSigner;
//! use google_cloud_kms::client::Client;
//! use google_cloud_kms::signer::ethereum::{Error, Signer};
//!
//! pub async fn send_bnb(client: Client, key_name: &str, rpc_node: &str) {
//!
//! // BSC testnet
//! let chain_id = 97;
//!
//! let signer = Signer::new(client, key_name, chain_id, None).await.unwrap();
//! let provider = Provider::<Http>::try_from(rpc_node).unwrap();
//! let signer_address = signer.address();
//!
//! let eth_client = SignerMiddleware::new_with_provider_chain(provider, signer).await.unwrap();
//!
//! let tx = TransactionRequest::new()
//! .to(signer_address)
//! .value(100_000_000_000_000_u128)
//! .gas(1_500_000_u64)
//! .gas_price(4_000_000_000_u64)
//! .chain_id(chain_id);
//!
//! let res = eth_client.send_transaction(tx, None).await.unwrap();
//! let receipt: TransactionReceipt = res.confirmations(3).await.unwrap().unwrap();
//! }
//! ```