diff --git a/CHANGELOG.md b/CHANGELOG.md index adad6f0..f2b90d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes are documented here. ## Unreleased +## 0.3.2 - 2026-10-04 + +- Added an explicit Show QR code action for the current credential and each imported token, opening a large, camera-readable enrollment QR in a keyboard-accessible dialog. +- Kept enrollment QR codes black on white in both themes, with a quiet zone, token identity and parameters, local SVG download, and visible errors when a token exceeds the encoder capacity. +- Replaced the automatic credential QR preview with deliberate display and verified displayed TOTP/HOTP enrollment codes with the independent jsQR decoder. + ## 0.3.1 - 2026-09-01 - Corrected the packaged corresponding-source identity to name this release and its immutable source tag. diff --git a/README.md b/README.md index af8d8f9..03f49fc 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ Authentication material stays in the active tab. The application has no backend, - RFC 4226 HOTP and RFC 6238 TOTP generation and bounded diagnostic verification using SHA-1, SHA-256 or SHA-512, with exact 64-bit counters and preserved leading zeroes. - Strict `otpauth://` parsing/serialization, random secret generation, masked values, interoperability findings, live period display and a project-owned QR encoder. +- **Show QR code** in the credential editor or beside any imported token displays a large enrollment QR for scanning with another device's authenticator. The dialog identifies the token and its parameters, supports SVG download, and closes with Escape. Displaying or downloading it reveals the token's secret; generation stays entirely in this tab. - Auditable TOTP time travel using positive/negative period offsets or a frozen local date/time in an explicit IANA timezone, including DST-gap rejection and repeated-time disambiguation. - Bounded clock-drift search, past/current/future OTP timelines, downloadable interoperability vectors and custom RFC 6238 T0 diagnostics. - RFC 6287 OCRA-1 suite parsing and computation for counter, numeric/alphanumeric/hex challenge, PIN/password hash, session and timestamp inputs. Official RFC interoperability vectors cover SHA-1, SHA-256 and SHA-512 paths. @@ -54,7 +55,7 @@ The Vite base is relative, so both `/` and nested paths work. `npm run toolbox:c ## Static deployment -Serve `dist/` or the contents of `release/auth-tools-0.3.1.zip` over HTTPS. Recommended response headers for the dedicated Auth Tools origin: +Serve `dist/` or the contents of `release/auth-tools-0.3.2.zip` over HTTPS. Recommended response headers for the dedicated Auth Tools origin: ```text Content-Security-Policy: default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'self'; worker-src 'self' blob:; manifest-src 'self' diff --git a/SOURCE.md b/SOURCE.md index 6097c8d..f5ec0cf 100644 --- a/SOURCE.md +++ b/SOURCE.md @@ -1,8 +1,8 @@ # Corresponding source and provenance -The corresponding source for OTP & Passkey Tools 0.3.1 is published at: +The corresponding source for OTP & Passkey Tools 0.3.2 is published at: -https://git.add-ideas.de/lotobo/auth-tools/src/tag/v0.3.1 +https://git.add-ideas.de/lotobo/auth-tools/src/tag/v0.3.2 Build that tag with Node.js 22 and the exact `package-lock.json`: diff --git a/package-lock.json b/package-lock.json index fb55bbc..7c005d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "auth-tools", - "version": "0.3.1", + "version": "0.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "auth-tools", - "version": "0.3.1", + "version": "0.3.2", "license": "GPL-3.0-or-later", "dependencies": { "@add-ideas/toolbox-contract": "0.2.3", diff --git a/package.json b/package.json index eca9aee..ffa826f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "auth-tools", - "version": "0.3.1", + "version": "0.3.2", "description": "Inspect and test OTP and WebAuthn authentication locally in the browser.", "license": "GPL-3.0-or-later", "author": "Albrecht Degering", diff --git a/public/CHANGELOG.md b/public/CHANGELOG.md index adad6f0..f2b90d2 100644 --- a/public/CHANGELOG.md +++ b/public/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes are documented here. ## Unreleased +## 0.3.2 - 2026-10-04 + +- Added an explicit Show QR code action for the current credential and each imported token, opening a large, camera-readable enrollment QR in a keyboard-accessible dialog. +- Kept enrollment QR codes black on white in both themes, with a quiet zone, token identity and parameters, local SVG download, and visible errors when a token exceeds the encoder capacity. +- Replaced the automatic credential QR preview with deliberate display and verified displayed TOTP/HOTP enrollment codes with the independent jsQR decoder. + ## 0.3.1 - 2026-09-01 - Corrected the packaged corresponding-source identity to name this release and its immutable source tag. diff --git a/public/README.md b/public/README.md index af8d8f9..03f49fc 100644 --- a/public/README.md +++ b/public/README.md @@ -8,6 +8,7 @@ Authentication material stays in the active tab. The application has no backend, - RFC 4226 HOTP and RFC 6238 TOTP generation and bounded diagnostic verification using SHA-1, SHA-256 or SHA-512, with exact 64-bit counters and preserved leading zeroes. - Strict `otpauth://` parsing/serialization, random secret generation, masked values, interoperability findings, live period display and a project-owned QR encoder. +- **Show QR code** in the credential editor or beside any imported token displays a large enrollment QR for scanning with another device's authenticator. The dialog identifies the token and its parameters, supports SVG download, and closes with Escape. Displaying or downloading it reveals the token's secret; generation stays entirely in this tab. - Auditable TOTP time travel using positive/negative period offsets or a frozen local date/time in an explicit IANA timezone, including DST-gap rejection and repeated-time disambiguation. - Bounded clock-drift search, past/current/future OTP timelines, downloadable interoperability vectors and custom RFC 6238 T0 diagnostics. - RFC 6287 OCRA-1 suite parsing and computation for counter, numeric/alphanumeric/hex challenge, PIN/password hash, session and timestamp inputs. Official RFC interoperability vectors cover SHA-1, SHA-256 and SHA-512 paths. @@ -54,7 +55,7 @@ The Vite base is relative, so both `/` and nested paths work. `npm run toolbox:c ## Static deployment -Serve `dist/` or the contents of `release/auth-tools-0.3.1.zip` over HTTPS. Recommended response headers for the dedicated Auth Tools origin: +Serve `dist/` or the contents of `release/auth-tools-0.3.2.zip` over HTTPS. Recommended response headers for the dedicated Auth Tools origin: ```text Content-Security-Policy: default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'self'; worker-src 'self' blob:; manifest-src 'self' diff --git a/public/SOURCE.md b/public/SOURCE.md index 6097c8d..f5ec0cf 100644 --- a/public/SOURCE.md +++ b/public/SOURCE.md @@ -1,8 +1,8 @@ # Corresponding source and provenance -The corresponding source for OTP & Passkey Tools 0.3.1 is published at: +The corresponding source for OTP & Passkey Tools 0.3.2 is published at: -https://git.add-ideas.de/lotobo/auth-tools/src/tag/v0.3.1 +https://git.add-ideas.de/lotobo/auth-tools/src/tag/v0.3.2 Build that tag with Node.js 22 and the exact `package-lock.json`: diff --git a/public/toolbox-app.json b/public/toolbox-app.json index a939ead..1eb80f6 100644 --- a/public/toolbox-app.json +++ b/public/toolbox-app.json @@ -3,7 +3,7 @@ "schemaVersion": 1, "id": "de.add-ideas.auth-tools", "name": "OTP & Passkey Tools", - "version": "0.3.1", + "version": "0.3.2", "description": "Generate, inspect and verify OTP credentials and test WebAuthn/passkey ceremonies locally in the browser.", "entry": "./", "icon": "./favicon.svg", diff --git a/src/components/otp/OtpWorkspace.tsx b/src/components/otp/OtpWorkspace.tsx index 8270976..27f11cb 100644 --- a/src/components/otp/OtpWorkspace.tsx +++ b/src/components/otp/OtpWorkspace.tsx @@ -58,6 +58,7 @@ import { } from "../../otp/vendor-backups"; import { exportEncryptedPskc, importEncryptedPskc } from "../../otp/pskc"; import { OtpAdvancedTools } from "./OtpAdvancedTools"; +import { TokenQrDialog } from "./TokenQrDialog"; type TotpTimeMode = "current" | "relative" | "absolute"; @@ -118,6 +119,7 @@ export function OtpWorkspace() { bytesToBase32(profile.secret), ); const [secretVisible, setSecretVisible] = useState(false); + const [qrProfile, setQrProfile] = useState(null); const [now, setNow] = useState(() => Date.now()); const [totpTimeMode, setTotpTimeMode] = useState("current"); const [periodOffset, setPeriodOffset] = useState("0"); @@ -955,7 +957,6 @@ export function OtpWorkspace() { )} {uri ? ( <> -