aes.js

slowAES algorithm implementation

このスクリプトは単体で利用できません。右のようなメタデータを含むスクリプトから、ライブラリとして読み込まれます: // @require https://update.greatest.deepsurf.us/scripts/13883/86931/aesjs.js

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
  1. /*
  2. * aes.js: implements AES - Advanced Encryption Standard
  3. * from the SlowAES project, http://code.google.com/p/slowaes/
  4. *
  5. * Copyright (c) 2008 Josh Davis ( http://www.josh-davis.org ),
  6. * Mark Percival ( http://mpercival.com ),
  7. *
  8. * Ported from C code written by Laurent Haan ( http://www.progressive-coding.com )
  9. *
  10. * Licensed under the Apache License, Version 2.0
  11. * http://www.apache.org/licenses/
  12. */
  13.  
  14. var slowAES = {
  15. /*
  16. * START AES SECTION
  17. */
  18. aes:{
  19. // structure of valid key sizes
  20. keySize:{
  21. SIZE_128:16,
  22. SIZE_192:24,
  23. SIZE_256:32
  24. },
  25. // Rijndael S-box
  26. sbox:[
  27. 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
  28. 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
  29. 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
  30. 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
  31. 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
  32. 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
  33. 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
  34. 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
  35. 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
  36. 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
  37. 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
  38. 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
  39. 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
  40. 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
  41. 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
  42. 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ],
  43. // Rijndael Inverted S-box
  44. rsbox:
  45. [ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
  46. , 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
  47. , 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
  48. , 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
  49. , 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
  50. , 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
  51. , 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
  52. , 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
  53. , 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
  54. , 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
  55. , 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
  56. , 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
  57. , 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
  58. , 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
  59. , 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
  60. , 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d ],
  61. /* rotate the word eight bits to the left */
  62. rotate:function(word)
  63. {
  64. var c = word[0];
  65. for (var i = 0; i < 3; i++)
  66. word[i] = word[i+1];
  67. word[3] = c;
  68. return word;
  69. },
  70. // Rijndael Rcon
  71. Rcon:[
  72. 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
  73. 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
  74. 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
  75. 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d,
  76. 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab,
  77. 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
  78. 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25,
  79. 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01,
  80. 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
  81. 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa,
  82. 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a,
  83. 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
  84. 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
  85. 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,
  86. 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
  87. 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
  88. 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f,
  89. 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
  90. 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33,
  91. 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb ],
  92.  
  93. G2X: [
  94. 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16,
  95. 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e,
  96. 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x46,
  97. 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e,
  98. 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76,
  99. 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e,
  100. 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa4, 0xa6,
  101. 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe,
  102. 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6,
  103. 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee,
  104. 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, 0x1b, 0x19, 0x1f, 0x1d,
  105. 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05,
  106. 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d,
  107. 0x23, 0x21, 0x27, 0x25, 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55,
  108. 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45, 0x7b, 0x79, 0x7f, 0x7d,
  109. 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65,
  110. 0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d,
  111. 0x83, 0x81, 0x87, 0x85, 0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5,
  112. 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, 0xdb, 0xd9, 0xdf, 0xdd,
  113. 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5,
  114. 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed,
  115. 0xe3, 0xe1, 0xe7, 0xe5
  116. ],
  117.  
  118. G3X: [
  119. 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d,
  120. 0x14, 0x17, 0x12, 0x11, 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39,
  121. 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, 0x60, 0x63, 0x66, 0x65,
  122. 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71,
  123. 0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d,
  124. 0x44, 0x47, 0x42, 0x41, 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9,
  125. 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, 0xf0, 0xf3, 0xf6, 0xf5,
  126. 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1,
  127. 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd,
  128. 0xb4, 0xb7, 0xb2, 0xb1, 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99,
  129. 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, 0x9b, 0x98, 0x9d, 0x9e,
  130. 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a,
  131. 0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6,
  132. 0xbf, 0xbc, 0xb9, 0xba, 0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2,
  133. 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea, 0xcb, 0xc8, 0xcd, 0xce,
  134. 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda,
  135. 0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46,
  136. 0x4f, 0x4c, 0x49, 0x4a, 0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62,
  137. 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, 0x3b, 0x38, 0x3d, 0x3e,
  138. 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a,
  139. 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16,
  140. 0x1f, 0x1c, 0x19, 0x1a
  141. ],
  142.  
  143. G9X: [
  144. 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53,
  145. 0x6c, 0x65, 0x7e, 0x77, 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf,
  146. 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, 0x3b, 0x32, 0x29, 0x20,
  147. 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c,
  148. 0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8,
  149. 0xc7, 0xce, 0xd5, 0xdc, 0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49,
  150. 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, 0xe6, 0xef, 0xf4, 0xfd,
  151. 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91,
  152. 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e,
  153. 0x21, 0x28, 0x33, 0x3a, 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2,
  154. 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, 0xec, 0xe5, 0xfe, 0xf7,
  155. 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b,
  156. 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f,
  157. 0x10, 0x19, 0x02, 0x0b, 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8,
  158. 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, 0x47, 0x4e, 0x55, 0x5c,
  159. 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30,
  160. 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9,
  161. 0xf6, 0xff, 0xe4, 0xed, 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35,
  162. 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, 0xa1, 0xa8, 0xb3, 0xba,
  163. 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6,
  164. 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62,
  165. 0x5d, 0x54, 0x4f, 0x46
  166. ],
  167.  
  168. GBX: [
  169. 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45,
  170. 0x74, 0x7f, 0x62, 0x69, 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81,
  171. 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, 0x7b, 0x70, 0x6d, 0x66,
  172. 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12,
  173. 0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e,
  174. 0xbf, 0xb4, 0xa9, 0xa2, 0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7,
  175. 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, 0x46, 0x4d, 0x50, 0x5b,
  176. 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f,
  177. 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8,
  178. 0xf9, 0xf2, 0xef, 0xe4, 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c,
  179. 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, 0xf7, 0xfc, 0xe1, 0xea,
  180. 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e,
  181. 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02,
  182. 0x33, 0x38, 0x25, 0x2e, 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd,
  183. 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, 0x3c, 0x37, 0x2a, 0x21,
  184. 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55,
  185. 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44,
  186. 0x75, 0x7e, 0x63, 0x68, 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80,
  187. 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, 0x7a, 0x71, 0x6c, 0x67,
  188. 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13,
  189. 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f,
  190. 0xbe, 0xb5, 0xa8, 0xa3
  191. ],
  192.  
  193. GDX: [
  194. 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f,
  195. 0x5c, 0x51, 0x46, 0x4b, 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3,
  196. 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, 0xbb, 0xb6, 0xa1, 0xac,
  197. 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0,
  198. 0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14,
  199. 0x37, 0x3a, 0x2d, 0x20, 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e,
  200. 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, 0xbd, 0xb0, 0xa7, 0xaa,
  201. 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6,
  202. 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9,
  203. 0x8a, 0x87, 0x90, 0x9d, 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25,
  204. 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, 0xda, 0xd7, 0xc0, 0xcd,
  205. 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91,
  206. 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75,
  207. 0x56, 0x5b, 0x4c, 0x41, 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42,
  208. 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, 0xb1, 0xbc, 0xab, 0xa6,
  209. 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa,
  210. 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8,
  211. 0xeb, 0xe6, 0xf1, 0xfc, 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44,
  212. 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, 0x0c, 0x01, 0x16, 0x1b,
  213. 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47,
  214. 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3,
  215. 0x80, 0x8d, 0x9a, 0x97
  216. ],
  217.  
  218. GEX: [
  219. 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62,
  220. 0x48, 0x46, 0x54, 0x5a, 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca,
  221. 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, 0xdb, 0xd5, 0xc7, 0xc9,
  222. 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81,
  223. 0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59,
  224. 0x73, 0x7d, 0x6f, 0x61, 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87,
  225. 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, 0x4d, 0x43, 0x51, 0x5f,
  226. 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17,
  227. 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14,
  228. 0x3e, 0x30, 0x22, 0x2c, 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc,
  229. 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, 0x41, 0x4f, 0x5d, 0x53,
  230. 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b,
  231. 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3,
  232. 0xe9, 0xe7, 0xf5, 0xfb, 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0,
  233. 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, 0x7a, 0x74, 0x66, 0x68,
  234. 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20,
  235. 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e,
  236. 0xa4, 0xaa, 0xb8, 0xb6, 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26,
  237. 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, 0x37, 0x39, 0x2b, 0x25,
  238. 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d,
  239. 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5,
  240. 0x9f, 0x91, 0x83, 0x8d
  241. ],
  242. // Key Schedule Core
  243. core:function(word,iteration)
  244. {
  245. /* rotate the 32-bit word 8 bits to the left */
  246. word = this.rotate(word);
  247. /* apply S-Box substitution on all 4 parts of the 32-bit word */
  248. for (var i = 0; i < 4; ++i)
  249. word[i] = this.sbox[word[i]];
  250. /* XOR the output of the rcon operation with i to the first part (leftmost) only */
  251. word[0] = word[0]^this.Rcon[iteration];
  252. return word;
  253. },
  254. /* Rijndael's key expansion
  255. * expands an 128,192,256 key into an 176,208,240 bytes key
  256. *
  257. * expandedKey is a pointer to an char array of large enough size
  258. * key is a pointer to a non-expanded key
  259. */
  260. expandKey:function(key,size)
  261. {
  262. var expandedKeySize = (16*(this.numberOfRounds(size)+1));
  263. /* current expanded keySize, in bytes */
  264. var currentSize = 0;
  265. var rconIteration = 1;
  266. var t = []; // temporary 4-byte variable
  267. var expandedKey = [];
  268. for(var i = 0;i < expandedKeySize;i++)
  269. expandedKey[i] = 0;
  270. /* set the 16,24,32 bytes of the expanded key to the input key */
  271. for (var j = 0; j < size; j++)
  272. expandedKey[j] = key[j];
  273. currentSize += size;
  274. while (currentSize < expandedKeySize)
  275. {
  276. /* assign the previous 4 bytes to the temporary value t */
  277. for (var k = 0; k < 4; k++)
  278. t[k] = expandedKey[(currentSize - 4) + k];
  279. /* every 16,24,32 bytes we apply the core schedule to t
  280. * and increment rconIteration afterwards
  281. */
  282. if(currentSize % size == 0)
  283. t = this.core(t, rconIteration++);
  284. /* For 256-bit keys, we add an extra sbox to the calculation */
  285. if(size == this.keySize.SIZE_256 && ((currentSize % size) == 16))
  286. for(var l = 0; l < 4; l++)
  287. t[l] = this.sbox[t[l]];
  288. /* We XOR t with the four-byte block 16,24,32 bytes before the new expanded key.
  289. * This becomes the next four bytes in the expanded key.
  290. */
  291. for(var m = 0; m < 4; m++) {
  292. expandedKey[currentSize] = expandedKey[currentSize - size] ^ t[m];
  293. currentSize++;
  294. }
  295. }
  296. return expandedKey;
  297. },
  298. // Adds (XORs) the round key to the state
  299. addRoundKey:function(state,roundKey)
  300. {
  301. for (var i = 0; i < 16; i++)
  302. state[i] ^= roundKey[i];
  303. return state;
  304. },
  305. // Creates a round key from the given expanded key and the
  306. // position within the expanded key.
  307. createRoundKey:function(expandedKey,roundKeyPointer)
  308. {
  309. var roundKey = [];
  310. for (var i = 0; i < 4; i++)
  311. for (var j = 0; j < 4; j++)
  312. roundKey[j*4+i] = expandedKey[roundKeyPointer + i*4 + j];
  313. return roundKey;
  314. },
  315. /* substitute all the values from the state with the value in the SBox
  316. * using the state value as index for the SBox
  317. */
  318. subBytes:function(state,isInv)
  319. {
  320. for (var i = 0; i < 16; i++)
  321. state[i] = isInv?this.rsbox[state[i]]:this.sbox[state[i]];
  322. return state;
  323. },
  324. /* iterate over the 4 rows and call shiftRow() with that row */
  325. shiftRows:function(state,isInv)
  326. {
  327. for (var i = 0; i < 4; i++)
  328. state = this.shiftRow(state,i*4, i,isInv);
  329. return state;
  330. },
  331. /* each iteration shifts the row to the left by 1 */
  332. shiftRow:function(state,statePointer,nbr,isInv)
  333. {
  334. for (var i = 0; i < nbr; i++)
  335. {
  336. if(isInv)
  337. {
  338. var tmp = state[statePointer + 3];
  339. for (var j = 3; j > 0; j--)
  340. state[statePointer + j] = state[statePointer + j-1];
  341. state[statePointer] = tmp;
  342. }
  343. else
  344. {
  345. var tmp = state[statePointer];
  346. for (var j = 0; j < 3; j++)
  347. state[statePointer + j] = state[statePointer + j+1];
  348. state[statePointer + 3] = tmp;
  349. }
  350. }
  351. return state;
  352. },
  353.  
  354. // galois multiplication of 8 bit characters a and b
  355. galois_multiplication:function(a,b)
  356. {
  357. var p = 0;
  358. for(var counter = 0; counter < 8; counter++)
  359. {
  360. if((b & 1) == 1)
  361. p ^= a;
  362. if(p > 0x100) p ^= 0x100;
  363. var hi_bit_set = (a & 0x80); //keep p 8 bit
  364. a <<= 1;
  365. if(a > 0x100) a ^= 0x100; //keep a 8 bit
  366. if(hi_bit_set == 0x80)
  367. a ^= 0x1b;
  368. if(a > 0x100) a ^= 0x100; //keep a 8 bit
  369. b >>= 1;
  370. if(b > 0x100) b ^= 0x100; //keep b 8 bit
  371. }
  372. return p;
  373. },
  374. // galois multipication of the 4x4 matrix
  375. mixColumns:function(state,isInv)
  376. {
  377. var column = [];
  378. /* iterate over the 4 columns */
  379. for (var i = 0; i < 4; i++)
  380. {
  381. /* construct one column by iterating over the 4 rows */
  382. for (var j = 0; j < 4; j++)
  383. column[j] = state[(j*4)+i];
  384. /* apply the mixColumn on one column */
  385. column = this.mixColumn(column,isInv);
  386. /* put the values back into the state */
  387. for (var k = 0; k < 4; k++)
  388. state[(k*4)+i] = column[k];
  389. }
  390. return state;
  391. },
  392.  
  393. // galois multipication of 1 column of the 4x4 matrix
  394. mixColumn:function(column,isInv)
  395. {
  396. var mult = [];
  397. if(isInv)
  398. mult = [14,9,13,11];
  399. else
  400. mult = [2,1,1,3];
  401. var cpy = [];
  402. for(var i = 0; i < 4; i++)
  403. cpy[i] = column[i];
  404. column[0] = this.galois_multiplication(cpy[0],mult[0]) ^
  405. this.galois_multiplication(cpy[3],mult[1]) ^
  406. this.galois_multiplication(cpy[2],mult[2]) ^
  407. this.galois_multiplication(cpy[1],mult[3]);
  408. column[1] = this.galois_multiplication(cpy[1],mult[0]) ^
  409. this.galois_multiplication(cpy[0],mult[1]) ^
  410. this.galois_multiplication(cpy[3],mult[2]) ^
  411. this.galois_multiplication(cpy[2],mult[3]);
  412. column[2] = this.galois_multiplication(cpy[2],mult[0]) ^
  413. this.galois_multiplication(cpy[1],mult[1]) ^
  414. this.galois_multiplication(cpy[0],mult[2]) ^
  415. this.galois_multiplication(cpy[3],mult[3]);
  416. column[3] = this.galois_multiplication(cpy[3],mult[0]) ^
  417. this.galois_multiplication(cpy[2],mult[1]) ^
  418. this.galois_multiplication(cpy[1],mult[2]) ^
  419. this.galois_multiplication(cpy[0],mult[3]);
  420. return column;
  421. },
  422. // applies the 4 operations of the forward round in sequence
  423. round:function(state, roundKey)
  424. {
  425. state = this.subBytes(state,false);
  426. state = this.shiftRows(state,false);
  427. state = this.mixColumns(state,false);
  428. state = this.addRoundKey(state, roundKey);
  429. return state;
  430. },
  431. // applies the 4 operations of the inverse round in sequence
  432. invRound:function(state,roundKey)
  433. {
  434. state = this.shiftRows(state,true);
  435. state = this.subBytes(state,true);
  436. state = this.addRoundKey(state, roundKey);
  437. state = this.mixColumns(state,true);
  438. return state;
  439. },
  440. /*
  441. * Perform the initial operations, the standard round, and the final operations
  442. * of the forward aes, creating a round key for each round
  443. */
  444. main:function(state,expandedKey,nbrRounds)
  445. {
  446. state = this.addRoundKey(state, this.createRoundKey(expandedKey,0));
  447. for (var i = 1; i < nbrRounds; i++)
  448. state = this.round(state, this.createRoundKey(expandedKey,16*i));
  449. state = this.subBytes(state,false);
  450. state = this.shiftRows(state,false);
  451. state = this.addRoundKey(state, this.createRoundKey(expandedKey,16*nbrRounds));
  452. return state;
  453. },
  454. /*
  455. * Perform the initial operations, the standard round, and the final operations
  456. * of the inverse aes, creating a round key for each round
  457. */
  458. invMain:function(state, expandedKey, nbrRounds)
  459. {
  460. state = this.addRoundKey(state, this.createRoundKey(expandedKey,16*nbrRounds));
  461. for (var i = nbrRounds-1; i > 0; i--)
  462. state = this.invRound(state, this.createRoundKey(expandedKey,16*i));
  463. state = this.shiftRows(state,true);
  464. state = this.subBytes(state,true);
  465. state = this.addRoundKey(state, this.createRoundKey(expandedKey,0));
  466. return state;
  467. },
  468.  
  469. numberOfRounds:function(size)
  470. {
  471. var nbrRounds;
  472. switch (size) /* set the number of rounds */
  473. {
  474. case this.keySize.SIZE_128:
  475. nbrRounds = 10;
  476. break;
  477. case this.keySize.SIZE_192:
  478. nbrRounds = 12;
  479. break;
  480. case this.keySize.SIZE_256:
  481. nbrRounds = 14;
  482. break;
  483. default:
  484. return null;
  485. break;
  486. }
  487. return nbrRounds;
  488. },
  489. // encrypts a 128 bit input block against the given key of size specified
  490. encrypt:function(input,key,size)
  491. {
  492. var output = [];
  493. var block = []; /* the 128 bit block to encode */
  494. var nbrRounds = this.numberOfRounds(size);
  495. /* Set the block values, for the block:
  496. * a0,0 a0,1 a0,2 a0,3
  497. * a1,0 a1,1 a1,2 a1,3
  498. * a2,0 a2,1 a2,2 a2,3
  499. * a3,0 a3,1 a3,2 a3,3
  500. * the mapping order is a0,0 a1,0 a2,0 a3,0 a0,1 a1,1 ... a2,3 a3,3
  501. */
  502. for (var i = 0; i < 4; i++) /* iterate over the columns */
  503. for (var j = 0; j < 4; j++) /* iterate over the rows */
  504. block[(i+(j*4))] = input[(i*4)+j];
  505. /* expand the key into an 176, 208, 240 bytes key */
  506. var expandedKey = this.expandKey(key, size); /* the expanded key */
  507. /* encrypt the block using the expandedKey */
  508. block = this.main(block, expandedKey, nbrRounds);
  509. for (var k = 0; k < 4; k++) /* unmap the block again into the output */
  510. for (var l = 0; l < 4; l++) /* iterate over the rows */
  511. output[(k*4)+l] = block[(k+(l*4))];
  512. return output;
  513. },
  514. // decrypts a 128 bit input block against the given key of size specified
  515. decrypt:function(input, key, size)
  516. {
  517. var output = [];
  518. var block = []; /* the 128 bit block to decode */
  519. var nbrRounds = this.numberOfRounds(size);
  520. /* Set the block values, for the block:
  521. * a0,0 a0,1 a0,2 a0,3
  522. * a1,0 a1,1 a1,2 a1,3
  523. * a2,0 a2,1 a2,2 a2,3
  524. * a3,0 a3,1 a3,2 a3,3
  525. * the mapping order is a0,0 a1,0 a2,0 a3,0 a0,1 a1,1 ... a2,3 a3,3
  526. */
  527. for (var i = 0; i < 4; i++) /* iterate over the columns */
  528. for (var j = 0; j < 4; j++) /* iterate over the rows */
  529. block[(i+(j*4))] = input[(i*4)+j];
  530. /* expand the key into an 176, 208, 240 bytes key */
  531. var expandedKey = this.expandKey(key, size);
  532. /* decrypt the block using the expandedKey */
  533. block = this.invMain(block, expandedKey, nbrRounds);
  534. for (var k = 0; k < 4; k++)/* unmap the block again into the output */
  535. for (var l = 0; l < 4; l++)/* iterate over the rows */
  536. output[(k*4)+l] = block[(k+(l*4))];
  537. return output;
  538. }
  539. },
  540. /*
  541. * END AES SECTION
  542. */
  543. /*
  544. * START MODE OF OPERATION SECTION
  545. */
  546. //structure of supported modes of operation
  547. modeOfOperation:{
  548. OFB:0,
  549. CFB:1,
  550. CBC:2
  551. },
  552. // get a 16 byte block (aes operates on 128bits)
  553. getBlock: function(bytesIn,start,end,mode)
  554. {
  555. if(end - start > 16)
  556. end = start + 16;
  557. return bytesIn.slice(start, end);
  558. },
  559. /*
  560. * Mode of Operation Encryption
  561. * bytesIn - Input String as array of bytes
  562. * mode - mode of type modeOfOperation
  563. * key - a number array of length 'size'
  564. * size - the bit length of the key
  565. * iv - the 128 bit number array Initialization Vector
  566. */
  567. encrypt: function (bytesIn, mode, key, iv)
  568. {
  569. var size = key.length;
  570. if(iv.length%16)
  571. {
  572. throw 'iv length must be 128 bits.';
  573. }
  574. // the AES input/output
  575. var byteArray = [];
  576. var input = [];
  577. var output = [];
  578. var ciphertext = [];
  579. var cipherOut = [];
  580. // char firstRound
  581. var firstRound = true;
  582. if (mode == this.modeOfOperation.CBC)
  583. this.padBytesIn(bytesIn);
  584. if (bytesIn !== null)
  585. {
  586. for (var j = 0;j < Math.ceil(bytesIn.length/16); j++)
  587. {
  588. var start = j*16;
  589. var end = j*16+16;
  590. if(j*16+16 > bytesIn.length)
  591. end = bytesIn.length;
  592. byteArray = this.getBlock(bytesIn,start,end,mode);
  593. if (mode == this.modeOfOperation.CFB)
  594. {
  595. if (firstRound)
  596. {
  597. output = this.aes.encrypt(iv, key, size);
  598. firstRound = false;
  599. }
  600. else
  601. output = this.aes.encrypt(input, key, size);
  602. for (var i = 0; i < 16; i++)
  603. ciphertext[i] = byteArray[i] ^ output[i];
  604. for(var k = 0;k < end-start;k++)
  605. cipherOut.push(ciphertext[k]);
  606. input = ciphertext;
  607. }
  608. else if (mode == this.modeOfOperation.OFB)
  609. {
  610. if (firstRound)
  611. {
  612. output = this.aes.encrypt(iv, key, size);
  613. firstRound = false;
  614. }
  615. else
  616. output = this.aes.encrypt(input, key, size);
  617. for (var i = 0; i < 16; i++)
  618. ciphertext[i] = byteArray[i] ^ output[i];
  619. for(var k = 0;k < end-start;k++)
  620. cipherOut.push(ciphertext[k]);
  621. input = output;
  622. }
  623. else if (mode == this.modeOfOperation.CBC)
  624. {
  625. for (var i = 0; i < 16; i++)
  626. input[i] = byteArray[i] ^ ((firstRound) ? iv[i] : ciphertext[i]);
  627. firstRound = false;
  628. ciphertext = this.aes.encrypt(input, key, size);
  629. // always 16 bytes because of the padding for CBC
  630. for(var k = 0;k < 16;k++)
  631. cipherOut.push(ciphertext[k]);
  632. }
  633. }
  634. }
  635. return cipherOut;
  636. },
  637. /*
  638. * Mode of Operation Decryption
  639. * cipherIn - Encrypted String as array of bytes
  640. * originalsize - The unencrypted string length - required for CBC
  641. * mode - mode of type modeOfOperation
  642. * key - a number array of length 'size'
  643. * size - the bit length of the key
  644. * iv - the 128 bit number array Initialization Vector
  645. */
  646. decrypt:function(cipherIn,mode,key,iv)
  647. {
  648. var size = key.length;
  649. if(iv.length%16)
  650. {
  651. throw 'iv length must be 128 bits.';
  652. }
  653. // the AES input/output
  654. var ciphertext = [];
  655. var input = [];
  656. var output = [];
  657. var byteArray = [];
  658. var bytesOut = [];
  659. // char firstRound
  660. var firstRound = true;
  661. if (cipherIn !== null)
  662. {
  663. for (var j = 0;j < Math.ceil(cipherIn.length/16); j++)
  664. {
  665. var start = j*16;
  666. var end = j*16+16;
  667. if(j*16+16 > cipherIn.length)
  668. end = cipherIn.length;
  669. ciphertext = this.getBlock(cipherIn,start,end,mode);
  670. if (mode == this.modeOfOperation.CFB)
  671. {
  672. if (firstRound)
  673. {
  674. output = this.aes.encrypt(iv, key, size);
  675. firstRound = false;
  676. }
  677. else
  678. output = this.aes.encrypt(input, key, size);
  679. for (i = 0; i < 16; i++)
  680. byteArray[i] = output[i] ^ ciphertext[i];
  681. for(var k = 0;k < end-start;k++)
  682. bytesOut.push(byteArray[k]);
  683. input = ciphertext;
  684. }
  685. else if (mode == this.modeOfOperation.OFB)
  686. {
  687. if (firstRound)
  688. {
  689. output = this.aes.encrypt(iv, key, size);
  690. firstRound = false;
  691. }
  692. else
  693. output = this.aes.encrypt(input, key, size);
  694. for (i = 0; i < 16; i++)
  695. byteArray[i] = output[i] ^ ciphertext[i];
  696. for(var k = 0;k < end-start;k++)
  697. bytesOut.push(byteArray[k]);
  698. input = output;
  699. }
  700. else if(mode == this.modeOfOperation.CBC)
  701. {
  702. output = this.aes.decrypt(ciphertext, key, size);
  703. for (i = 0; i < 16; i++)
  704. byteArray[i] = ((firstRound) ? iv[i] : input[i]) ^ output[i];
  705. firstRound = false;
  706. for(var k = 0;k < end-start;k++)
  707. bytesOut.push(byteArray[k]);
  708. input = ciphertext;
  709. }
  710. }
  711. if(mode == this.modeOfOperation.CBC)
  712. this.unpadBytesOut(bytesOut);
  713. }
  714. return bytesOut;
  715. },
  716. padBytesIn: function(data) {
  717. var len = data.length;
  718. var padByte = 16 - (len % 16);
  719. for (var i = 0; i < padByte; i++) {
  720. data.push(padByte);
  721. }
  722. },
  723. unpadBytesOut: function(data) {
  724. var padCount = 0;
  725. var padByte = -1;
  726. var blockSize = 16;
  727. for (var i = data.length - 1; i >= data.length-1 - blockSize; i--) {
  728. if (data[i] <= blockSize) {
  729. if (padByte == -1)
  730. padByte = data[i];
  731. if (data[i] != padByte) {
  732. padCount = 0;
  733. break;
  734. }
  735. padCount++;
  736. } else
  737. break;
  738. if (padCount == padByte)
  739. break;
  740. }
  741. if (padCount > 0)
  742. data.splice(data.length - padCount, padCount);
  743. }
  744. /*
  745. * END MODE OF OPERATION SECTION
  746. */
  747. };