public void AddSignature(BlockSignature signature)
 {
     lock (this)
     {
         _signatures[signature.Issuer] = signature;
     }
 }
예제 #2
0
        /// <summary>
        /// Create a SpecialFolderDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A SpecialFolderDataBlock object</returns>
        public static SpecialFolderDataBlock FromByteArray(byte[] ba)
        {
            SpecialFolderDataBlock SpecialFolderDataBlock = new SpecialFolderDataBlock();

            if (ba.Length < 0x10)
            {
                throw new ArgumentException(String.Format("Size of the SpecialFolderDataBlock Structure is less than 16 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, SpecialFolderDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != SpecialFolderDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, SpecialFolderDataBlock.BlockSignature));
            }

            SpecialFolderDataBlock.SpecialFolderID = (CSIDL)BitConverter.ToUInt32(ba, 8);
            SpecialFolderDataBlock.Offset          = BitConverter.ToUInt32(ba, 12);

            return(SpecialFolderDataBlock);
        }
예제 #3
0
        /// <summary>
        /// Create a PropertyStoreDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A PropertyStoreDataBlock object</returns>
        public static PropertyStoreDataBlock FromByteArray(byte[] ba)
        {
            PropertyStoreDataBlock PropertyStoreDataBlock = new PropertyStoreDataBlock();

            if (ba.Length < 0xC)
            {
                throw new ArgumentException(String.Format("Size of the PropertyStoreDataBlock Structure is less than 12 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, PropertyStoreDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != PropertyStoreDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, PropertyStoreDataBlock.BlockSignature));
            }

            byte[] data = new byte[BlockSize - 4];
            Buffer.BlockCopy(BitConverter.GetBytes(BlockSize - 4), 0, data, 0, 4);
            Buffer.BlockCopy(ba, 8, data, 4, (int)BlockSize - 8);
            SerializedPropertyStore SerializedPropertyStore = SerializedPropertyStore.FromByteArray(data);

            PropertyStoreDataBlock.PropertyStore = SerializedPropertyStore.PropertyStorage;

            return(PropertyStoreDataBlock);
        }
예제 #4
0
        /// <summary>
        /// Create a ShimDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A ShimDataBlock object</returns>
        public static ShimDataBlock FromByteArray(byte[] ba)
        {
            ShimDataBlock ShimDataBlock = new ShimDataBlock();

            if (ba.Length < 0x88)
            {
                throw new ArgumentException(String.Format("Size of the ShimDataBlock Structure is less than 136 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, ShimDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != ShimDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, ShimDataBlock.BlockSignature));
            }

            byte[] LayerName = new byte[BlockSize - 8];
            Buffer.BlockCopy(ba, 8, LayerName, 0, (int)BlockSize - 8);
            ShimDataBlock.LayerName = Encoding.Unicode.GetString(LayerName).TrimEnd(new char[] { (char)0 });

            return(ShimDataBlock);
        }
        /// <summary>
        /// Create an EnvironmentVariableDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>An EnvironmentVariableDataBlock object</returns>
        public static EnvironmentVariableDataBlock FromByteArray(byte[] ba)
        {
            EnvironmentVariableDataBlock EnvironmentVariableDataBlock = new EnvironmentVariableDataBlock();

            if (ba.Length < 0x314)
            {
                throw new ArgumentException(String.Format("Size of the EnvironmentVariableDataBlock Structure is less than 788 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, EnvironmentVariableDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != EnvironmentVariableDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, EnvironmentVariableDataBlock.BlockSignature));
            }

            byte[] TargetAnsi = new byte[260];
            Buffer.BlockCopy(ba, 8, TargetAnsi, 0, 260);
            EnvironmentVariableDataBlock.TargetAnsi = Encoding.Default.GetString(TargetAnsi).TrimEnd(new char[] { (char)0 });

            byte[] TargetUnicode = new byte[520];
            Buffer.BlockCopy(ba, 268, TargetUnicode, 0, 520);
            EnvironmentVariableDataBlock.TargetUnicode = Encoding.Unicode.GetString(TargetUnicode).TrimEnd(new char[] { (char)0 });

            return(EnvironmentVariableDataBlock);
        }
        /// <summary>
        /// Create a ConsoleFEDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A ConsoleFEDataBlock object</returns>
        public static ConsoleFEDataBlock FromByteArray(byte[] ba)
        {
            ConsoleFEDataBlock ConsoleFEDataBlock = new ConsoleFEDataBlock();

            if (ba.Length < 0xC)
            {
                throw new ArgumentException(String.Format("Size of the ConsoleFEDataBlock Structure is less than 12 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, ConsoleFEDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != ConsoleFEDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, ConsoleFEDataBlock.BlockSignature));
            }

            ConsoleFEDataBlock.CodePage = BitConverter.ToUInt32(ba, 8);

            return(ConsoleFEDataBlock);
        }
예제 #7
0
        /// <summary>
        /// Create a KnownFolderDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A KnownFolderDataBlock object</returns>
        public static KnownFolderDataBlock FromByteArray(byte[] ba)
        {
            KnownFolderDataBlock KnownFolderDataBlock = new KnownFolderDataBlock();

            if (ba.Length < 0x1C)
            {
                throw new ArgumentException(String.Format("Size of the KnownFolderDataBlock Structure is less than 28 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, KnownFolderDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != KnownFolderDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, KnownFolderDataBlock.BlockSignature));
            }

            byte[] KnownFolderID = new byte[16];
            Buffer.BlockCopy(ba, 8, KnownFolderID, 0, KnownFolderID.Length);
            KnownFolderDataBlock.KnownFolderID = new Guid(KnownFolderID);
            KnownFolderDataBlock.Offset        = BitConverter.ToUInt32(ba, 24);

            return(KnownFolderDataBlock);
        }
예제 #8
0
        /// <inheritdoc />
        public bool CheckStakeSignature(BlockSignature signature, uint256 blockHash, Transaction coinStake)
        {
            if (signature.IsEmpty())
            {
                this.logger.LogTrace("(-)[EMPTY]:false");
                return(false);
            }

            var txout = coinStake.Outputs[1];

            if (PayToPubkeyTemplate.Instance.CheckScriptPubKey(txout.ScriptPubKey))
            {
                var pubKey = PayToPubkeyTemplate.Instance.ExtractScriptPubKeyParameters(txout.ScriptPubKey);
                var res    = pubKey.Verify(blockHash, new ECDSASignature(signature.Signature));
                this.logger.LogTrace("(-)[P2PK]:{0}", res);
                return(res);
            }

            // Block signing key also can be encoded in the nonspendable output.
            // This allows to not pollute UTXO set with useless outputs e.g. in case of multisig staking.

            var ops = txout.ScriptPubKey.ToOps().ToList();

            if (!ops.Any())
            {
                this.logger.LogTrace("(-)[NO_OPS]:false");
                return(false);
            }

            if (ops.ElementAt(0).Code != OpcodeType.OP_RETURN) // OP_RETURN)
            {
                this.logger.LogTrace("(-)[NO_OP_RETURN]:false");
                return(false);
            }

            if (ops.Count != 2)
            {
                this.logger.LogTrace("(-)[INVALID_OP_COUNT]:false");
                return(false);
            }

            var data = ops.ElementAt(1).PushData;

            if (data.Length > MaxPushDataSize)
            {
                this.logger.LogTrace("(-)[PUSH_DATA_TOO_LARGE]:false");
                return(false);
            }

            if (!ScriptEvaluationContext.IsCompressedOrUncompressedPubKey(data))
            {
                this.logger.LogTrace("(-)[NO_PUSH_DATA]:false");
                return(false);
            }

            var verifyRes = new PubKey(data).Verify(blockHash, new ECDSASignature(signature.Signature));

            return(verifyRes);
        }
예제 #9
0
        public bool IsSignatureValid(Key key, BlockSignature signature, Block block)
        {
            if (signature != null && block != null)
            {
                return(signature.IsValid(key, GetBlockHash(block)));
            }

            return(false);
        }
예제 #10
0
        public static bool EnsureLowS(BlockSignature blockSignature)
        {
            var signature = new ECDSASignature(blockSignature.Signature);

            if (!signature.IsLowS)
            {
                blockSignature.Signature = signature.MakeCanonical().ToDER();
            }
            return(true);
        }
예제 #11
0
        public StoreError Set(string participant, BlockSignature sig)
        {
            var(id, err) = ParticipantId(participant);
            if (err != null)
            {
                return(err);
            }

            return(Rim.Set(id, sig, sig.Index));
        }
        /// <inheritdoc />
        public override void Run(RuleContext context)
        {
            BlockSignature expectedSignature = (context.ValidationContext.ChainedHeaderToValidate.Header as PoABlockHeader).BlockSignature;
            BlockSignature actualSignature   = (context.ValidationContext.BlockToValidate.Header  as PoABlockHeader).BlockSignature;

            if (expectedSignature != actualSignature)
            {
                this.Logger.LogTrace("(-)[INVALID_SIGNATURE]");
                PoAConsensusErrors.InvalidBlockSignature.Throw();
            }
        }
예제 #13
0
        public void AddSignature(short issuer, Block block, Key key)
        {
            if (block.BlockId != BlockId || block.Issuer != BlockIssuer)
            {
                throw new ArgumentException(nameof(block));
            }

            lock (this)
            {
                _signatures[issuer] = new BlockSignature(issuer, Signature.Generate(key, GetBlockHash(block)));
            }
        }
예제 #14
0
        /// <summary>
        /// Create a ConsoleDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A ConsoleDataBlock object</returns>
        public static ConsoleDataBlock FromByteArray(byte[] ba)
        {
            ConsoleDataBlock ConsoleDataBlock = new ConsoleDataBlock();

            if (ba.Length < 0xCC)
            {
                throw new ArgumentException(String.Format("Size of the ConsoleDataBlock Structure is less than 204 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, ConsoleDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != ConsoleDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, ConsoleDataBlock.BlockSignature));
            }

            ConsoleDataBlock.FillAttributes      = (FillAttributes)BitConverter.ToUInt16(ba, 8);
            ConsoleDataBlock.PopupFillAttributes = (FillAttributes)BitConverter.ToUInt16(ba, 10);
            ConsoleDataBlock.ScreenBufferSizeX   = BitConverter.ToUInt16(ba, 12);
            ConsoleDataBlock.ScreenBufferSizeY   = BitConverter.ToUInt16(ba, 14);
            ConsoleDataBlock.WindowSizeX         = BitConverter.ToUInt16(ba, 16);
            ConsoleDataBlock.WindowSizeY         = BitConverter.ToUInt16(ba, 18);
            ConsoleDataBlock.WindowOriginX       = BitConverter.ToUInt16(ba, 20);
            ConsoleDataBlock.WindowOriginY       = BitConverter.ToUInt16(ba, 22);
            ConsoleDataBlock.Unused1             = BitConverter.ToUInt32(ba, 24);
            ConsoleDataBlock.Unused2             = BitConverter.ToUInt32(ba, 28);
            ConsoleDataBlock.FontSize            = BitConverter.ToUInt32(ba, 32);
            ConsoleDataBlock.FontFamily          = (FontFamily)(BitConverter.ToUInt32(ba, 36) & 0xF0);
            ConsoleDataBlock.FontPitch           = (FontPitch)(BitConverter.ToUInt32(ba, 36) & 0xF);
            ConsoleDataBlock.FontWeight          = BitConverter.ToUInt32(ba, 40);
            byte[] FaceName = new byte[64];
            Buffer.BlockCopy(ba, 44, FaceName, 0, 64);
            ConsoleDataBlock.FaceName               = Encoding.Unicode.GetString(FaceName).TrimEnd(new char[] { (char)0 });
            ConsoleDataBlock.CursorSize             = BitConverter.ToUInt32(ba, 108);
            ConsoleDataBlock.FullScreen             = BitConverter.ToUInt32(ba, 112) != 0;
            ConsoleDataBlock.QuickEdit              = BitConverter.ToUInt32(ba, 116) != 0;
            ConsoleDataBlock.InsertMode             = BitConverter.ToUInt32(ba, 120) != 0;
            ConsoleDataBlock.AutoPosition           = BitConverter.ToUInt32(ba, 124) != 0;
            ConsoleDataBlock.HistoryBufferSize      = BitConverter.ToUInt32(ba, 128);
            ConsoleDataBlock.NumberOfHistoryBuffers = BitConverter.ToUInt32(ba, 132);
            ConsoleDataBlock.HistoryNoDup           = BitConverter.ToUInt32(ba, 136) != 0;
            Buffer.BlockCopy(ba, 140, ConsoleDataBlock.ColorTable, 0, 64);

            return(ConsoleDataBlock);
        }
예제 #15
0
        /// <summary>
        /// Create a TrackerDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A TrackerDataBlock object</returns>
        public static TrackerDataBlock FromByteArray(byte[] ba)
        {
            TrackerDataBlock TrackerDataBlock = new TrackerDataBlock();

            if (ba.Length < 0x60)
            {
                throw new ArgumentException(String.Format("Size of the TrackerDataBlock Structure is less than 96 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, TrackerDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != TrackerDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, TrackerDataBlock.BlockSignature));
            }

            UInt32 Length = BitConverter.ToUInt32(ba, 8);

            if (Length < 0x58)
            {
                throw new ArgumentException(String.Format("Length is {0} is incorrect (expected 88)", Length));
            }

            TrackerDataBlock.Version = BitConverter.ToUInt32(ba, 12);

            byte[] MachineID = new byte[Length - 0x48];
            Buffer.BlockCopy(ba, 16, MachineID, 0, MachineID.Length);
            TrackerDataBlock.MachineID = Encoding.Default.GetString(MachineID).TrimEnd(new char[] { (char)0 });

            byte[] Guid = new byte[16];
            Buffer.BlockCopy(ba, 16 + MachineID.Length, Guid, 0, Guid.Length);
            TrackerDataBlock.Droid    = new Guid[2];
            TrackerDataBlock.Droid[0] = new Guid(Guid);
            Buffer.BlockCopy(ba, 32 + MachineID.Length, Guid, 0, Guid.Length);
            TrackerDataBlock.Droid[1] = new Guid(Guid);

            Buffer.BlockCopy(ba, 48 + MachineID.Length, Guid, 0, Guid.Length);
            TrackerDataBlock.DroidBirth    = new Guid[2];
            TrackerDataBlock.DroidBirth[0] = new Guid(Guid);
            Buffer.BlockCopy(ba, 64 + MachineID.Length, Guid, 0, Guid.Length);
            TrackerDataBlock.DroidBirth[1] = new Guid(Guid);

            return(TrackerDataBlock);
        }
예제 #16
0
        public ExternalDataBlock Create(IB blockOffset, BID blockId, BinaryData data)
        {
            var obfuscatedData = dataObfuscator.Obfuscate(data, blockId);

            return
                (new ExternalDataBlock(
                     obfuscatedData,
                     BinaryData.OfSize(Utilities.GetExternalDataBlockPaddingSize(obfuscatedData.Length)),
                     new BlockTrailer(
                         obfuscatedData.Length,
                         BlockSignature.Calculate(blockOffset, blockId),
                         Crc32.ComputeCrc32(obfuscatedData),
                         blockId)));
        }
예제 #17
0
        internal static BlockSignature GenerateBlockSig(byte[] buffer, long offset, int blockSize, uint id)
        {
            var sig = new BlockSignature();

            var rollingSig = CreateRollingSignature(buffer, blockSize);
            var md5Sig     = CreateMD5Signature(buffer, blockSize);

            sig.RollingSig   = rollingSig;
            sig.MD5Signature = md5Sig;
            sig.Offset       = offset;
            sig.BlockNumber  = id;
            sig.Size         = (uint)blockSize;

            return(sig);
        }
예제 #18
0
        /// <summary>
        /// Create a VistaAndAboveIDListDataBlock from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>A VistaAndAboveIDListDataBlock object</returns>
        public static VistaAndAboveIDListDataBlock FromByteArray(byte[] ba)
        {
            VistaAndAboveIDListDataBlock VistaAndAboveIDListDataBlock = new VistaAndAboveIDListDataBlock();

            if (ba.Length < 0xA)
            {
                throw new ArgumentException(String.Format("Size of the VistaAndAboveIDListDataBlock Structure is less than 10 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            if (BlockSize > ba.Length)
            {
                throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (expected {1})", BlockSize, VistaAndAboveIDListDataBlock.BlockSize));
            }

            BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);

            if (BlockSignature != VistaAndAboveIDListDataBlock.BlockSignature)
            {
                throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect (expected {1})", BlockSignature, VistaAndAboveIDListDataBlock.BlockSignature));
            }

            ba = ba.Skip(8).ToArray();
            UInt32 Count = BlockSize - 8;

            while (Count > 0)
            {
                UInt16 ItemIDSize = BitConverter.ToUInt16(ba, 0);
                if (ItemIDSize != 0)
                {
                    byte[] itemID = new byte[ItemIDSize - 2];
                    Buffer.BlockCopy(ba, 2, itemID, 0, itemID.Length);
                    Count -= ItemIDSize;
                    VistaAndAboveIDListDataBlock.IDList.ItemIDList.Add(new ItemID(itemID));
                    ba = ba.Skip(ItemIDSize).ToArray();
                }
                else
                {
                    break;
                }
            }

            return(VistaAndAboveIDListDataBlock);
        }
예제 #19
0
        // very manual writer... but want to see how small I can get the data.
        public static CompleteSignature ReadBinaryCompleteSignature(Stream s)
        {
            var sig = new CompleteSignature();

            var l = new List <BlockSignature>();

            var reader = new BinaryReader(s);

            int numberOfEntries = reader.ReadInt32();

            for (var i = 0; i < numberOfEntries; i++)
            {
                var entry = new BlockSignature();

                // 8 bytes. offset
                long offset = reader.ReadInt64();

                // 4 bytes. size
                int size = reader.ReadInt32();

                // 4 bytes. Block Number;
                int blockNumber = reader.ReadInt32();

                // 4 bytes. Rolling Signature.
                decimal          sig1       = reader.ReadDecimal();
                decimal          sig2       = reader.ReadDecimal();
                RollingSignature rollingSig = new RollingSignature()
                {
                    Sig1 = sig1, Sig2 = sig2
                };

                // should be 16 bytes.
                byte[] md5 = reader.ReadBytes(16);

                entry.BlockNumber  = (UInt32)blockNumber;
                entry.RollingSig   = (RollingSignature)rollingSig;
                entry.MD5Signature = md5;
                entry.Offset       = offset;
                entry.Size         = (uint)size;

                l.Add(entry);
            }
            sig.SignatureList = l.ToArray <BlockSignature>();
            return(sig);
        }
예제 #20
0
        public InternalDataBlock Create(
            IB blockOffset,
            BID blockId,
            BlockIdsWithTotalNumberOfBytesInReferencedBlocks data)
        {
            var encodedExternalBlockIds = data.BlockIds.Encode(bidEncoder);

            return
                (new InternalDataBlock(
                     0x01,
                     blockLevel,
                     data.BlockIds.Length,
                     data.TotalNumberOfBytesInReferencedBlocks,
                     encodedExternalBlockIds,
                     BinaryData.OfSize(Utilities.GetInternalDataBlockPaddingSize(encodedExternalBlockIds.Length)),
                     new BlockTrailer(
                         encodedExternalBlockIds.Length + 8,
                         BlockSignature.Calculate(blockOffset, blockId),
                         Crc32.ComputeCrc32(GetDataToCalculateCrc32(encodedExternalBlockIds, data.BlockIds.Length, data.TotalNumberOfBytesInReferencedBlocks)),
                         blockId)));
        }
예제 #21
0
 public bool TryGetSignature(short issuer, out BlockSignature signature)
 {
     signature = GetSignature(issuer);
     return(signature != null);
 }
예제 #22
0
        /// <summary>
        /// Create an ExtraData from a given byte array
        /// </summary>
        /// <param name="ba">The byte array</param>
        /// <returns>An ExtraData object</returns>
        public static ExtraData FromByteArray(byte[] ba)
        {
            ExtraData ExtraData = new ExtraData();

            if (ba.Length < 4)
            {
                throw new ArgumentException(String.Format("Size of the ExtraData Structure is less than 4 ({0})", ba.Length));
            }

            UInt32 BlockSize = BitConverter.ToUInt32(ba, 0);

            while (BlockSize > 4)
            {
                if (BlockSize > ba.Length)
                {
                    throw new ArgumentException(String.Format("BlockSize is {0} is incorrect (bytes left {1})", BlockSize, ba.Length));
                }
                BlockSignature BlockSignature = (BlockSignature)BitConverter.ToUInt32(ba, 4);
                switch (BlockSignature)
                {
                case BlockSignature.CONSOLE_PROPS:
                    ExtraData.ConsoleDataBlock = ConsoleDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.CONSOLE_FE_PROPS:
                    ExtraData.ConsoleFEDataBlock = ConsoleFEDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.DARWIN_PROPS:
                    ExtraData.DarwinDataBlock = DarwinDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.ENVIRONMENT_PROPS:
                    ExtraData.EnvironmentVariableDataBlock = EnvironmentVariableDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.ICON_ENVIRONMENT_PROPS:
                    ExtraData.IconEnvironmentDataBlock = IconEnvironmentDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.KNOWN_FOLDER_PROPS:
                    ExtraData.KnownFolderDataBlock = KnownFolderDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.PROPERTY_STORE_PROPS:
                    ExtraData.PropertyStoreDataBlock = PropertyStoreDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.SHIM_PROPS:
                    ExtraData.ShimDataBlock = ShimDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.SPECIAL_FOLDER_PROPS:
                    ExtraData.SpecialFolderDataBlock = SpecialFolderDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.TRACKER_PROPS:
                    ExtraData.TrackerDataBlock = TrackerDataBlock.FromByteArray(ba);
                    break;

                case BlockSignature.VISTA_AND_ABOVE_IDLIST_PROPS:
                    ExtraData.VistaAndAboveIDListDataBlock = VistaAndAboveIDListDataBlock.FromByteArray(ba);
                    break;

                default:
                    throw new ArgumentException(String.Format("BlockSignature is {0} is incorrect", BlockSignature));
                }
                ba        = ba.Skip((int)BlockSize).ToArray();
                BlockSize = BitConverter.ToUInt32(ba, 0);
            }

            return(ExtraData);
        }
예제 #23
0
 public void AddBlockSignature(BlockSignature bs)
 {
     BlockSignaturePool.Add(bs);
 }