示例#1
0
        /*public AssuredStreamHeader(Stream source)
         *      : this(source, VerificationMode.Full)
         * {
         * }*/

        public AssuredStreamHeader(Stream source, VerificationMode mode)
        {
            QQnBinaryReader br             = new QQnBinaryReader(source);
            uint            vFileSignature = br.ReadUInt32();

            if (vFileSignature != FileSignature)
            {
                throw new FormatException();
            }

            _fileType      = br.ReadString();
            _hashType      = (HashType)br.ReadByte();
            _fileHash      = br.ReadByteArray();
            _hashSignature = br.ReadByteArray();
            byte[] publicKey = br.ReadByteArray();

            if (publicKey.Length > 0)
            {
                _snk = StrongNameKey.LoadFrom(publicKey);

                if (mode != VerificationMode.None)
                {
                    if (!_snk.VerifyHash(_fileHash, _hashSignature))
                    {
                        throw new CryptographicException("Stream hash verification failed");
                    }
                }
            }
            _guid       = new Guid(br.ReadBytes(16));
            _bodyLength = br.ReadInt64();

            _hashPosition = source.Position;
        }
示例#2
0
        public void TestMyHash()
        {
            StrongNameKey snkIn = StrongNameKey.LoadFrom(SnkFile);

            byte[] data          = new byte[20];
            byte[] signature     = snkIn.SignHash(data);
            byte[] publicKeyData = snkIn.GetPublicKeyData();


            StrongNameKey snkVerify = StrongNameKey.LoadFrom(publicKeyData);

            Assert.That(snkVerify.VerifyHash(data, signature), Is.True, "Verification completed");
        }
示例#3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AssuredSubStream"/> class.
        /// </summary>
        /// <param name="parentStream">The parent stream.</param>
        /// <param name="verificationMode">The verification mode.</param>
        public AssuredSubStream(Stream parentStream, VerificationMode verificationMode)
            : base(parentStream, true)
        {
            AssuredStream signedParent = GetService <AssuredStream>();

            if (signedParent != null)
            {
                _snk      = signedParent.AssemblyStrongNameKey;
                _hashType = signedParent.HashType;
            }
            else
            {
                _hashType = HashType.SHA1;
            }

            _headerPosition = parentStream.Position;

            _streamHash    = new byte[QQnCryptoHelpers.GetHashBits(_hashType) / 8];
            _hashSignature = new byte[(_snk != null) ? _snk.SignatureLength : 0];

            if (parentStream.CanWrite && parentStream.CanSeek && parentStream.Position == parentStream.Length)
            {
                _updating = true;
                WriteHeader();
            }
            else
            {
                QQnBinaryReader br = new QQnBinaryReader(BaseStream);
                _streamHash    = br.ReadBytes(_streamHash.Length);
                _hashSignature = br.ReadBytes(_hashSignature.Length);
                _hashLength    = br.ReadInt64();
                _hashPosition  = BaseStream.Position;

                if (verificationMode != VerificationMode.None)
                {
                    if (_snk != null && !_snk.VerifyHash(_streamHash, _hashSignature))
                    {
                        throw new CryptographicException("Stream hash verification failed");
                    }
                }

                if (verificationMode == VerificationMode.Full)
                {
                    if (!VerifyHash())
                    {
                        throw new CryptographicException("Invalid hash value");
                    }
                }
            }
        }