public AESServiceProvider(InternalMemoryManager manager, SystemBus bus)
 {
     this.manager = manager;
     this.bus     = bus;
 }
 public PseudorandomBitGenerator(InternalMemoryManager manager)
 {
     this.manager = manager;
     Reset();
 }
 public RSAServiceProvider(InternalMemoryManager manager)
 {
     this.manager = manager;
 }
        public AthenaX5200(Machine machine)
        {
            memoryManager       = new InternalMemoryManager();
            RegistersCollection = new DoubleWordRegisterCollection(this);
            rsaServiceProvider  = new RSAServiceProvider(memoryManager);
            aesServiceProvider  = new AESServiceProvider(memoryManager, machine.SystemBus);

            Registers.CSR.Define(this)
            .WithFlag(0,
                      writeCallback: (_, val) =>
            {
                if (val)
                {
                    Reset();
                }
                coreReset = val;
            },
                      valueProviderCallback: _ => coreReset, name: "RESET")
            .WithFlag(1, FieldMode.Write, writeCallback: (_, val) =>
            {
                if (val)
                {
                    isCompleted = false;
                }
            }, name: "CLEAR_COMPLETE")
            .WithFlag(2, FieldMode.Read, valueProviderCallback: _ => isCompleted, name: "COMPLETE")
            .WithTag("BUSY", 3, 1)
            .WithFlag(4, out coreExecuteCommand, name: "EXECUTE_COMMAND")
            .WithReservedBits(5, 3)
            .WithEnumField(8, 8, out operation)
            .WithReservedBits(16, 3)
            .WithTag("PKX_OFFSET", 19, 1)
            .WithReservedBits(20, 12)
            .WithWriteCallback((_, __) =>
            {
                if (!coreExecuteCommand.Value)
                {
                    return;
                }
                if (!commands.TryGetValue(operation.Value, out var command))
                {
                    this.Log(LogLevel.Error, "Unknown command: [{0}].", operation.Value);
                    return;
                }
                this.Log(LogLevel.Noisy, "Executing command: [{0}]", operation.Value);
                command();
                isCompleted = true;
                coreExecuteCommand.Value = false;
            });

            commands = new Dictionary <JumpTable, Action>
            {
                { JumpTable.DetectFirmwareVersion, EmptyHandler },
                { JumpTable.PrecomputeValueRSA, EmptyHandler },
                { JumpTable.InstantiateDRBG, InstantiateDRBG },
                { JumpTable.GenerateBlocksFromDRBG, GenerateBlocksWithDRBG },
                { JumpTable.UninstantiateDRBG, UninstantiateDRBG },
                { JumpTable.ModularExponentationRSA, rsaServiceProvider.ModularExponentation },
                { JumpTable.ModularReductionRSA, rsaServiceProvider.ModularReduction },
                { JumpTable.DecryptCipherRSA, rsaServiceProvider.DecryptData },
                { JumpTable.RunAES, aesServiceProvider.PerformAESOperation },
                { JumpTable.RunAES_DMA, aesServiceProvider.PerformAESOperationDMA },
            };

            Reset();
        }