1 <?php
if (!defined('PmWiki')) exit();
6 Copyright 2011 Anomen (ludek_h@seznam.cz)
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published
9 by the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
13 $RecipeInfo['AesCrypt']['Version'] = '2012-DEV';
15 SDV($AesCryptKDF, 'sha256_dup');
16 SDV($AesCryptPlainToken, '(:encrypt ');
17 SDV($AesCryptCipherToken, '(:aes ');
18 SDV($AesCryptEndToken, ':)');
19 SDV($AesCryptPadding, 6);
20 SDV($AesCryptSelectionMode, true);
22 SDV($HTMLStylesFmt['aescrypt'], "
31 filter: alpha(opacity=40);
32 /* this hack is so it works in IE
33 * I find setting the color in the css gives me more flexibility
34 * than the PNG solution.
36 background-color:transparent !important;
37 background-color: #333333;
38 /* this hack is for opera support
39 * you can uncomment the background-image if you don't care about opera.
40 * this gives you the flexibility to use any bg color that you want, instead of the png
42 background-image/**/: url('$PubDirUrl/aescrypt/maskBG.png') !important; // For browsers Moz, Opera, etc.
43 background-image:none;
44 background-repeat: repeat;
59 .aescrypt_overlay div {
62 background-color: #ffffff;
63 border:1px solid #000000;
70 $HTMLHeaderFmt['aescrypt_common'] = "
71 <script type=\"text/javascript\" src=\"\$PubDirUrl/aescrypt/aescrypt.js\"></script>
72 <script type=\"text/javascript\">
76 * Displays and hides modal dialog.
78 function aescryptOverlay(id, state) {
79 var el = document.getElementById('aescrypt_o_'+id);
80 el.style.visibility = (state ? 'visible' : 'hidden');
82 var pw = document.getElementById('aescrypt_p_'+id);
89 * Function invoked on submit of password modal dialog.
90 * Performs decryption.
92 function aescryptDecSubmit(id)
94 aescryptOverlay(id, false);
95 var pwel = document.getElementById('aescrypt_p_'+id);
97 pwel.value = 'TopSecret';
99 var allEl = document.getElementById('aescrypt_b_'+id);
105 to = 10000; // just some big number
109 var contentel = document.getElementById('aescrypt_c_'+i);
113 if (contentel.style.display == 'none') {
114 var cipher = contentel.childNodes[0].nodeValue;
115 var plain = AesCtr.decrypt(cipher,pw,256);
116 var plainTrim = plain.replace(/\\s\\s*\$/, '');
117 contentel.childNodes[0].nodeValue = plainTrim;
118 contentel.style.display='block';
119 var linkel = document.getElementById('aescrypt_a_'+i);
123 linkel.style.visibility='hidden';
124 linkel.style.display='none';
132 * Key derivation function selected by AesCryptKDF variable.
134 AesCtr.kdf = function(password, nBits, nonce) {
135 return AesCtr.kdf_$AesCryptKDF (password, nBits, nonce);
142 if ($action == 'edit') {
143 $HTMLHeaderFmt['aescrypt_edit'] = "
144 <script type=\"text/javascript\">
147 var aeascryptPopupDiv = false;
149 * display modal box for encryption
151 function aescryptEncPopup()
154 aescryptSelectionRange = aescryptSaveSelection();
156 // alert(aescryptSelectionRange);
157 if (!aeascryptPopupDiv) {
158 var popup = '<div id=\'aescrypt_o_enc\' class=\'aescrypt_overlay\'>'
160 + '<p id=\'aescrypt_l_enc\'>Encrypt selected text:</p>'
161 + '<form id=\'aescrypt_f_enc\' onsubmit=\'aescryptEncSubmit();return false;\'>'
162 + '<input type=\'password\' name=\'aescrypt_p_enc\' id=\'aescrypt_p_enc\' />'
163 + '<input type=\'submit\' />'
164 + '</form>' + '</div>' + '</div>';
166 var theBody = document.getElementsByTagName('BODY')[0];
167 var popmask = document.createElement('div');
168 popmask.id = 'aescryptPopupMask';
169 var popcont = document.createElement('div');
170 popcont.id = 'aescrypt_x_enc';
171 popcont.innerHTML = popup;
173 theBody.appendChild(popmask);
174 theBody.appendChild(popcont);
176 aeascryptPopupDiv = true;
178 var pwel = document.getElementById('aescrypt_p_enc');
181 aescryptOverlay('enc',true);
185 * Hide modal box and encrypt selection
186 * - how to get selection?
189 function aescryptEncSubmit() {
191 var tpart = aescryptGetSelection();
193 var pwel = document.getElementById('aescrypt_p_enc');
195 pwel.value = 'TopSecret';
197 aescryptOverlay('enc', false);
199 var padding = $AesCryptPadding;
200 var tarr = '$AesCryptCipherToken';
201 var markup_end = '$AesCryptEndToken';
203 while ((tpart.length % padding) > 0) {
204 tpart = tpart.concat(' ');
206 tpart = tpart.concat(' ');
208 tarr +=AesCtr.encrypt(tpart, pw, 256);
211 alert('encrypted: ' + tarr);
214 aescryptReplaceSelection(tarr);
217 var aescryptSelectionRange = [0, 0];
220 * Get selection to be encrypted (selection mode)
222 function aescryptSaveSelection() {
224 var textarea = document.getElementById('text');
226 if (document.selection) { // IE variant
228 //var sel = document.selection.createRange();
230 // TODO: save selection object (easier, might not work)
231 // or save start,length and reconstruct later ?
232 var bm = document.selection.createRange().getBookmark();
233 var sel = textarea.createTextRange();
234 sel.moveToBookmark(bm);
236 var sleft = textarea.createTextRange();
237 sleft.collapse(true);
238 sleft.setEndPoint('EndToStart', sel);
239 var start = sleft.text.length
240 var end = sleft.text.length + sel.text.length;
243 // alert the selected text in textarea
246 var start = textarea.selectionStart;
247 var end = textarea.selectionEnd;
252 alert('Please select text to encrypt');
258 function aescryptGetSelection() {
259 var start = aescryptSelectionRange[0];
260 var end = aescryptSelectionRange[1];
261 var textarea = document.getElementById('text');
262 var sel = textarea.value.substring(start, end);
266 function aescryptReplaceSelection(replace) {
267 var textarea = document.getElementById('text');
268 var start = aescryptSelectionRange[0];
269 var end = aescryptSelectionRange[1];
270 var len = textarea.value.length;
271 textarea.value = textarea.value.substring(0,start) + replace + textarea.value.substring(end,len);
280 /* generate decryption code */
281 function aescryptMarkup($ciphertext)
286 $res .= "<div id=\"aescrypt_c_$id\" style=\"white-space:pre;display:none;\">$ciphertext</div>";
287 $res .= "<div id=\"aescrypt_d_$id\">";
288 $res .= "<a id=\"aescrypt_a_$id\" href=\"javascript:void (0);\" onClick=\"aescryptOverlay($id, true);\">";
293 if (strlen($c) > 30) {
294 $c = substr($c, 0, 27) . "...";
296 $res .= "<div id=\"aescrypt_o_$id\" class=\"aescrypt_overlay\">
298 <p id=\"aescrypt_l_$id\">Decrypting \"$c\".</p>
299 <form id=\"aescrypt_f_$id\" onsubmit=\"aescryptDecSubmit($id);return false;\">
300 <label for=\"aescrypt_p_$id\">Password </label>
301 <input type=\"password\" name=\"aescrypt_p_$id\" id=\"aescrypt_p_$id\" />
303 <input type=\"checkbox\" name=\"aescrypt_b_$id\" id=\"aescrypt_b_$id\" value=\"true\" />
304 <label for=\"aescrypt_b_$id\">decrypt all</label>
306 <input type=\"submit\" />
316 "/\\Q$AesCryptCipherToken\\E\\s*(.*?)\\s*\\Q$AesCryptEndToken\\E/se",
317 "aescryptMarkup('$1')");
319 if ($action == 'edit') {
321 if (IsEnabled($EnableGUIButtons)) {
322 $GUIButtons['aescrypt'] = array(750, '', '', '',
323 // TODO: add overlay DIV here & test browsers
324 "<a href='#' onclick='aescryptEncPopup();'><img src='\$GUIButtonDirUrlFmt/aescrypt.png' title='Encrypt' /></a>");
326 // TODO: simply add overlay DIV here
327 $MessagesFmt[] = "<input type='button' name='aesButton' value='Encrypt' onClick='aescryptEncPopup();'/>";