All products
CP Word List

Word passphrases on the enrollment page

When a user enrolls, CP Word List replaces the random DPSK passphrase with three words—like apple-red-truck. If it's down, the passphrase is never changed; within 15 seconds the enrollment page shows Cloudpath's own.

Enrollment page

Cloudpath generated xK9mPq2vL

Your personal Wi-Fi password is

apple-red-truck

Connect to the Residents network.

Illustrative example
2.17 billion
Possible word combinations
11–17 characters
Always above the WPA minimum
15 seconds
Fallback window on any error

Three-step setup

Sign in and configure

Sign in with Google. Enter your Cloudpath FQDN, API credentials, and SSID name. Cloudpath's API must be publicly reachable over HTTPS with a trusted certificate.

Test and add the notification step

Click Test Connection to verify credentials. In Cloudpath, add a 'Call a URL' step after 'Generate a DPSK': POST to wordlist.lanpulse.com with the enrollment ID and shared secret.

Add the message step and publish

Add 'Display a message' with the provided snippet after the notification. Enrolling devices need browser access to wordlist.lanpulse.com. Set Kill Session, paste in your Tenant ID, and publish.

Built to stay out of the path

The service is never in the path to network access. DPSK auth runs inside Cloudpath and the network. If it's down, can't reach Cloudpath, or Cloudpath refuses the change, the passphrase is never changed—within 15 seconds, the enrollment page shows Cloudpath's own.

How CP Word List changes a passphrase during enrollment The Cloudpath enrollment workflow generates a DPSK with a random passphrase and notifies CP Word List. CP Word List signs in to the Cloudpath API, finds the DPSK, skips it if a device is already on it, and sets a three-word passphrase, retrying up to three times on a conflict. It keeps the old-to-new mapping for five minutes. The enrollment page asks CP Word List for the new phrase, up to seven times two seconds apart, and shows it. If CP Word List is down, cannot reach Cloudpath, or Cloudpath refuses the change, the passphrase is never changed and within 15 seconds the page shows Cloudpath's own passphrase, which works. Joining the network is between the device, the Wi-Fi and Cloudpath; CP Word List is not in that path. Enrollment Cloudpath workflow Generate a DPSK random: xK9mPq2vL CP Word List Cloudflare Worker Sign in, find the DPSK skip if a device is on it apple-red-truck 3 words · 31 bits old → new kept 5 minutes Cloudpath your server DPSK passphrase now apple-red-truck Enrollment page the user's browser Your Wi-Fi password is apple-red-truck Your Wi-Fi the device joins with the passphrase on the DPSK CP Word List not involved 1 notify 2 retry ×3 3 ≤7 asks 2 s apart checks it IF IT FAILS BEFORE THE CHANGE CP Word List is down, can't reach or sign in to Cloudpath, or Cloudpath refuses: the passphrase is never changed. Within 15 seconds the enrollment page shows Cloudpath's own xK9mPq2vL, and it works. Joining the network is between the device, your Wi-Fi and Cloudpath. CP Word List is not in that path.

No role at connect time

When a device connects to the Wi-Fi, DPSK auth runs entirely within Cloudpath and the network gear. The service edits passphrases via Cloudpath's API—nothing more.

After DPSK generation, not before

The notification fires after Cloudpath generates the DPSK. The enrollment page renders from Cloudpath regardless. The snippet always resolves within 15 seconds.

Won't change a passphrase in use

Before any edit, the service reads the device count. If a device is already connected on this DPSK, the change is skipped. Cloudpath also enforces this with a 409.

Retries only where safe

On a 409 from Cloudpath—phrase collision or a device joining mid-flight—it retries with a fresh phrase, up to three attempts. On auth errors or 5xx responses, it stops.

What it does

Works automatically during enrollment and for bulk unit provisioning. No per-user admin action required.

Word phrases at enrollment

When a user enrolls, the service replaces the random DPSK with three words—like apple-red-truck—before the enrollment page displays it. No admin action per enrollment.

Shown on the enrollment page

The enrollment page shows a spinner, then the word phrase and 'Connect to [SSID]'—resolved within 15 seconds.

Won't change active devices

Before editing a passphrase, the service checks the DPSK's device count. If any device is already using it, the change is skipped. Cloudpath enforces the same rule.

Returning users see it instantly

If the DPSK is already in word format, the snippet shows it immediately without contacting the service. Works for repeated visits to the enrollment page.

