Resolve some UNSAFE_TODO() in AES

In particular, convert the local `keysched` to span.

Change-Id: Id417752949a5e94b21b5a7ccccee7b8eb7513a71
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/132930
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fdrm/fx_crypt_aes.cpp b/core/fdrm/fx_crypt_aes.cpp
index 74d2fdf..d8b012a 100644
--- a/core/fdrm/fx_crypt_aes.cpp
+++ b/core/fdrm/fx_crypt_aes.cpp
@@ -6,6 +6,8 @@
 
 #include "core/fdrm/fx_crypt_aes.h"
 
+#include <array>
+
 #include "core/fxcrt/byteorder.h"
 #include "core/fxcrt/check.h"
 #include "core/fxcrt/check_op.h"
@@ -431,29 +433,28 @@
     0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
 }};
 
-#define ADD_ROUND_KEY_4()                                        \
-  UNSAFE_TODO((block[0] ^= *keysched++, block[1] ^= *keysched++, \
-               block[2] ^= *keysched++, block[3] ^= *keysched++))
-#define MOVEWORD(i) UNSAFE_TODO((block[i] = newstate[i]))
-#define FMAKEWORD(i)                                                    \
-  UNSAFE_TODO((newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^             \
-                              E1[(block[(i + C1) % Nb] >> 16) & 0xFF] ^ \
-                              E2[(block[(i + C2) % Nb] >> 8) & 0xFF] ^  \
-                              E3[block[(i + C3) % Nb] & 0xFF])))
-#define LASTWORD(i)                                                      \
-  UNSAFE_TODO(                                                           \
-      (newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) |             \
-                     (Sbox[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \
-                     (Sbox[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) |   \
-                     (Sbox[(block[(i + C3) % Nb]) & 0xFF])))
+#define ADD_ROUND_KEY_4()                                                     \
+  (block[0] ^= keysched[0], block[1] ^= keysched[1], block[2] ^= keysched[2], \
+   block[3] ^= keysched[3], keysched = keysched.subspan<4u>())
+#define MOVEWORD(i) (block[i] = newstate[i])
+#define FMAKEWORD(i)                                        \
+  (newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^             \
+                  E1[(block[(i + C1) % Nb] >> 16) & 0xFF] ^ \
+                  E2[(block[(i + C2) % Nb] >> 8) & 0xFF] ^  \
+                  E3[block[(i + C3) % Nb] & 0xFF]))
+#define LASTWORD(i)                                                  \
+  (newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) |             \
+                 (Sbox[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \
+                 (Sbox[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) |   \
+                 (Sbox[(block[(i + C3) % Nb]) & 0xFF]))
 
-void aes_encrypt_nb_4(CRYPT_aes_context* ctx, uint32_t* block) {
+void aes_encrypt_nb_4(CRYPT_aes_context* ctx, pdfium::span<uint32_t, 4> block) {
   const int C1 = 1;
   const int C2 = 2;
   const int C3 = 3;
   const int Nb = 4;
-  uint32_t* keysched = ctx->keysched.data();
-  uint32_t newstate[4];
+  pdfium::span<uint32_t> keysched(ctx->keysched);
+  std::array<uint32_t, 4> newstate;
   CHECK_NE(ctx->Nr, 0u);
   for (size_t i = 0; i < ctx->Nr - 1; i++) {
     ADD_ROUND_KEY_4();
@@ -480,25 +481,24 @@
 #undef FMAKEWORD
 #undef LASTWORD
 
-#define FMAKEWORD(i)                                                    \
-  UNSAFE_TODO((newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^             \
-                              D1[(block[(i + C1) % Nb] >> 16) & 0xFF] ^ \
-                              D2[(block[(i + C2) % Nb] >> 8) & 0xFF] ^  \
-                              D3[block[(i + C3) % Nb] & 0xFF])))
-#define LASTWORD(i)                                                         \
-  UNSAFE_TODO(                                                              \
-      (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) |             \
-                     (Sboxinv[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \
-                     (Sboxinv[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) |   \
-                     (Sboxinv[(block[(i + C3) % Nb]) & 0xFF])))
+#define FMAKEWORD(i)                                        \
+  (newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^             \
+                  D1[(block[(i + C1) % Nb] >> 16) & 0xFF] ^ \
+                  D2[(block[(i + C2) % Nb] >> 8) & 0xFF] ^  \
+                  D3[block[(i + C3) % Nb] & 0xFF]))
+#define LASTWORD(i)                                                     \
+  (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) |             \
+                 (Sboxinv[(block[(i + C1) % Nb] >> 16) & 0xFF] << 16) | \
+                 (Sboxinv[(block[(i + C2) % Nb] >> 8) & 0xFF] << 8) |   \
+                 (Sboxinv[(block[(i + C3) % Nb]) & 0xFF]))
 
-void aes_decrypt_nb_4(CRYPT_aes_context* ctx, uint32_t* block) {
+void aes_decrypt_nb_4(CRYPT_aes_context* ctx, pdfium::span<uint32_t, 4> block) {
   const int C1 = 4 - 1;
   const int C2 = 4 - 2;
   const int C3 = 4 - 3;
   const int Nb = 4;
-  uint32_t* keysched = ctx->invkeysched.data();
-  uint32_t newstate[4];
+  pdfium::span<uint32_t> keysched(ctx->invkeysched);
+  std::array<uint32_t, 4> newstate;
   CHECK_NE(ctx->Nr, 0);
   for (size_t i = 0; i < ctx->Nr - 1; i++) {
     ADD_ROUND_KEY_4();
@@ -623,7 +623,7 @@
       iv_element ^= fxcrt::GetUInt32MSBFirst(src.first<4u>());
       src = src.subspan(4u);
     }
-    aes_encrypt_nb_4(ctx, ctx_iv.data());
+    aes_encrypt_nb_4(ctx, ctx_iv);
     for (auto& iv_element : ctx_iv) {
       fxcrt::PutUInt32MSBFirst(iv_element, dest.first<4u>());
       dest = dest.subspan(4u);