authtoken.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /****************************************************************
  2. ** Licensed Materials - Property of IBM
  3. ** IBM Cognos Products: CAMCrypto
  4. ** (C) Copyright IBM Corp. 2005, 2019
  5. ** US Government Users Restricted Rights - Use, duplication or
  6. ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. ********************************************************************/
  8. // CAMAuthenticityTokenSession
  9. // Operations supporting the generation of an Authenticity Token. See
  10. // WO2385 - Client Token Phase One
  11. function CAMAuthenticityTokenSession() {
  12. // Note: no return statement here
  13. };
  14. CAMAuthenticityTokenSession.prototype.generate = function()
  15. {
  16. var cookieString = this._getCookie();
  17. if( !cookieString ){
  18. return null;
  19. }
  20. var authToken_version = "V1";
  21. // base64 decode content revealing the UserSessionID token.
  22. base64 = new Base64();
  23. var token = base64.decode64( cookieString );
  24. // Get Token Version.
  25. // var version = token.substring( 0, 1 );
  26. var version = token.charCodeAt( 0 ) & 0xFF;
  27. // Extract timelen.
  28. var szTimelen = token.substring( 1, 5 ); // timelength
  29. var timelen = this._intFromBytes( szTimelen );
  30. // Find the length of the user session id.
  31. var uidlenstart = 5 + timelen;
  32. var uidlenstop = uidlenstart + 4;
  33. var szuidlen = token.substring( uidlenstart, uidlenstop );
  34. var uidlen = this._intFromBytes( szuidlen );
  35. // Extract the string for the usersessionid.
  36. var uidstart = uidlenstop;
  37. var uidstop = uidstart + uidlen;
  38. var uid = token.substring( uidstart, uidstop );
  39. // In a version 1 USID token we only need the userSessionID. In version 2+
  40. // extract the string for the algorithm. Position to the beginning of digest
  41. // algorithm length, ignore csk value.
  42. var cskIdLenStart = uidstop; // cskidlen
  43. var cskIdLenStop = cskIdLenStart + 4;
  44. var szcskIdLen = token.substring( cskIdLenStart, cskIdLenStop );
  45. var cskIdLen = this._intFromBytes( szcskIdLen );
  46. var cskidstart = cskIdLenStop; // cskid
  47. var cskidstop = cskidstart + cskIdLen;
  48. var digLenStart;
  49. if ( version >= 2 ) {
  50. var digAlgLenStart = cskidstop; // digAlgLen
  51. var digAlgLenStop = digAlgLenStart + 4;
  52. var szdigAlgLen = token.substring( digAlgLenStart, digAlgLenStop );
  53. var digAlgLen = this._intFromBytes( szdigAlgLen );
  54. var digAlgStart = digAlgLenStop; // digAlg
  55. var digAlgStop = digAlgStart + digAlgLen;
  56. var szDigAlg = token.substring( digAlgStart, digAlgStop );
  57. // Now that we have a value for the algorithm, ensure that it is valid.
  58. // alternatively we could let the issue be logged on the server.
  59. if (! ( szDigAlg in { 'SHA':'', 'SHA-1':'', 'SHA1':'', 'SHA-256':'', 'SHA-384':'', 'SHA-512':'' } )) {
  60. return "bad digest algorithm";
  61. }
  62. digLenStart = digAlgStop; // diglen
  63. } else { // version 1
  64. digLenStart = cskidstop; // diglen
  65. }
  66. var digLenStop = digLenStart + 4;
  67. var szdigLen = token.substring( digLenStart, digLenStop );
  68. var digLen = this._intFromBytes( szdigLen, 0, 4 );
  69. var digStart = digLenStop; // dig
  70. var digStop = digStart + digLen;
  71. var dig = token.substring( digStart, digStop );
  72. var authToken = authToken_version + dig;
  73. // Base64 encode.
  74. b64 = new Base64();
  75. var b64Token = b64.encode64( authToken );
  76. // return b64Token;
  77. return b64Token;
  78. };
  79. CAMAuthenticityTokenSession.prototype._getCookie = function()
  80. {
  81. var cookies = document.cookie.split(';');
  82. if( !cookies || !cookies.length){
  83. return null;
  84. }
  85. var cookieName = 'usersessionid=';
  86. for(var i=0; i<cookies.length; i++){
  87. var item = cookies[i].trim();
  88. if( item.indexOf(cookieName) === 0){
  89. var cookieVal = item.substring( cookieName.length);
  90. return cookieVal;
  91. };
  92. };
  93. return null;
  94. }
  95. CAMAuthenticityTokenSession.prototype._intFromBytes = function( bytes ) {
  96. var val = 0;
  97. for(var i=3; i>=0; i-- ) {
  98. val <<= 8;
  99. val |= (bytes.charCodeAt(i) & 0x00FF);
  100. }
  101. return val;
  102. }