Bulk unit export

Generate up to 10,000 units in Cloudpath's property-unit import format as an .xlsx. Word passphrases are pre-filled; add an optional separate guest passphrase per unit.

Activity log and direct API

A per-tenant activity log, kept 90 days. Two direct API endpoints—POST /api/change-dpsk and GET /api/get-dpsk—are available for custom integrations.

Who uses it

Campus and MDU admin

Users misread random passphrases and call the help desk. Word phrases are easier to read from a screen, say over the phone, and type on a mobile keyboard.

MSP managing multiple tenants

Each customer account is independent. Configure credentials, paste the snippet, publish—once per tenant. The activity log shows what happened on each enrollment, per account.

Pre-sales or QA engineer

The in-app Technical Reference includes sequence diagrams and an API reference. The Security page covers credential handling—material you can walk a customer through.

Data handling

API credentials are encrypted before storage. Passphrases pass through briefly and are purged. No AI, no third parties beyond Google sign-in and your Cloudpath server.

Encrypted credentials

API username and password are each encrypted with AES-256-GCM, with a random IV and per-field salt. The key is derived with HKDF-SHA256 tied to your tenant ID.

Short-lived passphrase cache

Old and new passphrases are stored in plain text for about 10 minutes—only long enough for the enrollment page to fetch the new phrase—then purged automatically.

What's stored in Cloudflare D1

Google account ID, email, and name; FQDN and SSID; encrypted credentials; shared secret; activity log (90 days); passphrase mappings (~10 min); Terms-acceptance records.

Where data goes

Your Cloudpath server (API calls during enrollment) and Google (sign-in only). No other services, no analytics, no AI processing.

Self-service account deletion

Deleting your account from the dashboard purges mappings, activity, sessions, and feedback, scrubs the tenant row, and rotates the shared secret so webhooks stop immediately.

Security in depth

This section covers the design decisions a security reviewer needs before handing the service an account-admin Cloudpath credential: key handling, trust boundaries, what each surface exposes to its holder, and the residual risks the design accepts.

Trust boundaries

Five surfaces, five controls

Cloudpath calls /api/change-dpsk with the per-tenant shared secret. The Worker calls Cloudpath's publicApi with a username/password-derived JWT. Tenants access the dashboard via Google OAuth. The operator accesses /admin with a password. The lookup endpoint /api/get-dpsk has no credential gate; the old passphrase is the lookup key.

API credential blast radius

A compromised Cloudpath credential gives account-admin access to the customer's entire Cloudpath account, not just the DPSKs this service touches. Encryption at rest, in-memory-only decryption, and the dedicated-account recommendation are the mitigations. The blast radius is set by Cloudpath's role model, not this service's design.

Operator trust boundary

NeuralConfig holds the Cloudflare account and the ENCRYPTION_SECRET binding. Encryption protects credentials against a database-only compromise; it does not protect against the operator. The admin console is never given the ENCRYPTION_SECRET binding and cannot decrypt stored credentials.

Outbound FQDN scope

Self-service accounts are limited to *.cloudpath.net FQDNs, which auto-enable after saving. Any other hostname stays disabled until operator review. Both the webhook and Test Connection are blocked while an account is disabled. The outbound scheme is fixed to https://.

Your Cloudpath credentials

AES-256-GCM, per-field keys

Username and password are encrypted separately. Each gets a fresh 12-byte random IV and a 16-byte random salt. The key derives from HKDF-SHA256 over the master Worker secret, with the per-field salt and the tenant's UUID as HKDF info. Two identical passwords produce different ciphertext.

Decrypted only at the Cloudpath call

Credentials are decrypted in memory in exactly two code paths: the webhook (to mint a JWT) and Test Connection. Plaintext is passed directly to Cloudpath's token endpoint and discarded after the call. No caching, no logging, no browser exposure.

Four Cloudpath calls, one write

Every webhook call makes four Cloudpath API calls: POST /token, GET /enrollments/{id}/dpsks, GET /dpskPools/{pool}/dpsks/{guid}, PUT the same path with only passphrase replaced. Path segments are percent-encoded. The only write the service ever makes is a passphrase edit on a DPSK with no devices.

Least privilege constrained by Cloudpath

Cloudpath's API requires the account-admin role for the token endpoint; no narrower role exists for these calls. Use a dedicated Cloudpath account so the credential can be revoked independently without affecting other integrations on the same account.

