annotate submit.m @ 6:6d94b2bafcd1 default tip

Replace complicated memory-intensive operation with a faster loop
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Tue, 06 Dec 2011 11:49:32 -0500
parents ded78d0b4987
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
1 function submit(partId)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
2 %SUBMIT Submit your code and output to the ml-class servers
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
3 % SUBMIT() will connect to the ml-class server and submit your solution
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
4
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
5 fprintf('==\n== [ml-class] Submitting Solutions | Programming Exercise %s\n==\n', ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
6 homework_id());
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
7 if ~exist('partId', 'var') || isempty(partId)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
8 partId = promptPart();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
9 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
10
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
11 % Check valid partId
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
12 partNames = validParts();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
13 if ~isValidPartId(partId)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
14 fprintf('!! Invalid homework part selected.\n');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
15 fprintf('!! Expected an integer from 1 to %d.\n', numel(partNames) + 1);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
16 fprintf('!! Submission Cancelled\n');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
17 return
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
18 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
19
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
20 [login password] = loginPrompt();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
21 if isempty(login)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
22 fprintf('!! Submission Cancelled\n');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
23 return
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
24 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
25
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
26 fprintf('\n== Connecting to ml-class ... ');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
27 if exist('OCTAVE_VERSION')
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
28 fflush(stdout);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
29 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
30
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
31 % Setup submit list
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
32 if partId == numel(partNames) + 1
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
33 submitParts = 1:numel(partNames);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
34 else
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
35 submitParts = [partId];
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
36 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
37
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
38 for s = 1:numel(submitParts)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
39 % Submit this part
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
40 partId = submitParts(s);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
41
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
42 % Get Challenge
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
43 [login, ch, signature] = getChallenge(login);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
44 if isempty(login) || isempty(ch) || isempty(signature)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
45 % Some error occured, error string in first return element.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
46 fprintf('\n!! Error: %s\n\n', login);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
47 return
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
48 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
49
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
50 % Attempt Submission with Challenge
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
51 ch_resp = challengeResponse(login, password, ch);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
52 [result, str] = submitSolution(login, ch_resp, partId, output(partId), ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
53 source(partId), signature);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
54
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
55 fprintf('\n== [ml-class] Submitted Homework %s - Part %d - %s\n', ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
56 homework_id(), partId, partNames{partId});
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
57 fprintf('== %s\n', strtrim(str));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
58 if exist('OCTAVE_VERSION')
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
59 fflush(stdout);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
60 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
61 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
62
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
63 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
64
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
65 % ================== CONFIGURABLES FOR EACH HOMEWORK ==================
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
66
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
67 function id = homework_id()
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
68 id = '7';
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
69 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
70
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
71 function [partNames] = validParts()
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
72 partNames = {
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
73 'Find Closest Centroids (k-Means)', ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
74 'Compute Centroid Means (k-Means)' ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
75 'PCA', ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
76 'Project Data (PCA)', ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
77 'Recover Data (PCA)' ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
78 };
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
79 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
80
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
81 function srcs = sources()
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
82 % Separated by part
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
83 srcs = { { 'findClosestCentroids.m' }, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
84 { 'computeCentroids.m' }, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
85 { 'pca.m' }, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
86 { 'projectData.m' }, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
87 { 'recoverData.m' } ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
88 };
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
89 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
90
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
91 function out = output(partId)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
92 % Random Test Cases
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
93 X = reshape(sin(1:165), 15, 11);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
94 Z = reshape(cos(1:121), 11, 11);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
95 C = Z(1:5, :);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
96 idx = (1 + mod(1:15, 3))';
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
97 if partId == 1
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
98 idx = findClosestCentroids(X, C);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
99 out = sprintf('%0.5f ', idx(:));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
100 elseif partId == 2
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
101 centroids = computeCentroids(X, idx, 3);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
102 out = sprintf('%0.5f ', centroids(:));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
103 elseif partId == 3
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
104 [U, S] = pca(X);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
105 out = sprintf('%0.5f ', abs([U(:); S(:)]));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
106 elseif partId == 4
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
107 X_proj = projectData(X, Z, 5);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
108 out = sprintf('%0.5f ', X_proj(:));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
109 elseif partId == 5
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
110 X_rec = recoverData(X(:,1:5), Z, 5);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
111 out = sprintf('%0.5f ', X_rec(:));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
112 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
113 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
114
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
115 function url = challenge_url()
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
116 url = 'http://www.ml-class.org/course/homework/challenge';
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
117 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
118
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
119 function url = submit_url()
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
120 url = 'http://www.ml-class.org/course/homework/submit';
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
121 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
122
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
123 % ========================= CHALLENGE HELPERS =========================
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
124
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
125 function src = source(partId)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
126 src = '';
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
127 src_files = sources();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
128 if partId <= numel(src_files)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
129 flist = src_files{partId};
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
130 for i = 1:numel(flist)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
131 fid = fopen(flist{i});
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
132 while ~feof(fid)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
133 line = fgets(fid);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
134 src = [src line];
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
135 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
136 fclose(fid);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
137 src = [src '||||||||'];
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
138 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
139 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
140 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
141
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
142 function ret = isValidPartId(partId)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
143 partNames = validParts();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
144 ret = (~isempty(partId)) && (partId >= 1) && (partId <= numel(partNames) + 1);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
145 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
146
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
147 function partId = promptPart()
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
148 fprintf('== Select which part(s) to submit:\n', ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
149 homework_id());
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
150 partNames = validParts();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
151 srcFiles = sources();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
152 for i = 1:numel(partNames)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
153 fprintf('== %d) %s [', i, partNames{i});
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
154 fprintf(' %s ', srcFiles{i}{:});
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
155 fprintf(']\n');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
156 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
157 fprintf('== %d) All of the above \n==\nEnter your choice [1-%d]: ', ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
158 numel(partNames) + 1, numel(partNames) + 1);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
159 selPart = input('', 's');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
160 partId = str2num(selPart);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
161 if ~isValidPartId(partId)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
162 partId = -1;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
163 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
164 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
165
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
166 function [email,ch,signature] = getChallenge(email)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
167 str = urlread(challenge_url(), 'post', {'email_address', email});
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
168
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
169 str = strtrim(str);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
170 [email, str] = strtok (str, '|');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
171 [ch, str] = strtok (str, '|');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
172 [signature, str] = strtok (str, '|');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
173 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
174
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
175
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
176 function [result, str] = submitSolution(email, ch_resp, part, output, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
177 source, signature)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
178
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
179 params = {'homework', homework_id(), ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
180 'part', num2str(part), ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
181 'email', email, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
182 'output', output, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
183 'source', source, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
184 'challenge_response', ch_resp, ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
185 'signature', signature};
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
186
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
187 str = urlread(submit_url(), 'post', params);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
188
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
189 % Parse str to read for success / failure
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
190 result = 0;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
191
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
192 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
193
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
194 % =========================== LOGIN HELPERS ===========================
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
195
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
196 function [login password] = loginPrompt()
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
197 % Prompt for password
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
198 [login password] = basicPrompt();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
199
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
200 if isempty(login) || isempty(password)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
201 login = []; password = [];
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
202 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
203 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
204
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
205
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
206 function [login password] = basicPrompt()
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
207 login = input('Login (Email address): ', 's');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
208 password = input('Password: ', 's');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
209 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
210
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
211
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
212 function [str] = challengeResponse(email, passwd, challenge)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
213 salt = ')~/|]QMB3[!W`?OVt7qC"@+}';
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
214 str = sha1([challenge sha1([salt email passwd])]);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
215 sel = randperm(numel(str));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
216 sel = sort(sel(1:16));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
217 str = str(sel);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
218 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
219
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
220
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
221 % =============================== SHA-1 ================================
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
222
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
223 function hash = sha1(str)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
224
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
225 % Initialize variables
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
226 h0 = uint32(1732584193);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
227 h1 = uint32(4023233417);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
228 h2 = uint32(2562383102);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
229 h3 = uint32(271733878);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
230 h4 = uint32(3285377520);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
231
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
232 % Convert to word array
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
233 strlen = numel(str);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
234
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
235 % Break string into chars and append the bit 1 to the message
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
236 mC = [double(str) 128];
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
237 mC = [mC zeros(1, 4-mod(numel(mC), 4), 'uint8')];
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
238
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
239 numB = strlen * 8;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
240 if exist('idivide')
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
241 numC = idivide(uint32(numB + 65), 512, 'ceil');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
242 else
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
243 numC = ceil(double(numB + 65)/512);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
244 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
245 numW = numC * 16;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
246 mW = zeros(numW, 1, 'uint32');
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
247
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
248 idx = 1;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
249 for i = 1:4:strlen + 1
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
250 mW(idx) = bitor(bitor(bitor( ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
251 bitshift(uint32(mC(i)), 24), ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
252 bitshift(uint32(mC(i+1)), 16)), ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
253 bitshift(uint32(mC(i+2)), 8)), ...
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
254 uint32(mC(i+3)));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
255 idx = idx + 1;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
256 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
257
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
258 % Append length of message
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
259 mW(numW - 1) = uint32(bitshift(uint64(numB), -32));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
260 mW(numW) = uint32(bitshift(bitshift(uint64(numB), 32), -32));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
261
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
262 % Process the message in successive 512-bit chs
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
263 for cId = 1 : double(numC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
264 cSt = (cId - 1) * 16 + 1;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
265 cEnd = cId * 16;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
266 ch = mW(cSt : cEnd);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
267
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
268 % Extend the sixteen 32-bit words into eighty 32-bit words
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
269 for j = 17 : 80
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
270 ch(j) = ch(j - 3);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
271 ch(j) = bitxor(ch(j), ch(j - 8));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
272 ch(j) = bitxor(ch(j), ch(j - 14));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
273 ch(j) = bitxor(ch(j), ch(j - 16));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
274 ch(j) = bitrotate(ch(j), 1);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
275 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
276
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
277 % Initialize hash value for this ch
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
278 a = h0;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
279 b = h1;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
280 c = h2;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
281 d = h3;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
282 e = h4;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
283
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
284 % Main loop
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
285 for i = 1 : 80
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
286 if(i >= 1 && i <= 20)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
287 f = bitor(bitand(b, c), bitand(bitcmp(b), d));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
288 k = uint32(1518500249);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
289 elseif(i >= 21 && i <= 40)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
290 f = bitxor(bitxor(b, c), d);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
291 k = uint32(1859775393);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
292 elseif(i >= 41 && i <= 60)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
293 f = bitor(bitor(bitand(b, c), bitand(b, d)), bitand(c, d));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
294 k = uint32(2400959708);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
295 elseif(i >= 61 && i <= 80)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
296 f = bitxor(bitxor(b, c), d);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
297 k = uint32(3395469782);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
298 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
299
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
300 t = bitrotate(a, 5);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
301 t = bitadd(t, f);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
302 t = bitadd(t, e);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
303 t = bitadd(t, k);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
304 t = bitadd(t, ch(i));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
305 e = d;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
306 d = c;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
307 c = bitrotate(b, 30);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
308 b = a;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
309 a = t;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
310
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
311 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
312 h0 = bitadd(h0, a);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
313 h1 = bitadd(h1, b);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
314 h2 = bitadd(h2, c);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
315 h3 = bitadd(h3, d);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
316 h4 = bitadd(h4, e);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
317
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
318 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
319
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
320 hash = reshape(dec2hex(double([h0 h1 h2 h3 h4]), 8)', [1 40]);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
321
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
322 hash = lower(hash);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
323
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
324 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
325
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
326 function ret = bitadd(iA, iB)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
327 ret = double(iA) + double(iB);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
328 ret = bitset(ret, 33, 0);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
329 ret = uint32(ret);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
330 end
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
331
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
332 function ret = bitrotate(iA, places)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
333 t = bitshift(iA, places - 32);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
334 ret = bitshift(iA, places);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
335 ret = bitor(ret, t);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
336 end