Skip to content

Instantly share code, notes, and snippets.

@emasaka
Created January 28, 2010 00:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save emasaka/288301 to your computer and use it in GitHub Desktop.
Save emasaka/288301 to your computer and use it in GitHub Desktop.
/*
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