Webhook and passphrase lookup

Webhook authentication and validation

The shared secret is looked up by its SHA-256 hash against a unique-indexed column—a hash lookup, not a string comparison against the stored value. The enrollment ID must match ^(Enrollment|Message)-<UUID>$ before any Cloudpath call or log write. All path segments are percent-encoded.

Rate limit and secret holder scope

Rate-limited per tenant at 30 requests per minute (approximate, per Cloudflare location). With the secret, a holder can trigger a passphrase change on a deviceless DPSK and receive the new passphrase in the response. They cannot reach other tenants, other Cloudpath endpoints, or DPSKs with devices.

Passphrase lookup: rate limits and window

GET /api/get-dpsk is rate-limited per IP (60/min) and per tenant across all IPs (600/min), both approximate. A mapping is readable for 5 minutes and purged within about 10. The response returns only {success, passphrase}—no DPSK GUID or name.

CORS on the lookup endpoint

Access-Control-Allow-Origin is set only to the tenant's saved Cloudpath FQDN. This blocks other websites' browser scripts from reading the response. It is not access control for non-browser clients; the rate limits and 5-minute window are what bound guessing.

Dashboard and operator access

Sessions and cookies

Session tokens are 32 random bytes; their SHA-256 hash is stored in D1, not the token itself. Tenant cookies: HttpOnly, Secure, SameSite=Lax, 1-hour absolute lifetime. Operator cookies: SameSite=Strict. Logout deletes the D1 row; account deletion deletes all tenant sessions in one transaction.

CSRF protection

Dashboard mutations rely on SameSite=Lax session cookies plus CSP form-action 'self'. Cross-site POST requests carry no Lax cookie; form-action 'self' blocks cross-origin form targets. The operator console adds SameSite=Strict.

Security headers on every response

HSTS (1 year, includeSubDomains), X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer, X-Frame-Options: DENY, Cache-Control: no-store. HTML pages add a CSP: default-src 'self'; script-src 'self' plus one SRI-pinned Mermaid URL; object-src, base-uri and frame-ancestors all 'none'. Plain HTTP is redirected to HTTPS with a 301.

Operator and tenant separation

The operator console and tenant dashboard use separate session types, cookies and URL paths. The admin console is never given the ENCRYPTION_SECRET binding; it cannot display decrypted Cloudpath credentials. Admin login is rate-limited at 5 attempts per minute per IP.

Passphrase strength and lifecycle

31-bit entropy, negligible bias

Phrases are three words from a 1,294-word list, drawn with crypto.getRandomValues. Entropy is 31.0 bits—about 2.17 billion combinations. Modulo selection introduces a per-word relative bias of 3×10⁻⁷, negligible in practice. No rejection sampling.

5-minute mapping, ~10-minute purge

After a change, the old-to-new mapping is readable for 5 minutes and deleted within about 10 by a cron that runs every 5 minutes. Old and new passphrases are stored in plain text during that window—only long enough for the enrollment page to retrieve the new phrase.

What the service logs

Operational logs record event names, tenant row IDs and HTTP status codes—never the shared secret, passphrases, enrollment IDs or DPSK GUIDs. The customer-visible activity log records enrollment IDs, DPSK GUIDs and names on success; on errors, a kind and HTTP status—not Cloudpath's raw message text.

Retention windows

Passphrase mappings: ~10 minutes. OAuth pending sign-ins: ~15 minutes. Sessions: 1 hour. Activity log and feedback: 90 days, then purged by a daily cron. Terms-acceptance records (with IP and user agent) are kept indefinitely. Account deletion purges everything except acceptance records in one D1 transaction.

Residual risks

Account-admin role is unavoidable

Cloudpath offers no narrower API role for these calls. A leaked credential gives full account-admin access to the customer's Cloudpath account. Use a dedicated account, separate from any human login, so it can be revoked without affecting other integrations.

Webhook has no replay protection

Cloudpath's 'Call a URL' step provides no signing or nonce. The shared secret is the only webhook authenticator, and calls are not idempotent: resending a valid enrollment ID re-keys its DPSK if it still has no devices. Send the secret in the POST body, not the URL.

Word phrases are 31 bits

Three words from 1,294 is 31.0 bits—less than Cloudpath's default 12-character random passphrase (~56 bits). These are per-user DPSKs: a compromised phrase affects one user's key, not a shared network credential. The admin can revoke that DPSK individually in Cloudpath.

