blob: 94f97d59f18b76bdaeae7c917a2ce1b70e0dc81e [file] [log] [blame]
Alex Gaynorf312a5c2013-08-10 15:23:38 -04001# Licensed under the Apache License, Version 2.0 (the "License");
2# you may not use this file except in compliance with the License.
3# You may obtain a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS,
9# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
10# implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
Donald Stufft9e1a48b2013-08-09 00:32:30 -040014import os.path
15
16
Paul Kehrerf7f6a9f2013-11-11 20:43:52 -060017def load_vectors_from_file(filename, loader):
18 base = os.path.join(
19 os.path.dirname(__file__), "hazmat", "primitives", "vectors",
20 )
21 with open(os.path.join(base, filename), "r") as vector_file:
22 return loader(vector_file)
23
24
Alex Gaynord3ce7032013-11-11 14:46:20 -080025def load_nist_vectors(vector_data):
Paul Kehrer749ac5b2013-11-18 18:12:41 -060026 test_data = None
27 data = []
Donald Stufft9e1a48b2013-08-09 00:32:30 -040028
29 for line in vector_data:
30 line = line.strip()
31
Paul Kehrer749ac5b2013-11-18 18:12:41 -060032 # Blank lines, comments, and section headers are ignored
33 if not line or line.startswith("#") or (line.startswith("[")
34 and line.endswith("]")):
Alex Gaynor521c42d2013-11-11 14:25:59 -080035 continue
36
Paul Kehrera43b6692013-11-12 15:35:49 -060037 if line.strip() == "FAIL":
Paul Kehrer749ac5b2013-11-18 18:12:41 -060038 test_data["fail"] = True
Paul Kehrera43b6692013-11-12 15:35:49 -060039 continue
40
Donald Stufft9e1a48b2013-08-09 00:32:30 -040041 # Build our data using a simple Key = Value format
Paul Kehrera43b6692013-11-12 15:35:49 -060042 name, value = [c.strip() for c in line.split("=")]
Donald Stufft9e1a48b2013-08-09 00:32:30 -040043
44 # COUNT is a special token that indicates a new block of data
45 if name.upper() == "COUNT":
Paul Kehrer749ac5b2013-11-18 18:12:41 -060046 test_data = {}
47 data.append(test_data)
48 continue
Donald Stufft9e1a48b2013-08-09 00:32:30 -040049 # For all other tokens we simply want the name, value stored in
50 # the dictionary
51 else:
Paul Kehrer749ac5b2013-11-18 18:12:41 -060052 test_data[name.lower()] = value.encode("ascii")
Donald Stufft9e1a48b2013-08-09 00:32:30 -040053
Paul Kehrer749ac5b2013-11-18 18:12:41 -060054 return data
Donald Stufft9e1a48b2013-08-09 00:32:30 -040055
56
Paul Kehrer1951bf62013-09-15 12:05:43 -050057def load_cryptrec_vectors(vector_data):
Paul Kehrere5805982013-09-27 11:26:01 -050058 cryptrec_list = []
Paul Kehrer1951bf62013-09-15 12:05:43 -050059
60 for line in vector_data:
61 line = line.strip()
62
63 # Blank lines and comments are ignored
64 if not line or line.startswith("#"):
65 continue
66
67 if line.startswith("K"):
Paul Kehrere5805982013-09-27 11:26:01 -050068 key = line.split(" : ")[1].replace(" ", "").encode("ascii")
Paul Kehrer1951bf62013-09-15 12:05:43 -050069 elif line.startswith("P"):
Paul Kehrere5805982013-09-27 11:26:01 -050070 pt = line.split(" : ")[1].replace(" ", "").encode("ascii")
Paul Kehrer1951bf62013-09-15 12:05:43 -050071 elif line.startswith("C"):
Paul Kehrere5805982013-09-27 11:26:01 -050072 ct = line.split(" : ")[1].replace(" ", "").encode("ascii")
73 # after a C is found the K+P+C tuple is complete
74 # there are many P+C pairs for each K
Alex Gaynor1fe70b12013-10-16 11:59:17 -070075 cryptrec_list.append({
76 "key": key,
77 "plaintext": pt,
78 "ciphertext": ct
79 })
Donald Stufft3359d7e2013-10-19 19:33:06 -040080 else:
81 raise ValueError("Invalid line in file '{}'".format(line))
Paul Kehrer1951bf62013-09-15 12:05:43 -050082 return cryptrec_list
83
84
Paul Kehrer6b99a1b2013-09-24 16:50:21 -050085def load_openssl_vectors(vector_data):
86 vectors = []
Paul Kehrer1951bf62013-09-15 12:05:43 -050087
88 for line in vector_data:
89 line = line.strip()
90
91 # Blank lines and comments are ignored
92 if not line or line.startswith("#"):
93 continue
94
95 vector = line.split(":")
Alex Gaynor016eed12013-10-16 14:16:04 -070096 vectors.append({
97 "key": vector[1].encode("ascii"),
98 "iv": vector[2].encode("ascii"),
99 "plaintext": vector[3].encode("ascii"),
100 "ciphertext": vector[4].encode("ascii"),
101 })
Paul Kehrer6b99a1b2013-09-24 16:50:21 -0500102 return vectors
Paul Kehrer69e06522013-10-18 17:28:39 -0500103
104
105def load_hash_vectors(vector_data):
106 vectors = []
Paul Kehrer1bb8b712013-10-27 17:00:14 -0500107 key = None
108 msg = None
109 md = None
Paul Kehrer69e06522013-10-18 17:28:39 -0500110
111 for line in vector_data:
112 line = line.strip()
113
Paul Kehrer87cd0db2013-10-18 18:01:26 -0500114 if not line or line.startswith("#") or line.startswith("["):
Paul Kehrer69e06522013-10-18 17:28:39 -0500115 continue
116
117 if line.startswith("Len"):
118 length = int(line.split(" = ")[1])
Paul Kehrer0317b042013-10-28 17:34:27 -0500119 elif line.startswith("Key"):
120 """
121 HMAC vectors contain a key attribute. Hash vectors do not.
122 """
123 key = line.split(" = ")[1].encode("ascii")
Paul Kehrer69e06522013-10-18 17:28:39 -0500124 elif line.startswith("Msg"):
125 """
126 In the NIST vectors they have chosen to represent an empty
127 string as hex 00, which is of course not actually an empty
128 string. So we parse the provided length and catch this edge case.
129 """
130 msg = line.split(" = ")[1].encode("ascii") if length > 0 else b""
131 elif line.startswith("MD"):
132 md = line.split(" = ")[1]
Paul Kehrer0317b042013-10-28 17:34:27 -0500133 # after MD is found the Msg+MD (+ potential key) tuple is complete
Paul Kehrer00dd5092013-10-23 09:41:49 -0500134 if key is not None:
Paul Kehrer0317b042013-10-28 17:34:27 -0500135 vectors.append((msg, md, key))
Paul Kehrer1bb8b712013-10-27 17:00:14 -0500136 key = None
137 msg = None
138 md = None
Paul Kehrer00dd5092013-10-23 09:41:49 -0500139 else:
Paul Kehrer0317b042013-10-28 17:34:27 -0500140 vectors.append((msg, md))
Paul Kehrer1bb8b712013-10-27 17:00:14 -0500141 msg = None
142 md = None
Paul Kehrer69e06522013-10-18 17:28:39 -0500143 else:
144 raise ValueError("Unknown line in hash vector")
145 return vectors