private bool VerifyApplePayPaymentProcessingCertificate(X509Certificate2 paymentProcessingCertificate, ApplePayPaymentToken token)
        {
            try
            {
                if (token.PaymentData?.Header?.PublicKeyHash == null)
                {
                    throw new InvalidOperationException("Required header data was not found on Payment Token JSON.");
                }

                ApplePayHelper.ValidatePaymentProcessingCertificate(
                    paymentProcessingCertificate,
                    token.PaymentData.Header.PublicKeyHash);

                return(true);
            }
            catch (Exception paymentProcessingCertificateException)
            {
                MessageBox.Show(
                    $"Payment Processing Certificate validation failed:\r\n\r\n{paymentProcessingCertificateException}",
                    "Apple Pay Payment Processing Certificate Failure",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return(false);
            }
        }
        private bool VerifyApplePaySignature(X509Certificate2 rootCertificateAuthority, ApplePayPaymentToken token)
        {
            try
            {
                if (token.PaymentData?.Signature == null ||
                    token.PaymentData?.Data == null ||
                    token.PaymentData?.Header?.EphemeralPublicKey == null ||
                    token.PaymentData?.Header?.TransactionId == null)
                {
                    throw new InvalidOperationException("Required signature data was not found on Payment Token JSON.");
                }

                ApplePayHelper.VerifyApplePaySignature(
                    rootCertificateAuthority,
                    token.PaymentData.Signature,
                    token.PaymentData.Data,
                    token.PaymentData.Header.EphemeralPublicKey,
                    token.PaymentData.Header.TransactionId.ToByteArray(),
                    token.PaymentData.Header.ApplicationData?.ToByteArray(),
                    _ValidateSigningTimeCheckBox.Checked ? 300 : (int?)null);

                return(true);
            }
            catch (Exception signatureValidationException)
            {
                MessageBox.Show(
                    $"Payment Token Signature validation failed:\r\n\r\n{signatureValidationException}",
                    "Apple Pay Signature Verification Failure",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return(false);
            }
        }
        private byte[]? DecryptApplePayData(byte[] keyMaterial, ApplePayPaymentToken token)
        {
            try
            {
                if (token.PaymentData?.Data == null)
                {
                    throw new InvalidOperationException("Required payment data was not found on Payment Token JSON.");
                }

                return(ApplePayHelper.DecryptCipherDataUsingAesGcmAlgorithm(keyMaterial, Convert.FromBase64String(token.PaymentData.Data)));
            }
            catch (Exception keyDerivationException)
            {
                MessageBox.Show(
                    $"Apple Pay decryption failed:\r\n\r\n{keyDerivationException}",
                    "Apple Pay Key Decryption Failure",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return(null);
            }
        }
        private byte[]? DeriveApplePayKeyMaterial(X509Certificate2 paymentProcessingCertificate, ApplePayPaymentToken token)
        {
            try
            {
                if (token.PaymentData?.Header?.EphemeralPublicKey == null)
                {
                    throw new InvalidOperationException("Required header data was not found on Payment Token JSON.");
                }

                return(ApplePayHelper.DeriveKeyMaterialUsingEllipticCurveDiffieHellmanAlgorithm(
                           paymentProcessingCertificate,
                           token.PaymentData.Header.EphemeralPublicKey));
            }
            catch (Exception keyDerivationException)
            {
                MessageBox.Show(
                    $"Apple Pay key derivation failed:\r\n\r\n{keyDerivationException}",
                    "Apple Pay Key Derivation Failure",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                return(null);
            }
        }