File: subresource_integrity.rs

package info (click to toggle)
thunderbird 1%3A60.9.0-1~deb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,339,492 kB
  • sloc: cpp: 5,457,040; ansic: 2,360,385; python: 596,167; asm: 340,963; java: 326,296; xml: 258,830; sh: 84,445; makefile: 23,705; perl: 17,317; objc: 3,768; yacc: 1,766; ada: 1,681; lex: 1,364; pascal: 1,264; cs: 879; exp: 527; php: 436; lisp: 258; ruby: 153; awk: 152; sed: 53; csh: 27
file content (92 lines) | stat: -rw-r--r-- 3,546 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

use net::subresource_integrity::{SriEntry, get_prioritized_hash_function, get_strongest_metadata};
use net::subresource_integrity::{is_response_integrity_valid, parsed_metadata};
use net_traits::response::{Response, ResponseBody};
use servo_url::ServoUrl;

#[test]
fn test_get_prioritized_hash_function() {
    let mut algorithm = get_prioritized_hash_function("sha256", "sha256");
    assert_eq!(algorithm, None);

    algorithm = get_prioritized_hash_function("sha256", "sha384");
    assert_eq!(algorithm.unwrap(), "sha384");

    algorithm = get_prioritized_hash_function("sha384", "sha512");
    assert_eq!(algorithm.unwrap(), "sha512");
}

#[test]
fn test_parsed_metadata_without_options() {
    let integrity_metadata = "sha384-Hash1";
    let ref parsed_metadata: SriEntry = parsed_metadata(integrity_metadata)[0];

    assert_eq!(parsed_metadata.alg, "sha384");
    assert_eq!(parsed_metadata.val, "Hash1");
    assert!(parsed_metadata.opt.is_none());
}

#[test]
fn test_parsed_metadata_with_options() {
    let integrity_metadata = "sha384-Hash1?opt=23";
    let ref parsed_metadata: SriEntry = parsed_metadata(integrity_metadata)[0];

    assert_eq!(parsed_metadata.alg, "sha384");
    assert_eq!(parsed_metadata.val, "Hash1");
    assert!(parsed_metadata.opt.is_some());
}

#[test]
fn test_parsed_metadata_with_malformed_integrity() {
    let integrity_metadata = "Not a valid integrity";
    let ref parsed_metadata_list: Vec<SriEntry> = parsed_metadata(integrity_metadata);

    assert!(parsed_metadata_list.is_empty());
}

#[test]
fn test_get_strongest_metadata_two_same_algorithm() {
    let integrity_metadata = "sha512-Hash1 sha512-Hash2?opt=23";
    let parsed_metadata_list: Vec<SriEntry> = parsed_metadata(integrity_metadata);

    let strong_metadata: Vec<SriEntry> = get_strongest_metadata(parsed_metadata_list);
    assert_eq!(strong_metadata.len(), 2);
    assert_eq!(strong_metadata[0].alg, strong_metadata[1].alg);
}

#[test]
fn test_get_strongest_metadata_different_algorithm() {
    let integrity_metadata = "sha256-Hash0 sha384-Hash1 sha512-Hash2?opt=23";
    let parsed_metadata_list: Vec<SriEntry> = parsed_metadata(integrity_metadata);

    let strong_metadata: Vec<SriEntry> = get_strongest_metadata(parsed_metadata_list);
    assert_eq!(strong_metadata.len(), 1);
    assert_eq!(strong_metadata[0].alg, "sha512");
}

#[test]
fn test_response_integrity_valid() {
    let url: ServoUrl = ServoUrl::parse("http://servo.org").unwrap();
    let response: Response = Response::new(url);

    let integrity_metadata = "sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO";
    let response_body = "alert('Hello, world.');".to_owned().into_bytes();

    *response.body.lock().unwrap() = ResponseBody::Done(response_body);
    assert!(is_response_integrity_valid(integrity_metadata, &response));
}

#[test]
fn test_response_integrity_invalid() {
    let url: ServoUrl = ServoUrl::parse("http://servo.org").unwrap();
    let response: Response = Response::new(url);

    let integrity_metadata = "sha256-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO";
    let response_body = "alert('Hello, world.');".to_owned().into_bytes();

    *response.body.lock().unwrap() = ResponseBody::Done(response_body);
    assert!(!is_response_integrity_valid(integrity_metadata, &response));
}