ECDHKekGenerator.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Generators;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Utilities;
  9. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Agreement.Kdf
  10. {
  11. /**
  12. * X9.63 based key derivation function for ECDH CMS.
  13. */
  14. public class ECDHKekGenerator
  15. : IDerivationFunction
  16. {
  17. private readonly IDerivationFunction kdf;
  18. private DerObjectIdentifier algorithm;
  19. private int keySize;
  20. private byte[] z;
  21. public ECDHKekGenerator(IDigest digest)
  22. {
  23. this.kdf = new Kdf2BytesGenerator(digest);
  24. }
  25. public virtual void Init(IDerivationParameters param)
  26. {
  27. DHKdfParameters parameters = (DHKdfParameters)param;
  28. this.algorithm = parameters.Algorithm;
  29. this.keySize = parameters.KeySize;
  30. this.z = parameters.GetZ(); // TODO Clone?
  31. }
  32. public virtual IDigest Digest
  33. {
  34. get { return kdf.Digest; }
  35. }
  36. public virtual int GenerateBytes(byte[] outBytes, int outOff, int len)
  37. {
  38. // TODO Create an ASN.1 class for this (RFC3278)
  39. // ECC-CMS-SharedInfo
  40. DerSequence s = new DerSequence(
  41. new AlgorithmIdentifier(algorithm, DerNull.Instance),
  42. new DerTaggedObject(true, 2, new DerOctetString(Pack.UInt32_To_BE((uint)keySize))));
  43. kdf.Init(new KdfParameters(z, s.GetDerEncoded()));
  44. return kdf.GenerateBytes(outBytes, outOff, len);
  45. }
  46. }
  47. }
  48. #pragma warning restore
  49. #endif