/// <summary>
        /// Process request.
        /// </summary>
        /// <returns>Response message.</returns>
        public override StreamResponse ConstructResponse()
        {
            var mr = new StreamResponse();

            KeyTypeCode ktc = null;

            if (!ValidateKeyTypeCode(_keyType, mr, ref ktc))
            {
                return(mr);
            }

            var zmkKs = KeyScheme.Unspecified;

            if (!ValidateKeySchemeCode(_zmkScheme, mr, ref zmkKs))
            {
                return(mr);
            }

            if (!ValidateAuthStateRequirement(KeyFunction.Export, ktc.Pair, ktc.Variant, mr))
            {
                return(mr);
            }

            var zmk = new HexKeyThales(new KeyTypeCode(0, LmkPair.Pair04_05), false, _zmk);

            if (!zmk.ClearKey.IsParityOk(Parity.Odd))
            {
                mr.Append(ErrorCodes.ER_10_SOURCE_KEY_PARITY_ERROR);
                return(mr);
            }

            var key = new HexKeyThales(ktc, false, _key);

            if (!key.ClearKey.IsParityOk(Parity.Odd))
            {
                mr.Append(ErrorCodes.ER_11_DESTINATION_KEY_PARITY_ERROR);
                return(mr);
            }

            var cryptKey = zmk.EncryptWithScheme(zmkKs.GetKeySchemeChar() + key.ClearKey);

            Log.InfoFormat("ZMK (clear): {0}", zmk.ClearKey);
            Log.InfoFormat("Key (clear): {0}", key.ClearKey);
            Log.InfoFormat("Key (ZMK): {0}", cryptKey);
            Log.InfoFormat("Check value: {0}", key.CheckValue);

            mr.Append(ErrorCodes.ER_00_NO_ERROR);
            mr.Append(zmkKs != KeyScheme.Unspecified && zmkKs != KeyScheme.SingleLengthKey
                          ? zmkKs.GetKeySchemeChar()
                          : string.Empty);
            mr.Append(cryptKey);
            mr.Append(key.CheckValue.Substring(0, 6));

            return(mr);
        }
        /// <summary>
        /// Process request.
        /// </summary>
        /// <returns>Response message.</returns>
        public override StreamResponse ConstructResponse()
        {
            var         mr  = new StreamResponse();
            KeyTypeCode ktc = null;

            if (!ValidateKeyTypeCode(_keyType, mr, ref ktc))
            {
                return(mr);
            }

            var ks = KeyScheme.Unspecified;

            if (!ValidateKeySchemeCode(_keyScheme, mr, ref ks))
            {
                return(mr);
            }

            var zmkKs = KeyScheme.Unspecified;

            if (!string.IsNullOrEmpty(_zmkScheme))
            {
                if (!ValidateKeySchemeCode(_zmkScheme, mr, ref zmkKs))
                {
                    return(mr);
                }
            }

            if (!ValidateAuthStateRequirement(KeyFunction.Generate, ktc.Pair, ktc.Variant, mr))
            {
                return(mr);
            }

            var rndKey       = string.Empty.RandomKey(ks);
            var thalesRndKey = new HexKeyThales(ktc, true, rndKey);

            Log.InfoFormat("Key generated (clear): {0}", rndKey);
            Log.InfoFormat("Key generated (LMK, ANSI): {0}", thalesRndKey.KeyAnsi);
            Log.InfoFormat("Key generated (LMK, Variant): {0}", thalesRndKey.KeyVariant);
            Log.InfoFormat("Check value: {0}", thalesRndKey.CheckValue);

            mr.Append(ErrorCodes.ER_00_NO_ERROR);
            mr.Append(ks == KeyScheme.DoubleLengthKeyAnsi || ks == KeyScheme.TripleLengthKeyAnsi
                          ? thalesRndKey.KeyAnsi
                          : thalesRndKey.KeyVariant);

            if (!string.IsNullOrEmpty(_zmk) && _modeFlag == "1")
            {
                var zmk = new HexKeyThales(new KeyTypeCode(0, LmkPair.Pair04_05), false, _zmk);
                if (!zmk.ClearKey.IsParityOk(Parity.Odd))
                {
                    mr.Append(ErrorCodes.ER_10_SOURCE_KEY_PARITY_ERROR);
                    return(mr);
                }

                var cryptUnderZmk = zmk.EncryptWithScheme(zmkKs.GetKeySchemeChar() + rndKey);

                Log.InfoFormat("ZMK (clear): {0}", zmk.ClearKey);
                Log.InfoFormat("Key under ZMK: {0}", zmkKs.GetKeySchemeChar() + cryptUnderZmk);

                mr.Append(zmkKs.GetKeySchemeChar() + cryptUnderZmk);
            }

            mr.Append(thalesRndKey.CheckValue.Substring(0, 6));

            return(mr);
        }