Module: Mpp

Extended by:
T::Sig
Defined in:
lib/mpp/store.rb,
lib/mpp.rb,
lib/mpp/json.rb,
lib/mpp/units.rb,
lib/mpp/client.rb,
lib/mpp/errors.rb,
lib/mpp/server.rb,
lib/mpp/expires.rb,
lib/mpp/parsing.rb,
lib/mpp/receipt.rb,
lib/mpp/version.rb,
lib/mpp/challenge.rb,
lib/mpp/credential.rb,
lib/mpp/body_digest.rb,
lib/mpp/challenge_id.rb,
lib/mpp/methods/tempo.rb,
lib/mpp/server/intent.rb,
lib/mpp/server/method.rb,
lib/mpp/server/verify.rb,
lib/mpp/challenge_echo.rb,
lib/mpp/extensions/mcp.rb,
lib/mpp/methods/stripe.rb,
lib/mpp/secure_compare.rb,
lib/mpp/server/defaults.rb,
lib/mpp/client/transport.rb,
lib/mpp/server/decorator.rb,
lib/mpp/methods/tempo/rpc.rb,
lib/mpp/server/middleware.rb,
lib/mpp/server/mpp_handler.rb,
lib/mpp/methods/tempo/proof.rb,
lib/mpp/extensions/mcp/types.rb,
lib/mpp/extensions/mcp/errors.rb,
lib/mpp/extensions/mcp/verify.rb,
lib/mpp/methods/tempo/account.rb,
lib/mpp/methods/tempo/intents.rb,
lib/mpp/methods/tempo/schemas.rb,
lib/mpp/methods/tempo/defaults.rb,
lib/mpp/methods/tempo/keychain.rb,
lib/mpp/methods/stripe/defaults.rb,
lib/mpp/extensions/mcp/constants.rb,
lib/mpp/extensions/mcp/decorator.rb,
lib/mpp/methods/tempo/attribution.rb,
lib/mpp/methods/tempo/transaction.rb,
lib/mpp/extensions/mcp/capabilities.rb,
lib/mpp/methods/tempo/client_method.rb,
lib/mpp/methods/stripe/charge_intent.rb,
lib/mpp/methods/stripe/client_method.rb,
lib/mpp/methods/stripe/stripe_method.rb,
lib/mpp/methods/tempo/fee_payer_envelope.rb

Overview

typed: false frozen_string_literal: true

Defined Under Namespace

Modules: BodyDigest, Client, Expires, Extensions, Json, Methods, Parsing, Server, Units Classes: BadRequestError, Challenge, ChallengeEcho, Credential, InvalidChallengeError, InvalidPayloadError, MalformedCredentialError, MemoryStore, ParseError, PaymentActionRequiredError, PaymentError, PaymentExpiredError, PaymentInsufficientError, PaymentMethodUnsupportedError, PaymentRequiredError, Receipt, VerificationError, VerificationFailedError

Constant Summary collapse

BASE_URI =
"https://paymentauth.org/problems"
VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.b64url_encode(data) ⇒ Object



45
46
47
# File 'lib/mpp/challenge_id.rb', line 45

def b64url_encode(data)
  Base64.urlsafe_encode64(data.encode(Encoding::UTF_8), padding: false)
end

.b64url_encode_bytes(data) ⇒ Object



51
52
53
# File 'lib/mpp/challenge_id.rb', line 51

def b64url_encode_bytes(data)
  Base64.urlsafe_encode64(data, padding: false)
end

.create(method:, realm: nil, secret_key: nil) ⇒ Object



43
44
45
# File 'lib/mpp.rb', line 43

def self.create(method:, realm: nil, secret_key: nil)
  Server::MppHandler.create(method: method, realm: realm, secret_key: secret_key)
end

.generate_challenge_id(secret_key:, realm:, method:, intent:, request:, expires: nil, digest: nil, opaque: nil) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/mpp/challenge_id.rb', line 18

def generate_challenge_id(secret_key:, realm:, method:, intent:, request:, expires: nil, digest: nil, opaque: nil)
  request_json = Json.compact_encode(request)
  request_b64 = b64url_encode(request_json)

  opaque_b64 = if opaque
    opaque_json = Json.compact_encode(opaque)
    b64url_encode(opaque_json)
  else
    ""
  end

  hmac_input = [
    realm,
    method,
    intent,
    request_b64,
    expires || "",
    digest || "",
    opaque_b64
  ].join("|")

  mac = OpenSSL::HMAC.digest("SHA256", secret_key.encode(Encoding::UTF_8), hmac_input.encode(Encoding::UTF_8))
  Base64.urlsafe_encode64(mac, padding: false)
end

.secure_compare(a, b) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/mpp/secure_compare.rb', line 15

def secure_compare(a, b)
  return false if a.nil? || b.nil?

  a_bytes = a.encode(Encoding::UTF_8)
  b_bytes = b.encode(Encoding::UTF_8)

  return false unless a_bytes.bytesize == b_bytes.bytesize

  OpenSSL.fixed_length_secure_compare(a_bytes, b_bytes)
end