
ãã¡ãããMEGAãµãŒãã¹èªäœã¯ãæå·åããŒããµãŒããŒã«ä¿åãããŠãããããã¹ãŠã®æå·åããã©ãŠã¶ãŒã®ã³ã³ããã¹ãã§å®è¡ãããããšãæå³ããŸãã åæã«ããµãŒãã¹ã®éå§åŸãäžå®å®ãªæå·åã¢ã«ãŽãªãºã
ãã®èšäºã§ã¯ã2ã¡ã¬ãã€ãã®MEGA JavaScriptã³ãŒãã§çºçããéæ³ãéšåçã«æŽçããå¿é ãæ¢ããŠæå·åãæããããã€ãã®æ¹æ³ãåå®çŸ©ããæ¹æ³ã瀺ããŸãã ãã®çµæã2èŠçŽ èªèšŒãšéèŠãªæ å ±ã®ããŒããŠã§ã¢æå·åãåããã¯ã©ãŠãããŒã¹ã®ãã¡ã€ã«ã¹ãã¬ãŒãžãµãŒãã¹ãå©çšã§ããŸãã
MEGAãUCEãããã³ãã¹ãŠãã¹ãŠ
ããã§ã¯ããµãŒãã¹ã®ã¯ã©ã€ã¢ã³ãéšåãæ§ç¯ãããŠãããã¯ãããžãŒãæ°èŠãŠãŒã¶ãŒã®ç»é²æ¹æ³ãèªèšŒæžã¿ç»é²ãŠãŒã¶ãŒããã¹ã¯ãŒãå€æŽãããã³ãã¡ã€ã«ã®ã¢ããããŒã/ããŠã³ããŒãããèŠãŠãããŸããããJavascript
æ¢ã«ãåç¥ãããããŸãããããµãŒãã¹ã®ã¯ã©ã€ã¢ã³ãéšåå šäœã¯JavaScriptã«åºã¥ããŠããããã©ãŠã¶ã«ãã£ãŠããŒãããããã¹ãŠã®ã¹ã¯ãªãããšããŒãžã®SHA-256ãã§ãã¯ãµã ã¯ã¡ã€ã³ããŒãžã³ãŒãã§èšè¿°ãããŠããŸãã ããŠã³ããŒãèªäœã¯æ¬¡ã®ãšããã§ãããã¹ãŠã®ãã¡ã€ã«ã®ãã§ãã¯ãµã ããã§ãã¯ããããã®åŸããããã¯1ã€ã®BLOBã«çµåããããã©ãŠã¶ã«æäŸãããŸãã js-filesã®ãœãŒã¹ã³ãŒãã¯ãããããç°ãªã人ã ã«ãã£ãŠæžããããã®ã§ãããã³ããŒïŒããŒã¹ãã®çµæãç¡æå³ãªæ¡ä»¶ãåçŽã«å¥åŠãªå€æ°ãªã©ãæã é¢çœãçç ãèŠã€ããããšã瀺ããŠããŸãã


ãµã€ãã®ãœãŒã¹ã³ãŒãã調æ»ããéçšã§ãéåžžã«æŽ»çºã«æŽæ°ãããŠããããšã«æ°ä»ããŸãããéçºè ã¯å°ããªãšã©ãŒãä¿®æ£ãããã§ã«èšè¿°ãããã³ãŒããæé©åããŸããããã¯æå ±ã§ãã ã³ãŒãèªäœã¯éåžžã«åçŽã§ããããã¿ã€ãã®åœ¢ã§äžå¿ èŠã«ã©ããããããšãªãæžãããŠããŸãããµã€ãã¯ã300ã®ã°ããŒãã«å€æ°ãš8000ãè¶ ããé¢æ°ã§ç®¡çããŠããŸãã ãµã€ãã®ã¢ãŒããã¯ãã£ãç解ãããã®ã³ãŒããå€æŽããããšã¯éåžžã«ç°¡åã§ããã
ãµãŒãããŒãã£ã®ãã¬ãŒã ã¯ãŒã¯ã®ãã¡ãMEGAã¯jQueryïŒçŸåšããããªãã§ã¯ååšããŸããïŒãExt JSããã³SJCLã䜿çšããŠããŸãã åŸè ã¯ãAESæå·åã«ããæå·åã³ã¢ãå®è£ ããŸãã SJCLã¯ãããŒããã®ä»ã®ãã€ãé åãæ ŒçŽããããã®èå³æ·±ã圢åŒãæäŸããŸããéåžžã®é åã§ãã€ããè¿œãããã代ããã«ãa32ãšåŒã°ãã圢åŒã«ãå§çž®ããããŸãã ãã®æ¬è³ªã¯ããã€ãé åã®å 容ã32ãããã®æ°å€ã«ããã¯ãããããçãé·ãã®é åã«æžã蟌ãŸããããšã§ãã ã€ãŸããé åã®4ãã€ãããšã«1ã€ã®éåžžã®æŽæ°ã«å€æãããŸãã ãµã€ãã³ãŒãã«ã¯ãå³æã»ãã{a32é åãæååãbase64æåå}ã§ããããçš®é¡ã®å€æãå®è¡ããé¢æ°ããããŸãã
ããŒæ å ±
ç»é²ããã³èªèšŒããã»ã¹ã®èª¬æã«é²ãåã«ãæå·åã®å¯Ÿè±¡ãšãªãæ å ±ãã€ãŸã次ã®ããšãèæ ®ãã䟡å€ããããŸãã- ã¢ã«ãŠã³ããã¹ã¿ãŒã㌠ããŠãŒã¶ãŒç»é²æã«ã©ã³ãã ã«äœæãããé·ãã¯128ãããã§ãã ãããŠãååãšããŠã察称æå·åã«äœ¿çšããããã¹ãŠã®ããŒã®é·ãã¯128ãããã§ãã
- RSAç§å¯éµ ïŒããŠã¹ã®åããšããŒããŒãå ¥åã«åºã¥ããŠç»é²æã«äœæãããŸãã ãã®èšäºã§ã¯ãé察称æå·åã¯ããŠã³ããŒããããã¡ã€ã«ã®å ±æã«äœ¿çšããããããé察称æå·åã«ã¯çŠç¹ãåœãŠãŸããããŸãããŠãŒã¶ãŒããŒã¿ã®èªèšŒãšæå·åã®ããã»ã¹ãå€æŽããã¿ã¹ã¯ããããŸããã
- ãµãŒãã¹ã«ã¢ããããŒããããåã ã®ãã¡ã€ã«ããŒãšãã¡ã€ã«èªäœ ã ããŒã¯ãã¡ã€ã«ã®ã¢ããããŒãæã«ã©ã³ãã ã«äœæããããã®ããŒã¯ãã¡ã€ã«ããŒã¿ã®æå·åã«äœ¿çšãããåã ã®ãã¡ã€ã«ããŒãšãã®ãã§ãã¯ãµã ã«åºã¥ããŠäœæãããããŒã¯å±æ§ã®æå·åã«äœ¿çšãããŸãã
ã³ãŒãã«ããè¿ã
ããã§ãç»é²ããã»ã¹ãšèªèšŒããã»ã¹ãåæãããã¹ã¿ãŒããŒã®äœææ¹æ³ãšæå·åæ¹æ³ã確èªããããšãææ¡ããŸããããã§ã¯ããããã®ããã»ã¹ãçŽã«æããŠã¿ãŸãããçæ°ã®æ¬è³ªå šäœãç解ããŠãããããã«ãç§ã¯ãã®åçãäœããŸããã

