Skip to content

Instantly share code, notes, and snippets.

@kinncj
Created July 17, 2015 22:22
Show Gist options
  • Save kinncj/dfa3cd40c48be50cf76b to your computer and use it in GitHub Desktop.
Save kinncj/dfa3cd40c48be50cf76b to your computer and use it in GitHub Desktop.
Pebble OAuth Handler
function hex_sha1(e){return binb2hex(core_sha1(str2binb(e),e.length*chrsz))}function b64_sha1(e){return binb2b64(core_sha1(str2binb(e),e.length*chrsz))}function str_sha1(e){return binb2str(core_sha1(str2binb(e),e.length*chrsz))}function hex_hmac_sha1(e,t){return binb2hex(core_hmac_sha1(e,t))}function b64_hmac_sha1(e,t){return binb2b64(core_hmac_sha1(e,t))}function str_hmac_sha1(e,t){return binb2str(core_hmac_sha1(e,t))}function sha1_vm_test(){return"a9993e364706816aba3e25717850c26c9cd0d89d"==hex_sha1("abc")}function core_sha1(e,t){e[t>>5]|=128<<24-t%32,e[(t+64>>9<<4)+15]=t;for(var r=Array(80),n=1732584193,a=-271733879,o=-1732584194,u=271733878,h=-1009589776,c=0;c<e.length;c+=16){for(var s=n,i=a,f=o,l=u,d=h,A=0;80>A;A++){16>A?r[A]=e[c+A]:r[A]=rol(r[A-3]^r[A-8]^r[A-14]^r[A-16],1);var m=safe_add(safe_add(rol(n,5),sha1_ft(A,a,o,u)),safe_add(safe_add(h,r[A]),sha1_kt(A)));h=u,u=o,o=rol(a,30),a=n,n=m}n=safe_add(n,s),a=safe_add(a,i),o=safe_add(o,f),u=safe_add(u,l),h=safe_add(h,d)}return Array(n,a,o,u,h)}function sha1_ft(e,t,r,n){return 20>e?t&r|~t&n:40>e?t^r^n:60>e?t&r|t&n|r&n:t^r^n}function sha1_kt(e){return 20>e?1518500249:40>e?1859775393:60>e?-1894007588:-899497514}function core_hmac_sha1(e,t){var r=str2binb(e);r.length>16&&(r=core_sha1(r,e.length*chrsz));for(var n=Array(16),a=Array(16),o=0;16>o;o++)n[o]=909522486^r[o],a[o]=1549556828^r[o];var u=core_sha1(n.concat(str2binb(t)),512+t.length*chrsz);return core_sha1(a.concat(u),672)}function safe_add(e,t){var r=(65535&e)+(65535&t),n=(e>>16)+(t>>16)+(r>>16);return n<<16|65535&r}function rol(e,t){return e<<t|e>>>32-t}function str2binb(e){for(var t=Array(),r=(1<<chrsz)-1,n=0;n<e.length*chrsz;n+=chrsz)t[n>>5]|=(e.charCodeAt(n/chrsz)&r)<<24-n%32;return t}function binb2str(e){for(var t="",r=(1<<chrsz)-1,n=0;n<32*e.length;n+=chrsz)t+=String.fromCharCode(e[n>>5]>>>24-n%32&r);return t}function binb2hex(e){for(var t=hexcase?"0123456789ABCDEF":"0123456789abcdef",r="",n=0;n<4*e.length;n++)r+=t.charAt(e[n>>2]>>8*(3-n%4)+4&15)+t.charAt(e[n>>2]>>8*(3-n%4)&15);return r}function binb2b64(e){for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="",n=0;n<4*e.length;n+=3)for(var a=(e[n>>2]>>8*(3-n%4)&255)<<16|(e[n+1>>2]>>8*(3-(n+1)%4)&255)<<8|e[n+2>>2]>>8*(3-(n+2)%4)&255,o=0;4>o;o++)r+=8*n+6*o>32*e.length?b64pad:t.charAt(a>>6*(3-o)&63);return r}var hexcase=0,b64pad="",chrsz=8,OAuth;null==OAuth&&(OAuth={}),OAuth.setProperties=function(e,t){if(null!=e&&null!=t)for(var r in t)e[r]=t[r];return e},OAuth.setProperties(OAuth,{percentEncode:function(e){if(null==e)return"";if(e instanceof Array){for(var t="",r=0;r<e.length;++e)""!=t&&(t+="&"),t+=OAuth.percentEncode(e[r]);return t}return e=encodeURIComponent(e),e=e.replace(/\!/g,"%21"),e=e.replace(/\*/g,"%2A"),e=e.replace(/\'/g,"%27"),e=e.replace(/\(/g,"%28"),e=e.replace(/\)/g,"%29")},decodePercent:function(e){return null!=e&&(e=e.replace(/\+/g," ")),decodeURIComponent(e)},getParameterList:function(e){if(null==e)return[];if("object"!=typeof e)return OAuth.decodeForm(e+"");if(e instanceof Array)return e;var t=[];for(var r in e)t.push([r,e[r]]);return t},getParameterMap:function(e){if(null==e)return{};if("object"!=typeof e)return OAuth.getParameterMap(OAuth.decodeForm(e+""));if(e instanceof Array){for(var t={},r=0;r<e.length;++r){var n=e[r][0];void 0===t[n]&&(t[n]=e[r][1])}return t}return e},getParameter:function(e,t){if(!(e instanceof Array))return OAuth.getParameterMap(e)[t];for(var r=0;r<e.length;++r)if(e[r][0]==t)return e[r][1];return null},formEncode:function(e){for(var t="",r=OAuth.getParameterList(e),n=0;n<r.length;++n){var a=r[n][1];null==a&&(a=""),""!=t&&(t+="&"),t+=OAuth.percentEncode(r[n][0])+"="+OAuth.percentEncode(a)}return t},decodeForm:function(e){for(var t=[],r=e.split("&"),n=0;n<r.length;++n){var a=r[n];if(""!=a){var o,u,h=a.indexOf("=");0>h?(o=OAuth.decodePercent(a),u=null):(o=OAuth.decodePercent(a.substring(0,h)),u=OAuth.decodePercent(a.substring(h+1))),t.push([o,u])}}return t},setParameter:function(e,t,r){var n=e.parameters;if(n instanceof Array){for(var a=0;a<n.length;++a)n[a][0]==t&&(void 0===r?n.splice(a,1):(n[a][1]=r,r=void 0));void 0!==r&&n.push([t,r])}else n=OAuth.getParameterMap(n),n[t]=r,e.parameters=n},setParameters:function(e,t){for(var r=OAuth.getParameterList(t),n=0;n<r.length;++n)OAuth.setParameter(e,r[n][0],r[n][1])},completeRequest:function(e,t){null==e.method&&(e.method="GET");var r=OAuth.getParameterMap(e.parameters);null==r.oauth_consumer_key&&OAuth.setParameter(e,"oauth_consumer_key",t.consumerKey||""),null==r.oauth_token&&null!=t.token&&OAuth.setParameter(e,"oauth_token",t.token),null==r.oauth_version&&OAuth.setParameter(e,"oauth_version","1.0"),null==r.oauth_timestamp&&OAuth.setParameter(e,"oauth_timestamp",OAuth.timestamp()),null==r.oauth_nonce&&OAuth.setParameter(e,"oauth_nonce",OAuth.nonce(6)),OAuth.SignatureMethod.sign(e,t)},setTimestampAndNonce:function(e){OAuth.setParameter(e,"oauth_timestamp",OAuth.timestamp()),OAuth.setParameter(e,"oauth_nonce",OAuth.nonce(6))},addToURL:function(e,t){if(newURL=e,null!=t){var r=OAuth.formEncode(t);if(r.length>0){var n=e.indexOf("?");0>n?newURL+="?":newURL+="&",newURL+=r}}return newURL},getAuthorizationHeader:function(e,t){for(var r='OAuth realm="'+OAuth.percentEncode(e)+'"',n=OAuth.getParameterList(t),a=0;a<n.length;++a){var o=n[a],u=o[0];0==u.indexOf("oauth_")&&(r+=","+OAuth.percentEncode(u)+'="'+OAuth.percentEncode(o[1])+'"')}return r},correctTimestampFromSrc:function(e){e=e||"oauth_timestamp";var t=document.getElementsByTagName("script");if(null!=t&&t.length){var r=t[t.length-1].src;if(r){var n=r.indexOf("?");if(!(0>n)){parameters=OAuth.getParameterMap(OAuth.decodeForm(r.substring(n+1)));var a=parameters[e];null!=a&&OAuth.correctTimestamp(a)}}}},correctTimestamp:function(e){OAuth.timeCorrectionMsec=1e3*e-(new Date).getTime()},timeCorrectionMsec:0,timestamp:function(){var e=(new Date).getTime()+OAuth.timeCorrectionMsec;return Math.floor(e/1e3)},nonce:function(e){for(var t=OAuth.nonce.CHARS,r="",n=0;e>n;++n){var a=Math.floor(Math.random()*t.length);r+=t.substring(a,a+1)}return r}}),OAuth.nonce.CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz",OAuth.declareClass=function(e,t,r){var n=e[t];if(e[t]=r,null!=r&&null!=n)for(var a in n)"prototype"!=a&&(r[a]=n[a]);return r},OAuth.declareClass(OAuth,"SignatureMethod",function(){}),OAuth.setProperties(OAuth.SignatureMethod.prototype,{sign:function(e){var t=OAuth.SignatureMethod.getBaseString(e),r=this.getSignature(t);return OAuth.setParameter(e,"oauth_signature",r),r},initialize:function(e,t){var r;r=null!=t.accessorSecret&&e.length>9&&"-Accessor"==e.substring(e.length-9)?t.accessorSecret:t.consumerSecret,this.key=OAuth.percentEncode(r)+"&"+OAuth.percentEncode(t.tokenSecret)}}),OAuth.setProperties(OAuth.SignatureMethod,{sign:function(e,t){var r=OAuth.getParameterMap(e.parameters).oauth_signature_method;(null==r||""==r)&&(r="HMAC-SHA1",OAuth.setParameter(e,"oauth_signature_method",r)),OAuth.SignatureMethod.newMethod(r,t).sign(e)},newMethod:function(e,t){var r=OAuth.SignatureMethod.REGISTERED[e];if(null!=r){var n=new r;return n.initialize(e,t),n}var a=new Error("signature_method_rejected"),o="";for(var u in OAuth.SignatureMethod.REGISTERED)""!=o&&(o+="&"),o+=OAuth.percentEncode(u);throw a.oauth_acceptable_signature_methods=o,a},REGISTERED:{},registerMethodClass:function(e,t){for(var r=0;r<e.length;++r)OAuth.SignatureMethod.REGISTERED[e[r]]=t},makeSubclass:function(e){var t=OAuth.SignatureMethod,r=function(){t.call(this)};return r.prototype=new t,r.prototype.getSignature=e,r.prototype.constructor=r,r},getBaseString:function(e){var t,r=e.action,n=r.indexOf("?");if(0>n)t=e.parameters;else{t=OAuth.decodeForm(r.substring(n+1));for(var a=OAuth.getParameterList(e.parameters),o=0;o<a.length;++o)t.push(a[o])}return OAuth.percentEncode(e.method.toUpperCase())+"&"+OAuth.percentEncode(OAuth.SignatureMethod.normalizeUrl(r))+"&"+OAuth.percentEncode(OAuth.SignatureMethod.normalizeParameters(t))},normalizeUrl:function(e){var t=OAuth.SignatureMethod.parseUri(e),r=t.protocol.toLowerCase(),n=t.authority.toLowerCase(),a="http"==r&&80==t.port||"https"==r&&443==t.port;if(a){var o=n.lastIndexOf(":");o>=0&&(n=n.substring(0,o))}var u=t.path;return u||(u="/"),r+"://"+n+u},parseUri:function(e){for(var t={key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/}},r=t.parser.strict.exec(e),n={},a=14;a--;)n[t.key[a]]=r[a]||"";return n},normalizeParameters:function(e){if(null==e)return"";for(var t=OAuth.getParameterList(e),r=[],n=0;n<t.length;++n){var a=t[n];"oauth_signature"!=a[0]&&r.push([OAuth.percentEncode(a[0])+" "+OAuth.percentEncode(a[1]),a])}r.sort(function(e,t){return e[0]<t[0]?-1:e[0]>t[0]?1:0});for(var o=[],u=0;u<r.length;++u)o.push(r[u][1]);return OAuth.formEncode(o)}}),OAuth.SignatureMethod.registerMethodClass(["PLAINTEXT","PLAINTEXT-Accessor"],OAuth.SignatureMethod.makeSubclass(function(e){return this.key})),OAuth.SignatureMethod.registerMethodClass(["HMAC-SHA1","HMAC-SHA1-Accessor"],OAuth.SignatureMethod.makeSubclass(function(e){b64pad="=";var t=b64_hmac_sha1(this.key,e);return t}));try{OAuth.correctTimestampFromSrc()}catch(e){}module.exports=OAuth;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment