api-console-assets
Version:
This repo only exists to publish api console components to npm
313 lines • 201 kB
HTML
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"> <style>
.KEYW {color: #933;}
.COMM {color: #bbb; font-style: italic;}
.NUMB {color: #393;}
.STRN {color: #393;}
.REGX {color: #339;}
.line {border-right: 1px dotted #666; color: #666; font-style: normal;}
</style></head><body><pre><span class='line'> 1</span> <span class="COMM">/* jws-3.3.10 (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
<span class='line'> 2</span> */</span><span class="WHIT">
<span class='line'> 3</span> </span><span class="COMM">/*
<span class='line'> 4</span> * jws.js - JSON Web Signature(JWS) and JSON Web Token(JWT) Class
<span class='line'> 5</span> *
<span class='line'> 6</span> * Copyright (c) 2010-2017 Kenji Urushima (kenji.urushima@gmail.com)
<span class='line'> 7</span> *
<span class='line'> 8</span> * This software is licensed under the terms of the MIT License.
<span class='line'> 9</span> * https://kjur.github.io/jsrsasign/license/
<span class='line'> 10</span> *
<span class='line'> 11</span> * The above copyright and license notice shall be
<span class='line'> 12</span> * included in all copies or substantial portions of the Software.
<span class='line'> 13</span> */</span><span class="WHIT">
<span class='line'> 14</span>
<span class='line'> 15</span> </span><span class="COMM">/**
<span class='line'> 16</span> * @fileOverview
<span class='line'> 17</span> * @name jws-3.3.js
<span class='line'> 18</span> * @author Kenji Urushima kenji.urushima@gmail.com
<span class='line'> 19</span> * @version jsrsasign 8.0.3 jws 3.3.10 (2017-Jul-11)
<span class='line'> 20</span> * @since jsjws 1.0, jsrsasign 4.8.0
<span class='line'> 21</span> * @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
<span class='line'> 22</span> */</span><span class="WHIT">
<span class='line'> 23</span>
<span class='line'> 24</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">KJUR</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">KJUR</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">KJUR</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 25</span>
<span class='line'> 26</span> </span><span class="COMM">/**
<span class='line'> 27</span> * kjur's JSON Web Signature/Token(JWS/JWT) library name space
<span class='line'> 28</span> * <p>
<span class='line'> 29</span> * This namespace privides following JWS/JWS related classes.
<span class='line'> 30</span> * <ul>
<span class='line'> 31</span> * <li>{@link KJUR.jws.JWS} - JSON Web Signature/Token(JWS/JWT) class</li>
<span class='line'> 32</span> * <li>{@link KJUR.jws.JWSJS} - JWS JSON Serialization(JWSJS) class</li>
<span class='line'> 33</span> * <li>{@link KJUR.jws.IntDate} - UNIX origin time utility class</li>
<span class='line'> 34</span> * </ul>
<span class='line'> 35</span> * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2.
<span class='line'> 36</span> * </p>
<span class='line'> 37</span> * @name KJUR.jws
<span class='line'> 38</span> * @namespace
<span class='line'> 39</span> */</span><span class="WHIT">
<span class='line'> 40</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">KJUR.jws</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">KJUR.jws</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">KJUR.jws</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 41</span>
<span class='line'> 42</span> </span><span class="COMM">/**
<span class='line'> 43</span> * JSON Web Signature(JWS) class.<br/>
<span class='line'> 44</span> * @name KJUR.jws.JWS
<span class='line'> 45</span> * @class JSON Web Signature(JWS) class
<span class='line'> 46</span> * @see <a href="https://kjur.github.io/jsjws/">'jwjws'(JWS JavaScript Library) home page https://kjur.github.io/jsjws/</a>
<span class='line'> 47</span> * @see <a href="https://kjur.github.io/jsrsasigns/">'jwrsasign'(RSA Sign JavaScript Library) home page https://kjur.github.io/jsrsasign/</a>
<span class='line'> 48</span> * @see <a href="http://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-14">IETF I-D JSON Web Algorithms (JWA)</a>
<span class='line'> 49</span> * @since jsjws 1.0
<span class='line'> 50</span> * @description
<span class='line'> 51</span> * This class provides JSON Web Signature(JWS)/JSON Web Token(JWT) signing and validation.
<span class='line'> 52</span> *
<span class='line'> 53</span> * <h4>METHOD SUMMARY</h4>
<span class='line'> 54</span> * Here is major methods of {@link KJUR.jws.JWS} class.
<span class='line'> 55</span> * <ul>
<span class='line'> 56</span> * <li><b>SIGN</b><br/>
<span class='line'> 57</span> * <li>{@link KJUR.jws.JWS.sign} - sign JWS</li>
<span class='line'> 58</span> * </li>
<span class='line'> 59</span> * <li><b>VERIFY</b><br/>
<span class='line'> 60</span> * <li>{@link KJUR.jws.JWS.verify} - verify JWS signature</li>
<span class='line'> 61</span> * <li>{@link KJUR.jws.JWS.verifyJWT} - verify properties of JWT token at specified time</li>
<span class='line'> 62</span> * </li>
<span class='line'> 63</span> * <li><b>UTILITY</b><br/>
<span class='line'> 64</span> * <li>{@link KJUR.jws.JWS.getJWKthumbprint} - get RFC 7638 JWK thumbprint</li>
<span class='line'> 65</span> * <li>{@link KJUR.jws.JWS.isSafeJSONString} - check whether safe JSON string or not</li>
<span class='line'> 66</span> * <li>{@link KJUR.jws.JWS.readSafeJSONString} - read safe JSON string only</li>
<span class='line'> 67</span> * </li>
<span class='line'> 68</span> * </ul>
<span class='line'> 69</span> *
<span class='line'> 70</span> * <h4>SUPPORTED SIGNATURE ALGORITHMS</h4>
<span class='line'> 71</span> * Here is supported algorithm names for {@link KJUR.jws.JWS.sign} and
<span class='line'> 72</span> * {@link KJUR.jws.JWS.verify} methods.
<span class='line'> 73</span> * <table>
<span class='line'> 74</span> * <tr><th>alg value</th><th>spec requirement</th><th>jsjws support</th></tr>
<span class='line'> 75</span> * <tr><td>HS256</td><td>REQUIRED</td><td>SUPPORTED</td></tr>
<span class='line'> 76</span> * <tr><td>HS384</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'> 77</span> * <tr><td>HS512</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'> 78</span> * <tr><td>RS256</td><td>RECOMMENDED</td><td>SUPPORTED</td></tr>
<span class='line'> 79</span> * <tr><td>RS384</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'> 80</span> * <tr><td>RS512</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'> 81</span> * <tr><td>ES256</td><td>RECOMMENDED+</td><td>SUPPORTED</td></tr>
<span class='line'> 82</span> * <tr><td>ES384</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'> 83</span> * <tr><td>ES512</td><td>OPTIONAL</td><td>-</td></tr>
<span class='line'> 84</span> * <tr><td>PS256</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'> 85</span> * <tr><td>PS384</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'> 86</span> * <tr><td>PS512</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'> 87</span> * <tr><td>none</td><td>REQUIRED</td><td>SUPPORTED(signature generation only)</td></tr>
<span class='line'> 88</span> * </table>
<span class='line'> 89</span> * <dl>
<span class='line'> 90</span> * <dt><b>NOTE1</b>
<span class='line'> 91</span> * <dd>HS384 is supported since jsjws 3.0.2 with jsrsasign 4.1.4.
<span class='line'> 92</span> * <dt><b>NOTE2</b>
<span class='line'> 93</span> * <dd>Some deprecated methods have been removed since jws 3.3 of jsrsasign 4.10.0.
<span class='line'> 94</span> * Removed methods are following:
<span class='line'> 95</span> * <ul>
<span class='line'> 96</span> * <li>JWS.verifyJWSByNE</li>
<span class='line'> 97</span> * <li>JWS.verifyJWSByKey</li>
<span class='line'> 98</span> * <li>JWS.generateJWSByNED</li>
<span class='line'> 99</span> * <li>JWS.generateJWSByKey</li>
<span class='line'>100</span> * <li>JWS.generateJWSByP1PrvKey</li>
<span class='line'>101</span> * </ul>
<span class='line'>102</span> * </dl>
<span class='line'>103</span> * <b>EXAMPLE</b><br/>
<span class='line'>104</span> * @example
<span class='line'>105</span> * // JWS signing
<span class='line'>106</span> * sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {"utf8": "password"});
<span class='line'>107</span> * // JWS validation
<span class='line'>108</span> * isValid = KJUR.jws.JWS.verify('eyJjdHkiOiJKV1QiLCJhbGc...', {"utf8": "password"});
<span class='line'>109</span> * // JWT validation
<span class='line'>110</span> * isValid = KJUR.jws.JWS.verifyJWT('eyJh...', {"utf8": "password"}, {
<span class='line'>111</span> * alg: ['HS256', 'HS384'],
<span class='line'>112</span> * iss: ['http://foo.com']
<span class='line'>113</span> * });
<span class='line'>114</span> */</span><span class="WHIT">
<span class='line'>115</span> </span><span class="NAME">KJUR.jws.JWS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>116</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_KJUR</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">KJUR</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>117</span> </span><span class="WHIT"> </span><span class="NAME">_KJUR_jws_JWS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR.jws.JWS</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>118</span> </span><span class="WHIT"> </span><span class="NAME">_isSafeJSONString</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR_jws_JWS.isSafeJSONString</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>119</span>
<span class='line'>120</span> </span><span class="WHIT"> </span><span class="COMM">// === utility =============================================================</span><span class="WHIT">
<span class='line'>121</span>
<span class='line'>122</span> </span><span class="WHIT"> </span><span class="COMM">/**
<span class='line'>123</span> * parse JWS string and set public property 'parsedJWS' dictionary.<br/>
<span class='line'>124</span> * @name parseJWS
<span class='line'>125</span> * @memberOf KJUR.jws.JWS
<span class='line'>126</span> * @function
<span class='line'>127</span> * @param {String} sJWS JWS signature string to be parsed.
<span class='line'>128</span> * @throws if sJWS is not comma separated string such like "Header.Payload.Signature".
<span class='line'>129</span> * @throws if JWS Header is a malformed JSON string.
<span class='line'>130</span> * @since jws 1.1
<span class='line'>131</span> */</span><span class="WHIT">
<span class='line'>132</span> </span><span class="WHIT"> </span><span class="NAME">this.parseJWS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">sJWS</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">sigValNotNeeded</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>133</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">this.parsedJWS</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
<span class='line'>134</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">sigValNotNeeded</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.parsedJWS.sigvalH</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>135</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>136</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>137</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">matchResult</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">sJWS.match</span><span class="PUNC">(</span><span class="REGX">/^([^.]+)\.([^.]+)\.([^.]+)$/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>138</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">matchResult</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>139</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">"JWS signature is not a form of 'Head.Payload.SigValue'."</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>140</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>141</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b6Head</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matchResult</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>142</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b6Payload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matchResult</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>143</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b6SigVal</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matchResult</span><span class="PUNC">[</span><span class="NUMB">3</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>144</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">sSI</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b6Head</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"."</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">b6Payload</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>145</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>146</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS.headB64U</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b6Head</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>147</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS.payloadB64U</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b6Payload</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>148</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS.sigvalB64U</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b6SigVal</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>149</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS.si</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">sSI</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>150</span>
<span class='line'>151</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">sigValNotNeeded</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>152</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hSigVal</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b64utohex</span><span class="PUNC">(</span><span class="NAME">b6SigVal</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>153</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">biSigVal</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">parseBigInt</span><span class="PUNC">(</span><span class="NAME">hSigVal</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">16</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>154</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS.sigvalH</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">hSigVal</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>155</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS.sigvalBI</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">biSigVal</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>156</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>157</span>
<span class='line'>158</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">sHead</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b64utoutf8</span><span class="PUNC">(</span><span class="NAME">b6Head</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>159</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">sPayload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b64utoutf8</span><span class="PUNC">(</span><span class="NAME">b6Payload</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>160</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS.headS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">sHead</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>161</span> </span><span class="WHIT"> </span><span class="NAME">this.parsedJWS.payloadS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">sPayload</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>162</span>
<span class='line'>163</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="WHIT"> </span><span class="NAME">_isSafeJSONString</span><span class="PUNC">(</span><span class="NAME">sHead</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.parsedJWS</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'headP'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>164</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">"malformed JSON string for JWS Head: "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">sHead</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>165</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>166</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>167</span>
<span class='line'>168</span> </span><span class="COMM">// === major static method ========================================================</span><span class="WHIT">
<span class='line'>169</span>
<span class='line'>170</span> </span><span class="COMM">/**
<span class='line'>171</span> * generate JWS signature by specified key<br/>
<span class='line'>172</span> * @name sign
<span class='line'>173</span> * @memberOf KJUR.jws.JWS
<span class='line'>174</span> * @function
<span class='line'>175</span> * @static
<span class='line'>176</span> * @param {String} alg JWS algorithm name to sign and force set to sHead or null
<span class='line'>177</span> * @param {String} spHead string or object of JWS Header
<span class='line'>178</span> * @param {String} spPayload string or object of JWS Payload
<span class='line'>179</span> * @param {String} key string of private key or mac key object to sign
<span class='line'>180</span> * @param {String} pass (OPTION)passcode to use encrypted asymmetric private key
<span class='line'>181</span> * @return {String} JWS signature string
<span class='line'>182</span> * @since jws 3.0.0
<span class='line'>183</span> * @see <a href="https://kjur.github.io/jsrsasign/api/symbols/KJUR.crypto.Signature.html">jsrsasign KJUR.crypto.Signature method</a>
<span class='line'>184</span> * @see <a href="https://kjur.github.io/jsrsasign/api/symbols/KJUR.crypto.Mac.html">jsrsasign KJUR.crypto.Mac method</a>
<span class='line'>185</span> * @description
<span class='line'>186</span> * This method supports following algorithms.
<span class='line'>187</span> * <table>
<span class='line'>188</span> * <tr><th>alg value</th><th>spec requirement</th><th>jsjws support</th></tr>
<span class='line'>189</span> * <tr><td>HS256</td><td>REQUIRED</td><td>SUPPORTED</td></tr>
<span class='line'>190</span> * <tr><td>HS384</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'>191</span> * <tr><td>HS512</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'>192</span> * <tr><td>RS256</td><td>RECOMMENDED</td><td>SUPPORTED</td></tr>
<span class='line'>193</span> * <tr><td>RS384</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'>194</span> * <tr><td>RS512</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'>195</span> * <tr><td>ES256</td><td>RECOMMENDED+</td><td>SUPPORTED</td></tr>
<span class='line'>196</span> * <tr><td>ES384</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'>197</span> * <tr><td>ES512</td><td>OPTIONAL</td><td>-</td></tr>
<span class='line'>198</span> * <tr><td>PS256</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'>199</span> * <tr><td>PS384</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'>200</span> * <tr><td>PS512</td><td>OPTIONAL</td><td>SUPPORTED</td></tr>
<span class='line'>201</span> * <tr><td>none</td><td>REQUIRED</td><td>SUPPORTED(signature generation only)</td></tr>
<span class='line'>202</span> * </table>
<span class='line'>203</span> * <dl>
<span class='line'>204</span> * <dt>NOTE1:
<span class='line'>205</span> * <dd>salt length of RSAPSS signature is the same as the hash algorithm length
<span class='line'>206</span> * because of <a href="http://www.ietf.org/mail-archive/web/jose/current/msg02901.html">IETF JOSE ML discussion</a>.
<span class='line'>207</span> * <dt>NOTE2:
<span class='line'>208</span> * <dd>To support HS384, patched version of CryptoJS is used.
<span class='line'>209</span> * <a href="https://code.google.com/p/crypto-js/issues/detail?id=84">See here for detail</a>.
<span class='line'>210</span> * <dt>NOTE3:
<span class='line'>211</span> * From jsrsasign 4.10.0 jws 3.3.0, Way to provide password
<span class='line'>212</span> * for HS* algorithm is changed. The 'key' attribute value is
<span class='line'>213</span> * passed to {@link KJUR.crypto.Mac.setPassword} so please see
<span class='line'>214</span> * {@link KJUR.crypto.Mac.setPassword} for detail.
<span class='line'>215</span> * As for backword compatibility, if key is a string, has even length and
<span class='line'>216</span> * 0..9, A-F or a-f characters, key string is treated as a hexadecimal
<span class='line'>217</span> * otherwise it is treated as a raw string.
<span class='line'>218</span> * <dd>
<span class='line'>219</span> * </dl>
<span class='line'>220</span> * <b>EXAMPLE</b><br/>
<span class='line'>221</span> * @example
<span class='line'>222</span> * // sign HS256 signature with password "aaa" implicitly handled as string
<span class='line'>223</span> * sJWS = KJUR.jws.JWS.sign(null, {alg: "HS256", cty: "JWT"}, {age: 21}, "aaa");
<span class='line'>224</span> * // sign HS256 signature with password "6161" implicitly handled as hex
<span class='line'>225</span> * sJWS = KJUR.jws.JWS.sign(null, {alg: "HS256", cty: "JWT"}, {age: 21}, "6161");
<span class='line'>226</span> * // sign HS256 signature with base64 password
<span class='line'>227</span> * sJWS = KJUR.jws.JWS.sign(null, {alg: "HS256"}, {age: 21}, {b64: "Mi/8..a="});
<span class='line'>228</span> * // sign RS256 signature with PKCS#8 PEM RSA private key
<span class='line'>229</span> * sJWS = KJUR.jws.JWS.sign(null, {alg: "RS256"}, {age: 21}, "-----BEGIN PRIVATE KEY...");
<span class='line'>230</span> * // sign RS256 signature with PKCS#8 PEM ECC private key with passcode
<span class='line'>231</span> * sJWS = KJUR.jws.JWS.sign(null, {alg: "ES256"}, {age: 21},
<span class='line'>232</span> * "-----BEGIN PRIVATE KEY...", "keypass");
<span class='line'>233</span> * // header and payload can be passed by both string and object
<span class='line'>234</span> * sJWS = KJUR.jws.JWS.sign(null, '{alg:"HS256",cty:"JWT"}', '{age:21}', "aaa");
<span class='line'>235</span> */</span><span class="WHIT">
<span class='line'>236</span> </span><span class="NAME">KJUR.jws.JWS.sign</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">alg</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">spHeader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">spPayload</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">key</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">pass</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>237</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_KJUR</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">KJUR</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>238</span> </span><span class="WHIT"> </span><span class="NAME">_KJUR_jws</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR.jws</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>239</span> </span><span class="WHIT"> </span><span class="NAME">_KJUR_jws_JWS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR_jws.JWS</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>240</span> </span><span class="WHIT"> </span><span class="NAME">_readSafeJSONString</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR_jws_JWS.readSafeJSONString</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>241</span> </span><span class="WHIT"> </span><span class="NAME">_isSafeJSONString</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR_jws_JWS.isSafeJSONString</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>242</span> </span><span class="WHIT"> </span><span class="NAME">_KJUR_crypto</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR.crypto</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>243</span> </span><span class="WHIT"> </span><span class="NAME">_ECDSA</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR_crypto.ECDSA</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>244</span> </span><span class="WHIT"> </span><span class="NAME">_Mac</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR_crypto.Mac</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>245</span> </span><span class="WHIT"> </span><span class="NAME">_Signature</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR_crypto.Signature</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>246</span> </span><span class="WHIT"> </span><span class="NAME">_JSON</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">JSON</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>247</span>
<span class='line'>248</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">sHeader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">pHeader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">sPayload</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>249</span>
<span class='line'>250</span> </span><span class="WHIT"> </span><span class="COMM">// 1. check signatureInput(Header, Payload) is string or object</span><span class="WHIT">
<span class='line'>251</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">spHeader</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">spHeader</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>252</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">"spHeader must be JSON string or object: "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">spHeader</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>253</span>
<span class='line'>254</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">spHeader</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>255</span> </span><span class="WHIT"> </span><span class="NAME">pHeader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">spHeader</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>256</span> </span><span class="WHIT"> </span><span class="NAME">sHeader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_JSON.stringify</span><span class="PUNC">(</span><span class="NAME">pHeader</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>257</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>258</span>
<span class='line'>259</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">spHeader</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'string'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>260</span> </span><span class="WHIT"> </span><span class="NAME">sHeader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">spHeader</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>261</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="WHIT"> </span><span class="NAME">_isSafeJSONString</span><span class="PUNC">(</span><span class="NAME">sHeader</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>262</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">"JWS Head is not safe JSON string: "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">sHeader</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>263</span> </span><span class="WHIT"> </span><span class="NAME">pHeader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_readSafeJSONString</span><span class="PUNC">(</span><span class="NAME">sHeader</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>264</span>
<span class='line'>265</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>266</span>
<span class='line'>267</span> </span><span class="WHIT"> </span><span class="NAME">sPayload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">spPayload</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>268</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">spPayload</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'object'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">sPayload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_JSON.stringify</span><span class="PUNC">(</span><span class="NAME">spPayload</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>269</span>
<span class='line'>270</span> </span><span class="WHIT"> </span><span class="COMM">// 2. use alg if defined in sHeader</span><span class="WHIT">
<span class='line'>271</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">alg</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">''</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">alg</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
<span class='line'>272</span> </span><span class="WHIT"> </span><span class="NAME">pHeader</span><span class="PUNC">[</span><span class="STRN">'alg'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>273</span> </span><span class="WHIT"> </span><span class="NAME">alg</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">pHeader</span><span class="PUNC">[</span><span class="STRN">'alg'</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>274</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>275</span>
<span class='line'>276</span> </span><span class="WHIT"> </span><span class="COMM">// 3. update sHeader to add alg if alg undefined</span><span class="WHIT">
<span class='line'>277</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">alg</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">''</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">alg</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
<span class='line'>278</span> </span><span class="WHIT"> </span><span class="NAME">pHeader</span><span class="PUNC">[</span><span class="STRN">'alg'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>279</span> </span><span class="WHIT"> </span><span class="NAME">pHeader</span><span class="PUNC">[</span><span class="STRN">'alg'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">alg</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>280</span> </span><span class="WHIT"> </span><span class="NAME">sHeader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_JSON.stringify</span><span class="PUNC">(</span><span class="NAME">pHeader</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>281</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>282</span>
<span class='line'>283</span> </span><span class="WHIT"> </span><span class="COMM">// 4. check explicit algorithm doesn't match with JWS header.</span><span class="WHIT">
<span class='line'>284</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">alg</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">pHeader.alg</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>285</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">"alg and sHeader.alg doesn't match: "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">alg</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"!="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">pHeader.alg</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>286</span>
<span class='line'>287</span> </span><span class="WHIT"> </span><span class="COMM">// 5. set signature algorithm like SHA1withRSA</span><span class="WHIT">
<span class='line'>288</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">sigAlg</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>289</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_KJUR_jws_JWS.jwsalg2sigalg</span><span class="PUNC">[</span><span class="NAME">alg</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>290</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">"unsupported alg name: "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">alg</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>291</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>292</span> </span><span class="WHIT"> </span><span class="NAME">sigAlg</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_KJUR_jws_JWS.jwsalg2sigalg</span><span class="PUNC">[</span><span class="NAME">alg</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>293</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>294</span> </span><span class="WHIT">
<span class='line'>295</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">uHeader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">utf8tob64u</span><span class="PUNC">(</span><span class="NAME">sHeader</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>296</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">uPayload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">utf8tob64u</span><span class="PUNC">(</span><span class="NAME">sPayload</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>297</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">uSignatureInput</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">uHeader</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"."</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">uPayload</span><span class="WHIT">
<span class='line'>298</span> </span><span class="WHIT"> </span><span class="COMM">// 6. sign</span><span class="WHIT">
<span class='line'>299</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hSig</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>300</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">sigAlg.substr</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"Hmac"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>301</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">key</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>302</span> </span><span class="WHIT"> </span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="STRN">"mac key shall be specified for HS* alg"</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>303</span> </span><span class="WHIT"> </span><span class="COMM">//alert("sigAlg=" + sigAlg);</span><span class="WHIT">
<span class='line'>304</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">mac</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">_Mac</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">'alg'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">sigAlg</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'prov'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'cryptojs'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'pass'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">key</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>305</span> </span><span class="WHIT"> </span><span class="NAME">mac.updateString</span><span class="PUNC">(</span><span class="NAME">uSignatureInput</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>306</span> </span><span class="WHIT"> </span><span class="NAME">hSig</sp