server-initiated.window.js (5052B)
1 // META: script=/common/get-host-info.sub.js 2 // META: script=helper.js 3 4 // The following tests verify server-initiated integrity checks which validate 5 // signatures even in the absence of integrity metadata asserted by the client. 6 7 // A canonically validly signed response, generated using the steps at 8 // https://wicg.github.io/signature-based-sri/#examples, relying on the test 9 // key from https://www.rfc-editor.org/rfc/rfc9421.html#name-example-ed25519-test-key: 10 // 11 // ``` 12 // NOTE: '\' line wrapping per RFC 8792 13 // 14 // HTTP/1.1 200 OK 15 // Date: Tue, 20 Apr 2021 02:07:56 GMT 16 // Content-Type: application/json 17 // Unencoded-Digest: sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=: 18 // Content-Length: 18 19 // Signature-Input: signature=("unencoded-digest";sf); \ 20 // keyid="JrQLj5P/89iXES9+vFgrIy29clF9CC/oPPsw3c5D0bs="; \ 21 // tag="sri" 22 // Signature: signature=:TUznBT2ikFq6VrtoZeC5znRtZugu1U8OHJWoBkOLDTJA2FglSR34Q \ 23 // Y9j+BwN79PT4H0p8aIosnv4rXSKfIZVDA==: 24 // 25 // {"hello": "world"} 26 // ``` 27 28 // Valid metadata from the response above: 29 const kRequestWithValidSignature = { 30 body: `{"hello": "world"}`, 31 digest: `sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:`, 32 signature: `signature=:gHim9e5Pk2H7c9BStOmxSmkyc8+ioZgoxynu3d4INAT4dwfj5LhvaV9DFnEQ9p7C0hzW4o4Qpkm5aApd6WLLCw==:`, 33 signatureInput: `signature=("unencoded-digest";sf);keyid="${kValidKeys['rfc']}";tag="sri"` 34 }; 35 generate_fetch_test(kRequestWithValidSignature, 36 {}, 37 EXPECT_LOADED, 38 "Valid signature, same-origin: loads."); 39 generate_fetch_test(kRequestWithValidSignature, 40 { 41 origin: get_host_info().REMOTE_ORIGIN, 42 mode: "cors", 43 }, 44 EXPECT_BLOCKED, 45 "Valid signature, cross-origin w/o cors, cors: blocked (because of CORS)."); 46 47 // Valid metadata for a response sending CORS headers: 48 const kRequestWithValidSignatureAndCORS = { 49 body: kRequestWithValidSignature['body'], 50 digest: kRequestWithValidSignature['digest'], 51 signature: kRequestWithValidSignature['signature'], 52 signatureInput: kRequestWithValidSignature['signatureInput'], 53 cors: true, 54 }; 55 generate_fetch_test(kRequestWithValidSignatureAndCORS, 56 {}, 57 EXPECT_LOADED, 58 "Valid signature, same-origin w/ cors: loads."); 59 generate_fetch_test(kRequestWithValidSignatureAndCORS, 60 { 61 origin: get_host_info().REMOTE_ORIGIN, 62 mode: "cors", 63 }, 64 EXPECT_LOADED, 65 "Valid signature, cross-origin w/cors, mode: cors: loads."); 66 67 // Incorrect signature, no cors: 68 const kRequestWithInvalidSignature = { 69 body: kRequestWithValidSignature['body'], 70 digest: kRequestWithValidSignature['digest'], 71 signature: `signature=:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==:`, 72 signatureInput: kRequestWithValidSignature['signatureInput'], 73 }; 74 generate_fetch_test(kRequestWithInvalidSignature, 75 {}, 76 EXPECT_BLOCKED, 77 "Invalid signature, same-origin: blocked."); 78 generate_fetch_test(kRequestWithInvalidSignature, 79 { 80 origin: get_host_info().REMOTE_ORIGIN, 81 mode: "no-cors", 82 }, 83 EXPECT_BLOCKED, 84 "Invalid signature, cross-origin w/o cors, mode: no-cors: blocked."); 85 generate_fetch_test(kRequestWithInvalidSignature, 86 { 87 origin: get_host_info().REMOTE_ORIGIN, 88 mode: "cors", 89 }, 90 EXPECT_BLOCKED, 91 "Invalid signature, cross-origin w/o cors, cors: blocked."); 92 93 // Incorrect signature, cors: 94 const kRequestWithInvalidSignatureAndCORS = { 95 body: kRequestWithValidSignature['body'], 96 digest: kRequestWithValidSignature['digest'], 97 signature: kRequestWithInvalidSignature['signature'], 98 signatureInput: kRequestWithValidSignature['signatureInput'], 99 cors: true, 100 }; 101 generate_fetch_test(kRequestWithInvalidSignatureAndCORS, 102 {}, 103 EXPECT_BLOCKED, 104 "Invalid signature, same-origin w/ cors: blocked."); 105 generate_fetch_test(kRequestWithInvalidSignatureAndCORS, 106 { 107 origin: get_host_info().REMOTE_ORIGIN, 108 mode: "no-cors", 109 }, 110 EXPECT_BLOCKED, 111 "Invalid signature, cross-origin w/ cors, mode: no-cors: blocked."); 112 generate_fetch_test(kRequestWithInvalidSignatureAndCORS, 113 { 114 origin: get_host_info().REMOTE_ORIGIN, 115 mode: "cors", 116 }, 117 EXPECT_BLOCKED, 118 "Invalid signature, cross-origin w/ cors, mode: cors: blocked.");