æ°èŠãŠãŒã¶ãŒç»é²
ç»é²ããã»ã¹èªäœã¯ããæ··ä¹±ãæããŸããã¢ã³ã±ãŒãã«èšå ¥ããåŸã匷åãªapi_createuser
ã®é¢æ°ãåŒã³åºãããŸããã
api_createuser
é¢æ°ã«èå³ããããŸãã
// - function api_createuser(ctx, invitecode, invitename, uh) { var i; var ssc = Array(4); // session self challenge, will be used to verify password var req, res; if (!ctx.passwordkey) { ctx.passwordkey = Array(4); for (i = 4; i--;) ctx.passwordkey[i] = rand(0x100000000); } if (!u_k) api_create_u_k(); // - u_k for (i = 4; i--;) ssc[i] = rand(0x100000000); // if (d) console.log("api_createuser - masterkey: " + u_k + " passwordkey: " + ctx.passwordkey); // - ( k) // ts ssc req = { a: 'up', k: a32_to_base64(encrypt_key(new sjcl.cipher.aes(ctx.passwordkey), u_k)), ts: base64urlencode(a32_to_str(ssc) + a32_to_str(encrypt_key(new sjcl.cipher.aes(u_k), ssc))) }; if (invitecode) { req.uh = uh; req.ic = invitecode; req.name = invitename; } if (d) console.log("Storing key: " + req.k); api_req([req], ctx); }
ãã®æ©èœã§ã¯ã次ã®ããšã«é¢å¿ããããŸãã
-
u_k
ãã¹ã¿ãŒããŒèªäœãã°ããŒãã«å€æ°ãapi_create_uk
ã«ãã£ãŠäœæããã4ã€ã®32ãããæ°å€ã®é å -
ssc
ã¯ããã¹ã¿ãŒããŒã§æå·åããããããªãã¯å€ãšé£çµãããŠãµãŒããŒã«éä¿¡ãããã©ã³ãã é åã§ãã åŸã§ãèªèšŒäžã«ãã¹ã¿ãŒããŒã®æ£ç¢ºæ§ã確èªããããã«äœ¿çšãããŸãã -
sjcl
-AESãå®è£ ããæå·åã©ã€ãã©ãª -
rand()
-ããŒã«ã«RC4ããŒã¹ã®æ¬äŒŒä¹±æ°ãžã§ãã¬ãŒã¿ãŒã®å®è£ -
encrypt_key()
ã¯ã察称æå·åãµãŒãã¹ã®åºæ¬æ©èœã§ãã æå·åãããããŒã§åæåãããsjcl
ãªããžã§ã¯ããšé åãsjcl
ãŸãã æ©èœã³ãŒãã以äžã«ç€ºããŸãããããŸãããã°èª¬æã¯äžèŠã§ãã
// encrypt/decrypt 4- or 8-element 32-bit integer array function encrypt_key(cipher, a) { if (a.length == 4) return cipher.encrypt(a); var x = []; for (var i = 0; i < a.length; i += 4) x = x.concat(cipher.encrypt([a[i], a[i + 1], a[i + 2], a[i + 3]])); return x; }
ãã®çµæãç»é²åŸã以äžããµãŒããŒã«éä¿¡ãããŸãã
- ã¢ã«ãŠã³ããã¹ã¯ãŒããã掟çããããŒã§æå·åããããã¹ã¿ãŒããŒ
-
ssc||encrypt_AES-128(u_k, ssc)
ã®åœ¢åŒã®æåå
ãŠãŒã¶ãŒãã°ã€ã³
ããã§ãèªèšŒããã»ã¹ã«ã¹ã ãŒãºã«é²ãããšãã§ããŸãã ã€ãŸãã次ã®ããã«è¡ãããŸãã- ãŠãŒã¶ãŒããã°ã€ã³/ãã¹ã¯ãŒããå ¥åããŸã
- æåã®èªèšŒã¹ãããã«åæ Œãããšãæå·åããããã¹ã¿ãŒããŒãšç»é²äžã«äœæãããèªèšŒã·ãŒã±ã³ã¹ïŒ
ssc
ïŒã¯ãµãŒããŒããååŸãããŸã - ãã¹ã¿ãŒããŒã¯ããŠãŒã¶ãŒãå ¥åãããã¹ã¯ãŒãã§åŸ©å·åãããŸã
- èªèšŒã·ãŒã±ã³ã¹ã¯ãã¹ã¿ãŒããŒã§åŸ©å·åããããããªãã¯å€ãšæ¯èŒãããŸããããã«ããããã¹ã¿ãŒããŒãšãã¹ã¯ãŒãã®æ£ç¢ºæ§ããã§ãã¯ãããŸãã
api_getsid2
ã
api_getsid2
ãŸãïŒ
// - function api_getsid2(res, ctx) { var t, k; var r = false; if (typeof res == 'object') { // sjcl-aes var aes = new sjcl.cipher.aes(ctx.passwordkey); // -... if (typeof res[0].k == 'string') { k = base64_to_a32(res[0].k); if (k.length == 4) { // ... k = decrypt_key(aes, k); // - sjcl-aes, - aes = new sjcl.cipher.aes(k); // ssc if (typeof res[0].tsid == 'string') { t = base64urldecode(res[0].tsid); // // - , if (a32_to_str(encrypt_key(aes, str_to_a32(t.substr(0, 16)))) == t.substr(-16)) r = [k, res[0].tsid]; } // RSA-, else if (typeof res[0].csid == 'string') { var t = mpi2b(base64urldecode(res[0].csid)); var privk = a32_to_str(decrypt_key(aes, base64_to_a32(res[0].privk))); var rsa_privk = Array(4); // decompose private key for (var i = 0; i < 4; i++) { var l = ((privk.charCodeAt(0) * 256 + privk.charCodeAt(1) + 7) >> 3) + 2; rsa_privk[i] = mpi2b(privk.substr(0, l)); if (typeof rsa_privk[i] == 'number') break; privk = privk.substr(l); } // check format if (i == 4 && privk.length < 16) { // TODO: check remaining padding for added early wrong password detection likelihood r = [k, base64urlencode(crypto_rsadecrypt(t, rsa_privk).substr(0, 43)), rsa_privk]; } } } } } ctx.result(ctx, r); }
ç»é²/èªèšŒã®ããŒãã¹ãšããŠããã¹ã¯ãŒããå€æŽããããã»ã¹ãèŠãããšãã§ããŸãã
// function changepw(currentpw, newpw, ctx) { var pw_aes = new sjcl.cipher.aes(prepare_key_pw(newpw)); api_req([{ a: 'up', currk: a32_to_base64(encrypt_key(new sjcl.cipher.aes(prepare_key_pw(currentpw)), u_k)), k: a32_to_base64(encrypt_key(pw_aes, u_k)), uh: stringhash(u_attr['email'].toLowerCase(), pw_aes) }], ctx); }
ãã®é¢æ°ã®ã³ãŒãã¯ããèªäœãç©èªã£ãŠããŸããå€ããã¹ã¯ãŒããšæ°ãããã¹ã¯ãŒãããååŸãã2ã€ã®ããŒã§ãã¹ã¿ãŒããŒãæå·åãããããã®å€ããµãŒããŒã«éä¿¡ããŸãã çŸåšã®ãã¹ã¯ãŒããè¿ã¥ããšãæ°ãããã¹ã¯ãŒãã«çœ®ãæããããŸãã ããã§ã¯ã以åã®ãã¹ãŠã®æäœã«æé»çã«ååšããŠãã
prepare_key_pw
é¢æ°ã«ãã£ãšæ³šæãæããããšæããŸããã ãã®ã¿ã¹ã¯ã¯ãæååãã¹ã¯ãŒããa32é åã«å€æãã次ã®ããã«ããŒæŽŸçæäœãå®è¡ããããšã§ãã
// convert user-supplied password array function prepare_key(a) { var i, j, r; var aes = []; var pkey = [0x93C467E3, 0x7DB0C7A4, 0xD1BE3F81, 0x0152CB56]; for (j = 0; j < a.length; j += 4) { key = [0, 0, 0, 0]; for (i = 0; i < 4; i++) if (i + j < a.length) key[i] = a[i + j]; aes.push(new sjcl.cipher.aes(key)); } for (r = 65536; r--;) for (j = 0; j < aes.length; j++) pkey = aes[j].encrypt(pkey); return pkey; }
ãã®é¢æ°ã¯ãç¬èªã®ã¢ã«ãŽãªãºã ã«åºã¥ããŠãããããå€ãã®èŠæ ãåŒãèµ·ãããŸããã èšäºã®å·çäžã«ããµãŒãã¹ã®äœæè ã¯ã³ãŒãããããã«å€æŽããããšãã§ããŸããããããã§å€§ããªå€æŽã¯ãããŸããã§ããã ãã®æ¬è³ªã¯ãéä¿¡ããããã¹ã¯ãŒãããã©ã³ãã ããŒãšåºå¥ã§ããªãããŒãååŸããããã«ãäžå®ã®ããŒã§65536åæå·åãããããšã§ãã ãµãŒãã¹ã®äœæè ãæ¢åã®ã¢ã«ãŽãªãºã ïŒPBKDF2ãªã©ïŒã䜿çšããªãã£ãçç±ã¯è¬ã®ãŸãŸã§ãã
ãã¡ã€ã«ãããŠã³ããŒãããŠæå·åãã
èŠããã«ããã®ããã»ã¹å šäœã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸãã
ãã®ç»åãé·ãç解ããããšã¯è³ã«ãšã£ãŠå±éºã§ãã®ã§ã以äžã§ãããã©ã®ããã«èµ·ãããã説æããŸãã
æ¢ã«è¿°ã¹ãããã«ãã¢ããããŒãäžã«ãåãã¡ã€ã«ã«å¯ŸããŠ6ã€ã®32ãããæ°ããç¬èªã®ã©ã³ãã ããŒé åãäœæãããŸãã ãã®é åã®æåã®4ã€ã®èŠçŽ ã¯ããã¡ã€ã«ã®å 容ãæå·åããããã«äœ¿çšãããæåŸã®2ã€ã¯ããã¡ã€ã«ã®ãã§ãã¯ãµã ãèšç®ãããã«ãŠã³ã¿ãŒã®åæå€ãšããŠäœ¿çšãããŸãã ãã®é åã¯ã
ul_key
ã°ããŒãã«å€æ°ã«æ ŒçŽãããŸãã ãã®å 容ã¯ãJSONã·ãªã¢ã«åãããæåå
ul_KeyNonce
ãããŸãã
æå·åèªäœã¯ãWeb Workerã䜿çšããŠïŒãã©ãŠã¶ããã®ãã¯ãããžããµããŒãããŠããå ŽåïŒããŸãã¯åã«ããŒãžã®ã¡ã€ã³ã³ãŒãå ã§è¡ãããŸãã ãã¡ã€ã«ãéä¿¡ããæºåãã§ãããããã®å±æ§ãæå·åããããã«ïŒçŸæç¹ã§ã¯ãå±æ§ã¯ãã¡ã€ã«åã®ã¿ãæå³ããŸãïŒã
ul_key
ãšãã¡ã€ã«ãã§ãã¯ãµã ã«åºã¥ããŠæ°ãããã¡ã€ã«
filekey
ãäœæãããŸãã 次ã«ããã®ããŒã¯ãã¹ã¿ãŒããŒã§æå·åããããã¡ã€ã«å±æ§ãšãšãã«ãµãŒããŒã«éä¿¡ãããŸãã
initupload3
ããã³
api_completeupload2
é¢æ°ã¯ãããããã¹ãŠã®ã¢ã¯ã·ã§ã³ãæ åœããŸãã
filekey
ããŒã¯
ul_chunkcomplete
é¢æ°ã§
filekey
ããŸãã以äžã«ãã®äžéšã瀺ããŸãã
// : function initupload3() { // ... =) // // ul_key , // ul_keyNonce Web Worker // ul_key = Array(6); for (i = 6; i--;) ul_key[i] = rand(0x100000000); ul_keyNonce = JSON.stringify(ul_key); ul_macs = []; // ... , ... // sjcl-aes ul_key ul_aes = new sjcl.cipher.aes([ul_key[0], ul_key[1], ul_key[2], ul_key[3]]); // ... // : // , onUploadStart(ul_queue_num); ul_dispatch_chain(); } // function ul_chunkcomplete(slot,pos,response) { // ... var t = []; // ul_macs - , worker' for (p in ul_macs) t.push(p); // , - t.sort(function(a,b) { return parseInt(a)-parseInt(b) }); for (var i = 0; i < t.length; i++) t[i] = ul_macs[t[i]]; // condenseMacs // "" 4 var mac = condenseMacs(t,ul_key); ul_settimeout(-1); // // var filekey = [ul_key[0]^ul_key[4],ul_key[1]^ul_key[5],ul_key[2]^mac[0]^mac[1],ul_key[3]^mac[2]^mac[3],ul_key[4],ul_key[5],mac[0]^mac[1],mac[2]^mac[3]]; // ... } // : function api_completeupload2(ctx, ut) { var p; if (ctx.path && ctx.path != ctx.n && (p = ctx.path.indexOf('/')) > 0) { var pc = ctx.path.substr(0, p); ctx.path = ctx.path.substr(p + 1); fm_requestfolderid(ut, pc, ctx); } else { // , ul_key // ctx.k == filekey a = { n: ctx.n }; if (d) console.log(ctx.k); var ea = enc_attr(a, ctx.k); if (d) console.log(ea); // - var req = { a: 'p', t: ut, n: [{ h: ctx.t, t: 0, a: ab_to_base64(ea[0]), // k: a32_to_base64(encrypt_key(u_k_aes, ctx.k)), // == AES_encrypt(u_k, filekey) fa: ctx.fa }] }; if (ut) { // a target has been supplied: encrypt to all relevant shares var sn = fm_getsharenodes(ut); if (sn.length) { req.cr = crypto_makecr([ctx.k], sn, false); req.cr[1][0] = ctx.t; } } api_req([req], ctx.ctx); } }
ãã¡ã€ã«ãããŠã³ããŒãããŠè§£èªãã
æããã«ããããã®ããã»ã¹ã¯åã«ãã¡ã€ã«æå·åã®éã§ããå¿ èŠããããŸãã èå³æ·±ãã®ã¯ããµãŒããŒããul_key
ããæå·åããã
filekey
å€ãã
ul_key
ããŒ
ul_key
ååŸããããšã ãã§ãã
ãã¡ã€ã«ã®ããŠã³ããŒãæã«ã¯ããã©ãŠã¶ãŒã³ã³ããã¹ãã«ã¯ã埩å·åããããã¡ã€ã«ããŒãæ ŒçŽãããªããžã§ã¯ããæ¢ã«å«ãŸããŠããŸãã ãããã£ãŠãæåã¯ããŠãŒã¶ãŒèªèšŒã®çŽåŸã«çºçããããã»ã¹ãã€ãŸããã¡ã€ã«ãããŒãžã£ãŒã®ããŠã³ããŒããæ€èšããã®ãçã«ããªã£ãŠããŸãã ãŠãŒã¶ãŒããµãŒãã¹ãžã®ã¢ã¯ã»ã¹ãèš±å¯ãããåŸããŠãŒã¶ãŒã¯åœç¶ãèªåã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããããšèããŠããŸãïŒæ¢ã«ããã«ãã¡ã€ã«ããããšä»®å®ããŸãïŒã ãããè¡ãã«ã¯ããŸããã¡ã€ã«ããŒã埩å·åããŠããããã®å±æ§ã埩å·åããå¿ èŠããããŸãã 次ã®é¢æ°ã®ãã³ãã«ã¯ãããæ±ããŸããããã®ãã¡
loadfm_callback
ãš
process_f_f
ãèå³ãæã£ãŠããŸãã
ç°¡åã«èª¬æãããšããã¡ã€ã«å±æ§ãååŸããããã»ã¹ã¯ã次ã®ã¢ã«ãŽãªãºã ã§èª¬æã§ããŸãã
- ãã¡ã€ã«ãããŒãžã£ãŒãããŒããããã®ãåŸ
ã£ãŠïŒ
loadfm_callback
ïŒãããŠã³ããŒãããããã¹ãŠã®ãã¡ã€ã«ã®èª¬æãå«ãJSONãååŸããŸã - ãã¡ã€ã«æ
å ±ãå«ãé
åãé
眮ãã
farray
é åãäœæããŸã - åãã¡ã€ã«ã«å¯ŸããŠ
process_f_f
é¢æ°ãïŒååž°çã«ïŒå®è¡ããŸã - ããŒãæã€åãã¡ã€ã«ã«ã€ããŠããã®ããŒãšå±æ§ã埩å·åãïŒ
crypto_processkey
é¢æ°ïŒããããããã¡ã€ã«æ å ±é åã«ä¿åããŸã - ãã®åŸã埩å·åãããå€ã
FileStore
å€æ°ã«FileStore
ãŸãïŒprocess_f_f
ã®ååž°ã®çµããïŒ
以äžã«ããã®ã¢ã«ãŽãªãºã ã瀺ãã³ãŒãã®æç²ã瀺ããŸã
// callback - function loadfm_callback(json, res) { // ... // JSON json = json[0]; if (d) console.log(json); if (d) console.log(json); if (json.u) process_u(json.u, false); if (json.ok) process_ok(json.ok); if (json.s) { for (i in json.s) { if (u_sharekeys[json.s[i].h]) { sharingData.push({ id: json.s[i].h + '_' + json.s[i].u, userid: json.s[i].u, folderid: json.s[i].h, rights: json.s[i].r, date: json.s[i].ts }); sharednodes[json.s[i].h] = true; } } } // ... ... // farray[fi] = new Object; farray[fi].f = json.f; // , callback // process_f(fi, false, callback); fi++; } // , // process_f function process_f_f(fid) { // - farray if (!farray[fid].f[farray[fid].i]) { if (farray[fid].ap) FileStore.suspendEvents(); // FileStore FileStore.loadData(farray[fid].mdata, true); if (farray[fid].ap) FileStore.resumeEvents(); if (d) console.log('call reqmissingkeys:'); crypto_reqmissingkeys(); if (farray[fid].callback) farray[fid].callback.fn(farray[fid].callback); return false; } var f = farray[fid].f[farray[fid].i]; f.attrs = fa; if (f.sk) u_sharekeys[fh] = crypto_process_sharekey(fh, f.sk); // , if ((ft !== 2) && (ft !== 3) && (ft !== 4) && (fk)) { crypto_processkey(u_handle, u_k_aes, f); // u_nodekeys[fh] = f.key; if ((typeof f.name !== 'undefined') && (fp == InboxID)) InboxCount++; } else { if (fa) { if (!missingkeys[fh]) { missingkeys[fh] = true; newmissingkeys = true; } } fk = ''; f.name = ''; } if (ft == 2) RootID = fh; else if (ft == 3) InboxID = fh; else if (ft == 4) TrashbinID = fh; else if ((ft < 2) || (ft == 5)) { // } else { // FileStore farray[fid].mdata.push({ id: fhreplace(/[^az^AZ^0-9^_^-]/g, ""), name: f.name, size: fs, type: filetype(f.name, ft), icon: fileicon(f.name, icontype), parentid: fp, folder: ft, owner: fu, date: f.ts, attrs: f.attrs, key: f.key, r: fr, su: f.su, fa: f.fa, }); if (fp == TrashbinID) trashbinfull = true; if (((ft) && (farray[fid].ap)) || (fp == InboxID)) refreshtree = true; } farray[fid].i++; // (, - ) timeoutcount++; if (!(timeoutcount & 63)) { // 63 - setTimeout("process_f_f(" + fid + ")", 1); timeoutcount2++; } // - else process_f_f(fid); } // function crypto_processkey(me, master_aes, file) { var id, key, k, n; if (!file.k) { if (!keycache[file.h]) return; file.k = keycache[file.h]; } id = me; // do I own the file? (user key is guaranteed to be first in .k) // "<file handle>:<key>/<share key>" var p = file.k.indexOf(id + ':'); // , if (p) { // I don't - do I have a suitable sharekey? for (id in u_sharekeys) { p = file.k.indexOf(id + ':'); if (p >= 0 && (!p || file.k.charAt(p - 1) == '/')) break; p = -1; } } // if (p >= 0) { delete keycache[file.h]; // - var pp = file.k.indexOf('/', p); if (pp < 0) pp = file.k.length; p += id.length + 1; key = file.k.substr(p, pp - p); // we have found a suitable key: decrypt! if (key.length < 46) { // short keys: AES k = base64_to_a32(key); // check for permitted key lengths (4 == folder, 8 == file) if (k.length == 4 || k.length == 8) { // -, k = decrypt_key(id == me ? master_aes : new sjcl.cipher.aes(u_sharekeys[id]), k); } else { if (d) console.log("Received invalid key length (" + k.length + "): " + file.h); return; } } else { // long keys: RSA if (u_privk) { var t = mpi2b(base64urldecode(key)); if (t) k = str_to_a32(crypto_rsadecrypt(t, u_privk).substr(0, file.t ? 16 : 32)); else { if (d) console.log("Corrupt key for node " + file.h); return; } } else { if (d) console.log("Received RSA key, but have no public key published: " + file.h); return; } } // var ab = base64_to_ab(file.a); // var o = dec_attr(ab, k); if (typeof o == 'object') { if (typeof on == 'string') { if (file.h) { u_nodekeys[file.h] = k; if (key.length >= 46) rsa2aes[file.h] = a32_to_str(encrypt_key(u_k_aes, k)); } // - file.key = k; file.name = on; } } } else { if (d) console.log("Received no suitable key: " + file.h); if (!missingkeys[file.h]) { newmissingkeys = true; missingkeys[file.h] = true; } keycache[file.h] = file.k; } }
ãã®åŸã次ã®ããã«ãã©ãŠã¶ã³ã³ããã¹ããã
ul_key
ãœãŒã¹ããŒã®å€ãååŸã§ããŸãã
dl_keyNonce = JSON.stringify([dl_key[0]^dl_key[4],dl_key[1]^dl_key[5],dl_key[2]^dl_key[6],dl_key[3]^dl_key[7],dl_key[4],dl_key[5]]);
ãã®å€æã¯ã
startdownload
é¢æ°ã§çºçããŸãã
dl_key == filekey
ul_chunkcomplete
é¢æ°ããã®ãã®ã§ãããããã€ãã®åçŽãªã¢ãžã¥ãæŒç®ãå®è¡ããããšã
ul_chunkcomplete
ãããšã
dl_keyNonce
å€æ°ã¯ãã¡ã€ã«ãã¢ããããŒãããããšãã«çæããã
ul_key
å€ãæ ŒçŽããŸãã ãã®å³ã¯ããã¡ã€ã«ã®ããŠã³ããŒãã«é¢ããã»ã¯ã·ã§ã³ã®åé ã®åçã®é»æ¿ã®å·Šäžé ã«ãããŸãã
æå·æäœã®ãéè² è·ã
ãã¡ã€ã«ãšããŒãä¿è·ããäžèšã®ååã¯éåžžã«å®å šã§ãããšããäºå®ã«ããããããã誰ãããµãŒãã¹ãæäŸããã¢ã«ãŽãªãºã ã®å®è£ ã«äŸåããŠããããšã奜ãŸãªããããããŸããã ãã®å Žåããã©ãŠã¶ã®ç¬èªã®æ¡åŒµæ©èœãéçºã§ããŸããããã«ããããµãŒãã¹ã®äžéšã®æ©èœããªãŒããŒã©ã€ããããè¿œå ã®æå·åãå®è£ ãããŸãã ã€ãŸããGOST 28147-89ã¢ã«ãŽãªãºã ã«åŸã£ãŠãååŸã§ããªãããŒã®ããŒããŠã§ã¢æå·åã䜿çšããŠãããŒæ å ±ïŒãã¹ã¿ãŒããŒãšãã¡ã€ã«ããŒïŒã®ä¿è·ãå®è£ ããããšã«ããŸããã ããã«å¯ŸããããŒãã¹ã¯ããµãŒãã¹ã«2èŠçŽ èªèšŒãå«ãŸããããšã§ãããããã£ãŠããã®ãŠãŒã¹ã±ãŒã¹ãæ€èšããŠãã ããã
- ãŠãŒã¶ãŒã¯ãµãŒãã¹ã«ç»é²ãããŠããŸã
- 次ã«ãæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããŸã
- ãã®å©ããåããŠããã¹ã¿ãŒããŒã®ããŒããŠã§ã¢æå·åã¯ãããŒã¯ã³ããæœåºã§ããªãããŒã§å®è¡ãããŸã
- ãã®æ¹æ³ã§æå·åããããã¹ã¿ãŒããŒã¯ãµãŒããŒã«ã¢ããããŒããããŸã
ãã®åŸãããŒã¯ã³ãšãã®PINã³ãŒãããªããã°ããã¹ã¿ãŒããŒã®å€ãååŸããããšã¯ã§ããŸããã ããã«ãã以äžãåŸãããŸãã
- ãµãŒãã¹ã§ã®2èŠçŽ èªèšŒïŒæ£ãã埩å·åããããã¹ã¿ãŒããŒããªããšã
api_getsid2
é¢æ°ã¯ã倱æãããŸãïŒ - ããŒã¯ã³ããªããšãçŸåšã®ã¢ã«ãŠã³ãã®ãã¹ã¯ãŒããå€æŽããããšãã§ããŸãã
次ã®ã¹ãããã¯ããã¡ã€ã«æå·åããŒïŒå¥å
ul_key
ïŒãšãã¡ã€ã«å±æ§ããŒïŒ
filekey
ïŒãããŒã¯ã³ã§æå·åããããšã§ããããŒã¯ã³ã¯ãµãŒããŒã«ä¿åãããŸãã ãããã£ãŠãåãã¡ã€ã«ã¯ãµãŒããŒã«
filekey
ããªãããŒã§æå·åããã
api_completeupload2
é¢æ°ããæå·åããããã¡ã€ã«ããŒã¯
api_completeupload2
ãŸãã ãã¡ã€ã«å±æ§ã¯ãopen
filekey
å€ã§æå·åãããŸãã æ確ã«ããããã«ããã¡ã€ã«ãããŠã³ããŒãããããã»ã¹ã瀺ã次ã®å³ãã¹ã±ããããŸããã

