Set the scrollbar according to mp.txt.vy instead of mp.txt.y.
[mp-5.x.git] / mp_crypt.mpsl
blobd22021cb7f2c7b7481777945ffe204a778e12058
1 /*
3     Minimum Profit 5.x
4     A Programmer's Text Editor
6     Encrypting functions.
8     Copyright (C) 1991-2007 Angel Ortega <angel@triptico.com>
10     This program is free software; you can redistribute it and/or
11     modify it under the terms of the GNU General Public License
12     as published by the Free Software Foundation; either version 2
13     of the License, or (at your option) any later version.
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18     GNU General Public License for more details.
20     You should have received a copy of the GNU General Public License
21     along with this program; if not, write to the Free Software
22     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24     http://www.triptico.com
28 /* editor actions */
30 mp.actions['set_password'] = sub(d) {
31         local r = mp.form( [
32                 { 'type' => 'password', 'label' => L("Password:") },
33                 { 'type' => 'password', 'label' => L("Password (again):") }
34                 ]
35         );
37         if (r != NULL) {
38                 if (r[0] ne r[1])
39                         mp.drv.alert(L("Passwords don't match."));
40                 else {
41                         d.password = r[0];
42                         d.txt.mod = 1;
43                 }
44         }
48 /* action descriptions */
50 mp.actdesc['set_password'] = LL("Password protect...");
52 sub mp.arcfour_byte()
53 /* gets next ARCFOUR byte */
54 /* next char is chr(ord(getchar(l)) ^ mp.arcfour_byte()) */
56         local i, j, S;
58         i = mp.arcfour.i;
59         j = mp.arcfour.j;
60         S = mp.arcfour.S;
62         i = (i + 1) & 0xff;
63         j = (j + S[i]) & 0xff;
65         mp.arcfour.i = i; mp.arcfour.j = j;
67         /* swap */
68         local t = S[i]; S[i] = S[j]; S[j] = t;
70         return S[(S[i] + S[j]) & 0xff];
74 sub mp.arcfour_init(key)
75 /* initializes an ARCFOUR cypher */
77         /* no key? nothing to do */
78         if (key == NULL)
79                 return;
81         /* split as an array of characters */
82         local k = split(NULL, key);
84         /* init structures */
85         mp.arcfour = {};
86         mp.arcfour.S = [ 0 .. 255 ];
87         mp.arcfour.i = 0;
88         mp.arcfour.j = 0;
90         local j = 0;
92         /* scramble */
93         foreach (i, [ 0 .. 255 ]) {
94                 local t = mp.arcfour.S[i];
96                 j = (j + t + ord(k[i % size(k)])) & 0xff;
98                 mp.arcfour.S[i] = mp.arcfour.S[j];
99                 mp.arcfour.S[j] = t;
100         }
102         /* discard 256 bytes (as recommended in many sources) */
103         foreach (i, [ 0 .. 255 ])
104                 mp.arcfour_byte();
108 sub mp.crypt1_load(fd, password)
109 /* loads a crypt1 encrypted file into lines */
111         local c;
112         local l = '';
113         local lines = [];
115         /* the mpcrypt1\n\0 signature has already been read */
117         /* init */
118         mp.arcfour_init(password);
120         while ((c = getchar(fd)) != NULL) {
121                 /* decrypt byte and concat */
122                 c = chr(ord(c) ^ mp.arcfour_byte());
123                 l = l ~ c;
125                 if (c eq "\n") {
126                         /* end of line; chomp l and push it */
127                         push(lines, mp.chomp(l));
128                         l = '';
129                 }
130         }
132         push(lines, mp.chomp(l));
134         return lines;
138 sub mp.crypt1_save(fd, lines, password)
139 /* saves the lines as a crypt1 encrypted file */
141         local nl = 0;
143         /* save first the signature */
144         write(fd, "mpcrypt1\n");
146         /* write a \0 */
147         putchar(fd, "");
149         /* init */
150         mp.arcfour_init(password);
152         /* loop the lines */
153         foreach (l, lines) {
154                 /* write a line separator if it's not the first line */
155                 if (nl)
156                         l = mp.config.eol ~ l;
158                 /* split by chars */
159                 local lc = split(NULL, l);
161                 /* write each char xoring with next crypto-byte */
162                 foreach (c, lc)
163                         putchar(fd, chr(ord(c) ^ mp.arcfour_byte()));
165                 nl++;
166         }
168         return nl;
172 sub mp.crypt1_detect(fd)
173 /* detects if fd is an mpcrypt1-type file */
175         /* is it mpcrypt1\n followed by a 0? */
176         if (read(fd) eq "mpcrypt1\n" && ord(getchar(fd)) == 0)
177                 return 1;
179         /* no; file must be reopen */
180         return 0;