Skip to content

Commit 0007f5d

Browse files
committed
Clarify FIPS 140-2/140-3 targeting and improve docs conversion
1 parent 8dfda33 commit 0007f5d

3 files changed

Lines changed: 185 additions & 34 deletions

File tree

README.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,13 @@ The gate is **fail-closed**:
6161

6262
If the gate cannot be verified, fips-pad refuses to run.
6363

64-
This project references **:contentReference[oaicite:0]{index=0} FIPS 140-3** as the governing cryptographic validation program, but does not claim validation.
64+
This project targets **FIPS 140-2 and FIPS 140-3 aligned runtime behavior** by requiring OS-backed, approved cryptographic surfaces at startup.
65+
It does **not** claim that fips-pad itself is a validated module.
66+
67+
In short:
68+
- **FIPS 140-2/140-3 target:** only use platform cryptography that is part of an OS-certified/approved module boundary.
69+
- **Product claim:** fail closed if that surface cannot be established.
70+
- **Non-claim:** no claim that this application is itself CMVP-validated.
6571

6672
### Windows 10 / 11
6773

@@ -137,7 +143,7 @@ If the gate can be bypassed, you are not running the product as shipped.
137143

138144
## NIST SP 800-53 control selection
139145

140-
This project uses **:contentReference[oaicite:1]{index=1}** as a **control vocabulary**, not a compliance claim.
146+
This project uses **NIST SP 800-53** as a **control vocabulary**, not a compliance claim.
141147

142148
Controls were selected and tailored based on the actual system boundary:
143149
- single user
@@ -162,6 +168,15 @@ Controls were selected and tailored based on the actual system boundary:
162168
- **AU-2 — Event Logging (minimal)**
163169
Local-only logging of security-relevant events; no content logging.
164170

171+
### Selected baseline control IDs (working set)
172+
173+
The current selected/tailored working set for this project is:
174+
- `SC-13` (Cryptographic Protection)
175+
- `SC-28` (Protection of Information at Rest)
176+
- `SI-7` (Software, Firmware, and Information Integrity)
177+
- `CM-7` (Least Functionality)
178+
- `AU-2` (Event Logging)
179+
165180
### Controls explicitly out of scope
166181

167182
Controls requiring:

docs/index.html

