public virtual byte[] processCommand(Apdu apdu)
        {
            CardContext context = handler.Context;

            if (apdu.P1 == 0x80 && apdu.P2 == 0x86)
            {
                // DEC
                BSO key = handler.GetEnvironmentKey(SecurityEnvironmentComponent.CON);
                if (key.Class != BSOClass.PSO)
                {
                    return(Error.P1OrP2NotValid);
                }

                if (key.Algo != BSOAlgo.RSA_Enc &&
                    key.Algo != BSOAlgo.DES3_Enc_SMEnc)
                {
                    return(Error.P1OrP2NotValid);
                }

                if (!handler.IsVerifiedAC(key, BSO_AC.AC_USE))
                {
                    return(Error.SecurityStatusNotSatisfied);
                }

                byte[] data = handler.Decrypt(key, new ByteArray(apdu.Data).Sub(1));
                // devo paddare per arrivare alla lunghezza del modulo
                if (key.Algo == BSOAlgo.RSA_Enc)
                {
                    if (data.Length < (key.data.Length - 2))
                    {
                        var dataPad = new byte[key.data.Length - 2];
                        data.CopyTo(dataPad, dataPad.Length - data.Length);
                        data = dataPad;
                    }
                }
                return(Util.Response(data, Error.Ok));
            }
            else if (apdu.P1 == 0x86 && apdu.P2 == 0x80)
            {
                // ENC
                BSO key = handler.GetEnvironmentKey(SecurityEnvironmentComponent.CON);
                if (key.Class != BSOClass.PSO)
                {
                    return(Error.P1OrP2NotValid);
                }

                if (key.Algo != BSOAlgo.RSA_Enc &&
                    key.Algo != BSOAlgo.DES3_Enc_SMEnc)
                {
                    return(Error.P1OrP2NotValid);
                }

                if (!handler.IsVerifiedAC(key, BSO_AC.AC_USE))
                {
                    return(Error.SecurityStatusNotSatisfied);
                }

                byte[] data = handler.Encrypt(key, apdu.Data);
                if (key.Algo == BSOAlgo.RSA_Enc && data.Length < (key.data.Length - 2))
                {
                    var dataPad = new byte[key.data.Length - 2];
                    data.CopyTo(dataPad, dataPad.Length - data.Length);
                    data = dataPad;
                }
                return(Util.Response(new ByteArray(0).Append(data), Error.Ok));
            }
            else if (apdu.P1 == 0x9E && apdu.P2 == 0x9A)
            {
                // CDS
                BSO key = handler.GetEnvironmentKey(SecurityEnvironmentComponent.CDS);
                if (key.Class != BSOClass.PSO)
                {
                    return(Error.P1OrP2NotValid);
                }

                if (key.Algo != BSOAlgo.RSA_DS_Test)
                {
                    return(Error.P1OrP2NotValid);
                }

                if (!handler.IsVerifiedAC(key, BSO_AC.AC_USE))
                {
                    return(Error.SecurityStatusNotSatisfied);
                }

                byte[] data = handler.DigitalSignature(key, apdu.Data);
                if (data.Length < (key.data.Length - 2))
                {
                    var dataPad = new byte[key.data.Length - 2];
                    data.CopyTo(dataPad, dataPad.Length - data.Length);
                    data = dataPad;
                }
                return(Util.Response(data, Error.Ok));
            }
            return(Error.P1OrP2NotValid);
        }