Skip to main content

Encryption and decryption primitives for gift card data (physical and virtual)

Project description

giftcrypt

Encryption and decryption of 16–19 digit gift card numbers (physical and virtual).

Version: 1.0.1


Overview

giftcrypt is a Python package used by the GC Activation Orchestrator to encrypt a plain 16–19 digit gift card number before writing it to Vault DB, and to decrypt it when reading back.

Two backends are supported:

Backend Mechanism When to use
gcm AES-256-GCM local key Local development and testing
kms_wrapped AWS KMS envelope encryption Production (recommended)

Installation

pip install cryptography          # for gcm backend
pip install cryptography boto3    # for kms_wrapped backend

Usage

The only function the Orchestrator needs to call is in vault.py:

from giftcrypt.vault import encrypt_card_number, decrypt_card_number

Local / dev testing (GCM backend)

No AWS needed. Uses a local secret key.

from giftcrypt.vault import encrypt_card_number, decrypt_card_number

key = "my-secret-encryption-key"

# Encrypt — after SVS activates the card (PGC or VGC)
ciphertext = encrypt_card_number(
    "1234567890123456",
    backend="gcm",
    key=key,
)
# → store ciphertext in Vault DB

# Decrypt — when reading back from Vault DB
card_number = decrypt_card_number(ciphertext, backend="gcm", key=key)
assert card_number == "1234567890123456"

Production (KMS wrapped backend)

Requires AWS account and KMS key. Card number never leaves your Lambda.

from giftcrypt.vault import encrypt_card_number, decrypt_card_number

KEY_ALIAS = "alias/giftcard-key"
REGION    = "us-east-1"

# PGC — card number from KIBO shipment swipe
# VGC — card number freshly issued by SVS
# Both use the exact same call:

ciphertext = encrypt_card_number(
    "1234567890123456",
    backend="kms_wrapped",
    key_alias=KEY_ALIAS,
    region=REGION,
)
# → store ciphertext in Vault DB

card_number = decrypt_card_number(ciphertext, backend="kms_wrapped", region=REGION)
assert card_number == "1234567890123456"

Input formats accepted

Dashes and spaces are stripped automatically before encryption:

encrypt_card_number("1234567890123456")      # plain
encrypt_card_number("1234-5678-9012-3456")   # dashes stripped
encrypt_card_number("1234 5678 9012 3456")   # spaces stripped
# all three store the same normalised value: "1234567890123456"

Package structure

giftcrypt/
├── giftcrypt/
│   ├── __init__.py       # package entry point
│   ├── vault.py          # primary interface — validate, normalise, route
│   ├── gcm.py            # AES-256-GCM local encryption
│   └── kms_wrapped.py    # AWS KMS envelope encryption
└── tests/
    ├── test_gcm.py        # 10 tests
    └── test_vault.py      # 21 tests

Running tests

No AWS account needed — KMS is fully mocked:

py -m pytest tests/ -v

Expected output:

31 passed in 0.82s

AWS KMS setup (for production)

  1. Create an AWS account at https://aws.amazon.com/free
  2. Create a KMS key in AWS Console → KMS → Create key
  3. Set alias to alias/giftcard-key
  4. Run aws configure on your machine to set up credentials
  5. Create conf/test.yml:
aws:
  profile: your_aws_profile
  region: us-east-1
  key_alias: alias/giftcard-key
  1. Run the KMS smoke test:
py kms_smoke_test.py

Ciphertext envelope formats

GCM envelope — pipe-separated, base64url-encoded:

v1|<iv>|<tag>|<aad>|<ciphertext>

KMS wrapped envelope — base64-encoded JSON:

{
  "version": "kms-wrapped-v1",
  "key_id": "arn:aws:kms:us-east-1:...",
  "wrapped_data_key": "...",
  "iv": "...",
  "ciphertext": "..."
}

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

giftcrypt-1.0.2.tar.gz (12.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

giftcrypt-1.0.2-py3-none-any.whl (11.2 kB view details)

Uploaded Python 3

File details

Details for the file giftcrypt-1.0.2.tar.gz.

File metadata

  • Download URL: giftcrypt-1.0.2.tar.gz
  • Upload date:
  • Size: 12.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for giftcrypt-1.0.2.tar.gz
Algorithm Hash digest
SHA256 b1fb13cc84dd1b6ac92bc0cebae96628768c938c24db09babfb3b295acabd485
MD5 d2522ca66ad4dd5052dc861335f29692
BLAKE2b-256 668b5431952e4e9a73bbd3268ab821300f344d498b7840760c76e5028a96428c

See more details on using hashes here.

File details

Details for the file giftcrypt-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: giftcrypt-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 11.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for giftcrypt-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 cf85aa5fedeb1a37d5496c153caa70f166aea5bf023701d06a95eafa618041da
MD5 c8923fa91ee0041f90c6dbd479e88ef7
BLAKE2b-256 b520d5ed4cd4965aaf27ca3e00c155b8acce70625e7c1a5b3d7b68d202bf6abd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page