xref: /aosp_15_r20/system/extras/libfscrypt/tests/fscrypt_test.cpp (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker  *
4*288bf522SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker  *
8*288bf522SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker  *
10*288bf522SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker  * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker  */
16*288bf522SAndroid Build Coastguard Worker 
17*288bf522SAndroid Build Coastguard Worker #include <linux/fscrypt.h>
18*288bf522SAndroid Build Coastguard Worker 
19*288bf522SAndroid Build Coastguard Worker #include <fscrypt/fscrypt.h>
20*288bf522SAndroid Build Coastguard Worker 
21*288bf522SAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*288bf522SAndroid Build Coastguard Worker 
23*288bf522SAndroid Build Coastguard Worker using namespace android::fscrypt;
24*288bf522SAndroid Build Coastguard Worker 
25*288bf522SAndroid Build Coastguard Worker /* modes not supported by upstream kernel, so not in <linux/fscrypt.h> */
26*288bf522SAndroid Build Coastguard Worker #define FSCRYPT_MODE_AES_256_HEH 126
27*288bf522SAndroid Build Coastguard Worker #define FSCRYPT_MODE_PRIVATE 127
28*288bf522SAndroid Build Coastguard Worker 
TestString(unsigned int first_api_level,const std::string instring,const std::string outstring)29*288bf522SAndroid Build Coastguard Worker const EncryptionOptions TestString(unsigned int first_api_level, const std::string instring,
30*288bf522SAndroid Build Coastguard Worker                                    const std::string outstring) {
31*288bf522SAndroid Build Coastguard Worker     EncryptionOptions options;
32*288bf522SAndroid Build Coastguard Worker     std::string options_string;
33*288bf522SAndroid Build Coastguard Worker 
34*288bf522SAndroid Build Coastguard Worker     EXPECT_TRUE(ParseOptionsForApiLevel(first_api_level, instring, &options));
35*288bf522SAndroid Build Coastguard Worker     EXPECT_TRUE(OptionsToStringForApiLevel(first_api_level, options, &options_string));
36*288bf522SAndroid Build Coastguard Worker     EXPECT_EQ(outstring, options_string);
37*288bf522SAndroid Build Coastguard Worker     return options;
38*288bf522SAndroid Build Coastguard Worker }
39*288bf522SAndroid Build Coastguard Worker 
40*288bf522SAndroid Build Coastguard Worker #define TEST_STRING(first_api_level, instring, outstring) \
41*288bf522SAndroid Build Coastguard Worker     SCOPED_TRACE(instring);                               \
42*288bf522SAndroid Build Coastguard Worker     auto options = TestString(first_api_level, instring, outstring);
43*288bf522SAndroid Build Coastguard Worker 
TEST(fscrypt,ParseOptions)44*288bf522SAndroid Build Coastguard Worker TEST(fscrypt, ParseOptions) {
45*288bf522SAndroid Build Coastguard Worker     EncryptionOptions dummy_options;
46*288bf522SAndroid Build Coastguard Worker 
47*288bf522SAndroid Build Coastguard Worker     std::vector<std::string> defaults = {
48*288bf522SAndroid Build Coastguard Worker             "software",
49*288bf522SAndroid Build Coastguard Worker             "",
50*288bf522SAndroid Build Coastguard Worker             ":",
51*288bf522SAndroid Build Coastguard Worker             "::",
52*288bf522SAndroid Build Coastguard Worker             "aes-256-xts",
53*288bf522SAndroid Build Coastguard Worker             "aes-256-xts:",
54*288bf522SAndroid Build Coastguard Worker             "aes-256-xts::",
55*288bf522SAndroid Build Coastguard Worker             "aes-256-xts:aes-256-cts",
56*288bf522SAndroid Build Coastguard Worker             "aes-256-xts:aes-256-cts:",
57*288bf522SAndroid Build Coastguard Worker             ":aes-256-cts",
58*288bf522SAndroid Build Coastguard Worker             ":aes-256-cts:",
59*288bf522SAndroid Build Coastguard Worker     };
60*288bf522SAndroid Build Coastguard Worker     for (const auto& d : defaults) {
61*288bf522SAndroid Build Coastguard Worker         TEST_STRING(29, d, "aes-256-xts:aes-256-cts:v1");
62*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(1, options.version);
63*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
64*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
65*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_4, options.flags);
66*288bf522SAndroid Build Coastguard Worker         EXPECT_FALSE(options.dusize_4k);
67*288bf522SAndroid Build Coastguard Worker     }
68*288bf522SAndroid Build Coastguard Worker     for (const auto& d : defaults) {
69*288bf522SAndroid Build Coastguard Worker         TEST_STRING(30, d, "aes-256-xts:aes-256-cts:v2");
70*288bf522SAndroid Build Coastguard Worker         EXPECT_TRUE(ParseOptionsForApiLevel(30, d, &dummy_options));
71*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(2, options.version);
72*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
73*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
74*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16, options.flags);
75*288bf522SAndroid Build Coastguard Worker         EXPECT_FALSE(options.dusize_4k);
76*288bf522SAndroid Build Coastguard Worker     }
77*288bf522SAndroid Build Coastguard Worker 
78*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(29, "blah", &dummy_options));
79*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "blah", &dummy_options));
80*288bf522SAndroid Build Coastguard Worker 
81*288bf522SAndroid Build Coastguard Worker     {
82*288bf522SAndroid Build Coastguard Worker         TEST_STRING(29, "::v1", "aes-256-xts:aes-256-cts:v1");
83*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(1, options.version);
84*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
85*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
86*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_4, options.flags);
87*288bf522SAndroid Build Coastguard Worker     }
88*288bf522SAndroid Build Coastguard Worker     {
89*288bf522SAndroid Build Coastguard Worker         TEST_STRING(30, "::v1", "aes-256-xts:aes-256-cts:v1");
90*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(1, options.version);
91*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
92*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
93*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16, options.flags);
94*288bf522SAndroid Build Coastguard Worker     }
95*288bf522SAndroid Build Coastguard Worker     {
96*288bf522SAndroid Build Coastguard Worker         TEST_STRING(29, "::v2", "aes-256-xts:aes-256-cts:v2");
97*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(2, options.version);
98*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
99*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
100*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16, options.flags);
101*288bf522SAndroid Build Coastguard Worker     }
102*288bf522SAndroid Build Coastguard Worker     {
103*288bf522SAndroid Build Coastguard Worker         TEST_STRING(29, "ice", "ice:aes-256-cts:v1");
104*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(1, options.version);
105*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_PRIVATE, options.contents_mode);
106*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
107*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_4, options.flags);
108*288bf522SAndroid Build Coastguard Worker     }
109*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(29, "ice:blah", &dummy_options));
110*288bf522SAndroid Build Coastguard Worker 
111*288bf522SAndroid Build Coastguard Worker     {
112*288bf522SAndroid Build Coastguard Worker         TEST_STRING(29, "ice:aes-256-cts", "ice:aes-256-cts:v1");
113*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(1, options.version);
114*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_PRIVATE, options.contents_mode);
115*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
116*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_4, options.flags);
117*288bf522SAndroid Build Coastguard Worker     }
118*288bf522SAndroid Build Coastguard Worker 
119*288bf522SAndroid Build Coastguard Worker     {
120*288bf522SAndroid Build Coastguard Worker         TEST_STRING(29, "ice:aes-256-heh", "ice:aes-256-heh:v1");
121*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(1, options.version);
122*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_PRIVATE, options.contents_mode);
123*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_HEH, options.filenames_mode);
124*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16, options.flags);
125*288bf522SAndroid Build Coastguard Worker     }
126*288bf522SAndroid Build Coastguard Worker     {
127*288bf522SAndroid Build Coastguard Worker         TEST_STRING(29, "adiantum", "adiantum:adiantum:v1");
128*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(1, options.version);
129*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_ADIANTUM, options.contents_mode);
130*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_ADIANTUM, options.filenames_mode);
131*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16 | FSCRYPT_POLICY_FLAG_DIRECT_KEY, options.flags);
132*288bf522SAndroid Build Coastguard Worker     }
133*288bf522SAndroid Build Coastguard Worker     {
134*288bf522SAndroid Build Coastguard Worker         TEST_STRING(30, "adiantum", "adiantum:adiantum:v2");
135*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(2, options.version);
136*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_ADIANTUM, options.contents_mode);
137*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_ADIANTUM, options.filenames_mode);
138*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16 | FSCRYPT_POLICY_FLAG_DIRECT_KEY, options.flags);
139*288bf522SAndroid Build Coastguard Worker     }
140*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(29, "adiantum:aes-256-cts", &dummy_options));
141*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "adiantum:aes-256-cts", &dummy_options));
142*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(29, "aes-256-xts:adiantum", &dummy_options));
143*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "aes-256-xts:adiantum", &dummy_options));
144*288bf522SAndroid Build Coastguard Worker     {
145*288bf522SAndroid Build Coastguard Worker         TEST_STRING(30, "::inlinecrypt_optimized",
146*288bf522SAndroid Build Coastguard Worker                     "aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized");
147*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(2, options.version);
148*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
149*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
150*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16 | FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64, options.flags);
151*288bf522SAndroid Build Coastguard Worker     }
152*288bf522SAndroid Build Coastguard Worker     {
153*288bf522SAndroid Build Coastguard Worker         TEST_STRING(30, "aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized",
154*288bf522SAndroid Build Coastguard Worker                     "aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized");
155*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(2, options.version);
156*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
157*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
158*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16 | FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64, options.flags);
159*288bf522SAndroid Build Coastguard Worker     }
160*288bf522SAndroid Build Coastguard Worker 
161*288bf522SAndroid Build Coastguard Worker     {
162*288bf522SAndroid Build Coastguard Worker         TEST_STRING(30, "::emmc_optimized", "aes-256-xts:aes-256-cts:v2+emmc_optimized");
163*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(2, options.version);
164*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
165*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
166*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16 | FSCRYPT_POLICY_FLAG_IV_INO_LBLK_32, options.flags);
167*288bf522SAndroid Build Coastguard Worker     }
168*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(
169*288bf522SAndroid Build Coastguard Worker             ParseOptionsForApiLevel(30, "::inlinecrypt_optimized+emmc_optimized", &dummy_options));
170*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "adiantum::inlinecrypt_optimized", &dummy_options));
171*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "adiantum::emmc_optimized", &dummy_options));
172*288bf522SAndroid Build Coastguard Worker 
173*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(29, "aes-256-xts:aes-256-cts:v2:", &dummy_options));
174*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(29, "aes-256-xts:aes-256-cts:v2:foo", &dummy_options));
175*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(29, "aes-256-xts:aes-256-cts:blah", &dummy_options));
176*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(29, "aes-256-xts:aes-256-cts:vblah", &dummy_options));
177*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "aes-256-xts:aes-256-cts:v2:", &dummy_options));
178*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "aes-256-xts:aes-256-cts:v2:foo", &dummy_options));
179*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "aes-256-xts:aes-256-cts:blah", &dummy_options));
180*288bf522SAndroid Build Coastguard Worker     EXPECT_FALSE(ParseOptionsForApiLevel(30, "aes-256-xts:aes-256-cts:vblah", &dummy_options));
181*288bf522SAndroid Build Coastguard Worker 
182*288bf522SAndroid Build Coastguard Worker     {
183*288bf522SAndroid Build Coastguard Worker         TEST_STRING(34, ":aes-256-hctr2", "aes-256-xts:aes-256-hctr2:v2");
184*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(2, options.version);
185*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
186*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_HCTR2, options.filenames_mode);
187*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16, options.flags);
188*288bf522SAndroid Build Coastguard Worker     }
189*288bf522SAndroid Build Coastguard Worker 
190*288bf522SAndroid Build Coastguard Worker     {
191*288bf522SAndroid Build Coastguard Worker         TEST_STRING(34, "::dusize_4k", "aes-256-xts:aes-256-cts:v2+dusize_4k");
192*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(2, options.version);
193*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_XTS, options.contents_mode);
194*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_MODE_AES_256_CTS, options.filenames_mode);
195*288bf522SAndroid Build Coastguard Worker         EXPECT_EQ(FSCRYPT_POLICY_FLAGS_PAD_16, options.flags);
196*288bf522SAndroid Build Coastguard Worker         EXPECT_TRUE(options.dusize_4k);
197*288bf522SAndroid Build Coastguard Worker     }
198*288bf522SAndroid Build Coastguard Worker }
199*288bf522SAndroid Build Coastguard Worker 
TEST(fscrypt,ComparePolicies)200*288bf522SAndroid Build Coastguard Worker TEST(fscrypt, ComparePolicies) {
201*288bf522SAndroid Build Coastguard Worker #define TEST_INEQUALITY(foo, field, value) \
202*288bf522SAndroid Build Coastguard Worker     {                                      \
203*288bf522SAndroid Build Coastguard Worker         auto bar = foo;                    \
204*288bf522SAndroid Build Coastguard Worker         bar.field = value;                 \
205*288bf522SAndroid Build Coastguard Worker         EXPECT_NE(foo, bar);               \
206*288bf522SAndroid Build Coastguard Worker     }
207*288bf522SAndroid Build Coastguard Worker     EncryptionPolicy foo;
208*288bf522SAndroid Build Coastguard Worker     foo.key_raw_ref = "foo";
209*288bf522SAndroid Build Coastguard Worker     EncryptionOptions foo_options;
210*288bf522SAndroid Build Coastguard Worker     foo_options.version = 1;
211*288bf522SAndroid Build Coastguard Worker     foo_options.contents_mode = 1;
212*288bf522SAndroid Build Coastguard Worker     foo_options.filenames_mode = 1;
213*288bf522SAndroid Build Coastguard Worker     foo_options.flags = 1;
214*288bf522SAndroid Build Coastguard Worker     foo_options.use_hw_wrapped_key = true;
215*288bf522SAndroid Build Coastguard Worker     foo_options.dusize_4k = true;
216*288bf522SAndroid Build Coastguard Worker     foo.options = foo_options;
217*288bf522SAndroid Build Coastguard Worker     EXPECT_EQ(foo, foo);
218*288bf522SAndroid Build Coastguard Worker     TEST_INEQUALITY(foo, key_raw_ref, "bar");
219*288bf522SAndroid Build Coastguard Worker     TEST_INEQUALITY(foo, options.version, 2);
220*288bf522SAndroid Build Coastguard Worker     TEST_INEQUALITY(foo, options.contents_mode, -1);
221*288bf522SAndroid Build Coastguard Worker     TEST_INEQUALITY(foo, options.filenames_mode, 3);
222*288bf522SAndroid Build Coastguard Worker     TEST_INEQUALITY(foo, options.flags, 0);
223*288bf522SAndroid Build Coastguard Worker     TEST_INEQUALITY(foo, options.use_hw_wrapped_key, false);
224*288bf522SAndroid Build Coastguard Worker     TEST_INEQUALITY(foo, options.dusize_4k, false);
225*288bf522SAndroid Build Coastguard Worker }
226