/// <summary>
        /// Decode a Gss_Wrap token from security buffers
        /// </summary>
        /// <param name="context">The context of decoding</param>
        /// <param name="securityBuffers">Security buffers</param>
        /// <returns>The decoded Gss_Wrap token.</returns>
        internal static KerberosPdu GssUnWrapEx(KerberosContext context, SecurityBuffer[] securityBuffers)
        {
            KerberosPdu   pdu = null;
            EncryptionKey key = context.ContextKey;

            switch ((EncryptionType)key.keytype.Value)
            {
            case EncryptionType.AES128_CTS_HMAC_SHA1_96:
            case EncryptionType.AES256_CTS_HMAC_SHA1_96:
                var token4121Pdu = new Token4121(context);
                token4121Pdu.FromSecurityBuffers(securityBuffers);
                pdu = token4121Pdu;
                break;

            case EncryptionType.DES_CBC_CRC:
            case EncryptionType.DES_CBC_MD5:
            case EncryptionType.RC4_HMAC:
            case EncryptionType.RC4_HMAC_EXP:
                var token1964or4757Pdu = new Token1964_4757(context);
                token1964or4757Pdu.FromSecurityBuffers(securityBuffers);
                pdu = token1964or4757Pdu;
                break;

            default:
                throw new NotSupportedException("The Encryption Type can only be AES128_CTS_HMAC_SHA1_96, "
                                                + "AES256_CTS_HMAC_SHA1_96, DES_CBC_CRC, DES_CBC_MD5, RC4_HMAC or RC4_HMAC_EXP.");
            }

            return(pdu);
        }
        internal static bool GssVerifyMicEx(KerberosContext context, SecurityBuffer[] securityBuffers, out KerberosPdu pdu)
        {
            pdu = null;
            bool          isVerified = true;
            EncryptionKey key        = context.ContextKey;

            switch ((EncryptionType)key.keytype.Value)
            {
            case EncryptionType.AES128_CTS_HMAC_SHA1_96:
            case EncryptionType.AES256_CTS_HMAC_SHA1_96:
                var micPdu4121 = new Token4121(context);
                try
                {
                    micPdu4121.FromSecurityBuffers(securityBuffers);
                }
                catch (FormatException)
                {
                    isVerified = false;
                }
                pdu = micPdu4121;
                break;

            case EncryptionType.DES_CBC_CRC:
            case EncryptionType.DES_CBC_MD5:
            case EncryptionType.RC4_HMAC:
            case EncryptionType.RC4_HMAC_EXP:
                var micPdu1964_4757 = new Token1964_4757(context);
                try
                {
                    micPdu1964_4757.FromSecurityBuffers(securityBuffers);
                }
                catch (FormatException)
                {
                    isVerified = false;
                }
                pdu = micPdu1964_4757;
                break;

            default:
                throw new NotSupportedException("The Encryption Type can only be AES128_CTS_HMAC_SHA1_96, "
                                                + "AES256_CTS_HMAC_SHA1_96, DES_CBC_CRC, DES_CBC_MD5, RC4_HMAC or RC4_HMAC_EXP.");
            }

            return(isVerified);
        }