Example #1
0
        protected void Decrypt(ref ReadableBuffer messageBuffer)
        {
            if (messageBuffer.IsSingleSpan)
            {
                _key.Finish(messageBuffer.First.Span);
                IncrementSequence();
                return;
            }
            var bytesRemaining = messageBuffer.Length;

            foreach (var b in messageBuffer)
            {
                if (b.Length == 0)
                {
                    continue;
                }
                bytesRemaining -= b.Length;
                if (bytesRemaining == 0)
                {
                    _key.Finish(b.Span);
                    break;
                }
                _key.Update(b.Span);
            }
            IncrementSequence();
        }
        public unsafe void EncryptSessionKey(ref WritableBuffer writer, Span <byte> ticketContent)
        {
            var tagLength = 16;

            lock (_key)
            {
                var contentLength = ticketContent.Length + tagLength + sizeof(long) + sizeof(Guid);
                var nonce         = System.Threading.Interlocked.Increment(ref _nounceCounter);
                writer.WriteBigEndian((ushort)contentLength);
                writer.Ensure(contentLength);

                _key.IV.Slice(4).Span.Write(nonce);
                _key.Init(KeyMode.Encryption);

                writer.WriteBigEndian(_keyGuid);
                writer.WriteBigEndian(_nounceCounter);

                var amountWritten = _key.Finish(ticketContent, writer.Buffer.Span);
                writer.Advance(amountWritten);
                _key.GetTag(writer.Buffer.Span.Slice(0, tagLength));
                writer.Advance(tagLength);
            }
        }