1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/tests/mochitest/crypto/test_getRandomValues.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,212 @@ 1.4 +<!DOCTYPE HTML> 1.5 +<html><head> 1.6 + <title>Test window.crypto.getRandomValues</title> 1.7 + <script type="text/javascript" src="/MochiKit/packed.js"></script> 1.8 + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.9 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 1.10 +</head> 1.11 +<body onload="onWindowLoad()"> 1.12 +<script class="testbody" type="text/javascript"> 1.13 +SimpleTest.waitForExplicitFinish(); 1.14 + 1.15 +var testData = [ { len: 32, type: "Int8", pass: true }, 1.16 + { len: 32, type: "Int16", pass: true }, 1.17 + { len: 32, type: "Int32", pass: true }, 1.18 + { len: 32, type: "Uint8", pass: true }, 1.19 + { len: 32, type: "Uint16", pass: true }, 1.20 + { len: 32, type: "Uint32", pass: true }, 1.21 + { len: 65536, type: "Uint8", pass: true }, 1.22 + { len: 32, type: "Uint8Clamped", pass: true }, 1.23 + { len: 65537, type: "Uint8", pass: false }, 1.24 + { len: 32, type: "Float32", pass: false }, 1.25 + { len: 32, type: "Float64", pass: false } ]; 1.26 + 1.27 + 1.28 +var testCount = 0; 1.29 + 1.30 +function testNsCryptoGetRandomValues(aLength, aType) 1.31 +{ 1.32 + var arrayTypes = { 1.33 + Int8: Int8Array, 1.34 + Int16: Int16Array, 1.35 + Int32: Int32Array, 1.36 + Uint8: Uint8Array, 1.37 + Uint16: Uint16Array, 1.38 + Uint32: Uint32Array, 1.39 + Float32: Float32Array, 1.40 + Float64: Float64Array, 1.41 + Uint8Clamped: Uint8ClampedArray, 1.42 + }; 1.43 + 1.44 + testCount++; 1.45 + 1.46 + var buf = new ArrayBuffer(aLength); 1.47 + var arBuf = new arrayTypes[aType](buf); 1.48 + 1.49 + var pass = false; 1.50 + var b = window.crypto.getRandomValues(arBuf); 1.51 + ok(b === arBuf, "ArrayBuffer result is argument buffer"); 1.52 + 1.53 + for (var i = 0; i < arBuf.length; i++) { 1.54 + if (arBuf.length > 6) { 1.55 + // XXXddahl: THIS MIGHT FAIL EVERY FULL MOON, SORRY QA!!! 1.56 + if (arBuf[i] != 0) { 1.57 + pass = true; 1.58 + break; 1.59 + } 1.60 + } 1.61 + else { 1.62 + pass = true; 1.63 + } 1.64 + } 1.65 + is(pass, true, "Non-zero result: " + i + " found in the " + aType + ": " + aLength + " ArrayBufferView"); 1.66 +} 1.67 + 1.68 +function onWindowLoad() 1.69 +{ 1.70 + window.removeEventListener("load", onWindowLoad, false); 1.71 + var failedWithCorrectError = false; 1.72 + try { 1.73 + for (var i = 0; i < testData.length; i++) { 1.74 + if (testData[i].pass) { 1.75 + try { 1.76 + testNsCryptoGetRandomValues(testData[i].len, testData[i].type, testData[i].pass); 1.77 + } 1.78 + catch (ex) { 1.79 + ok(false, "testNsCryptoGetRandomValues failed, test should have passed: " + testData[i].type); 1.80 + } 1.81 + } 1.82 + else { 1.83 + // failing tests are dealt with here 1.84 + if (i == 8) { 1.85 + try { 1.86 + testNsCryptoGetRandomValues(testData[i].len, testData[i].type, testData[i].pass); 1.87 + } 1.88 + catch (ex) { 1.89 + todo("QuotaExceededError" in window && ex instanceof QuotaExceededError, 1.90 + "Exception was the correct type"); 1.91 + failedWithCorrectError = ex.toString().search(/QUOTA_EXCEEDED_ERR/); 1.92 + ok(failedWithCorrectError, "Extended length array buffer fails, NS_ERROR_DOM_QUOTA_EXCEEDED_ERR thrown"); 1.93 + } 1.94 + } // 8 1.95 + 1.96 + if (i == 9) { 1.97 + try { 1.98 + testNsCryptoGetRandomValues(testData[i].len, testData[i].type, testData[i].pass); 1.99 + } 1.100 + catch (ex) { 1.101 + failedWithCorrectError = ex.toString().search(/TYPE_MISMATCH_ERR/); 1.102 + ok(failedWithCorrectError, 1.103 + "Expected TYPE_MISMATCH_ERR: Float32Array is not valid, got " + ex + "."); 1.104 + } 1.105 + } // 9 1.106 + 1.107 + if (i == 10) { 1.108 + try { 1.109 + testNsCryptoGetRandomValues(testData[i].len, testData[i].type, testData[i].pass); 1.110 + } 1.111 + catch (ex) { 1.112 + failedWithCorrectError = ex.toString().search(/TYPE_MISMATCH_ERR/); 1.113 + ok(failedWithCorrectError, 1.114 + "Expected TYPE_MISMATCH_ERR: Float64Array is not valid, got " + ex + "."); 1.115 + } 1.116 + } 1.117 + } 1.118 + } // end main for loop 1.119 + } 1.120 + catch (ex) { 1.121 + ok(false, "Unexpected Error: " + ex); 1.122 + } 1.123 + // Count the tests in the testData array 1.124 + ok(testCount == 11, "11 tests run via testData"); 1.125 + 1.126 + // Test a null argument 1.127 + try { 1.128 + window.crypto.getRandomValues(null); 1.129 + } 1.130 + catch (ex) { 1.131 + var test = ex.toString().search(/1003|TypeError/); 1.132 + ok((test > -1), "Expected TYPE_ERR, got " + ex + "."); 1.133 + } 1.134 + 1.135 + // Test a zero-length buffer view 1.136 + try { 1.137 + var a = new Int8Array(0); 1.138 + window.crypto.getRandomValues(a); 1.139 + ok(a[0] === undefined, "The array buffer is unchanged, still 0 length"); 1.140 + } 1.141 + catch (ex) { 1.142 + ok(false, "A zero-length array buffer view should not fail"); 1.143 + } 1.144 + 1.145 + // Test a one-length buffer view 1.146 + var randomVal = 0; 1.147 + // The probability of getRandomValues generating a zero value is 1/256 so we 1.148 + // run this in a loop until it returns a non-zero value to guard against 1.149 + // false failures 1.150 + do { 1.151 + try { 1.152 + var a = new Uint8Array(1); 1.153 + var b = window.crypto.getRandomValues(a); 1.154 + randomVal = a[0]; 1.155 + ok(a === b, "ArrayBuffer result is argument buffer"); 1.156 + } 1.157 + catch (ex) { 1.158 + ok(false, "A one-length array buffer view should not fail"); 1.159 + } 1.160 + } 1.161 + while (randomVal == 0); 1.162 + ok(randomVal !== 0, "The array buffer eventually had one random value"); 1.163 + 1.164 + // Test a 16 byte length buffer 1.165 + var testConfig = { len: 16, type: "Int8", pass: true }; 1.166 + testNsCryptoGetRandomValues(testConfig.len, 1.167 + testConfig.type, 1.168 + testConfig.pass); 1.169 + 1.170 + // Test a 31 byte length buffer 1.171 + testConfig = { len: 31, type: "Int8", pass: true }; 1.172 + testNsCryptoGetRandomValues(testConfig.len, 1.173 + testConfig.type, 1.174 + testConfig.pass); 1.175 + 1.176 + // Test a 33 byte length buffer 1.177 + testConfig = { len: 33, type: "Int8", pass: true }; 1.178 + testNsCryptoGetRandomValues(testConfig.len, 1.179 + testConfig.type, 1.180 + testConfig.pass); 1.181 + 1.182 + // Test a range of an array buffer view 1.183 + var buffer = new ArrayBuffer(32); 1.184 + var view = new Int8Array(buffer, 0, 16); 1.185 + var view2 = new Int8Array(buffer, 16, 16); 1.186 + for (var i = 0; i < view2.byteLength; i++) { 1.187 + view2[i] = 1; 1.188 + } 1.189 + var b = window.crypto.getRandomValues(view); 1.190 + ok(b === view, "ArrayBuffer result is argument buffer"); 1.191 + for (var i = 0; i < view.byteLength; i++) { 1.192 + is(view2[i], 1, "view2 is unchanged"); 1.193 + } 1.194 + 1.195 + // test an offset view 1.196 + var result = false; 1.197 + var b = window.crypto.getRandomValues(view2); 1.198 + for (var i = 0; i < view2.length; i++) { 1.199 + if (view2[i] != 1) { 1.200 + result = true; 1.201 + break; 1.202 + } 1.203 + } 1.204 + ok(result, "view2 has been updated correctly"); 1.205 + ok(b === view2, "ArrayBuffer result is argument buffer"); 1.206 + // test the return value 1.207 + buffer = new ArrayBuffer(32); 1.208 + view = new Int8Array(buffer, 0, 16); 1.209 + var retval = window.crypto.getRandomValues(view); 1.210 + ok(view === retval, "The view and return value are the same"); 1.211 + 1.212 + SimpleTest.finish(); 1.213 +} 1.214 +</script> 1.215 +</body></html>