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-12-17-DEV';
15 SDV($AesCryptKDF, 'sha256_dup');
16 SDV($AesCryptPlainToken, '(:encrypt ');
17 SDV($AesCryptCipherToken, '(:aes ');
18 SDV($AesCryptEndToken, ':)');
19 SDV($AesCryptPadding, 8);
20 SDV($AesCryptSelectionMode, true);
22 SDV($HTMLStylesFmt['aescrypt'], "
34 .aescrypt_overlay div {
37 background-color: #ffffff;
38 border:1px solid #000000;
45 $HTMLHeaderFmt['aescrypt_common'] = "
46 <script type=\"text/javascript\" src=\"\$PubDirUrl/aescrypt/aescrypt.js\"></script>
47 <script type=\"text/javascript\">
50 function aescryptOverlay(id, state) {
51 var el = document.getElementById('aescrypt_o_'+id);
52 el.style.visibility = state ? 'visible' : 'hidden';
54 var pw = document.getElementById('aescrypt_p_'+id);
59 function aescryptDecSubmit(id)
61 aescryptOverlay(id, false);
62 var pwel = document.getElementById('aescrypt_p_'+id);
64 var pwel = document.getElementById('aescrypt_c_'+id);
66 var contentel = document.getElementById('aescrypt_c_'+id);
67 var cipher = contentel.childNodes[0].nodeValue;
68 var plain = AesCtr.decrypt(cipher,pw,256);
69 contentel.childNodes[0].nodeValue = plain;
70 contentel.style.display='block';
72 var linkel = document.getElementById('aescrypt_a_'+id);
73 linkel.style.visibility='hidden';
74 linkel.style.display='none';
79 AesCtr.kdf = function(password, nBits, nonce) {
80 return AesCtr.kdf_$AesCryptKDF (password, nBits, nonce);
83 function aescryptDecClick(elem) {
84 var node = elem.childNodes[0];
85 var nodeDec = elem.childNodes[1];
86 if (nodeDec.style.visibility=='hidden') {
89 var aesDecrypt = node.childNodes[0].nodeValue;
90 var res = AesCtr.decrypt(aesDecrypt,prompt('Decrypt key','TopSecret'),256);
91 res = res.replace(/^\\s\\s*/, '').replace(/\\s\\s*\$/, '');
92 node.childNodes[0].nodeValue = res;
93 node.style.display='block';
94 nodeDec.style.visibility='hidden';
95 nodeDec.style.display='none';
98 function aescryptOverlayDecClick(elem) {
100 var node = elem.childNodes[0];
101 var crypted = node.childNodes[0].nodeValue;
102 var aesDecrypt = getElementById('aescryptLabel').nodevalue = crypted;
110 if ($action == 'edit') {
111 $HTMLHeaderFmt['aescrypt_edit'] = "
112 <script type=\"text/javascript\">
115 function aescryptEncSubmit() {
117 var pwel = document.getElementById('aescrypt_p_0');
120 aescryptOverlay(0, false);
123 var textarea = document.getElementById('text');
125 if (document.selection) { // IE variant
127 var sel = document.selection.createRange();
128 // alert the selected text in textarea
130 // Finally replace the value of the selected text with this new replacement one
131 if (sel != null && sel.text != null && sel.text != '' ) {
132 sel.text = aesPrompt(pw, sel.text);
134 alert('Please select text to encrypt');
137 var len = textarea.value.length;
138 var start = textarea.selectionStart;
139 var end = textarea.selectionEnd;
140 var sel = textarea.value.substring(start, end);
143 var replace = aesOverlayPrompt(pw, sel);
144 // Here we are replacing the selected text with this one
145 textarea.value = textarea.value.substring(0,start) + replace + textarea.value.substring(end,len);
148 alert('Please select text to encrypt');
155 function aesOverlayPrompt(pass, tpart) {
156 var padding = $AesCryptPadding;
157 var tarr = '$AesCryptCipherToken';
158 var markup_end = '$AesCryptEndToken';
160 while ((tpart.length % padding) > 0) {
161 tpart = tpart.concat(' ');
164 tarr +=AesCtr.encrypt(tpart,pass,256);
170 function aesPrompt(tmark, tpart) {
171 var padding = $AesCryptPadding;
172 var tarr = '$AesCryptCipherToken';
173 var markup_end = '$AesCryptEndToken';
175 var tpass = prompt('Encrypt key for text starting at position '+tmark,'TopSecret');
177 while ((tpart.length % padding) > 0) {
178 tpart = tpart.concat(' ');
181 tarr +=AesCtr.encrypt(tpart,tpass,256);
187 function aesSelectionClick() {
189 var textarea = document.getElementById('text');
191 if (document.selection) { // IE variant
193 var sel = document.selection.createRange();
194 // alert the selected text in textarea
196 // Finally replace the value of the selected text with this new replacement one
197 if (sel != null && sel.text != null && sel.text != '' ) {
198 sel.text = aesPrompt('[selection]', sel.text);
200 alert('Please select text to encrypt');
203 var len = textarea.value.length;
204 var start = textarea.selectionStart;
205 var end = textarea.selectionEnd;
206 var sel = textarea.value.substring(start, end);
209 var replace = aesPrompt(start, sel);
210 // Here we are replacing the selected text with this one
211 textarea.value = textarea.value.substring(0,start) + replace + textarea.value.substring(end,len);
214 alert('Please select text to encrypt');
221 function aescryptDecSubmit($id)
223 aescryptOverlay(false);
224 var textField = document.getElementById('aescrypt_c_$id');
225 var enc = elem.childNodes[0];
229 function aesClick() {
231 var textField = document.getElementById('text');
233 var markup1 = '$AesCryptPlainToken';
234 var markup2 = '$AesCryptCipherToken';
235 var markup_end = '$AesCryptEndToken';
236 var padding = $AesCryptPadding;
238 var testt = textField.value;
240 var tarr = new String;
241 var tmark = testt.indexOf(markup1);
244 tarr += testt.substring(tmark2,tmark);
245 tmark2 = testt.indexOf(markup_end,tmark);
246 var tpart = testt.substring(tmark+markup1.length,tmark2);
248 tarr += aesPrompt(tmark, tpart);
250 tmark2 += markup_end.length;
251 tmark = testt.indexOf(markup1,tmark2);
254 tarr += testt.substr(tmark2);
256 textField.value = tarr;
259 function registerAesEvent()
261 // TODO: add protection handler to save buttons
263 var formElement = document.getElementById('text').parentNode;
264 //alert(formElement.nodeValue);
266 var inputs = document.getElementsByTagName('input');
268 for (var i=0; i < inputs.length; i++)
270 if ((inputs[i].getAttribute('type') == 'submit') && (inputs[i].getAttribute('name') == name))
279 if ( document.addEventListener ) {
280 window.addEventListener( 'load', registerAesEvent, false );
281 } else if ( document.attachEvent ) {
282 window.attachEvent( 'onload', registerAesEvent );
291 function aescryptMarkup($ciphertext)
296 $res .= "<div id=\"aescrypt_c_$id\" style=\"white-space:pre;display:none;\">$ciphertext</div>";
297 $res .= "<div id=\"aescrypt_d_$id\">";
298 $res .= "<a id=\"aescrypt_a_$id\" href=\"javascript:void (0);\" onClick=\"aescryptOverlay($id, true);\">";
303 if (strlen($c) > 30) {
304 $c = substr($c, 0, 27) . "...";
306 $res .= "<div id=\"aescrypt_o_$id\" class=\"aescrypt_overlay\">
308 <p id=\"aescrypt_l_$id\">Decrypting \"$c\".</p>
309 <form id=\"aescrypt_f_$id\" onsubmit=\"aescryptDecSubmit($id);return false;\">
310 <label for=\"aescrypt_p_$id\">Password </label>
311 <input type=\"password\" name=\"aescrypt_p_$id\" id=\"aescrypt_p_$id\" />
312 <input type=\"submit\" />
322 "/\\Q$AesCryptCipherToken\\E\\s*(.*?)\\s*\\Q$AesCryptEndToken\\E/se",
323 "aescryptMarkup('$1')");
325 if ($action == 'edit') {
327 if (IsEnabled($EnableGUIButtons)) {
328 $GUIButtons['aescrypt'] = array(750, '', '', '',
329 // TODO: add overlay DIV here & test browsers
330 "<a href='#' onclick=\"aescryptOverlay(0, true);\"><img src='\$GUIButtonDirUrlFmt/aescrypt.png' title='Encrypt' /></a>
331 <div id=\"aescrypt_o_0\" class=\"aescrypt_overlay\">
333 <p id=\"aescrypt_l_0\">Encrypt selected text:</p>
334 <form id=\"aescrypt_f_0\" onsubmit=\"aescryptEncSubmit();return false;\">
335 <input type=\"password\" name=\"aescrypt_p_0\" id=\"aescrypt_p_0\" />
336 <input type=\"submit\" />
342 // TODO: simply add overlay DIV here
343 $MessagesFmt[] = "<input type='button' name='aesButton' value='Encrypt' onClick=\"aescryptOverlay(0, true);\"/>
344 <div id=\"aescrypt_o_0\" class=\"aescrypt_overlay\">
346 <p id=\"aescrypt_l_0\">Encrypt selected text:</p>
347 <form id=\"aescrypt_f_0\" onsubmit=\"aescryptEncSubmit();return false;\">
348 <input type=\"password\" name=\"aescrypt_p_0\" id=\"aescrypt_p_0\" />
349 <input type=\"submit\" />