{"id":46,"date":"2026-04-01T03:25:51","date_gmt":"2026-04-01T03:25:51","guid":{"rendered":"https:\/\/birthpangs.com\/?p=46"},"modified":"2026-04-01T03:25:51","modified_gmt":"2026-04-01T03:25:51","slug":"the-message","status":"publish","type":"post","link":"https:\/\/birthpangs.com\/index.php\/the-message\/46.htm","title":{"rendered":"The Message"},"content":{"rendered":"<div>    <style>\r\n    #emb-board select {\r\n        appearance: none; -webkit-appearance: none; -moz-appearance: none;\r\n        padding: 12px 30px 12px 12px;\r\n        background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' fill='%23333' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14 2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z'\/%3E%3C\/svg%3E\");\r\n        background-position: right 12px center;\r\n        background-repeat: no-repeat;\r\n        background-size: 12px;\r\n        font-size: 16px;\r\n    }\r\n    #emb-board select:focus { outline: 2px solid #0073aa; }\r\n    <\/style>\r\n\r\n    <div id=\"emb-board\" style=\"max-width:1000px;margin:0 auto;font-family:system-ui,sans-serif;\">\r\n        <h1 style=\"text-align:center;\">\ud83d\udd10 Encrypted Messages Board<\/h1>\r\n        <p style=\"text-align:center;color:#555;\">Public ciphertexts \u2022 Only holders of the secret key can read them<\/p>\r\n\r\n        <!-- Sender name search -->\r\n        <div style=\"margin-bottom:20px;\">\r\n            <input type=\"text\" id=\"emb-search\" placeholder=\"Search by sender name...\" style=\"width:100%;padding:12px;border-radius:6px;border:1px solid #ccc;\" onkeyup=\"embFilterTable()\">\r\n        <\/div>\r\n\r\n            <div style=\"background:#f8f9fa;padding:20px;border-radius:12px;margin-bottom:30px;box-shadow:0 4px 12px rgba(0,0,0,0.05);\">\r\n        <h3>\ud83d\udd0d View all messages for a Posting Key<\/h3>\r\n        <form action=\"https:\/\/birthpangs.com\/key-view\/\" method=\"get\" target=\"_blank\" style=\"display:flex;gap:10px;\">\r\n            <input type=\"text\" name=\"key\" placeholder=\"Enter the posting key here\" style=\"flex:1;padding:14px;font-size:16px;border:2px solid #0073aa;border-radius:8px;\" required>\r\n            <button type=\"submit\" style=\"padding:14px 28px;font-size:16px;background:#0073aa;color:white;border:none;border-radius:8px;cursor:pointer;white-space:nowrap;\">Open Decrypted Messages<\/button>\r\n        <\/form>\r\n        <small style=\"color:#666;\">This will open a new page\/tab showing all matching messages already decrypted.<\/small>\r\n    <\/div>\r\n    \r\n                    <div style=\"background:#f8f9fa;padding:25px;border-radius:12px;margin-bottom:40px;box-shadow:0 4px 12px rgba(0,0,0,0.05);\">\r\n                <h2>Post as Guest<\/h2>\r\n                <div style=\"display:grid;gap:15px;grid-template-columns:1fr 1fr;\">\r\n                    <div>\r\n                        <label><strong>Display Name<\/strong><\/label><br>\r\n                        <input type=\"text\" id=\"emb-guest-name\" placeholder=\"e.g. Alice\" style=\"width:100%;padding:12px;border-radius:6px;border:1px solid #ccc;\">\r\n                    <\/div>\r\n                    <div>\r\n                        <label><strong>Expires in<\/strong><\/label><br>\r\n                        <select id=\"emb-guest-expires\" style=\"width:100%;\">\r\n                                                            <option value=\"1\" selected>1 day<\/option>\r\n                                                            <option value=\"7\">7 days<\/option>\r\n                                                            <option value=\"30\">30 days<\/option>\r\n                                                            <option value=\"5\">5 days<\/option>\r\n                                                                                        <option value=\"0\">Never expires<\/option>\r\n                                                    <\/select>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <label style=\"display:block;margin-top:15px;\"><strong>Posting Key (share with readers to decrypt)<\/strong><\/label>\r\n                <input type=\"text\" id=\"emb-guest-posting-key\" style=\"width:100%;padding:12px;border-radius:6px;border:1px solid #ccc;\" placeholder=\"e.g. shareThisKey123!\">\r\n\r\n                <label style=\"display:block;margin-top:15px;\"><strong>Password Key (private - only you know this, used to delete)<\/strong><\/label>\r\n                <input type=\"text\" id=\"emb-guest-password-key\" style=\"width:100%;padding:12px;border-radius:6px;border:1px solid #ccc;\" placeholder=\"e.g. myPrivateDeleteKey!\">\r\n\r\n                <label style=\"display:block;margin-top:15px;\"><strong>Your secret message<\/strong> <small>(max 1000 characters)<\/small><\/label>\r\n                <textarea id=\"emb-guest-message\" rows=\"4\" maxlength=\"1000\" style=\"width:100%;padding:12px;border-radius:6px;border:1px solid #ccc;\" placeholder=\"Write your message here...\"><\/textarea>\r\n                <div id=\"emb-guest-char-count\" style=\"text-align:right;font-size:12px;color:#666;\">0 \/ 1000<\/div>\r\n\r\n                <button onclick=\"embGuestPostMessage()\" style=\"margin-top:20px;padding:14px 28px;font-size:16px;background:#0073aa;color:white;border:none;border-radius:8px;cursor:pointer;\">\ud83d\udd12 Encrypt &amp; Post as Guest<\/button>\r\n            <\/div>\r\n        \r\n        <h2>Latest Messages (publicly visible)<\/h2>\r\n        <table style=\"width:100%;border-collapse:collapse;background:white;box-shadow:0 4px 12px rgba(0,0,0,0.1);border-radius:8px;overflow:hidden;\">\r\n            <thead>\r\n                <tr style=\"background:#f1f1f1;\">\r\n                    <th style=\"padding:14px;text-align:left;\">From<\/th>\r\n                    <th style=\"padding:14px;text-align:left;\">Date<\/th>\r\n                    <th style=\"padding:14px;text-align:left;\">Content<\/th>\r\n                    <th style=\"padding:14px;text-align:left;\">Expires in<\/th>\r\n                    <th style=\"padding:14px;width:220px;\">Action<\/th>\r\n                <\/tr>\r\n            <\/thead>\r\n            <tbody id=\"emb-messages-body\">\r\n                            <tr class=\"emb-message-row\" data-post-id=\"64\" data-salt=\"ylNY+cbw0P\/fTzrL0vflig==\" data-iv=\"pTBzdsWCpUzpN17R\" data-cipher=\"9DtLj95KBrKrjbqcqL3n5pc91g==\" data-guest-password-hash=\"fbd8fb73c802a572981d0814b4c2316d\">\r\n                <td style=\"padding:12px;\">Cally<\/td>\r\n                <td style=\"padding:12px;\">Apr 2, 2026 3:41 AM<\/td>\r\n                <td style=\"padding:12px;\"><em>Decrypt to see message.<\/em><\/td>\r\n                <td style=\"padding:12px;\">3 days 13h<\/td>\r\n                <td style=\"padding:12px; white-space:nowrap;\">\r\n                    <button onclick=\"showDecryptModal(this)\" style=\"padding:8px 16px;background:#28a745;color:white;border:none;border-radius:6px;cursor:pointer;margin-right:6px;\">Decrypt<\/button>\r\n                                            <button onclick=\"embGuestDeleteMessage(this)\" style=\"padding:8px 16px;background:#dc3545;color:white;border:none;border-radius:6px;cursor:pointer;\">Delete<\/button>\r\n                                    <\/td>\r\n            <\/tr>\r\n                        <\/tbody>\r\n        <\/table>\r\n    <\/div>\r\n\r\n    <!-- Success Modal -->\r\n    <div id=\"emb-success-modal\" style=\"display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.75);z-index:99999;align-items:center;justify-content:center;\">\r\n        <div style=\"background:white;padding:30px;border-radius:16px;width:460px;max-width:92%;box-shadow:0 15px 35px rgba(0,0,0,0.3);text-align:center;\">\r\n            <h2 style=\"margin:0 0 20px;color:#28a745;\">\u2705 Message Posted Successfully!<\/h2>\r\n            <p style=\"margin-bottom:20px;\">Share this **Posting Key** with the recipient:<\/p>\r\n            <div style=\"background:#f8f9fa;padding:15px;border-radius:8px;font-size:18px;font-weight:bold;margin-bottom:20px;word-break:break-all;\" id=\"emb-secret-key-display\"><\/div>\r\n            <div style=\"display:flex;gap:12px;\">\r\n                <button onclick=\"embCopySecretKey()\" style=\"flex:1;padding:14px;font-size:16px;background:#28a745;color:white;border:none;border-radius:8px;cursor:pointer;\">\ud83d\udccb Copy Posting Key<\/button>\r\n                <button onclick=\"embCloseSuccessModal()\" style=\"flex:1;padding:14px;font-size:16px;background:#6c757d;color:white;border:none;border-radius:8px;cursor:pointer;\">Close<\/button>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- Decrypt Modal -->\r\n    <div id=\"emb-decrypt-modal\" style=\"display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.75);z-index:99999;align-items:center;justify-content:center;\">\r\n        <div style=\"background:white;padding:30px;border-radius:16px;width:420px;max-width:92%;box-shadow:0 15px 35px rgba(0,0,0,0.3);text-align:center;\">\r\n            <h3 style=\"margin:0 0 20px;\">\ud83d\udd11 Decrypt Message<\/h3>\r\n            <input type=\"text\" id=\"emb-modal-key\" style=\"width:100%;padding:14px;font-size:17px;border:2px solid #ddd;border-radius:8px;margin-bottom:20px;\" placeholder=\"Enter the posting key\">\r\n            <div style=\"display:flex;gap:12px;\">\r\n                <button onclick=\"embPerformModalDecrypt()\" style=\"flex:1;padding:14px;font-size:16px;background:#28a745;color:white;border:none;border-radius:8px;cursor:pointer;\">Decrypt Now<\/button>\r\n                <button onclick=\"embHideModal()\" style=\"flex:1;padding:14px;font-size:16px;background:#6c757d;color:white;border:none;border-radius:8px;cursor:pointer;\">Cancel<\/button>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <script>\r\n    const encoder = new TextEncoder();\r\n    const decoder = new TextDecoder();\r\n\r\n    function uint8ArrayToBase64(arr) {\r\n        let binary = '';\r\n        for (let i = 0; i < arr.byteLength; i++) binary += String.fromCharCode(arr[i]);\r\n        return btoa(binary);\r\n    }\r\n    function base64ToUint8Array(base64) {\r\n        const binary = atob(base64);\r\n        const bytes = new Uint8Array(binary.length);\r\n        for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\r\n        return bytes;\r\n    }\r\n\r\n    async function deriveKey(password, salt) {\r\n        const keyMaterial = await crypto.subtle.importKey(\"raw\", encoder.encode(password), \"PBKDF2\", false, [\"deriveBits\", \"deriveKey\"]);\r\n        return crypto.subtle.deriveKey({ name: \"PBKDF2\", salt: salt, iterations: 100000, hash: \"SHA-256\" }, keyMaterial, { name: \"AES-GCM\", length: 256 }, false, [\"encrypt\", \"decrypt\"]);\r\n    }\r\n\r\n    async function embEncrypt(plainText, password) {\r\n        const salt = crypto.getRandomValues(new Uint8Array(16));\r\n        const iv = crypto.getRandomValues(new Uint8Array(12));\r\n        const key = await deriveKey(password, salt);\r\n        const data = encoder.encode(plainText);\r\n        const encrypted = await crypto.subtle.encrypt({ name: \"AES-GCM\", iv: iv }, key, data);\r\n        return { salt: uint8ArrayToBase64(salt), iv: uint8ArrayToBase64(iv), data: uint8ArrayToBase64(new Uint8Array(encrypted)) };\r\n    }\r\n\r\n    function embFilterTable() {\r\n        const filter = document.getElementById('emb-search').value.toLowerCase();\r\n        const rows = document.querySelectorAll('#emb-messages-body tr');\r\n        rows.forEach(row => {\r\n            const from = row.cells[0].textContent.toLowerCase();\r\n            row.style.display = from.includes(filter) ? '' : 'none';\r\n        });\r\n    }\r\n\r\n    function setupCharCounter() {\r\n        const max = 1000;\r\n        const loggedInTextarea = document.getElementById('emb-message');\r\n        const guestTextarea = document.getElementById('emb-guest-message');\r\n        if (loggedInTextarea) loggedInTextarea.addEventListener('input', () => {\r\n            document.getElementById('emb-char-count').textContent = loggedInTextarea.value.length + ' \/ ' + max;\r\n        });\r\n        if (guestTextarea) guestTextarea.addEventListener('input', () => {\r\n            document.getElementById('emb-guest-char-count').textContent = guestTextarea.value.length + ' \/ ' + max;\r\n        });\r\n    }\r\n\r\n    async function embPostMessage() {\r\n        const recipient = document.getElementById('emb-recipient').value.trim();\r\n        const message   = document.getElementById('emb-message').value.trim();\r\n        const secret    = document.getElementById('emb-secret').value.trim();\r\n        const expires   = parseInt(document.getElementById('emb-expires').value);\r\n\r\n        if (!message || !secret) return alert('Message and secret key are required.');\r\n\r\n        const encrypted = await embEncrypt(message, secret);\r\n\r\n        const formData = new FormData();\r\n        formData.append('action', 'emb_post_message');\r\n        formData.append('nonce', '84e11f2954');\r\n        formData.append('recipient', recipient);\r\n        formData.append('expires_days', expires);\r\n        formData.append('salt', encrypted.salt);\r\n        formData.append('iv', encrypted.iv);\r\n        formData.append('ciphertext', encrypted.data);\r\n        formData.append('posting_key', secret);\r\n\r\n        const res = await fetch('https:\/\/birthpangs.com\/wp-admin\/admin-ajax.php', { method: 'POST', body: formData });\r\n        const json = await res.json();\r\n\r\n        if (json.success) {\r\n            document.getElementById('emb-secret-key-display').textContent = secret;\r\n            document.getElementById('emb-success-modal').style.display = 'flex';\r\n            document.getElementById('emb-message').value = '';\r\n            document.getElementById('emb-secret').value = '';\r\n        } else {\r\n            alert('Error: ' + (json.data?.message || 'Could not post message'));\r\n        }\r\n    }\r\n\r\n    async function embGuestPostMessage() {\r\n        const name        = document.getElementById('emb-guest-name').value.trim();\r\n        const postingKey  = document.getElementById('emb-guest-posting-key').value.trim();\r\n        const passwordKey = document.getElementById('emb-guest-password-key').value.trim();\r\n        const message     = document.getElementById('emb-guest-message').value.trim();\r\n        const expires     = parseInt(document.getElementById('emb-guest-expires').value);\r\n\r\n        if (!name || !postingKey || !passwordKey || !message) {\r\n            alert('All fields are required.');\r\n            return;\r\n        }\r\n\r\n        const encrypted = await embEncrypt(message, postingKey);\r\n\r\n        const formData = new FormData();\r\n        formData.append('action', 'emb_guest_post');\r\n        formData.append('name', name);\r\n        formData.append('posting_key', postingKey);\r\n        formData.append('password_key', passwordKey);\r\n        formData.append('message', message);\r\n        formData.append('expires_days', expires);\r\n        formData.append('salt', encrypted.salt);\r\n        formData.append('iv', encrypted.iv);\r\n        formData.append('ciphertext', encrypted.data);\r\n\r\n        const res = await fetch('https:\/\/birthpangs.com\/wp-admin\/admin-ajax.php', { method: 'POST', body: formData });\r\n        const json = await res.json();\r\n\r\n        if (json.success) {\r\n            document.getElementById('emb-secret-key-display').textContent = postingKey;\r\n            document.getElementById('emb-success-modal').style.display = 'flex';\r\n            document.getElementById('emb-guest-message').value = '';\r\n            document.getElementById('emb-guest-posting-key').value = '';\r\n            document.getElementById('emb-guest-password-key').value = '';\r\n        } else {\r\n            alert('Error: ' + (json.data?.message || 'Could not post message'));\r\n        }\r\n    }\r\n\r\n    function embCopySecretKey() {\r\n        const key = document.getElementById('emb-secret-key-display').textContent;\r\n        navigator.clipboard.writeText(key).then(() => alert('\u2705 Copied!'));\r\n    }\r\n\r\n    function embCloseSuccessModal() {\r\n        document.getElementById('emb-success-modal').style.display = 'none';\r\n        location.reload();\r\n    }\r\n\r\n    let currentDecryptRow = null;\r\n    function showDecryptModal(btn) {\r\n        currentDecryptRow = btn.closest('tr');\r\n        document.getElementById('emb-decrypt-modal').style.display = 'flex';\r\n        document.getElementById('emb-modal-key').focus();\r\n    }\r\n    function embHideModal() {\r\n        document.getElementById('emb-decrypt-modal').style.display = 'none';\r\n        document.getElementById('emb-modal-key').value = '';\r\n        currentDecryptRow = null;\r\n    }\r\n    async function embPerformModalDecrypt() {\r\n        if (!currentDecryptRow) return;\r\n        const key = document.getElementById('emb-modal-key').value.trim();\r\n        if (!key) return alert('Please enter the posting key');\r\n        const salt = currentDecryptRow.dataset.salt;\r\n        const iv = currentDecryptRow.dataset.iv;\r\n        const cipher = currentDecryptRow.dataset.cipher;\r\n        try {\r\n            const plaintext = await embPerformDecryption(cipher, iv, salt, key);\r\n            currentDecryptRow.cells[2].innerHTML = `<strong style=\"color:#28a745;\">\u2705 Decrypted:<\/strong><br>${plaintext}`;\r\n            embHideModal();\r\n        } catch (e) {\r\n            alert('\u274c Decryption failed. Wrong key?');\r\n        }\r\n    }\r\n    async function embPerformDecryption(cipherB64, ivB64, saltB64, password) {\r\n        const salt = base64ToUint8Array(saltB64);\r\n        const iv = base64ToUint8Array(ivB64);\r\n        const cipher = base64ToUint8Array(cipherB64);\r\n        const key = await deriveKey(password, salt);\r\n        const decrypted = await crypto.subtle.decrypt({ name: \"AES-GCM\", iv: iv }, key, cipher);\r\n        return decoder.decode(decrypted);\r\n    }\r\n\r\n    async function embGuestDeleteMessage(btn) {\r\n        const row = btn.closest('tr');\r\n        const postId = row.dataset.postId;\r\n        const passwordKey = prompt('Enter your Password Key to delete this message:');\r\n        if (!passwordKey) return;\r\n\r\n        const formData = new FormData();\r\n        formData.append('action', 'emb_guest_delete');\r\n        formData.append('nonce', '639ef82dd2');\r\n        formData.append('post_id', postId);\r\n        formData.append('password_key', passwordKey);\r\n\r\n        const res = await fetch('https:\/\/birthpangs.com\/wp-admin\/admin-ajax.php', { method: 'POST', body: formData });\r\n        const json = await res.json();\r\n\r\n        if (json.success) {\r\n            row.remove();\r\n            alert('Message deleted successfully.');\r\n        } else {\r\n            alert('Error: ' + (json.data?.message || 'Incorrect password key'));\r\n        }\r\n    }\r\n\r\n    window.addEventListener('load', setupCharCounter);\r\n\r\n    console.log('%cEncrypted Messages Board v2.6.13 loaded \u2705', 'color:#28a745;font-weight:bold');\r\n    <\/script>\r\n    <\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-46","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/posts\/46","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/comments?post=46"}],"version-history":[{"count":1,"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/posts\/46\/revisions"}],"predecessor-version":[{"id":47,"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/posts\/46\/revisions\/47"}],"wp:attachment":[{"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/media?parent=46"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/categories?post=46"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/birthpangs.com\/index.php\/wp-json\/wp\/v2\/tags?post=46"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}