Created
January 28, 2010 00:22
-
-
Save emasaka/288301 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Based on: | |
http://lastoneofthezodiac.blog38.fc2.com/blog-entry-5613.html | |
Needs sha_256.js <http://point-at-infinity.org/jssha256/> like following: | |
<script type="text/javascript" src="./jssha256.js"></script> | |
*/ | |
function pad0(n, len, radix) { | |
radix = radix || 10; | |
var s = '00000000000' + n.toString(radix); | |
return s.substr(s.length - len, len); | |
} | |
function make_timestamp() { | |
var d = new Date(); | |
return [ d.getUTCFullYear(), '-', | |
pad0(d.getUTCMonth() + 1, 2), '-', | |
pad0(d.getUTCDate(), 2), | |
'T', | |
pad0(d.getUTCHours(), 2), '%3A', // %3A == ':' | |
pad0(d.getUTCMinutes(), 2), '%3A', | |
pad0(d.getUTCSeconds(), 2), | |
'Z' | |
].join(''); | |
} | |
function pad_align(str, padstr, align) { | |
var len = str.length; | |
var mod = len % align; | |
return mod == 0 ? str : str + padstr.substr(0, align - mod); | |
} | |
var base64_table = [ | |
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', | |
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', | |
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', | |
't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', | |
'8', '9', '+', '/' ]; | |
function array_base64(ary) { | |
var bit_ary = []; | |
for(var i = 0 ; i < ary.length ; i++) { | |
bit_ary.push(pad0(ary[i], 8, 2)); | |
} | |
var bit_str = bit_ary.join(''); | |
bit_str = pad_align(bit_str, '00000', 6); | |
var encoded_ary = []; | |
for(i = 0 ; i < bit_str.length ; i += 6) { | |
var n = parseInt(bit_str.substr(i, 6), 2); | |
encoded_ary.push(base64_table[n]); | |
} | |
return pad_align(encoded_ary.join(''), '===', 4); | |
} | |
function make_hmac_sha256(str, skey) { | |
HMAC_SHA256_init(skey); | |
HMAC_SHA256_write(str); | |
var mac_ary = HMAC_SHA256_finalize(); // byte array | |
return array_base64(mac_ary); | |
} | |
function make_signed_url(host, baseurl, param, skey) { | |
var param_ary = param.split('&'); | |
var timestamp = 'Timestamp=' + make_timestamp(); | |
param_ary.push(timestamp); | |
var param2 = "GET\n" + host + "\n" + baseurl + "\n" + | |
param_ary.sort().join('&'); | |
return [ | |
'http://', host, baseurl, '?', param, '&', timestamp, '&Signature=', | |
encodeURIComponent(make_hmac_sha256(param2, skey)) | |
].join(''); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment