1use crate::{Error, Keystore, KeystorePtr};
21
22#[cfg(feature = "bandersnatch-experimental")]
23use sp_core::bandersnatch;
24#[cfg(feature = "bls-experimental")]
25use sp_core::{
26 bls381, ecdsa_bls381, proof_of_possession::ProofOfPossessionGenerator, KeccakHasher,
27};
28use sp_core::{
29 crypto::{ByteArray, KeyTypeId, Pair, VrfSecret},
30 ecdsa, ed25519, sr25519,
31};
32
33use parking_lot::RwLock;
34use std::{collections::HashMap, sync::Arc};
35
36#[derive(Default, Clone)]
38pub struct MemoryKeystore {
39 keys: Arc<RwLock<HashMap<KeyTypeId, HashMap<Vec<u8>, String>>>>,
41}
42
43impl MemoryKeystore {
44 pub fn new() -> Self {
46 Self::default()
47 }
48
49 fn pair<T: Pair>(&self, key_type: KeyTypeId, public: &T::Public) -> Option<T> {
53 self.keys.read().get(&key_type).and_then(|inner| {
54 let pair = T::from_string(inner.get(public.as_slice())?, None).ok()?;
55 (pair.public().as_slice() == public.as_slice()).then_some(pair)
56 })
57 }
58
59 fn public_keys<T: Pair>(&self, key_type: KeyTypeId) -> Vec<T::Public> {
60 self.keys
61 .read()
62 .get(&key_type)
63 .map(|keys| {
64 keys.iter()
65 .filter_map(|(raw_pubkey, s)| {
66 let pair = T::from_string(s, None).ok()?;
67 let pubkey = pair.public();
68 (pubkey.as_slice() == raw_pubkey).then_some(pubkey)
69 })
70 .collect()
71 })
72 .unwrap_or_default()
73 }
74
75 fn generate_new<T: Pair>(
76 &self,
77 key_type: KeyTypeId,
78 seed: Option<&str>,
79 ) -> Result<T::Public, Error> {
80 match seed {
81 Some(seed) => {
82 let pair = T::from_string(seed, None)
83 .map_err(|_| Error::ValidationError("Generates a pair.".to_owned()))?;
84 self.keys
85 .write()
86 .entry(key_type)
87 .or_default()
88 .insert(pair.public().to_raw_vec(), seed.into());
89 Ok(pair.public())
90 },
91 None => {
92 let (pair, phrase, _) = T::generate_with_phrase(None);
93 self.keys
94 .write()
95 .entry(key_type)
96 .or_default()
97 .insert(pair.public().to_raw_vec(), phrase);
98 Ok(pair.public())
99 },
100 }
101 }
102
103 fn sign<T: Pair>(
104 &self,
105 key_type: KeyTypeId,
106 public: &T::Public,
107 msg: &[u8],
108 ) -> Result<Option<T::Signature>, Error> {
109 let sig = self.pair::<T>(key_type, public).map(|pair| pair.sign(msg));
110 Ok(sig)
111 }
112
113 fn vrf_sign<T: Pair + VrfSecret>(
114 &self,
115 key_type: KeyTypeId,
116 public: &T::Public,
117 data: &T::VrfSignData,
118 ) -> Result<Option<T::VrfSignature>, Error> {
119 let sig = self.pair::<T>(key_type, public).map(|pair| pair.vrf_sign(data));
120 Ok(sig)
121 }
122
123 fn vrf_pre_output<T: Pair + VrfSecret>(
124 &self,
125 key_type: KeyTypeId,
126 public: &T::Public,
127 input: &T::VrfInput,
128 ) -> Result<Option<T::VrfPreOutput>, Error> {
129 let pre_output = self.pair::<T>(key_type, public).map(|pair| pair.vrf_pre_output(input));
130 Ok(pre_output)
131 }
132
133 #[cfg(feature = "bls-experimental")]
134 fn generate_proof_of_possession<T: Pair + ProofOfPossessionGenerator>(
135 &self,
136 key_type: KeyTypeId,
137 public: &T::Public,
138 owner: &[u8],
139 ) -> Result<Option<T::ProofOfPossession>, Error> {
140 let proof_of_possession = self
141 .pair::<T>(key_type, public)
142 .map(|mut pair| pair.generate_proof_of_possession(owner));
143 Ok(proof_of_possession)
144 }
145}
146
147impl Keystore for MemoryKeystore {
148 fn sr25519_public_keys(&self, key_type: KeyTypeId) -> Vec<sr25519::Public> {
149 self.public_keys::<sr25519::Pair>(key_type)
150 }
151
152 fn sr25519_generate_new(
153 &self,
154 key_type: KeyTypeId,
155 seed: Option<&str>,
156 ) -> Result<sr25519::Public, Error> {
157 self.generate_new::<sr25519::Pair>(key_type, seed)
158 }
159
160 fn sr25519_sign(
161 &self,
162 key_type: KeyTypeId,
163 public: &sr25519::Public,
164 msg: &[u8],
165 ) -> Result<Option<sr25519::Signature>, Error> {
166 self.sign::<sr25519::Pair>(key_type, public, msg)
167 }
168
169 fn sr25519_vrf_sign(
170 &self,
171 key_type: KeyTypeId,
172 public: &sr25519::Public,
173 data: &sr25519::vrf::VrfSignData,
174 ) -> Result<Option<sr25519::vrf::VrfSignature>, Error> {
175 self.vrf_sign::<sr25519::Pair>(key_type, public, data)
176 }
177
178 fn sr25519_vrf_pre_output(
179 &self,
180 key_type: KeyTypeId,
181 public: &sr25519::Public,
182 input: &sr25519::vrf::VrfInput,
183 ) -> Result<Option<sr25519::vrf::VrfPreOutput>, Error> {
184 self.vrf_pre_output::<sr25519::Pair>(key_type, public, input)
185 }
186
187 fn ed25519_public_keys(&self, key_type: KeyTypeId) -> Vec<ed25519::Public> {
188 self.public_keys::<ed25519::Pair>(key_type)
189 }
190
191 fn ed25519_generate_new(
192 &self,
193 key_type: KeyTypeId,
194 seed: Option<&str>,
195 ) -> Result<ed25519::Public, Error> {
196 self.generate_new::<ed25519::Pair>(key_type, seed)
197 }
198
199 fn ed25519_sign(
200 &self,
201 key_type: KeyTypeId,
202 public: &ed25519::Public,
203 msg: &[u8],
204 ) -> Result<Option<ed25519::Signature>, Error> {
205 self.sign::<ed25519::Pair>(key_type, public, msg)
206 }
207
208 fn ecdsa_public_keys(&self, key_type: KeyTypeId) -> Vec<ecdsa::Public> {
209 self.public_keys::<ecdsa::Pair>(key_type)
210 }
211
212 fn ecdsa_generate_new(
213 &self,
214 key_type: KeyTypeId,
215 seed: Option<&str>,
216 ) -> Result<ecdsa::Public, Error> {
217 self.generate_new::<ecdsa::Pair>(key_type, seed)
218 }
219
220 fn ecdsa_sign(
221 &self,
222 key_type: KeyTypeId,
223 public: &ecdsa::Public,
224 msg: &[u8],
225 ) -> Result<Option<ecdsa::Signature>, Error> {
226 self.sign::<ecdsa::Pair>(key_type, public, msg)
227 }
228
229 fn ecdsa_sign_prehashed(
230 &self,
231 key_type: KeyTypeId,
232 public: &ecdsa::Public,
233 msg: &[u8; 32],
234 ) -> Result<Option<ecdsa::Signature>, Error> {
235 let sig = self.pair::<ecdsa::Pair>(key_type, public).map(|pair| pair.sign_prehashed(msg));
236 Ok(sig)
237 }
238
239 #[cfg(feature = "bandersnatch-experimental")]
240 fn bandersnatch_public_keys(&self, key_type: KeyTypeId) -> Vec<bandersnatch::Public> {
241 self.public_keys::<bandersnatch::Pair>(key_type)
242 }
243
244 #[cfg(feature = "bandersnatch-experimental")]
245 fn bandersnatch_generate_new(
246 &self,
247 key_type: KeyTypeId,
248 seed: Option<&str>,
249 ) -> Result<bandersnatch::Public, Error> {
250 self.generate_new::<bandersnatch::Pair>(key_type, seed)
251 }
252
253 #[cfg(feature = "bandersnatch-experimental")]
254 fn bandersnatch_sign(
255 &self,
256 key_type: KeyTypeId,
257 public: &bandersnatch::Public,
258 msg: &[u8],
259 ) -> Result<Option<bandersnatch::Signature>, Error> {
260 self.sign::<bandersnatch::Pair>(key_type, public, msg)
261 }
262
263 #[cfg(feature = "bandersnatch-experimental")]
264 fn bandersnatch_vrf_sign(
265 &self,
266 key_type: KeyTypeId,
267 public: &bandersnatch::Public,
268 data: &bandersnatch::vrf::VrfSignData,
269 ) -> Result<Option<bandersnatch::vrf::VrfSignature>, Error> {
270 self.vrf_sign::<bandersnatch::Pair>(key_type, public, data)
271 }
272
273 #[cfg(feature = "bandersnatch-experimental")]
274 fn bandersnatch_ring_vrf_sign(
275 &self,
276 key_type: KeyTypeId,
277 public: &bandersnatch::Public,
278 data: &bandersnatch::vrf::VrfSignData,
279 prover: &bandersnatch::ring_vrf::RingProver,
280 ) -> Result<Option<bandersnatch::ring_vrf::RingVrfSignature>, Error> {
281 let sig = self
282 .pair::<bandersnatch::Pair>(key_type, public)
283 .map(|pair| pair.ring_vrf_sign(data, prover));
284 Ok(sig)
285 }
286
287 #[cfg(feature = "bandersnatch-experimental")]
288 fn bandersnatch_vrf_pre_output(
289 &self,
290 key_type: KeyTypeId,
291 public: &bandersnatch::Public,
292 input: &bandersnatch::vrf::VrfInput,
293 ) -> Result<Option<bandersnatch::vrf::VrfPreOutput>, Error> {
294 self.vrf_pre_output::<bandersnatch::Pair>(key_type, public, input)
295 }
296
297 #[cfg(feature = "bls-experimental")]
298 fn bls381_public_keys(&self, key_type: KeyTypeId) -> Vec<bls381::Public> {
299 self.public_keys::<bls381::Pair>(key_type)
300 }
301
302 #[cfg(feature = "bls-experimental")]
303 fn bls381_generate_new(
304 &self,
305 key_type: KeyTypeId,
306 seed: Option<&str>,
307 ) -> Result<bls381::Public, Error> {
308 self.generate_new::<bls381::Pair>(key_type, seed)
309 }
310
311 #[cfg(feature = "bls-experimental")]
312 fn bls381_sign(
313 &self,
314 key_type: KeyTypeId,
315 public: &bls381::Public,
316 msg: &[u8],
317 ) -> Result<Option<bls381::Signature>, Error> {
318 self.sign::<bls381::Pair>(key_type, public, msg)
319 }
320
321 #[cfg(feature = "bls-experimental")]
322 fn bls381_generate_proof_of_possession(
323 &self,
324 key_type: KeyTypeId,
325 public: &bls381::Public,
326 owner: &[u8],
327 ) -> Result<Option<bls381::ProofOfPossession>, Error> {
328 self.generate_proof_of_possession::<bls381::Pair>(key_type, public, owner)
329 }
330
331 #[cfg(feature = "bls-experimental")]
332 fn ecdsa_bls381_public_keys(&self, key_type: KeyTypeId) -> Vec<ecdsa_bls381::Public> {
333 self.public_keys::<ecdsa_bls381::Pair>(key_type)
334 }
335
336 #[cfg(feature = "bls-experimental")]
337 fn ecdsa_bls381_generate_new(
338 &self,
339 key_type: KeyTypeId,
340 seed: Option<&str>,
341 ) -> Result<ecdsa_bls381::Public, Error> {
342 let pubkey = self.generate_new::<ecdsa_bls381::Pair>(key_type, seed)?;
343
344 let s: String = self
345 .keys
346 .read()
347 .get(&key_type)
348 .and_then(|inner| inner.get(pubkey.as_slice()).map(|s| s.to_string()))
349 .expect("Can Retrieve Seed");
350
351 self.generate_new::<ecdsa::Pair>(key_type, Some(&s))
355 .expect("seed slice is valid");
356 self.generate_new::<bls381::Pair>(key_type, Some(&s))
357 .expect("seed slice is valid");
358
359 Ok(pubkey)
360 }
361
362 #[cfg(feature = "bls-experimental")]
363 fn ecdsa_bls381_sign(
364 &self,
365 key_type: KeyTypeId,
366 public: &ecdsa_bls381::Public,
367 msg: &[u8],
368 ) -> Result<Option<ecdsa_bls381::Signature>, Error> {
369 self.sign::<ecdsa_bls381::Pair>(key_type, public, msg)
370 }
371
372 #[cfg(feature = "bls-experimental")]
373 fn ecdsa_bls381_sign_with_keccak256(
374 &self,
375 key_type: KeyTypeId,
376 public: &ecdsa_bls381::Public,
377 msg: &[u8],
378 ) -> Result<Option<ecdsa_bls381::Signature>, Error> {
379 let sig = self
380 .pair::<ecdsa_bls381::Pair>(key_type, public)
381 .map(|pair| pair.sign_with_hasher::<KeccakHasher>(msg));
382 Ok(sig)
383 }
384
385 fn insert(&self, key_type: KeyTypeId, suri: &str, public: &[u8]) -> Result<(), ()> {
386 self.keys
387 .write()
388 .entry(key_type)
389 .or_default()
390 .insert(public.to_owned(), suri.to_string());
391 Ok(())
392 }
393
394 fn keys(&self, key_type: KeyTypeId) -> Result<Vec<Vec<u8>>, Error> {
395 let keys = self
396 .keys
397 .read()
398 .get(&key_type)
399 .map(|map| map.keys().cloned().collect())
400 .unwrap_or_default();
401 Ok(keys)
402 }
403
404 fn has_keys(&self, public_keys: &[(Vec<u8>, KeyTypeId)]) -> bool {
405 public_keys
406 .iter()
407 .all(|(k, t)| self.keys.read().get(t).and_then(|s| s.get(k)).is_some())
408 }
409}
410
411impl Into<KeystorePtr> for MemoryKeystore {
412 fn into(self) -> KeystorePtr {
413 Arc::new(self)
414 }
415}
416
417#[cfg(test)]
418mod tests {
419 use super::*;
420 use sp_core::{
421 sr25519,
422 testing::{ECDSA, ED25519, SR25519},
423 };
424
425 #[test]
426 fn store_key_and_extract() {
427 let store = MemoryKeystore::new();
428
429 let public = store.ed25519_generate_new(ED25519, None).expect("Generates key");
430
431 let public_keys = store.ed25519_public_keys(ED25519);
432
433 assert!(public_keys.contains(&public.into()));
434 }
435
436 #[test]
437 fn store_unknown_and_extract_it() {
438 let store = MemoryKeystore::new();
439
440 let secret_uri = "//Alice";
441 let key_pair = sr25519::Pair::from_string(secret_uri, None).expect("Generates key pair");
442
443 store
444 .insert(SR25519, secret_uri, key_pair.public().as_ref())
445 .expect("Inserts unknown key");
446
447 let public_keys = store.sr25519_public_keys(SR25519);
448
449 assert!(public_keys.contains(&key_pair.public().into()));
450 }
451
452 #[test]
453 fn mismatched_secret_uri_signs_nothing() {
454 let store = MemoryKeystore::new();
455 let alice = sr25519::Pair::from_string("//Alice", None).unwrap();
456 let bob = sr25519::Pair::from_string("//Bob", None).unwrap();
457
458 store.insert(SR25519, "//Bob", alice.public().as_ref()).unwrap();
460
461 assert_eq!(store.sr25519_sign(SR25519, &alice.public(), b"msg").unwrap(), None);
462 assert_eq!(
463 store
464 .sign_with(SR25519, sr25519::CRYPTO_ID, alice.public().as_slice(), b"msg")
465 .unwrap(),
466 None
467 );
468 let data = sr25519::vrf::VrfInput::new(b"Test", &[(b"one", &1_u64.to_le_bytes())])
469 .into_sign_data();
470 assert!(store.sr25519_vrf_sign(SR25519, &alice.public(), &data).unwrap().is_none());
471 let input = sr25519::vrf::VrfInput::new(b"Test", &[(b"one", &1_u64.to_le_bytes())]);
472 assert!(store
473 .sr25519_vrf_pre_output(SR25519, &alice.public(), &input)
474 .unwrap()
475 .is_none());
476 assert!(store.sr25519_public_keys(SR25519).is_empty());
477 assert_eq!(store.sr25519_sign(SR25519, &bob.public(), b"msg").unwrap(), None);
479
480 store.insert(SR25519, "//Bob", bob.public().as_ref()).unwrap();
482 let sig = store.sr25519_sign(SR25519, &bob.public(), b"msg").unwrap().unwrap();
483 assert!(sr25519::Pair::verify(&sig, b"msg", &bob.public()));
484 assert_eq!(store.sr25519_public_keys(SR25519), vec![bob.public()]);
485 }
486
487 #[test]
488 fn unparseable_secret_uri_does_not_panic() {
489 let store = MemoryKeystore::new();
490 let sr = sr25519::Pair::from_string("//Alice", None).unwrap();
491 let ed = ed25519::Pair::from_string("//Alice", None).unwrap();
492 let ec = ecdsa::Pair::from_string("//Alice", None).unwrap();
493 let bad = "not a valid secret uri";
494 assert!(sr25519::Pair::from_string(bad, None).is_err());
495
496 store.insert(SR25519, bad, sr.public().as_ref()).unwrap();
497 store.insert(ED25519, bad, ed.public().as_ref()).unwrap();
498 store.insert(ECDSA, bad, ec.public().as_ref()).unwrap();
499
500 assert_eq!(store.sr25519_sign(SR25519, &sr.public(), b"msg").unwrap(), None);
501 let data = sr25519::vrf::VrfInput::new(b"Test", &[(b"one", &1_u64.to_le_bytes())])
502 .into_sign_data();
503 assert!(store.sr25519_vrf_sign(SR25519, &sr.public(), &data).unwrap().is_none());
504 let input = sr25519::vrf::VrfInput::new(b"Test", &[(b"one", &1_u64.to_le_bytes())]);
505 assert!(store.sr25519_vrf_pre_output(SR25519, &sr.public(), &input).unwrap().is_none());
506 assert_eq!(store.ed25519_sign(ED25519, &ed.public(), b"msg").unwrap(), None);
507 assert_eq!(store.ecdsa_sign(ECDSA, &ec.public(), b"msg").unwrap(), None);
508 assert_eq!(store.ecdsa_sign_prehashed(ECDSA, &ec.public(), &[0u8; 32]).unwrap(), None);
509 assert_eq!(
510 store
511 .sign_with(ED25519, ed25519::CRYPTO_ID, ed.public().as_slice(), b"msg")
512 .unwrap(),
513 None
514 );
515
516 assert!(store.sr25519_public_keys(SR25519).is_empty());
517 assert!(store.ed25519_public_keys(ED25519).is_empty());
518 assert!(store.ecdsa_public_keys(ECDSA).is_empty());
519 }
520
521 #[test]
522 fn sr25519_vrf_sign() {
523 let store = MemoryKeystore::new();
524
525 let secret_uri = "//Alice";
526 let key_pair = sr25519::Pair::from_string(secret_uri, None).expect("Generates key pair");
527
528 let data = sr25519::vrf::VrfInput::new(
529 b"Test",
530 &[
531 (b"one", &1_u64.to_le_bytes()),
532 (b"two", &2_u64.to_le_bytes()),
533 (b"three", "test".as_bytes()),
534 ],
535 )
536 .into_sign_data();
537
538 let result = store.sr25519_vrf_sign(SR25519, &key_pair.public(), &data);
539 assert!(result.unwrap().is_none());
540
541 store
542 .insert(SR25519, secret_uri, key_pair.public().as_ref())
543 .expect("Inserts unknown key");
544
545 let result = store.sr25519_vrf_sign(SR25519, &key_pair.public(), &data);
546
547 assert!(result.unwrap().is_some());
548 }
549
550 #[test]
551 fn sr25519_vrf_pre_output() {
552 let store = MemoryKeystore::new();
553
554 let secret_uri = "//Alice";
555 let pair = sr25519::Pair::from_string(secret_uri, None).expect("Generates key pair");
556
557 let input = sr25519::vrf::VrfInput::new(
558 b"Test",
559 &[
560 (b"one", &1_u64.to_le_bytes()),
561 (b"two", &2_u64.to_le_bytes()),
562 (b"three", "test".as_bytes()),
563 ],
564 );
565
566 let result = store.sr25519_vrf_pre_output(SR25519, &pair.public(), &input);
567 assert!(result.unwrap().is_none());
568
569 store
570 .insert(SR25519, secret_uri, pair.public().as_ref())
571 .expect("Inserts unknown key");
572
573 let pre_output =
574 store.sr25519_vrf_pre_output(SR25519, &pair.public(), &input).unwrap().unwrap();
575
576 let result = pre_output.make_bytes::<32>(b"rand", &input, &pair.public());
577 assert!(result.is_ok());
578 }
579
580 #[test]
581 fn ecdsa_sign_prehashed_works() {
582 let store = MemoryKeystore::new();
583
584 let suri = "//Alice";
585 let pair = ecdsa::Pair::from_string(suri, None).unwrap();
586
587 let hash = [0xff; 32];
589
590 let res = store.ecdsa_sign_prehashed(ECDSA, &pair.public(), &hash).unwrap();
592 assert!(res.is_none());
593
594 store.insert(ECDSA, suri, pair.public().as_ref()).unwrap();
596
597 let res = store.ecdsa_sign_prehashed(ECDSA, &pair.public(), &hash).unwrap();
598 assert!(res.is_some());
599 }
600
601 #[test]
602 #[cfg(feature = "bls-experimental")]
603 fn ecdsa_bls381_sign_with_keccak_works() {
604 use sp_core::testing::ECDSA_BLS377;
605
606 let store = MemoryKeystore::new();
607
608 let suri = "//Alice";
609 let pair = ecdsa_bls381::Pair::from_string(suri, None).unwrap();
610
611 let msg = b"this should be a normal unhashed message not a hash of a message because bls scheme comes with its own hashing";
612
613 store.insert(ECDSA_BLS377, suri, pair.public().as_ref()).unwrap();
615
616 let res = store
617 .ecdsa_bls381_sign_with_keccak256(ECDSA_BLS377, &pair.public(), &msg[..])
618 .unwrap();
619
620 assert!(res.is_some());
621
622 assert!(!ecdsa_bls381::Pair::verify(&res.unwrap(), &msg[..], &pair.public()));
624
625 assert!(ecdsa_bls381::Pair::verify_with_hasher::<KeccakHasher>(
627 &res.unwrap(),
628 msg,
629 &pair.public()
630 ));
631 }
632
633 #[test]
634 #[cfg(feature = "bls-experimental")]
635 fn ecdsa_bls381_generate_with_none_works() {
636 use sp_core::testing::ECDSA_BLS381;
637
638 let store = MemoryKeystore::new();
639 let ecdsa_bls381_key =
640 store.ecdsa_bls381_generate_new(ECDSA_BLS381, None).expect("Can generate key..");
641
642 let ecdsa_keys = store.ecdsa_public_keys(ECDSA_BLS381);
643 let bls381_keys = store.bls381_public_keys(ECDSA_BLS381);
644 let ecdsa_bls381_keys = store.ecdsa_bls381_public_keys(ECDSA_BLS381);
645
646 assert_eq!(ecdsa_keys.len(), 1);
647 assert_eq!(bls381_keys.len(), 1);
648 assert_eq!(ecdsa_bls381_keys.len(), 1);
649
650 let ecdsa_key = ecdsa_keys[0];
651 let bls381_key = bls381_keys[0];
652
653 let mut combined_key_raw = [0u8; ecdsa_bls381::PUBLIC_KEY_LEN];
654 combined_key_raw[..ecdsa::PUBLIC_KEY_SERIALIZED_SIZE].copy_from_slice(ecdsa_key.as_ref());
655 combined_key_raw[ecdsa::PUBLIC_KEY_SERIALIZED_SIZE..].copy_from_slice(bls381_key.as_ref());
656 let combined_key = ecdsa_bls381::Public::from_raw(combined_key_raw);
657
658 assert_eq!(combined_key, ecdsa_bls381_key);
659 }
660
661 #[test]
662 #[cfg(feature = "bls-experimental")]
663 fn ecdsa_bls381_generate_with_seed_works() {
664 use sp_core::testing::ECDSA_BLS381;
665
666 let store = MemoryKeystore::new();
667 let ecdsa_bls381_key = store
668 .ecdsa_bls381_generate_new(ECDSA_BLS381, Some("//Alice"))
669 .expect("Can generate key..");
670
671 let ecdsa_keys = store.ecdsa_public_keys(ECDSA_BLS381);
672 let bls381_keys = store.bls381_public_keys(ECDSA_BLS381);
673 let ecdsa_bls381_keys = store.ecdsa_bls381_public_keys(ECDSA_BLS381);
674
675 assert_eq!(ecdsa_keys.len(), 1);
676 assert_eq!(bls381_keys.len(), 1);
677 assert_eq!(ecdsa_bls381_keys.len(), 1);
678
679 let ecdsa_key = ecdsa_keys[0];
680 let bls381_key = bls381_keys[0];
681
682 let mut combined_key_raw = [0u8; ecdsa_bls381::PUBLIC_KEY_LEN];
683 combined_key_raw[..ecdsa::PUBLIC_KEY_SERIALIZED_SIZE].copy_from_slice(ecdsa_key.as_ref());
684 combined_key_raw[ecdsa::PUBLIC_KEY_SERIALIZED_SIZE..].copy_from_slice(bls381_key.as_ref());
685 let combined_key = ecdsa_bls381::Public::from_raw(combined_key_raw);
686
687 assert_eq!(combined_key, ecdsa_bls381_key);
688 }
689
690 #[test]
691 #[cfg(feature = "bandersnatch-experimental")]
692 fn bandersnatch_vrf_sign() {
693 use sp_core::testing::BANDERSNATCH;
694
695 let store = MemoryKeystore::new();
696
697 let secret_uri = "//Alice";
698 let key_pair =
699 bandersnatch::Pair::from_string(secret_uri, None).expect("Generates key pair");
700 let sign_data = bandersnatch::vrf::VrfSignData::new(b"vrf_input", b"aux_data");
701
702 let result = store.bandersnatch_vrf_sign(BANDERSNATCH, &key_pair.public(), &sign_data);
703 assert!(result.unwrap().is_none());
704
705 store
706 .insert(BANDERSNATCH, secret_uri, key_pair.public().as_ref())
707 .expect("Inserts unknown key");
708
709 let result = store.bandersnatch_vrf_sign(BANDERSNATCH, &key_pair.public(), &sign_data);
710
711 assert!(result.unwrap().is_some());
712 }
713
714 #[test]
715 #[cfg(feature = "bandersnatch-experimental")]
716 fn bandersnatch_ring_vrf_sign() {
717 use sp_core::testing::BANDERSNATCH;
718
719 let store = MemoryKeystore::new();
720
721 let ring_ctx = bandersnatch::ring_vrf::RingContext::<1024>::new_testing();
722
723 let mut pks: Vec<_> = (0..16)
724 .map(|i| bandersnatch::Pair::from_seed(&[i as u8; 32]).public())
725 .collect();
726
727 let prover_idx = 3;
728 let prover = ring_ctx.prover(&pks, prover_idx);
729
730 let secret_uri = "//Alice";
731 let pair = bandersnatch::Pair::from_string(secret_uri, None).expect("Generates key pair");
732 pks[prover_idx] = pair.public();
733
734 let sign_data = bandersnatch::vrf::VrfSignData::new(b"vrf_input", b"aux_data");
735
736 let result =
737 store.bandersnatch_ring_vrf_sign(BANDERSNATCH, &pair.public(), &sign_data, &prover);
738 assert!(result.unwrap().is_none());
739
740 store
741 .insert(BANDERSNATCH, secret_uri, pair.public().as_ref())
742 .expect("Inserts unknown key");
743
744 let result =
745 store.bandersnatch_ring_vrf_sign(BANDERSNATCH, &pair.public(), &sign_data, &prover);
746
747 assert!(result.unwrap().is_some());
748 }
749}