Encryption and decryption primitives for gift card data (physical and virtual)
Project description
giftcrypt
Encryption and decryption of 16-digit gift card numbers (physical and virtual).
Version: 1.0.0
Overview
giftcrypt is a Python package used by the GC Activation Orchestrator to encrypt
a plain 16-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)
- Create an AWS account at https://aws.amazon.com/free
- Create a KMS key in AWS Console → KMS → Create key
- Set alias to
alias/giftcard-key - Run
aws configureon your machine to set up credentials - Create
conf/test.yml:
aws:
profile: your_aws_profile
region: us-east-1
key_alias: alias/giftcard-key
- 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file giftcrypt-1.0.0.tar.gz.
File metadata
- Download URL: giftcrypt-1.0.0.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
835bfe228cca8327d66f4a7aec39d858c48af9de0ee2daf15c9da7e21c04b548
|
|
| MD5 |
b98069553ef67199fe88b244963e596f
|
|
| BLAKE2b-256 |
639308f4e0a0d7a42cf714d5c8a5c1f299569116cbee990b05b3d48b57f92977
|
File details
Details for the file giftcrypt-1.0.0-py3-none-any.whl.
File metadata
- Download URL: giftcrypt-1.0.0-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1dc5ff9b861b112f8e4efc075cbaecc948bc5db7caa63972a99920404092b76b
|
|
| MD5 |
104dd858ae3cd7330d034f63f38caa6b
|
|
| BLAKE2b-256 |
4a617a6314ae52ca6e48437cc13a0d9e267a57d8f0e0fb04e75f63290349aa7a
|