Example #1
0
        public EncryptedStream(Stream output, NpaEntry entry, EncryptionScheme scheme, int arc_key)
        {
            m_read_mode        = false;
            m_encrypted_length = GetEncryptedLength(entry, scheme.TitleId);
            int key = NpaOpener.GetKeyFromEntry(entry, scheme, arc_key);

            m_stream    = output;
            m_encrypted = new Lazy <byte[]> (() => new byte[m_encrypted_length]);
            m_base_pos  = m_stream.Position;

            byte[] decrypt_table = NpaOpener.GenerateKeyTable(scheme);
            byte[] encrypt_table = new byte[256];
            for (int i = 0; i < 256; ++i)
            {
                encrypt_table[decrypt_table[i]] = (byte)i;
            }

            if (NpaTitleId.LAMENTO == scheme.TitleId)
            {
                Encrypt = (i, x) => encrypt_table[(x + key) & 0xff];
            }
            else
            {
                Encrypt = (i, x) => encrypt_table[(x + key + i) & 0xff];
            }
        }
Example #2
0
        public EncryptedStream(NpaArchive arc, NpaEntry entry)
        {
            m_read_mode        = true;
            m_encrypted_length = GetEncryptedLength(entry, arc.Scheme.TitleId);
            if (m_encrypted_length > entry.Size)
            {
                m_encrypted_length = (int)entry.Size;
            }
            int key = NpaOpener.GetKeyFromEntry(entry, arc.Scheme, arc.Key);

            m_stream    = arc.File.CreateStream(entry.Offset, entry.Size);
            m_encrypted = new Lazy <byte[]> (() => InitEncrypted(key, arc.Scheme.TitleId, arc.KeyTable));
            m_base_pos  = m_stream.Position;
        }