Lines changed: 78 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,26 @@
22
<html lang="en">
33
<head>
44
<meta charset="utf-8">
5-
<title>FIPSPad — A Notepad That Refuses to Run Without FIPS</title>
5+
<title>FIPSPad - Encrypted Notepad with a Hard FIPS Gate</title>
6+
<meta name="description" content="FIPSPad is an offline encrypted notepad that refuses to run unless a platform-appropriate FIPS cryptographic surface is verified.">
67
<meta name="viewport" content="width=device-width, initial-scale=1">
78
<style>
9+
:root {
10+
--bg: #f6f7f4;
11+
--card: #ffffff;
12+
--ink: #1f2b23;
13+
--muted: #516057;
14+
--line: #d8ddd7;
15+
--brand: #1f7a4f;
16+
--brand-2: #145838;
17+
--warn: #fff6df;
18+
}
819
body {
9-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
20+
font-family: Georgia, "Times New Roman", serif;
1021
margin: 0;
1122
padding: 0;
12-
background: #0b0b0b;
13-
color: #eaeaea;
23+
background: radial-gradient(circle at 0% 0%, #edf2ea, var(--bg) 40%);
24+
color: var(--ink);
1425
line-height: 1.5;
1526
}
1627
main {
@@ -22,21 +33,27 @@
2233
font-weight: 600;
2334
}
2435
h1 {
25-
font-size: 2.4rem;
36+
font-size: 2.6rem;
2637
margin-bottom: 0.5rem;
2738
}
2839
.subtitle {
29-
color: #aaa;
40+
color: var(--muted);
3041
margin-bottom: 2rem;
3142
}
3243
section {
3344
margin-bottom: 3rem;
3445
}
46+
.hero {
47+
border: 1px solid var(--line);
48+
background: linear-gradient(180deg, #ffffff, #f9fbf8);
49+
border-radius: 10px;
50+
padding: 1.2rem 1.2rem 0.8rem;
51+
}
3552
.box {
36-
border: 1px solid #333;
53+
border: 1px solid var(--line);
3754
padding: 1.25rem;
38-
border-radius: 6px;
39-
background: #111;
55+
border-radius: 10px;
56+
background: var(--card);
4057
}
4158
.pricing {
4259
display: grid;
@@ -50,62 +67,92 @@
5067
a.button {
5168
display: inline-block;
5269
padding: 0.6rem 1rem;
53-
background: #2d7cff;
70+
background: var(--brand);
5471
color: #fff;
5572
text-decoration: none;
5673
border-radius: 4px;
5774
font-weight: 500;
5875
}
76+
a.button:hover {
77+
background: var(--brand-2);
78+
}
79+
a.button.secondary {
80+
background: transparent;
81+
color: var(--brand-2);
82+
border: 1px solid var(--brand-2);
83+
}
5984
footer {
60-
color: #777;
85+
color: var(--muted);
6186
font-size: 0.9rem;
6287
margin-top: 4rem;
63-
border-top: 1px solid #222;
88+
border-top: 1px solid var(--line);
6489
padding-top: 1rem;
6590
}
6691
code {
67-
background: #1a1a1a;
92+
background: #ecf2ed;
6893
padding: 0.2rem 0.4rem;
6994
border-radius: 3px;
7095
}
96+
.cta-row {
97+
display: flex;
98+
flex-wrap: wrap;
99+
gap: 0.75rem;
100+
margin: 1rem 0 1.2rem;
101+
}
102+
.highlight {
103+
background: var(--warn);
104+
border-left: 4px solid #b98b00;
105+
padding: 0.75rem 0.9rem;
106+
border-radius: 4px;
107+
}
71108
</style>
72109
</head>
73110
<body>
74111
<main>
75112

76-
<h1>FIPSPad</h1>
77-
<div class="subtitle">
78-
A deliberately boring notepad that refuses to run unless it can prove it has a FIPS cryptographic surface.
79-
</div>
113+
<section class="hero">
114+
<h1>FIPSPad</h1>
115+
<div class="subtitle">
116+
The encrypted notepad that fails closed: no verified FIPS surface, no launch.
117+
</div>
118+
<p>
119+
For consultants, security teams, and regulated environments where "best effort crypto" is not acceptable.
120+
</p>
121+
<div class="cta-row">
122+
<a class="button" href="https://github.com/BrowserBox/FIPSPad/releases">Get Signed Binary</a>
123+
<a class="button secondary" href="#pricing">See Pricing</a>
124+
<a class="button secondary" href="FIPSPad-SPS.pdf">Read Security Posture Statement</a>
125+
</div>
126+
</section>
80127

81128
<section>
82129
<p>
83-
FIPSPad is a single-user, offline, encrypted notepad.
84-
No network. No accounts. No telemetry. No cloud.
130+
FIPSPad is single-user, offline, and encrypted at rest.
131+
No network. No accounts. No telemetry. No cloud sync.
85132
</p>
86133
<p>
87-
It exists to explore one question honestly:
88-
<strong>what does “FIPS-mode” actually mean for a real, minimal desktop app?</strong>
134+
It answers one practical question:
135+
<strong>what does a real fail-closed FIPS gate look like in a tiny desktop app?</strong>
89136
</p>
90137
</section>
91138

92139
<section class="box">
93-
<h2>Security posture</h2>
140+
<h2>Why teams buy it</h2>
94141
<ul>
95-
<li>Hard fail-closed gate on startup</li>
142+
<li>Hard fail-closed startup gate</li>
96143
<li>Uses OS-provided cryptography only</li>
97144
<li>Refuses to run on unsupported platforms</li>
98-
<li>Documents a scoped subset of NIST SP 800-53 controls</li>
145+
<li>Scoped, explicit security claims you can read in minutes</li>
99146
</ul>
100-
<p>
147+
<p class="highlight">
101148
This is not a certified product. Claims are narrow, explicit, and documented.
102149
</p>
103150
<p>
104-
<a class="button" href="FIPSPad-SPS.pdf">Read the Security Posture Statement (PDF)</a>
151+
<a class="button secondary" href="FIPSPad-SPS.pdf">Open SPS (PDF)</a>
105152
</p>
106153
</section>
107154

108-
<section>
155+
<section id="pricing">
109156
<h2>Pricing</h2>
110157
<div class="pricing">
111158
<div class="box">
@@ -116,7 +163,7 @@ <h3>Individual</h3>
116163
<li>Minor updates</li>
117164
<li>Personal use</li>
118165
</ul>
119-
<a class="button" href="https://buy.stripe.com/REPLACE_ME">Buy</a>
166+
<a class="button" href="https://buy.stripe.com/REPLACE_ME">Buy Individual</a>
120167
</div>
121168

122169
<div class="box">
@@ -127,7 +174,7 @@ <h3>Professional</h3>
127174
<li>Client / consulting use</li>
128175
<li>Priority updates</li>
129176
</ul>
130-
<a class="button" href="https://buy.stripe.com/REPLACE_ME">Buy</a>
177+
<a class="button" href="https://buy.stripe.com/REPLACE_ME">Buy Professional</a>
131178
</div>
132179

133180
<div class="box">
@@ -150,15 +197,14 @@ <h2>Source code</h2>
150197
Paid binaries cover signing, notarization, and supply-chain hygiene.
151198
</p>
152199
<p>
153-
<a class="button" href="https://github.com/YOURNAME/FIPSPad">View the repository</a>
200+
<a class="button secondary" href="https://github.com/BrowserBox/FIPSPad">View Repository</a>
154201
</p>
155202
</section>
156203

157204
<footer>
158-
FIPSPad © 2026. No tracking. No analytics. No surprises.
205+
FIPSPad © 2026. No tracking. No analytics. No surprises. Security posture over marketing spin.
159206
</footer>
160207

161208
</main>
162209
</body>
163210
</html>
164-

scripts/inspect-p12.sh

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# Inspect identities inside a base64-encoded .p12 file
5+
# Usage: ./inspect-p12.sh [base64_string_or_file]
6+
7+
cleanup() {
8+
[[ -f "${TMP_P12:-}" ]] && rm -f "$TMP_P12"
9+
}
10+
trap cleanup EXIT
11+
12+
# Get base64 input
13+
if [[ $# -ge 1 ]]; then
14+
if [[ -f "$1" ]]; then
15+
# It's a file path
16+
P12_B64=$(cat "$1")
17+
else
18+
# It's a base64 string directly
19+
P12_B64="$1"
20+
fi
21+
elif [[ -n "${MACOS_CODESIGN_CERT_P12_B64:-}" ]]; then
22+
P12_B64="$MACOS_CODESIGN_CERT_P12_B64"
23+
else
24+
echo "Usage: $0 <base64_string_or_file>"
25+
echo " or: export MACOS_CODESIGN_CERT_P12_B64=... && $0"
26+
exit 1
27+
fi
28+
29+
# Prompt for password
30+
echo -n "Enter .p12 password: "
31+
read -rs P12_PASS
32+
echo
33+
34+
# Decode to temp file
35+
TMP_P12=$(mktemp /tmp/inspect-p12.XXXXXX.p12)
36+
echo "$P12_B64" | base64 -d > "$TMP_P12"
37+
38+
echo ""
39+
echo "=== Certificates in .p12 ==="
40+
echo ""
41+
42+
openssl pkcs12 -in "$TMP_P12" -passin pass:"$P12_PASS" -nokeys -info 2>/dev/null | \
43+
grep -E "(subject=|issuer=|friendlyName|localKeyID)" || true
44+
45+
echo ""
46+
echo "=== Certificate Details ==="
47+
echo ""
48+
49+
openssl pkcs12 -in "$TMP_P12" -passin pass:"$P12_PASS" -nokeys 2>/dev/null | \
50+
openssl x509 -noout -subject -issuer -dates -serial 2>/dev/null || {
51+
echo "Could not parse certificate details"
52+
}
53+
54+
echo ""
55+
echo "=== Identity Summary ==="
56+
echo ""
57+
58+
# Count certificates
59+
CERT_COUNT=$(openssl pkcs12 -in "$TMP_P12" -passin pass:"$P12_PASS" -nokeys 2>/dev/null | \
60+
grep -c "BEGIN CERTIFICATE" || echo "0")
61+
echo "Certificates found: $CERT_COUNT"
62+
63+
# Check for private key
64+
if openssl pkcs12 -in "$TMP_P12" -passin pass:"$P12_PASS" -nocerts -nodes 2>/dev/null | \
65+
grep -q "BEGIN.*PRIVATE KEY"; then
66+
echo "Private key: Yes"
67+
else
68+
echo "Private key: No"
69+
fi
70+
71+
# Check certificate type (Developer ID, etc.)
72+
echo ""
73+
echo "=== Certificate Type Detection ==="
74+
SUBJECT=$(openssl pkcs12 -in "$TMP_P12" -passin pass:"$P12_PASS" -nokeys 2>/dev/null | \
75+
openssl x509 -noout -subject 2>/dev/null || echo "")
76+
77+
if echo "$SUBJECT" | grep -q "Developer ID Application"; then
78+
echo "Type: Developer ID Application (for signing apps)"
79+
elif echo "$SUBJECT" | grep -q "Developer ID Installer"; then
80+
echo "Type: Developer ID Installer (for signing .pkg)"
81+
elif echo "$SUBJECT" | grep -q "Apple Distribution"; then
82+
echo "Type: Apple Distribution (App Store)"
83+
elif echo "$SUBJECT" | grep -q "Apple Development"; then
84+
echo "Type: Apple Development (local testing)"
85+
else
86+
echo "Type: Unknown or non-Apple certificate"
87+
fi
88+
89+
echo ""
90+
echo "Full subject: $SUBJECT"

0 commit comments

Comments
 (0)