Challenge.vala 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Sodium.Asymmetric;
  2. namespace LibPeer.Protocols.Gdp {
  3. public class Challenge {
  4. public delegate uint8[] ChallengeGenerator(uint8[] secret);
  5. public uint8[] public_key { get; set; }
  6. public uint8[] challenge_blob { get; set; }
  7. private uint8[]? secret { get; set; }
  8. public bool solved {
  9. get{
  10. return secret != null;
  11. }
  12. }
  13. public bool complete(uint8[] secret) {
  14. var signed = Signing.sign(public_key, secret);
  15. if(Signing.verify(signed, public_key) != null) {
  16. this.secret = secret;
  17. return true;
  18. }
  19. return false;
  20. }
  21. internal uint8[] sign(uint8[] message) requires (solved) {
  22. return Signing.sign(message, secret);
  23. }
  24. public bool check_key(uint8[] compare) {
  25. return new Bytes(compare).compare(new Bytes(public_key)) == 0;
  26. }
  27. public Challenge(ChallengeGenerator generator) {
  28. public_key = new uint8[Signing.PUBLIC_KEY_BYTES];
  29. var sk = new uint8[Signing.SECRET_KEY_BYTES];
  30. Signing.generate_keypair(public_key, sk);
  31. challenge_blob = generator(sk);
  32. }
  33. public Challenge.from_values(uint8[] key, uint8[] challenge) {
  34. public_key = key;
  35. challenge_blob = challenge;
  36. }
  37. }
  38. }