blob: 70f275e0e3bad18ae08f210242c164fd9f7576f1 [file] [log] [blame]
K. Moon832a6942022-10-31 20:11:31 +00001// Copyright 2020 The PDFium Authors
Miklos Vajna2b76bf92020-06-25 21:35:26 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Lei Zhang59a1a912021-06-07 16:55:25 +00005#include <vector>
6
Miklos Vajna2b76bf92020-06-25 21:35:26 +00007#include "public/fpdf_signature.h"
8#include "testing/embedder_test.h"
Miklos Vajnaf8935042020-08-03 18:08:56 +00009#include "testing/fx_string_testhelpers.h"
Miklos Vajna2b76bf92020-06-25 21:35:26 +000010
11class FPDFSignatureEmbedderTest : public EmbedderTest {};
12
13TEST_F(FPDFSignatureEmbedderTest, GetSignatureCount) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +000014 ASSERT_TRUE(OpenDocument("two_signatures.pdf"));
Miklos Vajna2b76bf92020-06-25 21:35:26 +000015 EXPECT_EQ(2, FPDF_GetSignatureCount(document()));
16}
17
18TEST_F(FPDFSignatureEmbedderTest, GetSignatureCountZero) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +000019 ASSERT_TRUE(OpenDocument("hello_world.pdf"));
Miklos Vajna2b76bf92020-06-25 21:35:26 +000020 EXPECT_EQ(0, FPDF_GetSignatureCount(document()));
21
22 // Provide no document.
23 EXPECT_EQ(-1, FPDF_GetSignatureCount(nullptr));
24}
Miklos Vajna0ab17242020-06-30 22:17:11 +000025
26TEST_F(FPDFSignatureEmbedderTest, GetSignatureObject) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +000027 ASSERT_TRUE(OpenDocument("two_signatures.pdf"));
Miklos Vajna0ab17242020-06-30 22:17:11 +000028 // Different, non-null signature objects are returned.
29 FPDF_SIGNATURE signature1 = FPDF_GetSignatureObject(document(), 0);
Tom Sepez9e61a722022-06-08 16:54:30 +000030 EXPECT_TRUE(signature1);
Miklos Vajna0ab17242020-06-30 22:17:11 +000031 FPDF_SIGNATURE signature2 = FPDF_GetSignatureObject(document(), 1);
Tom Sepez9e61a722022-06-08 16:54:30 +000032 EXPECT_TRUE(signature2);
Miklos Vajna0ab17242020-06-30 22:17:11 +000033 EXPECT_NE(signature1, signature2);
34
35 // Out of bounds.
Tom Sepez9e61a722022-06-08 16:54:30 +000036 EXPECT_FALSE(FPDF_GetSignatureObject(document(), -1));
37 EXPECT_FALSE(FPDF_GetSignatureObject(document(), 2));
Miklos Vajna0ab17242020-06-30 22:17:11 +000038
39 // Provide no document.
Tom Sepez9e61a722022-06-08 16:54:30 +000040 EXPECT_FALSE(FPDF_GetSignatureObject(nullptr, 0));
Miklos Vajna0ab17242020-06-30 22:17:11 +000041}
Miklos Vajna57445f22020-07-17 19:15:48 +000042
43TEST_F(FPDFSignatureEmbedderTest, GetContents) {
Daniel Hosseinian5af51b62020-07-18 00:53:43 +000044 ASSERT_TRUE(OpenDocument("two_signatures.pdf"));
Miklos Vajna57445f22020-07-17 19:15:48 +000045 FPDF_SIGNATURE signature = FPDF_GetSignatureObject(document(), 0);
Tom Sepez9e61a722022-06-08 16:54:30 +000046 EXPECT_TRUE(signature);
Miklos Vajna57445f22020-07-17 19:15:48 +000047
48 // FPDFSignatureObj_GetContents() positive testing.
49 unsigned long size = FPDFSignatureObj_GetContents(signature, nullptr, 0);
50 const uint8_t kExpectedContents[] = {0x30, 0x80, 0x06, 0x09, 0x2A, 0x86, 0x48,
51 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0,
52 0x80, 0x30, 0x80, 0x02, 0x01, 0x01};
53 ASSERT_EQ(sizeof(kExpectedContents), size);
54 std::vector<char> contents(size);
55 ASSERT_EQ(size,
56 FPDFSignatureObj_GetContents(signature, contents.data(), size));
Tom Sepezb69783f2024-12-16 10:14:17 -080057 ASSERT_EQ(0, UNSAFE_TODO(memcmp(kExpectedContents, contents.data(), size)));
Miklos Vajna57445f22020-07-17 19:15:48 +000058
59 // FPDFSignatureObj_GetContents() negative testing.
60 ASSERT_EQ(0U, FPDFSignatureObj_GetContents(nullptr, nullptr, 0));
61
62 contents.resize(2);
63 contents[0] = 'x';
64 contents[1] = '\0';
65 size =
66 FPDFSignatureObj_GetContents(signature, contents.data(), contents.size());
67 ASSERT_EQ(sizeof(kExpectedContents), size);
68 EXPECT_EQ('x', contents[0]);
69 EXPECT_EQ('\0', contents[1]);
70}
Miklos Vajna9e1fc052020-07-22 14:22:23 +000071
72TEST_F(FPDFSignatureEmbedderTest, GetByteRange) {
73 ASSERT_TRUE(OpenDocument("two_signatures.pdf"));
74 FPDF_SIGNATURE signature = FPDF_GetSignatureObject(document(), 0);
Tom Sepez9e61a722022-06-08 16:54:30 +000075 EXPECT_TRUE(signature);
Miklos Vajna9e1fc052020-07-22 14:22:23 +000076
77 // FPDFSignatureObj_GetByteRange() positive testing.
78 unsigned long size = FPDFSignatureObj_GetByteRange(signature, nullptr, 0);
79 const std::vector<int> kExpectedByteRange{0, 10, 30, 10};
80 ASSERT_EQ(kExpectedByteRange.size(), size);
81 std::vector<int> byte_range(size);
82 ASSERT_EQ(size,
83 FPDFSignatureObj_GetByteRange(signature, byte_range.data(), size));
84 ASSERT_EQ(kExpectedByteRange, byte_range);
85
86 // FPDFSignatureObj_GetByteRange() negative testing.
Lei Zhang1881da72020-07-28 20:05:11 +000087 ASSERT_EQ(0U, FPDFSignatureObj_GetByteRange(nullptr, nullptr, 0));
Miklos Vajna9e1fc052020-07-22 14:22:23 +000088
89 byte_range.resize(2);
90 byte_range[0] = 0;
91 byte_range[1] = 1;
92 size = FPDFSignatureObj_GetByteRange(signature, byte_range.data(),
93 byte_range.size());
94 ASSERT_EQ(kExpectedByteRange.size(), size);
95 EXPECT_EQ(0, byte_range[0]);
96 EXPECT_EQ(1, byte_range[1]);
97}
Miklos Vajna1fc751f2020-07-28 06:35:27 +000098
99TEST_F(FPDFSignatureEmbedderTest, GetSubFilter) {
100 ASSERT_TRUE(OpenDocument("two_signatures.pdf"));
101 FPDF_SIGNATURE signature = FPDF_GetSignatureObject(document(), 0);
Tom Sepez9e61a722022-06-08 16:54:30 +0000102 EXPECT_TRUE(signature);
Miklos Vajna1fc751f2020-07-28 06:35:27 +0000103
104 // FPDFSignatureObj_GetSubFilter() positive testing.
105 unsigned long size = FPDFSignatureObj_GetSubFilter(signature, nullptr, 0);
106 const char kExpectedSubFilter[] = "ETSI.CAdES.detached";
107 ASSERT_EQ(sizeof(kExpectedSubFilter), size);
108 std::vector<char> sub_filter(size);
109 ASSERT_EQ(size,
110 FPDFSignatureObj_GetSubFilter(signature, sub_filter.data(), size));
Tom Sepezb69783f2024-12-16 10:14:17 -0800111 ASSERT_EQ(0,
112 UNSAFE_TODO(memcmp(kExpectedSubFilter, sub_filter.data(), size)));
Miklos Vajna1fc751f2020-07-28 06:35:27 +0000113
114 // FPDFSignatureObj_GetSubFilter() negative testing.
115 ASSERT_EQ(0U, FPDFSignatureObj_GetSubFilter(nullptr, nullptr, 0));
116
117 sub_filter.resize(2);
118 sub_filter[0] = 'x';
119 sub_filter[1] = '\0';
120 size = FPDFSignatureObj_GetSubFilter(signature, sub_filter.data(),
121 sub_filter.size());
122 ASSERT_EQ(sizeof(kExpectedSubFilter), size);
123 EXPECT_EQ('x', sub_filter[0]);
124 EXPECT_EQ('\0', sub_filter[1]);
125}
126
127TEST_F(FPDFSignatureEmbedderTest, GetSubFilterNoKeyExists) {
128 ASSERT_TRUE(OpenDocument("signature_no_sub_filter.pdf"));
129 FPDF_SIGNATURE signature = FPDF_GetSignatureObject(document(), 0);
Tom Sepez9e61a722022-06-08 16:54:30 +0000130 EXPECT_TRUE(signature);
Miklos Vajna1fc751f2020-07-28 06:35:27 +0000131
132 // FPDFSignatureObj_GetSubFilter() negative testing: no SubFilter
133 ASSERT_EQ(0U, FPDFSignatureObj_GetSubFilter(signature, nullptr, 0));
134}
Miklos Vajnaf8935042020-08-03 18:08:56 +0000135
136TEST_F(FPDFSignatureEmbedderTest, GetReason) {
137 ASSERT_TRUE(OpenDocument("signature_reason.pdf"));
138 FPDF_SIGNATURE signature = FPDF_GetSignatureObject(document(), 0);
Tom Sepez9e61a722022-06-08 16:54:30 +0000139 EXPECT_TRUE(signature);
Miklos Vajnaf8935042020-08-03 18:08:56 +0000140
141 // FPDFSignatureObj_GetReason() positive testing.
Lei Zhang666e8472024-11-21 21:38:19 +0000142 static constexpr char kReason[] = "test reason";
Miklos Vajnaf8935042020-08-03 18:08:56 +0000143 // Return value includes the terminating NUL that is provided.
Lei Zhang666e8472024-11-21 21:38:19 +0000144 static constexpr unsigned long kReasonUTF16Size = std::size(kReason) * 2;
145 static constexpr wchar_t kReasonWide[] = L"test reason";
Miklos Vajnaf8935042020-08-03 18:08:56 +0000146 unsigned long size = FPDFSignatureObj_GetReason(signature, nullptr, 0);
147 ASSERT_EQ(kReasonUTF16Size, size);
148
149 std::vector<unsigned short> buffer(size);
150 ASSERT_EQ(size, FPDFSignatureObj_GetReason(signature, buffer.data(), size));
151 ASSERT_EQ(kReasonWide, GetPlatformWString(buffer.data()));
152
153 // FPDFSignatureObj_GetReason() negative testing.
154 ASSERT_EQ(0U, FPDFSignatureObj_GetReason(nullptr, nullptr, 0));
155
156 // Buffer is too small, ensure it's not modified.
157 buffer.resize(2);
158 buffer[0] = 'x';
159 buffer[1] = '\0';
160 size = FPDFSignatureObj_GetReason(signature, buffer.data(), buffer.size());
161 ASSERT_EQ(kReasonUTF16Size, size);
162 EXPECT_EQ('x', buffer[0]);
163 EXPECT_EQ('\0', buffer[1]);
164}
Miklos Vajna571febd2020-08-12 19:18:14 +0000165
166TEST_F(FPDFSignatureEmbedderTest, GetTime) {
167 ASSERT_TRUE(OpenDocument("two_signatures.pdf"));
168 FPDF_SIGNATURE signature = FPDF_GetSignatureObject(document(), 0);
Tom Sepez9e61a722022-06-08 16:54:30 +0000169 EXPECT_TRUE(signature);
Miklos Vajna571febd2020-08-12 19:18:14 +0000170
171 // FPDFSignatureObj_GetTime() positive testing.
172 unsigned long size = FPDFSignatureObj_GetTime(signature, nullptr, 0);
173 const char kExpectedTime[] = "D:20200624093114+02'00'";
174 ASSERT_EQ(sizeof(kExpectedTime), size);
175 std::vector<char> time_buffer(size);
176 ASSERT_EQ(size,
177 FPDFSignatureObj_GetTime(signature, time_buffer.data(), size));
Tom Sepezb69783f2024-12-16 10:14:17 -0800178 ASSERT_EQ(0, UNSAFE_TODO(memcmp(kExpectedTime, time_buffer.data(), size)));
Miklos Vajna571febd2020-08-12 19:18:14 +0000179
180 // FPDFSignatureObj_GetTime() negative testing.
181 ASSERT_EQ(0U, FPDFSignatureObj_GetTime(nullptr, nullptr, 0));
182
183 time_buffer.resize(2);
184 time_buffer[0] = 'x';
185 time_buffer[1] = '\0';
186 size = FPDFSignatureObj_GetTime(signature, time_buffer.data(),
187 time_buffer.size());
188 ASSERT_EQ(sizeof(kExpectedTime), size);
189 EXPECT_EQ('x', time_buffer[0]);
190 EXPECT_EQ('\0', time_buffer[1]);
191}
Miklos Vajnaf63c9652020-11-03 16:32:12 +0000192
193TEST_F(FPDFSignatureEmbedderTest, GetDocMDPPermission) {
194 ASSERT_TRUE(OpenDocument("docmdp.pdf"));
195 FPDF_SIGNATURE signature = FPDF_GetSignatureObject(document(), 0);
196 ASSERT_NE(nullptr, signature);
197
198 // FPDFSignatureObj_GetDocMDPPermission() positive testing.
199 unsigned int permission = FPDFSignatureObj_GetDocMDPPermission(signature);
200 EXPECT_EQ(1U, permission);
201
202 // FPDFSignatureObj_GetDocMDPPermission() negative testing.
203 EXPECT_EQ(0U, FPDFSignatureObj_GetDocMDPPermission(nullptr));
204}