예제 #1
0
        public override void Update(BytesSegment bs)
        {
            bs.CheckAsParameter();
            var pos = (uint)bs.Offset;
            var end = pos + (uint)bs.Len;

            fixed(Context *ctx = &this.ctx)
            fixed(byte *bytes = bs.Bytes)
            {
                while (pos < end)
                {
                    var remainningKeystream = KeystreamBufferSize - keystreamBufferPos;
                    if (remainningKeystream == 0)
                    {
                        keystreamBufferPos  = 0;
                        remainningKeystream = KeystreamBufferSize;
                        NextKeystreamBuffer(ctx);
                    }
                    var count = end - pos;
                    count = count < remainningKeystream ? count : remainningKeystream;
                    NaiveUtils.XorBytesUnsafe(ctx->keyStreamBuffer + keystreamBufferPos, bytes + pos, count);
                    pos += count;
                    keystreamBufferPos += count;
                }
            }
        }
예제 #2
0
        public override void Update(BytesSegment bs)
        {
            bs.CheckAsParameter();
            var pos = bs.Offset;
            var end = pos + bs.Len;

            while (pos < end)
            {
                var remainningFeed = toBeFeedBack.Length - feedingPos;
                if (remainningFeed == 0)
                {
                    feedingPos     = 0;
                    remainningFeed = toBeFeedBack.Length;
                    EcbTransform.TransformBlock(toBeFeedBack, 0, toBeFeedBack.Length, feedingBack, 0);
                }
                var feedEnd      = pos + remainningFeed;
                var thisBlockEnd = (feedEnd < end) ? feedEnd : end;
                var count        = thisBlockEnd - pos;
                if (IsEncrypting)
                {
                    NaiveUtils.XorBytes(feedingBack, feedingPos, bs.Bytes, pos, (uint)count);
                    NaiveUtils.CopyBytes(bs.Bytes, pos, toBeFeedBack, feedingPos, count);
                }
                else
                {
                    NaiveUtils.CopyBytes(bs.Bytes, pos, toBeFeedBack, feedingPos, count);
                    NaiveUtils.XorBytes(feedingBack, feedingPos, bs.Bytes, pos, (uint)count);
                }
                pos        += count;
                feedingPos += count;
            }
        }
예제 #3
0
            public override void Update(BytesSegment bs)
            {
                bs.CheckAsParameter();
                var pos          = bs.Offset;
                var end          = pos + bs.Len;
                var keyStreamBuf = this.keyStreamBuf;

                fixed(byte *bytes = bs.Bytes)
                {
                    while (pos < end)
                    {
                        var remainningKeystream = KeystreamBufferSize - keystreamBufferPos;
                        if (remainningKeystream == 0)
                        {
                            keystreamBufferPos  = 0;
                            remainningKeystream = KeystreamBufferSize;
                            var ksb = keyStreamBuf;
                            for (int i = 0; i < KsBlockCount; i++)
                            {
                                ksb[i] = counter;
                                if (++counter.v1 == 0)
                                {
                                    ++counter.v0;
                                }
                                Cipher.encrypt_64_128(keys, &ksb[i]);
                            }
                        }
                        var count = end - pos;
                        count = count < remainningKeystream ? count : remainningKeystream;
                        NaiveUtils.XorBytesUnsafe((byte *)keyStreamBuf + keystreamBufferPos, bytes + pos, (uint32)count);
                        pos += count;
                        keystreamBufferPos += count;
                    }
                }
            }
예제 #4
0
            public override void Update(BytesSegment bs)
            {
                bs.CheckAsParameter();
                var pos = (uint)bs.Offset;
                var len = (uint)bs.Len;

                fixed(byte *bytes = &bs.Bytes[pos])
                {
                    if (EnableMultiThreading && bs.Len >= 32 * 1024 && ThreadCount > 1)
                    {
                        UpdateMT(bytes, len, ThreadCount);
                    }
                    else
                    {
                        Update(bytes, len, keyStreamBuf, ref keystreamBufferPos, ref counter, keys);
                    }
                }
            }