ããã§éåžžã«æ³šæãå¿ èŠãªæ¹æ³ãé©çšããããšã«æ³šæããŠãã ããã ãã®å Žåãæ»æè ã¯ããµãŒããŒããéä¿¡ããããã¡ã€ã«ããŒãååãããŠãŒã¶ãŒã®ãã¹ã¿ãŒããŒãç¥ã£ãŠããŠãããã¡ã€ã«ã解èªã§ããªãã£ãããšãéèŠã§ãã ãããã£ãŠãããã§ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã®æ©èœãè©ŠããŠãul_keyïŒãŸãã¯dl_keyïŒããŒããŒã¯ã³ããã¡ã€ã«ã®æå·åã«æå·åããŠååŸããul_keyNonceããŒå€ïŒåãdl_keyNonceïŒã䜿çšã§ããŸãã
䜿çšæè¡
ããŒããŠã§ã¢æå·åãå®è£ ããããã«ãUSBããŒã¯ã³Rutoken EDSïŒRutoken Webãé©ããŠããŸãïŒããã©ãŠã¶ãŒãã©ã°ã€ã³ãRutoken Web PKI Editionããšãšãã«äœ¿çšãããŸãã RBSã·ã¹ãã ã® Rutoken WEB PKI Editionããã³Shield and Swordã®èšäºã§ããã©ã°ã€ã³ã®è©³çŽ°ãªèª¬æãæ¢ã«æäŸããŸããã å¿çšãœãªã¥ãŒã·ã§ã³ ããããã®èšäºã®å·ç以æ¥ãGOST 28147-89ã¢ã«ãŽãªãºã ã«åŸã£ãããŒããŠã§ã¢æå·åã®å¯èœæ§ã補åã«è¿œå ãããŸããã GOST 28147-89ã¢ã«ãŽãªãºã ã«æºæ ããããŒããŠã§ã¢æå·åæ©èœãåãããã©ã°ã€ã³ã®ããŒã¿çã¯ã ããããããŠã³ããŒãã§ããŸã ã ãã®ããŒãžã§ã³ã®ãã©ã°ã€ã³ã¯ãŸã å®å šã«ã¯ãã¹ããããŠããªããããPMã§éç¥ããããã«æ±ããŠããå Žæã«ãšã©ãŒãããå¯èœæ§ãããããšãèŠåããŸãã
ãã©ã°ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ã察称æå·åã¯ã次ã®æ§æãæã€æå·åé¢æ°ã«ãã£ãŠå®è£ ãããŸãã
encrypt(deviceId, keyLabel, data, resultCallback, errorCallback) â {string}
å ¥åãšããŠãé¢æ°ã¯ä»¥äžãåããŸãã
- ããã€ã¹ID
number
- æå·åã®ããŒã©ãã«ã
number
ïŒãã®ãããªããŒããªãå Žåã¯çæãããŸãïŒ - æå·åãããããŒã¿ã
string
ïŒ"aa:bb:cc:dd"
ã®åœ¢åŒã®ãã€ãé åãå«ãæååïŒ - æå·åæäœãæ£åžžããã³å€±æã«å®äºããããã®ã³ãŒã«ããã¯é¢æ°
埩å·åã¯ã
decrypt
æ©èœã䜿çšããŠåæ§ã«å®è¡ãããŸã
ããŒã©ãã«ã¯ãã©ã®ããŒã§ããŒã¿ãïŒdecïŒã§æå·åãããã決å®ãããããç¹å¥ãªæ³šæãæãå¿ èŠããããŸãã ã©ãã«ã¯ä»»æã®æååã§ãããäž»ã«äŸ¿å©ãªããŒèå¥ã«äœ¿çšãããŸãããã®å Žåã2ã€ã®ããŒãã¢ã䜿çšããŸãã1ã€ã¯ãã¹ã¿ãŒããŒã®æå·åçšããã1ã€ã¯åã ã®ãã¡ã€ã«ããŒã®æå·åçšã§ãããã¹ã¿ãŒããŒãæå·åãããŠããããŒã«ã¯ããŠãŒã¶ãŒã®ãã¹ã¯ãŒããšåãã©ãã«ãä»ããŠããŸãïŒçŸåšãæååããããã·ã¥ã䜿çšãããšããèãã
e-mail||
ãããŸããããè¿ããã¡ã«ä¿®æ£ããŸãïŒãããŠã³ããŒããããã¡ã€ã«ã®ããŒãæå·åããã«ã¯ããã¹ã¿ãŒããŒã®æååè¡šçŸãšåãã©ãã«ã®ããŒã䜿çšããŸãïŒããã§ã¯ããã¹ã¿ãŒããŒã®ããã·ã¥ã䜿çšããããšãã§ããŸãïŒã
çŽæ¥éçº
ç§ã®ãœãŒã¹ã³ãŒãã«ã€ããŠã³ã¡ã³ããããã ãã§ããå®éã«ã¯ã¢ã«ãã¡çã§ãããäžèšã®æ©èœãå®è£ ããŠããŸããç§ã¯èªåã®ãªã¯ãŒã¯ããµãŒãã¹ã®ä»ã®æ©èœãšã©ãã ãäºææ§ããããã確èªããªãã£ãã®ã§ããã¹ãŠã®ãœãŒã¹ãgithubã«æçš¿ãããã®ã·ã¹ãã ãå®æãããã®ã«ã©ããªå©ãã§ãåãã§ããŸãããããã£ãŠããã®èšäºã巚倧ãªãªã¹ãã§è©°ãŸãããããšã¯ãããæ¡åŒµæ©èœã®äžè¬çãªã¹ããŒã ã®ã¿ã説æããŸããå®æããæ¡åŒµæ©èœã¯ããããããŠã³ããŒãã§ããŸãã3ã€ã®ãã©ãŠã¶ïŒChromeãFirefoxãIEïŒã®æ¡åŒµæ©èœãæäŸããCrossriderãµãŒãã¹ã䜿çšããŠéçºãããŸããããChromeãŸãã¯Firefoxã§åäœã確èªããæ¹ããããæåã®ã»ããã¯ããã«å®å®ããŠããŸãã
å¹³å¡ãžã®æ¡åŒµã³ãŒãã¯ç°¡åã§ãããµãŒãã¹ããŒãžã«ãããã©ããããã§ãã¯ããããã§ããã°ãè¿œå ã®ã¹ã¯ãªãããããŒãããã ãã§ãããããã®ã¹ã¯ãªããã¯ãããã€ãã®ãã€ã¢ãã°ãè¿œå ããŠããŒãžã³ãŒããå€æŽãã次ã®ãµãŒãã¹æ©èœããªãŒããŒã©ã€ãããŸãã
-
changepw
ïŒãã¹ã¯ãŒãã®å€æŽãæ åœ -
api_getsid2
ïŒãã°ã€ã³ã³ãŒã«ããã¯ã®1〠-
api_completeupload2
ïŒã³ãŒã«ããã¯ãã¡ã€ã«ã®ã¢ããããŒãå®äº -
loadfm_callback
ïŒã³ãŒã«ããã¯ãã¡ã€ã«ãããŒãžã£ãŒã®ããŠã³ããŒã -
processpacket
ïŒå¥ã®ã³ãŒã«ããã¯ãããŠã³ããŒããããã°ããã®ãã¡ã€ã«ã®å±æ§ããã³ãŒããããŸã -
parsepage
ïŒè¿œå ã®ãã€ã¢ãã°ã®æç»ãæ åœ -
dologin
ïŒèªèšŒæ©èœãæ¡åŒµããŸã -
initupload3
ïŒãã¡ã€ã«æå·åããŒã®äœæãæ åœ -
startdownload
ïŒãã¡ã€ã«ããŒã®é解æãšããŠã³ããŒãã®åæå
- å§ããã«ã¯ãRutoken EDSïŒãŸãã¯Rutoken WebïŒãååŸãããã©ãŠã¶ãŒãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããã®ãè¯ã
- æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ãã
- æ¡åŒµæ©èœãç¡å¹ã«ããŠãµãŒãã¹ã«ãã°ã€ã³ããŸã
- ãã©ãŠã¶æ¡åŒµæ©èœãæå¹ã«ãã
- ã¢ã«ãŠã³ãããŒãžã«ç§»å
- ããªã³ã¯ããŒã¯ã³ããã¿ã³ãã¯ãªãã¯ããŸã
- çŸåšã®ãã¹ã¯ãŒããå ¥åããŠããã®æäœãå®è¡ããŸã
javascript:(function(){if(document.getElementById('cryptorutokenjs')){alert(' ');return}function loadRemoteScript(url){var script=document.createElement('script');script.type="text/javascript";script.src=url;document.head.appendChild(script)}function loadRemoteStyle(url){var style=document.createElement('link');style.rel='stylesheet';style.type="text/css";style.href=url;document.head.appendChild(style)}loadRemoteStyle("https://mega-crypto.googlecode.com/git/mega.css");loadRemoteScript("https://mega-crypto.googlecode.com/git/util.js");loadRemoteScript("https://mega-crypto.googlecode.com/git/rutoken-extra.js");loadRemoteScript("https://mega-crypto.googlecode.com/git/rutoken-crypto.js");loadRemoteScript("https://mega-crypto.googlecode.com/git/mega.js")})();
äœæ¥å®æŒ
ãŸããäœæç©ããµã€ãã«æ¥ç¶ããŸãã ãããè¡ãã«ã¯ïŒãµãŒãã¹ã«ãã°ã€ã³ãããã¡ã€ã«ãããŒãžã£ãŒããŒãžãéããŸã
æ¡åŒµæ©èœãŸãã¯ããã¯ããŒã¯ã¬ãããæ¥ç¶ãããã®åŸããŒã¯ã³PINãå ¥åããå¿ èŠããããŸã
ã¢ã«ãŠã³ãããŒãžã«ç§»åããããŒã¯ã³ãã¢ã«ãŠã³ãã«ãã€ã³ãããŸã
ãã®åŸããµãŒãã¹ãçµäºããäºèŠçŽ èªèšŒã䜿çšããŠå床ãã°ã€ã³ãè©Šè¡ã§ããŸãã
ãŠãŒã¶ãŒåãšãã¹ã¯ãŒããå ¥åããŠãã ãã
PINãå ¥åããŠãã ãã
...
å©çïŒ
ãã®å Žåã®èªèšŒã¯ã次ã®ã¹ããŒã ã«åŸã£ãŠè¡ãããŸãã
- ãµãŒããŒã§ã®ãã°ã€ã³ãšãã¹ã¯ãŒãã®ãã¢ã®ç¢ºèª
- ãŠãŒã¶ãŒåãšãã¹ã¯ãŒããæ£ããå Žåãæå·åããããã¹ã¿ãŒããŒã¯ãµãŒããŒããååŸãããŸã
- ãã©ã°ã€ã³ã䜿çšããŠãããŒã¯ã³ã®PINãèŠæ±ãããŸã
- PINãæ£ããå ¥åãããå Žåããã¹ã¿ãŒããŒã¯ããŒã¯ã³ã®ããŒã§è§£èªãããŸã
çµè«ã®ä»£ããã«
æ¡åŒµæ©èœã®äœæã®è©³çŽ°ãšãã»ãšãã©ã®å Žåã«åæåŒã³åºãã䜿çšãããµãŒãã¹ã«éåææå·åæ©èœãçµã¿èŸŒãããšã®è©³çŽ°ã«ã€ããŠã¯èª¬æããªãã£ããããããã§ãç¶ç¶ãã...ããšæžããããšæããŸãããã®èšäºãç· ããããããã«ãã¯ã©ã€ã¢ã³ãåŽã®æå·åãå®è£ ãããšããèãã«ããäžåºŠæ»ããããšæããŸããã¯ã©ã€ã¢ã³ãåŽã§è¿œå ã®æå·åæ©èœãå®è£ ããã¢ãããŒãã¯ããµãŒããŒã«äœãä¿åããããæ°ã«ããªãWebãµãŒãã¹ïŒãã¡ã€ã«ã¹ãã¬ãŒãžãã¡ãŒã«ããŸãã¯åçŽãªãã£ãããªã©ïŒã«é©çšã§ããŸããããšãã°ãCMS圢åŒã®ã¡ãã»ãŒãžæå·åã䜿çšããã¡ãŒã«ãµãŒãã¹ãšãVKO GOST R 34.10-2001ã¢ã«ãŽãªãºã ã䜿çšããããŒäº€æã¡ã«ããºã ã䜿çšããŠãå®å šãªã¡ãŒã«ãå®è£ ã§ããŸãã
ã質åããæèŠããåŸ ã¡ããŠãããŸãã
PSïŒïŒã¢ã¹ã¯ã¯ããã®ïŒæåã®5人ã«ããŒã¯ã³ã§ãã©ã°ã€ã³ããã¹ãããŠããããŸã-PMã«æžã蟌ã¿ãŸãã