public bool Open(Stream fs) { var intBytes = new byte[4]; Header = MarshalUtil.ReadStruct<CIAHeader>(fs); //read header CertificateChainOffset = Marshal.SizeOf(Header) + (long)Header.PaddingLength; TicketOffset = CertificateChainOffset + Header.CertificateChainLength; if (TicketOffset % 64 != 0) TicketOffset += (64 - TicketOffset % 64); TMDOffset = TicketOffset + Header.TicketLength; if (TMDOffset % 64 != 0) TMDOffset += (64 - TMDOffset % 64); ContentOffset = TMDOffset + Header.TMDLength; ; if (ContentOffset % 64 != 0) ContentOffset += (64 - ContentOffset % 64); MetaOffset = ContentOffset + (long)Header.ContentLength; if (MetaOffset % 64 != 0) MetaOffset += (64 - MetaOffset % 64); fs.Seek(TicketOffset, SeekOrigin.Begin); TicketContext = new TicketContext(); if (!TicketContext.Open(fs)) { errorMessage = TicketContext.GetErrorMessage(); return false; } fs.Seek(CertificateChainOffset, SeekOrigin.Begin); CertificatesContext = new CertificatesContext(); if (!CertificatesContext.Open(fs)) { errorMessage = CertificatesContext.GetErrorMessage(); return false; } fs.Seek(TMDOffset, SeekOrigin.Begin); TMDContext = new TMDContext(); if (!TMDContext.Open(fs)) { errorMessage = TMDContext.GetErrorMessage(); return false; } if (Header.MetaLength > 0) { fs.Seek(MetaOffset, SeekOrigin.Begin); MetaHeaderEntries = new ArrayList(); var metaHeaderEntry = MarshalUtil.ReadStruct<CIAMetaHeaderEntry>(fs); while (metaHeaderEntry.Type != 0) { MetaHeaderEntries.Add(metaHeaderEntry); metaHeaderEntry = MarshalUtil.ReadStruct<CIAMetaHeaderEntry>(fs); } fs.Seek(MetaOffset + 0x400, SeekOrigin.Begin); //Jump to the header ICN = new ICNContext(); ICN.Open(fs); } return true; }
public bool Open(Stream fs) { var intBytes = new byte[4]; Header = MarshalUtil.ReadStruct <CIAHeader>(fs); //read header CertificateChainOffset = Align(Marshal.SizeOf(Header), 64); TicketOffset = Align(CertificateChainOffset + Header.CertificateChainLength, 64); TMDOffset = Align(TicketOffset + Header.TicketLength, 64); ContentOffset = Align(TMDOffset + Header.TMDLength, 64); MetaOffset = Align(ContentOffset + (long)Header.ContentLength, 64); fs.Seek(CertificateChainOffset, SeekOrigin.Begin); CertificatesContext = new CertificatesContext(); if (!CertificatesContext.Open(fs)) { errorMessage = CertificatesContext.GetErrorMessage(); return(false); } fs.Seek(TicketOffset, SeekOrigin.Begin); TicketContext = new TicketContext(); if (!TicketContext.Open(fs)) { errorMessage = TicketContext.GetErrorMessage(); return(false); } fs.Seek(TMDOffset, SeekOrigin.Begin); TMDContext = new TMDContext(); if (!TMDContext.Open(fs)) { errorMessage = TMDContext.GetErrorMessage(); return(false); } if (Header.MetaLength > 0) { fs.Seek(MetaOffset, SeekOrigin.Begin); MetaHeaderEntries = new ArrayList(); var metaHeaderEntry = MarshalUtil.ReadStruct <CIAMetaHeaderEntry>(fs); while (metaHeaderEntry.ID[6] == 4) { MetaHeaderEntries.Add(metaHeaderEntry); metaHeaderEntry = MarshalUtil.ReadStruct <CIAMetaHeaderEntry>(fs); } fs.Seek(MetaOffset + 0x400, SeekOrigin.Begin); //Jump to the header ICN = new ICNContext(); ICN.Open(fs); } return(true); }