123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- #pragma warning disable
- using System;
- using System.IO;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Math.EC.Rfc8032;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
- namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Signers
- {
- public class Ed25519Signer
- : ISigner
- {
- private readonly Buffer buffer = new Buffer();
- private bool forSigning;
- private Ed25519PrivateKeyParameters privateKey;
- private Ed25519PublicKeyParameters publicKey;
- public Ed25519Signer()
- {
- }
- public virtual string AlgorithmName
- {
- get { return "Ed25519"; }
- }
- public virtual void Init(bool forSigning, ICipherParameters parameters)
- {
- this.forSigning = forSigning;
- if (forSigning)
- {
- this.privateKey = (Ed25519PrivateKeyParameters)parameters;
- this.publicKey = null;
- }
- else
- {
- this.privateKey = null;
- this.publicKey = (Ed25519PublicKeyParameters)parameters;
- }
- Reset();
- }
- public virtual void Update(byte b)
- {
- buffer.WriteByte(b);
- }
- public virtual void BlockUpdate(byte[] buf, int off, int len)
- {
- buffer.Write(buf, off, len);
- }
- public virtual byte[] GenerateSignature()
- {
- if (!forSigning || null == privateKey)
- throw new InvalidOperationException("Ed25519Signer not initialised for signature generation.");
- return buffer.GenerateSignature(privateKey);
- }
- public virtual bool VerifySignature(byte[] signature)
- {
- if (forSigning || null == publicKey)
- throw new InvalidOperationException("Ed25519Signer not initialised for verification");
- return buffer.VerifySignature(publicKey, signature);
- }
- public virtual void Reset()
- {
- buffer.Reset();
- }
- private class Buffer : MemoryStream
- {
- internal byte[] GenerateSignature(Ed25519PrivateKeyParameters privateKey)
- {
- lock (this)
- {
- #if PORTABLE || NETFX_CORE
- byte[] buf = ToArray();
- int count = buf.Length;
- #else
- byte[] buf = GetBuffer();
- int count = (int)Position;
- #endif
- byte[] signature = new byte[Ed25519PrivateKeyParameters.SignatureSize];
- privateKey.Sign(Ed25519.Algorithm.Ed25519, null, buf, 0, count, signature, 0);
- Reset();
- return signature;
- }
- }
- internal bool VerifySignature(Ed25519PublicKeyParameters publicKey, byte[] signature)
- {
- if (Ed25519.SignatureSize != signature.Length)
- {
- Reset();
- return false;
- }
- lock (this)
- {
- #if PORTABLE || NETFX_CORE
- byte[] buf = ToArray();
- int count = buf.Length;
- #else
- byte[] buf = GetBuffer();
- int count = (int)Position;
- #endif
- byte[] pk = publicKey.GetEncoded();
- bool result = Ed25519.Verify(signature, 0, pk, 0, buf, 0, count);
- Reset();
- return result;
- }
- }
- internal void Reset()
- {
- lock (this)
- {
- long count = Position;
- #if PORTABLE || NETFX_CORE
- this.Position = 0L;
- Streams.WriteZeroes(this, count);
- #else
- Array.Clear(GetBuffer(), 0, (int)count);
- #endif
- this.Position = 0L;
- }
- }
- }
- }
- }
- #pragma warning restore
- #endif
|