Lookup guessing depends on pool settings

The lookup is rate-limited, but guessing resistance also depends on the DPSK pool's passphrase format and length. Short or numeric-only pools are substantially weaker. Use Cloudpath's default format (12-character random) or longer to ensure the window and rate limits are meaningful controls.

How I built it

A Cloudflare Worker that rewrites Cloudpath DPSK passphrases at enrollment—and the failure design that keeps it out of the path to network access.

The failure design

The core constraint was that this service must never block a user from connecting. RADIUS auth and DPSK verification happen inside Cloudpath and the network gear—the service is only a passphrase editor. I wanted word phrases to appear on the enrollment page, which Cloudpath serves, but that required a browser-side fetch. So failure is possible at two points: before the change, and on the display side.

The before-change case is clean. If the notification call fails for any reason—service down, Cloudpath unreachable, bad credentials, enrollment not found—the DPSK passphrase is never changed. The snippet polls for up to 15 seconds, seven attempts 2 seconds apart, then writes Cloudpath's own phrase. The user gets a random passphrase instead of a word one, but they connect.

A few other choices: I retry only on 409—phrase collision or a device joining mid-flight—never on auth errors or Cloudpath 5xx responses. Hammering a sick Cloudpath is worse than one missed word phrase. Before any PUT, I check deviceCount. Cloudpath enforces this too, but I wanted an explicit skip with no retry. And I never log the shared secret, passphrases, enrollment IDs, or DPSK GUIDs to console; the customer-visible activity log records the last two for the tenant's own debugging.

Credentials, tenancy, and Cloudpath calls

Each tenant gets a UUID tenant ID—public, embedded in the snippet—and a separate UUID shared secret, shown in the dashboard and regeneratable with one click. The secret authenticates the webhook. The tenant ID scopes DPSK lookups, paired with the exact old passphrase and a 5-minute TTL.

API credentials are encrypted with AES-256-GCM before storage. Each field—username and password separately—gets its own random 12-byte IV and a 16-byte salt. The key comes from HKDF-SHA256 over a Worker secret, with the tenant ID as info and the per-field salt, so two identical passwords don't produce identical ciphertext. Passphrase selection uses crypto.getRandomValues with modulo arithmetic; the modulo bias is negligible—a relative difference of about 3×10⁻⁷—and I didn't add rejection sampling.

Cloudpath JWTs are stateless: one minted per webhook call, never cached. The cloud-hosted platform caps token requests at 10 per minute per Cloudpath account, so that's the throughput ceiling at high enrollment volume—roughly 10 word-phrase changes per minute. Over that limit, enrollments fall back to Cloudpath's random phrase; they succeed, just without word format. The Cloudpath PUT requires the full resource object, not a patch, so I GET it, replace only the passphrase field, and PUT it back.

Common questions

No. It runs after Cloudpath generates the DPSK. If it's down or can't reach Cloudpath, the passphrase is never changed. Within 15 seconds the enrollment page shows Cloudpath's own phrase, which works.
Your Cloudpath API must be reachable from the public internet over HTTPS. You'll need a dedicated API account with the Cloudpath account admin role. Cloud-hosted *.cloudpath.net accounts activate automatically; self-hosted FQDNs need a brief operator review.
About 2.17 billion. Phrases are three words from a 1,294-word EFF short word list—all lowercase, 3-5 letters each—hyphen-separated, 11 to 17 characters, always above the 8-character WPA minimum.
Encrypted with AES-256-GCM before they're written to the database. They're never shown again after you save them—the dashboard shows 'Configured (encrypted)'.
No. Each account is linked to one Cloudpath FQDN. MSPs managing multiple customers set up a separate account per tenant.
Event type, timestamp, enrollment ID, DPSK GUID and name, or error kind and Cloudpath's error message. Kept 90 days, paginated 20 per page in the dashboard.
CP Word List is free. There's no billing, no trial period, and no feature tiers. Sign in with any Google account to get started.

Word passphrases on your next enrollment

Free, self-service. Sign in with Google, configure your Cloudpath details, and add two steps to the workflow.

Open the App ↗

CP Word List is an independent product of NeuralConfig LLC. It is not made, endorsed or supported by RUCKUS Networks. RUCKUS and Cloudpath are trademarks of their respective owners.