diff --git a/DEPS b/DEPS
index 1a1f11de..4df335d 100644
--- a/DEPS
+++ b/DEPS
@@ -100,7 +100,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '1f46296507805ddfb2bbb992a832bde528100351',
+  'v8_revision': 'a2f0a25ca3622a8a4303307a6f7ec4b16afe6fe2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -108,7 +108,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'e708f004bce5dc2ef7d33fd9572e9ca9a7e979ba',
+  'angle_revision': '03bb2231a821b2815a1ca472db47164af1350c6e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -120,7 +120,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'ccd9421589922b8f35ee5330d7fdac7edea081db',
+  'pdfium_revision': '525147a1f6d6cd736a407d1e189ac25d2f4726e8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -128,7 +128,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
-  'boringssl_revision': 'cece32610b89549386b42b2032dd5d8a423af6c8',
+  'boringssl_revision': '8e75ae488047c519f14f2c08b02a55bf7712fa1d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
diff --git a/WATCHLISTS b/WATCHLISTS
index c13d8abf..fc1250a 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1067,9 +1067,10 @@
       'filepath': 'chrome/android/(java|junit)/src/org/chromium/chrome/browser/media/router/' \
                   '|chrome/browser/media/router/' \
                   '|chrome/browser/resources/media_router/' \
+                  '|chrome/browser/ui/media_router/' \
                   '|chrome/browser/ui/views/media_router/' \
                   '|chrome/browser/ui/webui/media_router/' \
-                  '|chrome/common/media/router/' \
+                  '|chrome/common/media_router/' \
                   '|chrome/test/data/webui/media_router/' \
                   '|chrome/test/media_router/' \
                   '|chrome/utility/media_router/'
@@ -2158,7 +2159,8 @@
                        'xjz+watch@chromium.org'],
     'media_router': ['amp+watch@chromium.org',
                      'imcheng+watch@chromium.org',
-                     'mfoltz+watch@chromium.org'],
+                     'mfoltz+watch@chromium.org',
+                     'takumif+watch@chromium.org'],
     'memory_coordinator': ['chrome-grc-reviews+memory@chromium.org'],
     'message_loop': ['sadrul@chromium.org'],
     'metrics': ['asvitkine+watch@chromium.org'],
diff --git a/android_webview/browser/aw_variations_service_client.cc b/android_webview/browser/aw_variations_service_client.cc
index 12c6943..1cfb39f 100644
--- a/android_webview/browser/aw_variations_service_client.cc
+++ b/android_webview/browser/aw_variations_service_client.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
+#include "components/version_info/android/channel_getter.h"
 #include "components/version_info/version_info.h"
 
 namespace android_webview {
@@ -45,9 +46,7 @@
 }
 
 version_info::Channel AwVariationsServiceClient::GetChannel() {
-  // TODO(kmilka): Investigate the proper value to return here so experiments
-  // are correctly filtered.
-  return version_info::Channel::UNKNOWN;
+  return version_info::GetChannel();
 }
 
 bool AwVariationsServiceClient::OverridesRestrictParameter(
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index a55ae17..a32f69a 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -71,6 +71,10 @@
     "accessibility/focus_ring_controller.h",
     "accessibility/focus_ring_layer.cc",
     "accessibility/focus_ring_layer.h",
+    "accessibility/key_accessibility_enabler.cc",
+    "accessibility/key_accessibility_enabler.h",
+    "accessibility/spoken_feedback_enabler.cc",
+    "accessibility/spoken_feedback_enabler.h",
     "accessibility/touch_accessibility_enabler.cc",
     "accessibility/touch_accessibility_enabler.h",
     "accessibility/touch_exploration_controller.cc",
@@ -203,6 +207,8 @@
     "events/event_rewriter_controller.h",
     "events/keyboard_driven_event_rewriter.cc",
     "events/keyboard_driven_event_rewriter.h",
+    "events/spoken_feedback_event_rewriter.cc",
+    "events/spoken_feedback_event_rewriter.h",
     "first_run/desktop_cleaner.cc",
     "first_run/desktop_cleaner.h",
     "first_run/first_run_helper.cc",
@@ -334,6 +340,8 @@
     "login/ui/login_detachable_base_model.h",
     "login/ui/login_expanded_public_account_view.cc",
     "login/ui/login_expanded_public_account_view.h",
+    "login/ui/login_menu_view.cc",
+    "login/ui/login_menu_view.h",
     "login/ui/login_password_view.cc",
     "login/ui/login_password_view.h",
     "login/ui/login_pin_view.cc",
@@ -519,6 +527,8 @@
     "sticky_keys/sticky_keys_overlay.cc",
     "sticky_keys/sticky_keys_overlay.h",
     "sticky_keys/sticky_keys_state.h",
+    "system/accessibility/select_to_speak_tray.cc",
+    "system/accessibility/select_to_speak_tray.h",
     "system/audio/audio_detailed_view.cc",
     "system/audio/audio_detailed_view.h",
     "system/audio/tray_audio.cc",
@@ -1518,6 +1528,7 @@
     "accessibility/accessibility_focus_ring_controller_unittest.cc",
     "accessibility/accessibility_highlight_controller_unittest.cc",
     "accessibility/accessibility_panel_layout_manager_unittest.cc",
+    "accessibility/key_accessibility_enabler_unittest.cc",
     "accessibility/touch_accessibility_enabler_unittest.cc",
     "accessibility/touch_exploration_controller_unittest.cc",
     "accessibility/touch_exploration_manager_unittest.cc",
@@ -1553,6 +1564,7 @@
     "drag_drop/drag_drop_tracker_unittest.cc",
     "drag_drop/drag_image_view_unittest.cc",
     "events/keyboard_driven_event_rewriter_unittest.cc",
+    "events/spoken_feedback_event_rewriter_unittest.cc",
     "extended_desktop_unittest.cc",
     "first_run/first_run_helper_unittest.cc",
     "focus_cycler_unittest.cc",
@@ -1631,6 +1643,7 @@
     "shell_unittest.cc",
     "sticky_keys/sticky_keys_overlay_unittest.cc",
     "sticky_keys/sticky_keys_unittest.cc",
+    "system/accessibility/select_to_speak_tray_unittest.cc",
     "system/audio/tray_audio_unittest.cc",
     "system/bluetooth/bluetooth_power_controller_unittest.cc",
     "system/bluetooth/tray_bluetooth_helper_unittest.cc",
diff --git a/ash/accessibility/accessibility_controller.cc b/ash/accessibility/accessibility_controller.cc
index af9e054..f03e7f58 100644
--- a/ash/accessibility/accessibility_controller.cc
+++ b/ash/accessibility/accessibility_controller.cc
@@ -25,6 +25,7 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/power/backlights_forced_off_setter.h"
 #include "ash/system/power/scoped_backlights_forced_off.h"
+#include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/strings/string16.h"
 #include "chromeos/audio/cras_audio_handler.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -173,19 +174,21 @@
 
   base::string16 text;
   base::string16 title;
-  if (type == A11yNotificationType::kSpokenFeedbackBrailleEnabled) {
-    text =
-        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED);
-    title = l10n_util::GetStringUTF16(
-        IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_BRAILLE_ENABLED_TITLE);
-  } else if (type == A11yNotificationType::kBrailleDisplayConnected) {
+  if (type == A11yNotificationType::kBrailleDisplayConnected) {
     text = l10n_util::GetStringUTF16(
         IDS_ASH_STATUS_TRAY_BRAILLE_DISPLAY_CONNECTED);
   } else {
+    bool is_tablet = Shell::Get()
+                         ->tablet_mode_controller()
+                         ->IsTabletModeWindowManagerEnabled();
+
     title = l10n_util::GetStringUTF16(
-        IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_TITLE);
-    text =
-        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED);
+        type == A11yNotificationType::kSpokenFeedbackBrailleEnabled
+            ? IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_BRAILLE_ENABLED_TITLE
+            : IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_TITLE);
+    text = l10n_util::GetStringUTF16(
+        is_tablet ? IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_TABLET
+                  : IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED);
   }
   message_center::RichNotificationData options;
   options.should_make_spoken_feedback_for_popup_updates = false;
diff --git a/ash/accessibility/key_accessibility_enabler.cc b/ash/accessibility/key_accessibility_enabler.cc
new file mode 100644
index 0000000..bd9d3371
--- /dev/null
+++ b/ash/accessibility/key_accessibility_enabler.cc
@@ -0,0 +1,44 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/accessibility/key_accessibility_enabler.h"
+
+#include "ash/accessibility/spoken_feedback_enabler.h"
+#include "ash/shell.h"
+#include "ash/wm/tablet_mode/tablet_mode_controller.h"
+#include "ui/events/event.h"
+
+namespace ash {
+
+KeyAccessibilityEnabler::KeyAccessibilityEnabler() {
+  Shell::Get()->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem);
+}
+
+KeyAccessibilityEnabler::~KeyAccessibilityEnabler() {
+  Shell::Get()->RemovePreTargetHandler(this);
+}
+
+void KeyAccessibilityEnabler::OnKeyEvent(ui::KeyEvent* event) {
+  if ((event->type() != ui::ET_KEY_PRESSED &&
+       event->type() != ui::ET_KEY_RELEASED) ||
+      !Shell::Get()
+           ->tablet_mode_controller()
+           ->IsTabletModeWindowManagerEnabled())
+    return;
+
+  if (event->key_code() == ui::VKEY_VOLUME_DOWN)
+    vol_down_pressed_ = event->type() == ui::ET_KEY_PRESSED;
+  else if (event->key_code() == ui::VKEY_VOLUME_UP)
+    vol_up_pressed_ = event->type() == ui::ET_KEY_PRESSED;
+
+  if (vol_down_pressed_ && vol_up_pressed_) {
+    event->StopPropagation();
+    if (!spoken_feedback_enabler_.get())
+      spoken_feedback_enabler_ = std::make_unique<SpokenFeedbackEnabler>();
+  } else if (spoken_feedback_enabler_.get()) {
+    spoken_feedback_enabler_.reset();
+  }
+}
+
+}  // namespace ash
diff --git a/ash/accessibility/key_accessibility_enabler.h b/ash/accessibility/key_accessibility_enabler.h
new file mode 100644
index 0000000..5d4fb09
--- /dev/null
+++ b/ash/accessibility/key_accessibility_enabler.h
@@ -0,0 +1,41 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_ACCESSIBILITY_KEY_ACCESSIBILITY_ENABLER_H_
+#define ASH_ACCESSIBILITY_KEY_ACCESSIBILITY_ENABLER_H_
+
+#include "ash/ash_export.h"
+#include "base/macros.h"
+#include "ui/events/event_handler.h"
+
+namespace ui {
+class KeyEvent;
+}  // namespace ui
+
+namespace ash {
+class SpokenFeedbackEnabler;
+
+// Toggles spoken feedback when the volume up and volume down keys are held for
+// at least 5 seconds.
+class ASH_EXPORT KeyAccessibilityEnabler : public ui::EventHandler {
+ public:
+  KeyAccessibilityEnabler();
+  ~KeyAccessibilityEnabler() override;
+
+ private:
+  friend class KeyAccessibilityEnablerTest;
+
+  // Overridden from ui::EventHandler
+  void OnKeyEvent(ui::KeyEvent* event) override;
+
+  std::unique_ptr<SpokenFeedbackEnabler> spoken_feedback_enabler_;
+  bool vol_down_pressed_ = false;
+  bool vol_up_pressed_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(KeyAccessibilityEnabler);
+};
+
+}  // namespace ash
+
+#endif  // ASH_ACCESSIBILITY_KEY_ACCESSIBILITY_ENABLER_H_
diff --git a/ash/accessibility/key_accessibility_enabler_unittest.cc b/ash/accessibility/key_accessibility_enabler_unittest.cc
new file mode 100644
index 0000000..4fe677f1
--- /dev/null
+++ b/ash/accessibility/key_accessibility_enabler_unittest.cc
@@ -0,0 +1,81 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/accessibility/key_accessibility_enabler.h"
+
+#include "ash/accessibility/accessibility_controller.h"
+#include "ash/accessibility/accessibility_observer.h"
+#include "ash/shell.h"
+#include "ash/test/ash_test_base.h"
+#include "ash/wm/tablet_mode/tablet_mode_controller.h"
+#include "base/run_loop.h"
+#include "base/test/simple_test_tick_clock.h"
+#include "ui/events/base_event_utils.h"
+#include "ui/events/event.h"
+
+namespace ash {
+
+class KeyAccessibilityEnablerTest : public AshTestBase,
+                                    public AccessibilityObserver {
+ public:
+  KeyAccessibilityEnablerTest() {}
+
+  void SetUp() override {
+    ui::SetEventTickClockForTesting(&clock_);
+    AshTestBase::SetUp();
+    Shell::Get()->accessibility_controller()->AddObserver(this);
+    key_accessibility_enabler_ = Shell::Get()->key_accessibility_enabler();
+  }
+
+  void SendKeyEvent(ui::KeyEvent* event) {
+    // Tablet mode gets exited elsewhere, so we must force it enabled before
+    // each key event.
+    ash::Shell::Get()->tablet_mode_controller()->EnableTabletModeWindowManager(
+        true);
+    key_accessibility_enabler_->OnKeyEvent(event);
+  }
+
+  void WaitForAccessibilityStatusChanged() {
+    run_loop_ = std::make_unique<base::RunLoop>();
+    clock_.Advance(base::TimeDelta::FromMilliseconds(5000));
+    run_loop_->Run();
+  }
+
+ private:
+  // AccessibilityObserver:
+  void OnAccessibilityStatusChanged() override { run_loop_->Quit(); }
+
+  std::unique_ptr<base::RunLoop> run_loop_;
+  KeyAccessibilityEnabler* key_accessibility_enabler_;
+  base::SimpleTestTickClock clock_;
+};
+
+TEST_F(KeyAccessibilityEnablerTest, TwoVolumeKeyDown) {
+  ui::KeyEvent vol_down_press(ui::ET_KEY_PRESSED, ui::VKEY_VOLUME_DOWN,
+                              ui::EF_NONE);
+  ui::KeyEvent vol_up_press(ui::ET_KEY_PRESSED, ui::VKEY_VOLUME_UP,
+                            ui::EF_NONE);
+  ui::KeyEvent vol_down_release(ui::ET_KEY_RELEASED, ui::VKEY_VOLUME_DOWN,
+                                ui::EF_NONE);
+  ui::KeyEvent vol_up_release(ui::ET_KEY_RELEASED, ui::VKEY_VOLUME_UP,
+                              ui::EF_NONE);
+
+  AccessibilityController* controller =
+      Shell::Get()->accessibility_controller();
+
+  ASSERT_FALSE(controller->IsSpokenFeedbackEnabled());
+  SendKeyEvent(&vol_down_press);
+  SendKeyEvent(&vol_up_press);
+  WaitForAccessibilityStatusChanged();
+  ASSERT_TRUE(controller->IsSpokenFeedbackEnabled());
+  SendKeyEvent(&vol_down_release);
+  SendKeyEvent(&vol_up_release);
+
+  SendKeyEvent(&vol_down_press);
+  SendKeyEvent(&vol_up_press);
+  WaitForAccessibilityStatusChanged();
+  ASSERT_FALSE(controller->IsSpokenFeedbackEnabled());
+}
+
+}  // namespace ash
diff --git a/ash/accessibility/spoken_feedback_enabler.cc b/ash/accessibility/spoken_feedback_enabler.cc
new file mode 100644
index 0000000..c0e08d0
--- /dev/null
+++ b/ash/accessibility/spoken_feedback_enabler.cc
@@ -0,0 +1,50 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/accessibility/spoken_feedback_enabler.h"
+
+#include "ash/accessibility/accessibility_controller.h"
+#include "ash/shell.h"
+#include "ui/events/base_event_utils.h"
+
+namespace ash {
+
+namespace {
+
+// Delay between timer callbacks. Each one plays a tick sound.
+constexpr base::TimeDelta kTimerDelay = base::TimeDelta::FromMilliseconds(500);
+
+// The number of ticks of the timer before the first sound is generated.
+constexpr int kTimerTicksOfFirstSoundFeedback = 6;
+
+// The number of ticks of the timer before toggling spoken feedback.
+constexpr int kTimerTicksToToggleSpokenFeedback = 10;
+
+}  // namespace
+
+SpokenFeedbackEnabler::SpokenFeedbackEnabler() {
+  start_time_ = ui::EventTimeForNow();
+  timer_.Start(FROM_HERE, kTimerDelay, this, &SpokenFeedbackEnabler::OnTimer);
+}
+
+SpokenFeedbackEnabler::~SpokenFeedbackEnabler() {}
+
+void SpokenFeedbackEnabler::OnTimer() {
+  base::TimeTicks now = ui::EventTimeForNow();
+  double tick_count_f = (now - start_time_) / kTimerDelay;
+  int tick_count = roundf(tick_count_f);
+
+  AccessibilityController* delegate = Shell::Get()->accessibility_controller();
+  CHECK(delegate);
+  if (tick_count >= kTimerTicksOfFirstSoundFeedback &&
+      tick_count < kTimerTicksToToggleSpokenFeedback) {
+    delegate->PlaySpokenFeedbackToggleCountdown(tick_count);
+  } else if (tick_count == kTimerTicksToToggleSpokenFeedback) {
+    delegate->SetSpokenFeedbackEnabled(!delegate->IsSpokenFeedbackEnabled(),
+                                       A11Y_NOTIFICATION_SHOW);
+    timer_.Stop();
+  }
+}
+
+}  // namespace ash
diff --git a/ash/accessibility/spoken_feedback_enabler.h b/ash/accessibility/spoken_feedback_enabler.h
new file mode 100644
index 0000000..3d78f363
--- /dev/null
+++ b/ash/accessibility/spoken_feedback_enabler.h
@@ -0,0 +1,37 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_ACCESSIBILITY_SPOKEN_FEEDBACK_ENABLER_H_
+#define ASH_ACCESSIBILITY_SPOKEN_FEEDBACK_ENABLER_H_
+
+#include "ash/ash_export.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+
+namespace ash {
+
+// A class that enables ChromeVox based on a timer, providing progress
+// sound feedback.
+class ASH_EXPORT SpokenFeedbackEnabler {
+ public:
+  SpokenFeedbackEnabler();
+  ~SpokenFeedbackEnabler();
+
+ private:
+  // Handles ticks of the timer.
+  void OnTimer();
+
+  // The start time.
+  base::TimeTicks start_time_;
+
+  // A timer that triggers repeatedly until either cancel or the desired time
+  // elapsed.
+  base::RepeatingTimer timer_;
+
+  DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEnabler);
+};
+
+}  // namespace ash
+
+#endif  // ASH_ACCESSIBILITY_SPOKEN_FEEDBACK_ENABLER_H_
diff --git a/ash/accessibility/test_accessibility_controller_client.cc b/ash/accessibility/test_accessibility_controller_client.cc
index 0961ea4f..91563c7 100644
--- a/ash/accessibility/test_accessibility_controller_client.cc
+++ b/ash/accessibility/test_accessibility_controller_client.cc
@@ -61,7 +61,9 @@
 void TestAccessibilityControllerClient::PlaySpokenFeedbackToggleCountdown(
     int tick_count) {}
 
-void TestAccessibilityControllerClient::RequestSelectToSpeakStateChange() {}
+void TestAccessibilityControllerClient::RequestSelectToSpeakStateChange() {
+  ++select_to_speak_state_change_requests_;
+}
 
 int32_t TestAccessibilityControllerClient::GetPlayedEarconAndReset() {
   int32_t tmp = sound_key_;
diff --git a/ash/accessibility/test_accessibility_controller_client.h b/ash/accessibility/test_accessibility_controller_client.h
index 9233689..879a101 100644
--- a/ash/accessibility/test_accessibility_controller_client.h
+++ b/ash/accessibility/test_accessibility_controller_client.h
@@ -45,6 +45,9 @@
 
   mojom::AccessibilityAlert last_a11y_alert() const { return last_a11y_alert_; }
   ax::mojom::Gesture last_a11y_gesture() const { return last_a11y_gesture_; }
+  int select_to_speak_change_change_requests() const {
+    return select_to_speak_state_change_requests_;
+  }
 
  private:
   mojom::AccessibilityAlert last_a11y_alert_ = mojom::AccessibilityAlert::NONE;
@@ -54,6 +57,8 @@
 
   ax::mojom::Gesture last_a11y_gesture_ = ax::mojom::Gesture::kNone;
 
+  int select_to_speak_state_change_requests_ = 0;
+
   mojo::Binding<mojom::AccessibilityControllerClient> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(TestAccessibilityControllerClient);
diff --git a/ash/ash_constants.cc b/ash/ash_constants.cc
index 08d33c5..07ca148 100644
--- a/ash/ash_constants.cc
+++ b/ash/ash_constants.cc
@@ -16,10 +16,6 @@
 
 const SkColor kChromeOsBootColor = SkColorSetRGB(0xfe, 0xfe, 0xfe);
 
-const float kInactiveFrameButtonIconAlphaRatio = 0.2f;
-
-const float kInactiveFrameButtonIconAlphaRatioTouch = 0.43f;
-
 const int kDefaultLargeCursorSize = 64;
 
 }  // namespace ash
diff --git a/ash/ash_constants.h b/ash/ash_constants.h
index 879e8ce..fc30bec 100644
--- a/ash/ash_constants.h
+++ b/ash/ash_constants.h
@@ -28,12 +28,6 @@
 // Background color used for the Chrome OS boot splash screen.
 extern const SkColor kChromeOsBootColor;
 
-// The alpha to draw inactive browser frame icons with.
-ASH_EXPORT extern const float kInactiveFrameButtonIconAlphaRatio;
-
-// Similar to the above but for touch-optimized UI.
-ASH_EXPORT extern const float kInactiveFrameButtonIconAlphaRatioTouch;
-
 // The border color of keyboard focus for launcher items and system tray.
 constexpr SkColor kFocusBorderColor = SK_ColorTRANSPARENT;
 constexpr int kFocusBorderThickness = 0;
diff --git a/ash/ash_layout_constants.cc b/ash/ash_layout_constants.cc
index c5fcdab2..628d706 100644
--- a/ash/ash_layout_constants.cc
+++ b/ash/ash_layout_constants.cc
@@ -21,7 +21,7 @@
       return gfx::Size(kButtonWidth, kBrowserRestoredCaptionButtonHeight[mode]);
     }
     case AshLayoutSize::kNonBrowserCaption:
-      return gfx::Size(kButtonWidth, 33);
+      return gfx::Size(kButtonWidth, 32);
   }
 
   NOTREACHED();
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index a91ca1b..7fb4960 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -208,6 +208,9 @@
       <message name="IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED" desc="The message shown on a notification when spoken feedback is enabled">
         Press Ctrl + Alt + Z to disable spoken feedback.
       </message>
+      <message name="IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_TABLET" desc="The message shown on a notification when spoken feedback is enabled on a tablet">
+        Press and hold both volume keys for five seconds to disable spoken feedback.
+      </message>
       <message name="IDS_ASH_STATUS_TRAY_SPOKEN_FEEDBACK_ENABLED_TITLE" desc="The title message shown on a notification when spoken feedback is enabled">
         ChromeVox enabled
       </message>
@@ -1082,6 +1085,10 @@
         IME menu button
       </message>
 
+      <message name="IDS_ASH_SELECT_TO_SPEAK_TRAY_ACCESSIBLE_NAME" desc="The accessible text for the select-to-speak menu icon in the status tray.">
+        Select-to-Speak button
+      </message>
+
       <!-- Deprecated Accelerators Messages -->
       <!-- Shortcut keys MUST be connected with pluses (e.g. Ctrl+Shift+L). -->
       <message name="IDS_SHORTCUT_LOCK_SCREEN_OLD" desc="the old deprecated shortcut to lock the screen.">
diff --git a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
index 27f84b1..833fc49e 100644
--- a/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
+++ b/ash/components/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
@@ -1211,9 +1211,9 @@
       {// |categories|
        {ShortcutCategory::kAccessibility},
        IDS_KSV_DESCRIPTION_TOGGLE_DICTATION,
-       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       IDS_KSV_SHORTCUT_ONE_MODIFIER_ONE_KEY,
        // |accelerator_ids|
-       {{ui::VKEY_S, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN}}},
+       {{ui::VKEY_D, ui::EF_COMMAND_DOWN}}},
 
       {// |categories|
        {ShortcutCategory::kSystemAndDisplay},
diff --git a/ash/events/OWNERS b/ash/events/OWNERS
new file mode 100644
index 0000000..fbd7277
--- /dev/null
+++ b/ash/events/OWNERS
@@ -0,0 +1 @@
+per-file spoken_feedback_event_rewriter*=file://ui/accessibility/OWNERS
diff --git a/ash/events/event_rewriter_controller.cc b/ash/events/event_rewriter_controller.cc
index e8546e96..91871fd6 100644
--- a/ash/events/event_rewriter_controller.cc
+++ b/ash/events/event_rewriter_controller.cc
@@ -9,10 +9,12 @@
 #include "ash/display/mirror_window_controller.h"
 #include "ash/display/window_tree_host_manager.h"
 #include "ash/events/keyboard_driven_event_rewriter.h"
+#include "ash/events/spoken_feedback_event_rewriter.h"
 #include "ash/shell.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/events/event_rewriter.h"
+#include "ui/events/event_sink.h"
 #include "ui/events/event_source.h"
 
 namespace ash {
@@ -25,6 +27,11 @@
       std::make_unique<KeyboardDrivenEventRewriter>();
   keyboard_driven_event_rewriter_ = keyboard_driven_event_rewriter.get();
   AddEventRewriter(std::move(keyboard_driven_event_rewriter));
+
+  std::unique_ptr<SpokenFeedbackEventRewriter> spoken_feedback_event_rewriter =
+      std::make_unique<SpokenFeedbackEventRewriter>();
+  spoken_feedback_event_rewriter_ = spoken_feedback_event_rewriter.get();
+  AddEventRewriter(std::move(spoken_feedback_event_rewriter));
 }
 
 EventRewriterController::~EventRewriterController() {
@@ -67,6 +74,17 @@
   keyboard_driven_event_rewriter_->set_arrow_to_tab_rewriting_enabled(enabled);
 }
 
+void EventRewriterController::SetSpokenFeedbackEventRewriterDelegate(
+    mojom::SpokenFeedbackEventRewriterDelegatePtr delegate) {
+  spoken_feedback_event_rewriter_->SetDelegate(std::move(delegate));
+}
+
+void EventRewriterController::OnUnhandledSpokenFeedbackEvent(
+    std::unique_ptr<ui::Event> event) {
+  spoken_feedback_event_rewriter_->OnUnhandledSpokenFeedbackEvent(
+      std::move(event));
+}
+
 void EventRewriterController::OnHostInitialized(aura::WindowTreeHost* host) {
   for (const auto& rewriter : rewriters_)
     host->GetEventSource()->AddEventRewriter(rewriter.get());
diff --git a/ash/events/event_rewriter_controller.h b/ash/events/event_rewriter_controller.h
index 05c6637..04ef56f8 100644
--- a/ash/events/event_rewriter_controller.h
+++ b/ash/events/event_rewriter_controller.h
@@ -22,6 +22,7 @@
 namespace ash {
 
 class KeyboardDrivenEventRewriter;
+class SpokenFeedbackEventRewriter;
 
 // Owns ui::EventRewriters and ensures that they are added to each root window
 // EventSource, current and future, in the order that they are added to this.
@@ -42,6 +43,10 @@
   // mojom::EventRewriterController:
   void SetKeyboardDrivenEventRewriterEnabled(bool enabled) override;
   void SetArrowToTabRewritingEnabled(bool enabled) override;
+  void SetSpokenFeedbackEventRewriterDelegate(
+      mojom::SpokenFeedbackEventRewriterDelegatePtr delegate) override;
+  void OnUnhandledSpokenFeedbackEvent(
+      std::unique_ptr<ui::Event> event) override;
 
   // aura::EnvObserver:
   void OnWindowInitialized(aura::Window* window) override {}
@@ -51,9 +56,12 @@
   // The |EventRewriter|s managed by this controller.
   std::vector<std::unique_ptr<ui::EventRewriter>> rewriters_;
 
-  // A weak pointer the KeyboardDrivenEventRewriter owned in |rewriters_|.
+  // A weak pointer to the KeyboardDrivenEventRewriter owned in |rewriters_|.
   KeyboardDrivenEventRewriter* keyboard_driven_event_rewriter_;
 
+  // A weak pointer to the SpokenFeedbackEventRewriter owned in |rewriters_|.
+  SpokenFeedbackEventRewriter* spoken_feedback_event_rewriter_;
+
   // Bindings for the EventRewriterController mojo interface.
   mojo::BindingSet<mojom::EventRewriterController> bindings_;
 
diff --git a/ash/events/spoken_feedback_event_rewriter.cc b/ash/events/spoken_feedback_event_rewriter.cc
new file mode 100644
index 0000000..7ee2142
--- /dev/null
+++ b/ash/events/spoken_feedback_event_rewriter.cc
@@ -0,0 +1,60 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/events/spoken_feedback_event_rewriter.h"
+
+#include <string>
+#include <utility>
+
+#include "ash/accessibility/accessibility_controller.h"
+#include "ash/shell.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/events/event.h"
+#include "ui/events/event_sink.h"
+
+namespace ash {
+
+SpokenFeedbackEventRewriter::SpokenFeedbackEventRewriter() = default;
+
+SpokenFeedbackEventRewriter::~SpokenFeedbackEventRewriter() = default;
+
+void SpokenFeedbackEventRewriter::SetDelegate(
+    mojom::SpokenFeedbackEventRewriterDelegatePtr delegate) {
+  delegate_ = std::move(delegate);
+}
+
+void SpokenFeedbackEventRewriter::OnUnhandledSpokenFeedbackEvent(
+    std::unique_ptr<ui::Event> event) const {
+  DCHECK(event->IsKeyEvent()) << "Unexpected unhandled event type";
+  // For now, these events are sent directly to the primary display's EventSink.
+  // TODO: Pass the event to the original EventSource's other event rewriters.
+  ui::EventSink* sink = Shell::GetPrimaryRootWindow()->GetHost()->event_sink();
+  if (sink->OnEventFromSource(event.get()).dispatcher_destroyed) {
+    VLOG(0) << "Undispatched key " << event->AsKeyEvent()->key_code()
+            << " due to destroyed dispatcher.";
+  }
+}
+
+ui::EventRewriteStatus SpokenFeedbackEventRewriter::RewriteEvent(
+    const ui::Event& event,
+    std::unique_ptr<ui::Event>* new_event) {
+  if (!delegate_.is_bound() || !event.IsKeyEvent())
+    return ui::EVENT_REWRITE_CONTINUE;
+
+  if (!Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled())
+    return ui::EVENT_REWRITE_CONTINUE;
+
+  // TODO: Avoid passing events that will be reposted for system-wide dispatch.
+  delegate_->DispatchKeyEventToChromeVox(ui::Event::Clone(event));
+  return ui::EVENT_REWRITE_DISCARD;
+}
+
+ui::EventRewriteStatus SpokenFeedbackEventRewriter::NextDispatchEvent(
+    const ui::Event& last_event,
+    std::unique_ptr<ui::Event>* new_event) {
+  NOTREACHED();
+  return ui::EVENT_REWRITE_CONTINUE;
+}
+
+}  // namespace ash
diff --git a/ash/events/spoken_feedback_event_rewriter.h b/ash/events/spoken_feedback_event_rewriter.h
new file mode 100644
index 0000000..cd3568c
--- /dev/null
+++ b/ash/events/spoken_feedback_event_rewriter.h
@@ -0,0 +1,50 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_EVENTS_SPOKEN_FEEDBACK_EVENT_REWRITER_H_
+#define ASH_EVENTS_SPOKEN_FEEDBACK_EVENT_REWRITER_H_
+
+#include "ash/ash_export.h"
+#include "ash/public/interfaces/event_rewriter_controller.mojom.h"
+#include "base/macros.h"
+#include "ui/events/event_rewriter.h"
+
+namespace ash {
+
+// SpokenFeedbackEventRewriter sends key events to ChromeVox (via the delegate)
+// when spoken feedback is enabled. Continues dispatch of unhandled key events.
+// TODO(http://crbug.com/839541): Avoid reposting unhandled events.
+class ASH_EXPORT SpokenFeedbackEventRewriter : public ui::EventRewriter {
+ public:
+  SpokenFeedbackEventRewriter();
+  ~SpokenFeedbackEventRewriter() override;
+
+  // Set the delegate used to send key events to the ChromeVox extension.
+  void SetDelegate(mojom::SpokenFeedbackEventRewriterDelegatePtr delegate);
+  mojom::SpokenFeedbackEventRewriterDelegatePtr* get_delegate_for_testing() {
+    return &delegate_;
+  }
+
+  // Continue dispatch of events that were unhandled by the ChromeVox extension.
+  // NOTE: These events may be delivered out-of-order from non-ChromeVox events.
+  void OnUnhandledSpokenFeedbackEvent(std::unique_ptr<ui::Event> event) const;
+
+ private:
+  // ui::EventRewriter:
+  ui::EventRewriteStatus RewriteEvent(
+      const ui::Event& event,
+      std::unique_ptr<ui::Event>* new_event) override;
+  ui::EventRewriteStatus NextDispatchEvent(
+      const ui::Event& last_event,
+      std::unique_ptr<ui::Event>* new_event) override;
+
+  // The delegate used to send key events to the ChromeVox extension.
+  mojom::SpokenFeedbackEventRewriterDelegatePtr delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEventRewriter);
+};
+
+}  // namespace ash
+
+#endif  // ASH_EVENTS_SPOKEN_FEEDBACK_EVENT_REWRITER_H_
diff --git a/ash/events/spoken_feedback_event_rewriter_unittest.cc b/ash/events/spoken_feedback_event_rewriter_unittest.cc
new file mode 100644
index 0000000..8eb2109
--- /dev/null
+++ b/ash/events/spoken_feedback_event_rewriter_unittest.cc
@@ -0,0 +1,202 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/events/spoken_feedback_event_rewriter.h"
+
+#include <memory>
+#include <vector>
+
+#include "ash/accessibility/accessibility_controller.h"
+#include "ash/shell.h"
+#include "ash/test/ash_test_base.h"
+#include "base/macros.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/events/event.h"
+#include "ui/events/event_constants.h"
+#include "ui/events/event_rewriter.h"
+#include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/events/test/event_generator.h"
+
+namespace ash {
+namespace {
+
+// An event rewriter that simply records all events that it receives.
+class EventRecorder : public ui::EventRewriter {
+ public:
+  EventRecorder() = default;
+  ~EventRecorder() override = default;
+
+  // ui::EventRewriter:
+  ui::EventRewriteStatus RewriteEvent(
+      const ui::Event& event,
+      std::unique_ptr<ui::Event>* new_event) override {
+    recorded_event_count_++;
+    return ui::EVENT_REWRITE_CONTINUE;
+  }
+  ui::EventRewriteStatus NextDispatchEvent(
+      const ui::Event& last_event,
+      std::unique_ptr<ui::Event>* new_event) override {
+    NOTREACHED();
+    return ui::EVENT_REWRITE_CONTINUE;
+  }
+
+  // Count of events sent to the rewriter.
+  size_t recorded_event_count_ = 0;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(EventRecorder);
+};
+
+// A test implementation of the spoken feedback delegate interface.
+class TestDelegate : public mojom::SpokenFeedbackEventRewriterDelegate {
+ public:
+  TestDelegate() : binding_(this) {}
+  ~TestDelegate() override = default;
+
+  mojom::SpokenFeedbackEventRewriterDelegatePtr BindInterface() {
+    mojom::SpokenFeedbackEventRewriterDelegatePtr ptr;
+    binding_.Bind(MakeRequest(&ptr));
+    return ptr;
+  }
+
+  // Count of events sent to the delegate.
+  size_t recorded_event_count_ = 0;
+
+ private:
+  // SpokenFeedbackEventRewriterDelegate:
+  void DispatchKeyEventToChromeVox(std::unique_ptr<ui::Event> event) override {
+    recorded_event_count_++;
+  }
+
+  // The binding that backs the interface pointer held by the event rewriter.
+  mojo::Binding<ash::mojom::SpokenFeedbackEventRewriterDelegate> binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestDelegate);
+};
+
+class SpokenFeedbackEventRewriterTest : public ash::AshTestBase {
+ public:
+  SpokenFeedbackEventRewriterTest() {
+    spoken_feedback_event_rewriter_.SetDelegate(delegate_.BindInterface());
+  }
+
+  void SetUp() override {
+    ash::AshTestBase::SetUp();
+    generator_ = &AshTestBase::GetEventGenerator();
+    CurrentContext()->GetHost()->GetEventSource()->AddEventRewriter(
+        &spoken_feedback_event_rewriter_);
+    CurrentContext()->GetHost()->GetEventSource()->AddEventRewriter(
+        &event_recorder_);
+  }
+
+  void TearDown() override {
+    CurrentContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
+        &event_recorder_);
+    CurrentContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
+        &spoken_feedback_event_rewriter_);
+    generator_ = nullptr;
+    ash::AshTestBase::TearDown();
+  }
+
+  // Flush any messages to the test delegate and return events it has recorded.
+  size_t GetDelegateRecordedEventCount() {
+    spoken_feedback_event_rewriter_.get_delegate_for_testing()
+        ->FlushForTesting();
+    return delegate_.recorded_event_count_;
+  }
+
+ protected:
+  // A test spoken feedback delegate; simulates ChromeVox.
+  TestDelegate delegate_;
+  // Generates ui::Events from simulated user input.
+  ui::test::EventGenerator* generator_ = nullptr;
+  // Records events delivered to the next event rewriter after spoken feedback.
+  EventRecorder event_recorder_;
+
+ private:
+  SpokenFeedbackEventRewriter spoken_feedback_event_rewriter_;
+
+  DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEventRewriterTest);
+};
+
+// The delegate should not intercept events when spoken feedback is disabled.
+TEST_F(SpokenFeedbackEventRewriterTest, EventsNotConsumedWhenDisabled) {
+  AccessibilityController* controller =
+      Shell::Get()->accessibility_controller();
+  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+
+  generator_->PressKey(ui::VKEY_A, ui::EF_NONE);
+  EXPECT_EQ(1U, event_recorder_.recorded_event_count_);
+  EXPECT_EQ(0U, GetDelegateRecordedEventCount());
+  generator_->ReleaseKey(ui::VKEY_A, ui::EF_NONE);
+  EXPECT_EQ(2U, event_recorder_.recorded_event_count_);
+  EXPECT_EQ(0U, GetDelegateRecordedEventCount());
+
+  generator_->ClickLeftButton();
+  EXPECT_EQ(4U, event_recorder_.recorded_event_count_);
+  EXPECT_EQ(0U, GetDelegateRecordedEventCount());
+
+  generator_->GestureTapAt(gfx::Point());
+  EXPECT_EQ(6U, event_recorder_.recorded_event_count_);
+  EXPECT_EQ(0U, GetDelegateRecordedEventCount());
+}
+
+// The delegate should intercept key events when spoken feedback is enabled.
+TEST_F(SpokenFeedbackEventRewriterTest, KeyEventsConsumedWhenEnabled) {
+  AccessibilityController* controller =
+      Shell::Get()->accessibility_controller();
+  controller->SetSpokenFeedbackEnabled(true, A11Y_NOTIFICATION_NONE);
+  EXPECT_TRUE(controller->IsSpokenFeedbackEnabled());
+
+  generator_->PressKey(ui::VKEY_A, ui::EF_NONE);
+  EXPECT_EQ(0U, event_recorder_.recorded_event_count_);
+  EXPECT_EQ(1U, GetDelegateRecordedEventCount());
+  generator_->ReleaseKey(ui::VKEY_A, ui::EF_NONE);
+  EXPECT_EQ(0U, event_recorder_.recorded_event_count_);
+  EXPECT_EQ(2U, GetDelegateRecordedEventCount());
+
+  generator_->ClickLeftButton();
+  EXPECT_EQ(2U, event_recorder_.recorded_event_count_);
+  EXPECT_EQ(2U, GetDelegateRecordedEventCount());
+
+  generator_->GestureTapAt(gfx::Point());
+  EXPECT_EQ(4U, event_recorder_.recorded_event_count_);
+  EXPECT_EQ(2U, GetDelegateRecordedEventCount());
+}
+
+TEST_F(SpokenFeedbackEventRewriterTest, KeysNotEatenWithChromeVoxDisabled) {
+  AccessibilityController* controller =
+      Shell::Get()->accessibility_controller();
+  EXPECT_FALSE(controller->IsSpokenFeedbackEnabled());
+
+  // Send Search+Shift+Right.
+  generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
+  EXPECT_EQ(1U, event_recorder_.recorded_event_count_);
+  generator_->PressKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+  EXPECT_EQ(2U, event_recorder_.recorded_event_count_);
+
+  // Mock successful commands lookup and dispatch; shouldn't matter either way.
+  generator_->PressKey(ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+  EXPECT_EQ(3U, event_recorder_.recorded_event_count_);
+
+  // Released keys shouldn't get eaten.
+  generator_->ReleaseKey(ui::VKEY_RIGHT,
+                         ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
+  generator_->ReleaseKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN);
+  generator_->ReleaseKey(ui::VKEY_LWIN, 0);
+  EXPECT_EQ(6U, event_recorder_.recorded_event_count_);
+
+  // Try releasing more keys.
+  generator_->ReleaseKey(ui::VKEY_RIGHT, 0);
+  generator_->ReleaseKey(ui::VKEY_SHIFT, 0);
+  generator_->ReleaseKey(ui::VKEY_LWIN, 0);
+  EXPECT_EQ(9U, event_recorder_.recorded_event_count_);
+
+  EXPECT_EQ(0U, GetDelegateRecordedEventCount());
+}
+
+}  // namespace
+}  // namespace ash
diff --git a/ash/frame/caption_buttons/frame_caption_button.cc b/ash/frame/caption_buttons/frame_caption_button.cc
index 46b2aa4..fe6c13e9 100644
--- a/ash/frame/caption_buttons/frame_caption_button.cc
+++ b/ash/frame/caption_buttons/frame_caption_button.cc
@@ -5,18 +5,29 @@
 #include "ash/frame/caption_buttons/frame_caption_button.h"
 
 #include "ash/ash_constants.h"
-#include "ui/base/material_design/material_design_controller.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/animation/throb_animation.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/animation/flood_fill_ink_drop_ripple.h"
+#include "ui/views/animation/ink_drop_highlight.h"
+#include "ui/views/animation/ink_drop_impl.h"
+#include "ui/views/animation/ink_drop_mask.h"
+#include "ui/views/animation/ink_drop_ripple.h"
 
 namespace ash {
 
 namespace {
 
+// Ink drop parameters.
+constexpr float kInkDropVisibleOpacity = 0.06f;
+constexpr float kHighlightVisibleOpacity = 0.08f;
+constexpr int kInkDropCornerRadius = 14;
+constexpr gfx::Size kInkDropHighlightSize{2 * kInkDropCornerRadius,
+                                          2 * kInkDropCornerRadius};
+
 // The duration of the crossfade animation when swapping the button's images.
 const int kSwapImagesAnimationDurationMs = 200;
 
@@ -27,12 +38,6 @@
 // The ratio applied to the button's alpha when the button is disabled.
 const float kDisabledButtonAlphaRatio = 0.5f;
 
-// The colors and alpha values used for the button background hovered and
-// pressed states.
-// TODO(tdanderson|estade): Request these colors from ThemeProvider.
-const int kHoveredAlpha = 0x14;
-const int kPressedAlpha = 0x24;
-
 // Minimum theme light color contrast.
 const float kContrastLightItemThreshold = 3;
 // The amount to darken a light theme color by for use as foreground color.
@@ -49,6 +54,15 @@
   return color_utils::IsDark(background_color);
 }
 
+// Returns the amount by which the inkdrop ripple and mask should be insetted
+// from the button size in order to achieve a circular inkdrop with a size
+// equals to kInkDropHighlightSize.
+gfx::Insets GetInkdropInsets(const gfx::Size& button_size) {
+  return gfx::Insets(
+      (button_size.height() - kInkDropHighlightSize.height()) / 2,
+      (button_size.width() - kInkDropHighlightSize.width()) / 2);
+}
+
 }  // namespace
 
 // static
@@ -66,6 +80,11 @@
   set_animate_on_state_change(true);
   swap_images_animation_->Reset(1);
 
+  set_has_ink_drop_action_on_click(true);
+  SetInkDropMode(InkDropMode::ON);
+  set_ink_drop_visible_opacity(kInkDropVisibleOpacity);
+  UpdateInkDropBaseColor();
+
   // Do not flip the gfx::Canvas passed to the OnPaint() method. The snap left
   // and snap right button icons should not be flipped. The other icons are
   // horizontally symmetrical.
@@ -87,17 +106,12 @@
   }
 
   DCHECK_EQ(color_mode, ColorMode::kDefault);
-  if (ui::MaterialDesignController::IsTouchOptimizedUiEnabled())
-    return use_light_color ? gfx::kGoogleGrey100 : gfx::kGoogleGrey800;
-
-  return use_light_color ? SK_ColorWHITE : gfx::kChromeIconGrey;
+  return use_light_color ? gfx::kGoogleGrey200 : gfx::kGoogleGrey700;
 }
 
 // static
 float FrameCaptionButton::GetInactiveButtonColorAlphaRatio() {
-  return ui::MaterialDesignController::IsTouchOptimizedUiEnabled()
-             ? kInactiveFrameButtonIconAlphaRatioTouch
-             : kInactiveFrameButtonIconAlphaRatio;
+  return 0.38f;
 }
 
 void FrameCaptionButton::SetImage(CaptionButtonIcon icon,
@@ -174,22 +188,48 @@
   return views::PaintInfo::ScaleType::kUniformScaling;
 }
 
+std::unique_ptr<views::InkDrop> FrameCaptionButton::CreateInkDrop() {
+  auto ink_drop = std::make_unique<views::InkDropImpl>(this, size());
+  ink_drop->SetAutoHighlightMode(
+      views::InkDropImpl::AutoHighlightMode::SHOW_ON_RIPPLE);
+  ink_drop->SetShowHighlightOnHover(true);
+  return ink_drop;
+}
+
+std::unique_ptr<views::InkDropRipple> FrameCaptionButton::CreateInkDropRipple()
+    const {
+  return std::make_unique<views::FloodFillInkDropRipple>(
+      size(), GetInkdropInsets(size()), GetInkDropCenterBasedOnLastEvent(),
+      GetInkDropBaseColor(), ink_drop_visible_opacity());
+}
+
+std::unique_ptr<views::InkDropHighlight>
+FrameCaptionButton::CreateInkDropHighlight() const {
+  auto highlight = std::make_unique<views::InkDropHighlight>(
+      kInkDropHighlightSize, kInkDropCornerRadius,
+      gfx::PointF(GetMirroredRect(GetContentsBounds()).CenterPoint()),
+      GetInkDropBaseColor());
+  highlight->set_visible_opacity(kHighlightVisibleOpacity);
+  return highlight;
+}
+
+std::unique_ptr<views::InkDropMask> FrameCaptionButton::CreateInkDropMask()
+    const {
+  return std::make_unique<views::RoundRectInkDropMask>(
+      size(), GetInkdropInsets(size()), kInkDropCornerRadius);
+}
+
+void FrameCaptionButton::SetBackgroundColor(SkColor background_color) {
+  background_color_ = background_color;
+  UpdateInkDropBaseColor();
+}
+
+void FrameCaptionButton::SetColorMode(ColorMode color_mode) {
+  color_mode_ = color_mode;
+  UpdateInkDropBaseColor();
+}
+
 void FrameCaptionButton::PaintButtonContents(gfx::Canvas* canvas) {
-  SkAlpha bg_alpha = SK_AlphaTRANSPARENT;
-  if (hover_animation().is_animating())
-    bg_alpha = hover_animation().CurrentValueBetween(0, kHoveredAlpha);
-  else if (state() == STATE_HOVERED)
-    bg_alpha = kHoveredAlpha;
-  else if (state() == STATE_PRESSED)
-    bg_alpha = kPressedAlpha;
-
-  if (bg_alpha != SK_AlphaTRANSPARENT) {
-    canvas->DrawColor(SkColorSetA(UseLightColor(color_mode_, background_color_)
-                                      ? SK_ColorWHITE
-                                      : SK_ColorBLACK,
-                                  bg_alpha));
-  }
-
   int icon_alpha = swap_images_animation_->CurrentValueBetween(0, 255);
   int crossfade_icon_alpha = 0;
   if (icon_alpha < static_cast<int>(kFadeOutRatio * 255))
@@ -239,4 +279,10 @@
   return base_alpha * inactive_alpha;
 }
 
+void FrameCaptionButton::UpdateInkDropBaseColor() {
+  set_ink_drop_base_color(UseLightColor(color_mode_, background_color_)
+                              ? SK_ColorWHITE
+                              : SK_ColorBLACK);
+}
+
 }  // namespace ash
diff --git a/ash/frame/caption_buttons/frame_caption_button.h b/ash/frame/caption_buttons/frame_caption_button.h
index 2cc08c81..cb94faa6 100644
--- a/ash/frame/caption_buttons/frame_caption_button.h
+++ b/ash/frame/caption_buttons/frame_caption_button.h
@@ -59,11 +59,15 @@
   void OnGestureEvent(ui::GestureEvent* event) override;
   views::PaintInfo::ScaleType GetPaintScaleType() const override;
 
-  void set_background_color(SkColor background_color) {
-    background_color_ = background_color;
-  }
+  // views::InkDropHostView:
+  std::unique_ptr<views::InkDrop> CreateInkDrop() override;
+  std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override;
+  std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight()
+      const override;
+  std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override;
 
-  void set_color_mode(ColorMode color_mode) { color_mode_ = color_mode; }
+  void SetBackgroundColor(SkColor background_color);
+  void SetColorMode(ColorMode color_mode);
 
   void set_paint_as_active(bool paint_as_active) {
     paint_as_active_ = paint_as_active;
@@ -84,6 +88,8 @@
   // active state.
   int GetAlphaForIcon(int base_alpha) const;
 
+  void UpdateInkDropBaseColor();
+
   // The button's current icon.
   CaptionButtonIcon icon_;
 
diff --git a/ash/frame/caption_buttons/frame_caption_button_container_view.cc b/ash/frame/caption_buttons/frame_caption_button_container_view.cc
index 6cdda6e..11b3c4795 100644
--- a/ash/frame/caption_buttons/frame_caption_button_container_view.cc
+++ b/ash/frame/caption_buttons/frame_caption_button_container_view.cc
@@ -241,18 +241,18 @@
 
 void FrameCaptionButtonContainerView::SetColorMode(
     FrameCaptionButton::ColorMode color_mode) {
-  menu_button_->set_color_mode(color_mode);
-  minimize_button_->set_color_mode(color_mode);
-  size_button_->set_color_mode(color_mode);
-  close_button_->set_color_mode(color_mode);
+  menu_button_->SetColorMode(color_mode);
+  minimize_button_->SetColorMode(color_mode);
+  size_button_->SetColorMode(color_mode);
+  close_button_->SetColorMode(color_mode);
 }
 
 void FrameCaptionButtonContainerView::SetBackgroundColor(
     SkColor background_color) {
-  menu_button_->set_background_color(background_color);
-  minimize_button_->set_background_color(background_color);
-  size_button_->set_background_color(background_color);
-  close_button_->set_background_color(background_color);
+  menu_button_->SetBackgroundColor(background_color);
+  minimize_button_->SetBackgroundColor(background_color);
+  size_button_->SetBackgroundColor(background_color);
+  close_button_->SetBackgroundColor(background_color);
 }
 
 void FrameCaptionButtonContainerView::ResetWindowControls() {
diff --git a/ash/frame/custom_frame_view_ash_unittest.cc b/ash/frame/custom_frame_view_ash_unittest.cc
index 4690a5f..c7175f3 100644
--- a/ash/frame/custom_frame_view_ash_unittest.cc
+++ b/ash/frame/custom_frame_view_ash_unittest.cc
@@ -523,7 +523,7 @@
       delegate, kShellWindowId_DefaultContainer, window_bounds);
 
   // The height is smaller by the top border height.
-  gfx::Size client_bounds(200, 67);
+  gfx::Size client_bounds(200, 68);
   CustomFrameViewAsh* custom_frame_view = delegate->custom_frame_view();
   EXPECT_EQ(client_bounds, widget->client_view()->GetLocalBounds().size());
 
@@ -539,8 +539,8 @@
   widget->GetRootView()->Layout();
   EXPECT_EQ(client_bounds, widget->client_view()->GetLocalBounds().size());
   EXPECT_TRUE(widget->non_client_view()->frame_view()->visible());
-  EXPECT_EQ(33, delegate->GetCustomFrameViewTopBorderHeight());
-  EXPECT_EQ(gfx::Rect(gfx::Point(10, 43), client_bounds),
+  EXPECT_EQ(32, delegate->GetCustomFrameViewTopBorderHeight());
+  EXPECT_EQ(gfx::Rect(gfx::Point(10, 42), client_bounds),
             custom_frame_view->GetClientBoundsForWindowBounds(window_bounds));
 }
 
@@ -668,7 +668,7 @@
   EXPECT_FALSE(wide_header_view->in_immersive_mode());
   // visible fraction should be ignored in non immersive.
   wide_header_view->SetVisibleFraction(0.5);
-  EXPECT_EQ(33, wide_header_view->GetPreferredOnScreenHeight());
+  EXPECT_EQ(32, wide_header_view->GetPreferredOnScreenHeight());
 
   UpdateDisplay("1234x800");
   EXPECT_EQ(1234,
diff --git a/ash/frame/default_frame_header.cc b/ash/frame/default_frame_header.cc
index 2302a6ea..3e8de22 100644
--- a/ash/frame/default_frame_header.cc
+++ b/ash/frame/default_frame_header.cc
@@ -39,7 +39,7 @@
 const SkColor kTitleTextColor = SkColorSetRGB(40, 40, 40);
 const SkColor kLightTitleTextColor = SK_ColorWHITE;
 // The default color of the frame.
-const SkColor kDefaultFrameColor = SkColorSetRGB(242, 242, 242);
+const SkColor kDefaultFrameColor = SkColorSetRGB(0xFD, 0xFE, 0xFF);
 // Duration of crossfade animation for activating and deactivating frame.
 const int kActivationCrossfadeDurationMs = 200;
 
@@ -171,8 +171,8 @@
 
   int origin = 0;
   if (back_button_) {
-    back_button_->set_background_color(GetCurrentFrameColor());
-    back_button_->set_color_mode(button_color_mode_);
+    back_button_->SetBackgroundColor(GetCurrentFrameColor());
+    back_button_->SetColorMode(button_color_mode_);
     gfx::Size size = back_button_->GetPreferredSize();
     back_button_->SetBounds(0, 0, size.width(),
                             caption_button_container_size.height());
@@ -319,8 +319,8 @@
   caption_button_container_->SetBackgroundColor(GetCurrentFrameColor());
   caption_button_container_->SetColorMode(button_color_mode_);
   if (back_button_) {
-    back_button_->set_background_color(GetCurrentFrameColor());
-    back_button_->set_color_mode(button_color_mode_);
+    back_button_->SetBackgroundColor(GetCurrentFrameColor());
+    back_button_->SetColorMode(button_color_mode_);
     back_button_->SetImage(CAPTION_BUTTON_ICON_BACK,
                            FrameCaptionButton::ANIMATE_NO,
                            kWindowControlBackIcon);
@@ -368,8 +368,7 @@
 gfx::Rect DefaultFrameHeader::GetAvailableTitleBounds() const {
   views::View* left_view = left_header_view_ ? left_header_view_ : back_button_;
   return FrameHeaderUtil::GetAvailableTitleBounds(
-      left_view, caption_button_container_,
-      views::NativeWidgetAura::GetWindowTitleFontList(), GetHeaderHeight());
+      left_view, caption_button_container_, GetHeaderHeight());
 }
 
 bool DefaultFrameHeader::UsesCustomFrameColors() const {
diff --git a/ash/frame/frame_header_util.cc b/ash/frame/frame_header_util.cc
index 49f9a97..4622bc9 100644
--- a/ash/frame/frame_header_util.cc
+++ b/ash/frame/frame_header_util.cc
@@ -12,6 +12,7 @@
 #include "ui/gfx/font_list.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/views/view.h"
+#include "ui/views/widget/native_widget_aura.h"
 #include "ui/views/widget/widget.h"
 
 namespace {
@@ -62,15 +63,20 @@
 gfx::Rect FrameHeaderUtil::GetAvailableTitleBounds(
     const views::View* left_view,
     const views::View* right_view,
-    const gfx::FontList& title_font_list,
     int header_height) {
   const int x = left_view ? left_view->bounds().right() + kTitleIconOffsetX
                           : kTitleNoIconOffsetX;
-  const int title_height = title_font_list.GetHeight();
-  // Floor when computing the center of |caption_button_container| and when
-  // computing the center of the text.
+  const int title_height =
+      views::NativeWidgetAura::GetWindowTitleFontList().GetHeight();
   DCHECK_LE(right_view->height(), header_height);
-  const int y = std::max(0, (header_height - title_height) / 2);
+  // We want to align the center points of the header and title vertically.
+  // Note that we can't just do (header_height - title_height) / 2, since this
+  // won't make the center points align perfectly vertically due to rounding.
+  // Floor when computing the center of |header_height| and when computing the
+  // center of the text.
+  const int header_center_y = header_height / 2;
+  const int title_center_y = title_height / 2;
+  const int y = std::max(0, header_center_y - title_center_y);
   const int width =
       std::max(0, right_view->x() - kTitleCaptionButtonSpacing - x);
   return gfx::Rect(x, y, width, title_height);
diff --git a/ash/frame/frame_header_util.h b/ash/frame/frame_header_util.h
index f6f733e..24e5f56e 100644
--- a/ash/frame/frame_header_util.h
+++ b/ash/frame/frame_header_util.h
@@ -9,7 +9,6 @@
 #include "base/macros.h"
 
 namespace gfx {
-class FontList;
 class Rect;
 }  // namespace gfx
 namespace views {
@@ -39,7 +38,6 @@
   // if there is no view to the left of the title.
   static gfx::Rect GetAvailableTitleBounds(const views::View* left_view,
                                            const views::View* right_view,
-                                           const gfx::FontList& title_font_list,
                                            int header_height);
 
   // Returns true if the header for |widget| can animate to new visuals when the
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index 44088a5..dcefdf3 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -572,7 +572,37 @@
 void LockContentsView::OnPublicSessionKeyboardLayoutsChanged(
     const AccountId& account_id,
     const std::string& locale,
-    const std::vector<mojom::InputMethodItemPtr>& keyboard_layouts) {}
+    const std::vector<mojom::InputMethodItemPtr>& keyboard_layouts) {
+  // Update expanded view because keyboard layouts is user interactive content.
+  // I.e. user selects a language locale and the corresponding keyboard layouts
+  // will be changed.
+  if (expanded_view_->visible() &&
+      expanded_view_->current_user()->basic_user_info->account_id ==
+          account_id) {
+    mojom::LoginUserInfoPtr user_info = expanded_view_->current_user()->Clone();
+    user_info->public_account_info->default_locale = locale;
+    user_info->public_account_info->keyboard_layouts =
+        mojo::Clone(keyboard_layouts);
+    expanded_view_->UpdateForUser(user_info);
+  }
+
+  LoginUserView* user_view = TryToFindUserView(account_id);
+  if (!user_view || !IsPublicAccountUser(user_view->current_user())) {
+    LOG(ERROR) << "Unable to find public account user.";
+    return;
+  }
+
+  mojom::LoginUserInfoPtr user_info = user_view->current_user()->Clone();
+  // Skip updating keyboard layouts if |locale| is not the default locale
+  // of the user. I.e. user changed the default locale in the expanded view,
+  // and it should be handled by expanded view.
+  if (user_info->public_account_info->default_locale != locale)
+    return;
+
+  user_info->public_account_info->keyboard_layouts =
+      mojo::Clone(keyboard_layouts);
+  user_view->UpdateForUser(user_info, false /*animate*/);
+}
 
 void LockContentsView::OnDetachableBasePairingStatusChanged(
     DetachableBasePairingStatus pairing_status) {
diff --git a/ash/login/ui/lock_screen_sanity_unittest.cc b/ash/login/ui/lock_screen_sanity_unittest.cc
index 9642b6e..683ba7e6 100644
--- a/ash/login/ui/lock_screen_sanity_unittest.cc
+++ b/ash/login/ui/lock_screen_sanity_unittest.cc
@@ -416,8 +416,7 @@
   // dropdown does not result in an interactive/focusable view.
   focus_and_submit(secondary().dropdown());
   EXPECT_TRUE(secondary().menu());
-  EXPECT_FALSE(
-      HasFocusInAnyChildView(secondary().menu()->bubble_view_for_test()));
+  EXPECT_FALSE(HasFocusInAnyChildView(secondary().menu()->bubble_view()));
   // TODO(jdufault): Run submit() and then EXPECT_FALSE(secondary().menu()); to
   // verify that double-enter closes the bubble.
 
@@ -427,7 +426,7 @@
   // well as removes the user from the UI.
   focus_and_submit(primary().dropdown());
   EXPECT_TRUE(primary().menu());
-  EXPECT_TRUE(HasFocusInAnyChildView(primary().menu()->bubble_view_for_test()));
+  EXPECT_TRUE(HasFocusInAnyChildView(primary().menu()->bubble_view()));
   EXPECT_CALL(*client, OnRemoveUserWarningShown()).Times(1);
   submit();
   EXPECT_CALL(*client, RemoveUser(users()[0]->basic_user_info->account_id))
diff --git a/ash/login/ui/login_bubble.cc b/ash/login/ui/login_bubble.cc
index 8e1d5ce..ed4da72 100644
--- a/ash/login/ui/login_bubble.cc
+++ b/ash/login/ui/login_bubble.cc
@@ -13,6 +13,7 @@
 #include "ash/login/ui/lock_screen.h"
 #include "ash/login/ui/lock_window.h"
 #include "ash/login/ui/login_button.h"
+#include "ash/login/ui/login_menu_view.h"
 #include "ash/login/ui/non_accessible_view.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shell.h"
@@ -404,7 +405,7 @@
   bool had_focus = bubble_opener_->HasFocus();
   Show();
   if (had_focus) {
-    // Try to focus the bubble view only if the tooltip was focused.
+    // Try to focus the bubble view only if the bubble opener was focused.
     bubble_view_->RequestFocus();
   }
 }
@@ -419,10 +420,36 @@
   Show();
 }
 
+void LoginBubble::ShowSelectionMenu(LoginMenuView* menu,
+                                    LoginButton* bubble_opener) {
+  if (bubble_view_)
+    CloseImmediately();
+
+  flags_ = kFlagsNone;
+  bubble_opener_ = bubble_opener;
+  const bool had_focus = bubble_opener_->HasFocus();
+
+  // Transfer the ownership of |menu| to bubble widget.
+  bubble_view_ = menu;
+  Show();
+
+  if (had_focus) {
+    // Try to focus the bubble view only if the bubble opener was focused.
+    bubble_view_->RequestFocus();
+  }
+}
+
 void LoginBubble::Close() {
   ScheduleAnimation(false /*visible*/);
 }
 
+void LoginBubble::CloseImmediately() {
+  DCHECK(bubble_view_);
+  bubble_view_->layer()->GetAnimator()->RemoveObserver(this);
+  bubble_view_->GetWidget()->Close();
+  is_visible_ = false;
+}
+
 bool LoginBubble::IsVisible() {
   return bubble_view_ && bubble_view_->GetWidget()->IsVisible();
 }
@@ -490,13 +517,6 @@
   bubble_view_->NotifyAccessibilityEvent(ax::mojom::Event::kAlert, true);
 }
 
-void LoginBubble::CloseImmediately() {
-  DCHECK(bubble_view_);
-  bubble_view_->layer()->GetAnimator()->RemoveObserver(this);
-  bubble_view_->GetWidget()->Close();
-  is_visible_ = false;
-}
-
 void LoginBubble::ProcessPressedEvent(const ui::LocatedEvent* event) {
   if (!bubble_view_)
     return;
diff --git a/ash/login/ui/login_bubble.h b/ash/login/ui/login_bubble.h
index ff1903a..1ef3aa0 100644
--- a/ash/login/ui/login_bubble.h
+++ b/ash/login/ui/login_bubble.h
@@ -15,6 +15,7 @@
 
 namespace ash {
 class LoginButton;
+class LoginMenuView;
 
 // A wrapper for the bubble view in the login screen.
 // This class observes keyboard events, mouse clicks and touch down events
@@ -58,10 +59,18 @@
   // Shows a tooltip.
   void ShowTooltip(const base::string16& message, views::View* anchor_view);
 
+  // Shows a selection menu.
+  void ShowSelectionMenu(LoginMenuView* menu, LoginButton* bubble_opener);
+
   // Schedule animation for closing the bubble.
   // The bubble widget will be closed when the animation is ended.
   void Close();
 
+  // Close the bubble immediately, without scheduling animation.
+  // Used to clean up old bubble widget when a new bubble is going to be
+  // created or it will be called before anchor view is hidden.
+  void CloseImmediately();
+
   // True if the bubble is visible.
   bool IsVisible();
 
@@ -80,17 +89,12 @@
   void OnLayerAnimationScheduled(
       ui::LayerAnimationSequence* sequence) override{};
 
-  LoginBaseBubbleView* bubble_view_for_test() { return bubble_view_; }
+  LoginBaseBubbleView* bubble_view() { return bubble_view_; }
 
  private:
   // Show the bubble widget and schedule animation for bubble showing.
   void Show();
 
-  // Close the bubble immediately, without scheduling animation.
-  // Used to clean up old bubble widget when a new bubble is
-  // going to be created.
-  void CloseImmediately();
-
   void ProcessPressedEvent(const ui::LocatedEvent* event);
 
   // Starts show/hide animation.
diff --git a/ash/login/ui/login_bubble_unittest.cc b/ash/login/ui/login_bubble_unittest.cc
index 1f4b83c3..f93da586 100644
--- a/ash/login/ui/login_bubble_unittest.cc
+++ b/ash/login/ui/login_bubble_unittest.cc
@@ -7,8 +7,10 @@
 
 #include "ash/login/ui/login_bubble.h"
 #include "ash/login/ui/login_button.h"
+#include "ash/login/ui/login_menu_view.h"
 #include "ash/login/ui/login_test_base.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/animation/test/ink_drop_host_view_test_api.h"
@@ -35,6 +37,29 @@
 // Non zero size for the bubble anchor view.
 constexpr int kBubbleAnchorViewSizeDp = 100;
 
+std::vector<LoginMenuView::Item> PopulateMenuItems() {
+  std::vector<LoginMenuView::Item> items;
+  // Add one regular item.
+  LoginMenuView::Item item1;
+  item1.title = "Regular Item 1";
+  item1.is_group = false;
+  item1.selected = true;
+  items.push_back(item1);
+
+  // Add one group item.
+  LoginMenuView::Item item2;
+  item2.title = "Group Item 2";
+  item2.is_group = true;
+  items.push_back(item2);
+
+  // Add another regular item.
+  LoginMenuView::Item item3;
+  item3.title = "Regular Item 2";
+  item3.is_group = false;
+  items.push_back(item3);
+  return items;
+}
+
 class LoginBubbleTest : public LoginTestBase {
  protected:
   LoginBubbleTest() = default;
@@ -79,6 +104,12 @@
         std::move(on_remove_show_warning), std::move(on_remove));
   }
 
+  void ShowSelectionMenu(const LoginMenuView::OnSelect& on_select) {
+    LoginMenuView* view =
+        new LoginMenuView(PopulateMenuItems(), container_, on_select);
+    bubble_->ShowSelectionMenu(view, bubble_opener_);
+  }
+
   // Owned by test widget view hierarchy.
   views::View* container_ = nullptr;
   // Owned by test widget view hierarchy.
@@ -99,7 +130,7 @@
   bubble_->ShowTooltip(base::string16(), bubble_opener_);
   EXPECT_TRUE(bubble_->IsVisible());
 
-  LoginBaseBubbleView* bubble_view = bubble_->bubble_view_for_test();
+  LoginBaseBubbleView* bubble_view = bubble_->bubble_view();
   EXPECT_EQ(bubble_view->GetDialogButtons(), ui::DIALOG_BUTTON_NONE);
   EXPECT_EQ(bubble_view->width(), kBubbleTotalWidthDp);
   EXPECT_EQ(bubble_view->color(), SK_ColorBLACK);
@@ -151,7 +182,7 @@
 
   // Verifies that mouse event on the bubble itself won't close the bubble.
   generator.MoveMouseTo(
-      bubble_->bubble_view_for_test()->GetBoundsInScreen().CenterPoint());
+      bubble_->bubble_view()->GetBoundsInScreen().CenterPoint());
   generator.ClickLeftButton();
   EXPECT_TRUE(bubble_->IsVisible());
 
@@ -179,7 +210,7 @@
 
   // Verifies that gesture event on the bubble itself won't close the bubble.
   generator.GestureTapAt(
-      bubble_->bubble_view_for_test()->GetBoundsInScreen().CenterPoint());
+      bubble_->bubble_view()->GetBoundsInScreen().CenterPoint());
   EXPECT_TRUE(bubble_->IsVisible());
 
   // Verifies that gesture event on the other view will close the bubble.
@@ -229,9 +260,8 @@
   EXPECT_TRUE(bubble_->IsVisible());
 
   // Focus the remove user button.
-  views::View* remove_user_button =
-      bubble_->bubble_view_for_test()->GetViewByID(
-          LoginBubble::kUserMenuRemoveUserButtonIdForTest);
+  views::View* remove_user_button = bubble_->bubble_view()->GetViewByID(
+      LoginBubble::kUserMenuRemoveUserButtonIdForTest);
   remove_user_button->RequestFocus();
   EXPECT_TRUE(remove_user_button->HasFocus());
 
@@ -276,7 +306,7 @@
 
   // Verifies that mouse event on the bubble itself won't close the bubble.
   generator.MoveMouseTo(
-      bubble_->bubble_view_for_test()->GetBoundsInScreen().CenterPoint());
+      bubble_->bubble_view()->GetBoundsInScreen().CenterPoint());
   generator.ClickLeftButton();
   EXPECT_TRUE(bubble_->IsVisible());
 
@@ -296,7 +326,7 @@
 
   // Verifies that gesture event on the bubble itself won't close the bubble.
   generator.GestureTapAt(
-      bubble_->bubble_view_for_test()->GetBoundsInScreen().CenterPoint());
+      bubble_->bubble_view()->GetBoundsInScreen().CenterPoint());
   EXPECT_TRUE(bubble_->IsVisible());
 
   // Verifies that gesture event on the other view will close the bubble.
@@ -315,7 +345,7 @@
 
   // Verifies that mouse event on the bubble itself won't close the bubble.
   generator.MoveMouseTo(
-      bubble_->bubble_view_for_test()->GetBoundsInScreen().CenterPoint());
+      bubble_->bubble_view()->GetBoundsInScreen().CenterPoint());
   generator.ClickLeftButton();
   EXPECT_TRUE(bubble_->IsVisible());
 
@@ -326,7 +356,7 @@
 
   // Verifies that gesture event on the bubble itself won't close the bubble.
   generator.GestureTapAt(
-      bubble_->bubble_view_for_test()->GetBoundsInScreen().CenterPoint());
+      bubble_->bubble_view()->GetBoundsInScreen().CenterPoint());
   EXPECT_TRUE(bubble_->IsVisible());
 
   // Verifies that gesture event on the other view won't close the bubble.
@@ -343,4 +373,57 @@
   EXPECT_FALSE(bubble_->IsVisible());
 }
 
+TEST_F(LoginBubbleTest, TestShowSelectionMenu) {
+  ui::test::EventGenerator& generator = GetEventGenerator();
+
+  EXPECT_FALSE(bubble_->IsVisible());
+  LoginMenuView::Item selected_item;
+  bool selected = false;
+  ShowSelectionMenu(base::BindLambdaForTesting([&](LoginMenuView::Item item) {
+    selected_item = item;
+    selected = true;
+  }));
+  EXPECT_TRUE(bubble_->IsVisible());
+
+  // Verifies that regular item 1 is selectable.
+  LoginMenuView* menu_view =
+      static_cast<LoginMenuView*>(bubble_->bubble_view());
+  LoginMenuView::TestApi test_api1(menu_view);
+  EXPECT_TRUE(test_api1.contents()->child_at(0)->HasFocus());
+  generator.PressKey(ui::KeyboardCode::VKEY_RETURN, 0 /*flag*/);
+  EXPECT_FALSE(bubble_->IsVisible());
+  EXPECT_EQ(selected_item.title, "Regular Item 1");
+  EXPECT_TRUE(selected);
+
+  // Verfies that group item 2 is not selectable.
+  selected = false;
+  ShowSelectionMenu(base::BindLambdaForTesting([&](LoginMenuView::Item item) {
+    selected_item = item;
+    selected = true;
+  }));
+  EXPECT_TRUE(bubble_->IsVisible());
+  menu_view = static_cast<LoginMenuView*>(bubble_->bubble_view());
+  LoginMenuView::TestApi test_api2(menu_view);
+  test_api2.contents()->child_at(1)->RequestFocus();
+  generator.PressKey(ui::KeyboardCode::VKEY_RETURN, 0 /*flag*/);
+  EXPECT_TRUE(bubble_->IsVisible());
+  EXPECT_FALSE(selected);
+
+  // Verifies up/down arrow key can navigate menu entries.
+  generator.PressKey(ui::KeyboardCode::VKEY_UP, 0 /*flag*/);
+  EXPECT_TRUE(test_api2.contents()->child_at(0)->HasFocus());
+  generator.PressKey(ui::KeyboardCode::VKEY_UP, 0 /*flag*/);
+  EXPECT_TRUE(test_api2.contents()->child_at(0)->HasFocus());
+
+  generator.PressKey(ui::KeyboardCode::VKEY_DOWN, 0 /*flag*/);
+  // Group item is skipped in up/down key navigation.
+  EXPECT_TRUE(test_api2.contents()->child_at(2)->HasFocus());
+  generator.PressKey(ui::KeyboardCode::VKEY_DOWN, 0 /*flag*/);
+  EXPECT_TRUE(test_api2.contents()->child_at(2)->HasFocus());
+  EXPECT_TRUE(bubble_->IsVisible());
+
+  bubble_->Close();
+  EXPECT_FALSE(bubble_->IsVisible());
+}
+
 }  // namespace ash
diff --git a/ash/login/ui/login_expanded_public_account_view.cc b/ash/login/ui/login_expanded_public_account_view.cc
index eabf3e7..539c0ec 100644
--- a/ash/login/ui/login_expanded_public_account_view.cc
+++ b/ash/login/ui/login_expanded_public_account_view.cc
@@ -6,6 +6,9 @@
 
 #include "ash/login/login_screen_controller.h"
 #include "ash/login/ui/arrow_button_view.h"
+#include "ash/login/ui/login_bubble.h"
+#include "ash/login/ui/login_button.h"
+#include "ash/login/ui/login_menu_view.h"
 #include "ash/login/ui/login_user_view.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shell.h"
@@ -80,15 +83,16 @@
 }  // namespace
 
 // Button with text on the left side and an icon on the right side.
-class SelectionButtonView : public views::Button {
+class SelectionButtonView : public LoginButton {
  public:
   SelectionButtonView(const base::string16& text,
                       views::ButtonListener* listener)
-      : views::Button(listener) {
+      : LoginButton(listener) {
     SetPaintToLayer();
     layer()->SetFillsBoundsOpaquely(false);
     SetFocusBehavior(FocusBehavior::ALWAYS);
     SetLayoutManager(std::make_unique<views::FillLayout>());
+    SetInkDropMode(InkDropHostView::InkDropMode::OFF);
 
     auto add_horizontal_margin = [&](int width,
                                      views::View* parent) -> views::View* {
@@ -148,6 +152,11 @@
   }
 
   void SetTextColor(SkColor color) { label_->SetEnabledColor(color); }
+  void SetText(const base::string16& text) {
+    SetAccessibleName(text);
+    label_->SetText(text);
+    Layout();
+  }
 
   void SetIcon(const gfx::VectorIcon& icon, SkColor color) {
     icon_->SetImage(gfx::CreateVectorIcon(icon, color));
@@ -169,7 +178,10 @@
                       public views::ButtonListener,
                       public views::StyledLabelListener {
  public:
-  RightPaneView() {
+  RightPaneView()
+      : language_menu_(std::make_unique<LoginBubble>()),
+        keyboard_menu_(std::make_unique<LoginBubble>()),
+        weak_factory_(this) {
     SetPreferredSize(
         gfx::Size(kExpandedViewWidthDp / 2, kExpandedViewHeightDp));
     SetBorder(views::CreateEmptyBorder(gfx::Insets(kRightPaneMarginDp)));
@@ -313,15 +325,35 @@
   void ButtonPressed(views::Button* sender, const ui::Event& event) override {
     if (sender == advanced_view_button_) {
       show_advanced_view_ = !show_advanced_view_;
+      show_advanced_changed_by_user_ = true;
       Layout();
     } else if (sender == submit_button_) {
       Shell::Get()->login_screen_controller()->LaunchPublicSession(
-          current_user_->basic_user_info->account_id, selected_locale_,
-          selected_keyboard_);
+          current_user_->basic_user_info->account_id,
+          selected_language_item_.value, selected_keyboard_item_.value);
+    } else if (sender == language_selection_) {
+      if (!language_menu_->IsVisible()) {
+        LoginMenuView* view = new LoginMenuView(
+            language_items_, language_selection_ /*anchor_view*/,
+            base::BindRepeating(&RightPaneView::OnLanguageSelected,
+                                weak_factory_.GetWeakPtr()));
+        language_menu_->ShowSelectionMenu(
+            view, language_selection_ /*bubble_opener*/);
+      } else {
+        language_menu_->Close();
+      }
+    } else if (sender == keyboard_selection_) {
+      if (!keyboard_menu_->IsVisible()) {
+        LoginMenuView* view = new LoginMenuView(
+            keyboard_items_, keyboard_selection_ /*anchor_view*/,
+            base::BindRepeating(&RightPaneView::OnKeyboardSelected,
+                                weak_factory_.GetWeakPtr()));
+        keyboard_menu_->ShowSelectionMenu(
+            view, keyboard_selection_ /*bubble_opener*/);
+      } else {
+        keyboard_menu_->Close();
+      }
     }
-
-    // TODO(crbug.com/809635): Show language and keyboard menu when clicks on
-    // language_selection_ and keyboard_selection_.
   }
 
   // "Learn more" is clicked to show additional information of what the device
@@ -336,13 +368,110 @@
     DCHECK_EQ(user->basic_user_info->type,
               user_manager::USER_TYPE_PUBLIC_ACCOUNT);
     current_user_ = user->Clone();
-    if (selected_locale_.empty())
-      selected_locale_ = user->public_account_info->default_locale;
+    if (!language_changed_by_user_)
+      selected_language_item_.value = user->public_account_info->default_locale;
 
-    show_advanced_view_ = user->public_account_info->show_advanced_view;
+    PopulateLanguageItems(user->public_account_info->available_locales);
+    PopulateKeyboardItems(user->public_account_info->keyboard_layouts);
+    language_selection_->SetText(
+        base::UTF8ToUTF16(selected_language_item_.title));
+    keyboard_selection_->SetText(
+        base::UTF8ToUTF16(selected_keyboard_item_.title));
+
+    if (!show_advanced_changed_by_user_)
+      show_advanced_view_ = user->public_account_info->show_advanced_view;
+
     Layout();
+  }
 
-    // TODO(crbug.com/809635): pre-populate keyboard list in LoginUserInfoPtr.
+  void OnLanguageSelected(LoginMenuView::Item item) {
+    language_changed_by_user_ = true;
+    selected_language_item_ = item;
+    language_selection_->SetText(base::UTF8ToUTF16(item.title));
+    current_user_->public_account_info->default_locale = item.value;
+
+    // User changed the preferred locale, request to get corresponding keyboard
+    // layouts.
+    Shell::Get()
+        ->login_screen_controller()
+        ->RequestPublicSessionKeyboardLayouts(
+            current_user_->basic_user_info->account_id, item.value);
+  }
+
+  void OnKeyboardSelected(LoginMenuView::Item item) {
+    selected_keyboard_item_ = item;
+    keyboard_selection_->SetText(base::UTF8ToUTF16(item.title));
+  }
+
+  void PopulateLanguageItems(const base::Value& locales) {
+    if (!locales.is_list())
+      return;
+    language_items_.clear();
+
+    for (const auto& locale : locales.GetList()) {
+      const base::DictionaryValue* dictionary;
+      if (!locale.GetAsDictionary(&dictionary))
+        continue;
+
+      std::string value;
+      std::string title;
+      std::string group_name;
+      dictionary->GetString("value", &value);
+      dictionary->GetString("title", &title);
+      dictionary->GetString("optionGroupName", &group_name);
+      LoginMenuView::Item item;
+      if (!group_name.empty()) {
+        item.title = group_name;
+        item.is_group = true;
+      } else {
+        item.title = title;
+        item.value = value;
+        item.is_group = false;
+        item.selected = selected_language_item_.value == value;
+      }
+      language_items_.push_back(item);
+
+      if (selected_language_item_.value == value)
+        selected_language_item_ = item;
+    }
+  }
+
+  void PopulateKeyboardItems(
+      const std::vector<mojom::InputMethodItemPtr>& keyboard_layouts) {
+    keyboard_items_.clear();
+    for (const auto& keyboard : keyboard_layouts) {
+      LoginMenuView::Item item;
+      item.title = keyboard->title;
+      item.value = keyboard->ime_id;
+      item.is_group = false;
+      item.selected = keyboard->selected;
+      keyboard_items_.push_back(item);
+
+      if (keyboard->selected)
+        selected_keyboard_item_ = item;
+    }
+  }
+
+  LoginBaseBubbleView* GetLanguageMenuView() {
+    if (language_menu_ && language_menu_->bubble_view())
+      return language_menu_->bubble_view();
+    return nullptr;
+  }
+
+  LoginBaseBubbleView* GetKeyboardMenuView() {
+    if (keyboard_menu_ && keyboard_menu_->bubble_view())
+      return keyboard_menu_->bubble_view();
+    return nullptr;
+  }
+
+  // Close language and keyboard menus and reset local states.
+  void Reset() {
+    if (language_menu_ && language_menu_->IsVisible())
+      language_menu_->CloseImmediately();
+    if (keyboard_menu_ && keyboard_menu_->IsVisible())
+      keyboard_menu_->CloseImmediately();
+    show_advanced_changed_by_user_ = false;
+    language_changed_by_user_ = false;
   }
 
   SelectionButtonView* advanced_view_button() { return advanced_view_button_; }
@@ -352,8 +481,6 @@
  private:
   bool show_advanced_view_ = false;
   mojom::LoginUserInfoPtr current_user_;
-  std::string selected_locale_;
-  std::string selected_keyboard_;
 
   views::View* labels_view_ = nullptr;
   SelectionButtonView* advanced_view_button_ = nullptr;
@@ -362,6 +489,24 @@
   SelectionButtonView* keyboard_selection_ = nullptr;
   ArrowButtonView* submit_button_ = nullptr;
 
+  std::unique_ptr<LoginBubble> language_menu_;
+  std::unique_ptr<LoginBubble> keyboard_menu_;
+  LoginMenuView::Item selected_language_item_;
+  LoginMenuView::Item selected_keyboard_item_;
+  std::vector<LoginMenuView::Item> language_items_;
+  std::vector<LoginMenuView::Item> keyboard_items_;
+
+  // Local states to check if the locale and whether to show advanced view
+  // has been changed by the user. This ensures user action won't be overridden
+  // by the default settings and it will be reset after this view is hidden.
+  // Keyboard selection is not tracked here because it's depending on which
+  // locale user selects, so the previously selected keyboard might not be
+  // applicable for the current locale.
+  bool show_advanced_changed_by_user_ = false;
+  bool language_changed_by_user_ = false;
+
+  base::WeakPtrFactory<RightPaneView> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(RightPaneView);
 };
 
@@ -429,8 +574,24 @@
   if (GetBoundsInScreen().Contains(event->root_location()))
     return;
 
-  SetVisible(false);
-  on_dismissed_.Run();
+  // Ignore press event inside the language and keyboard menu.
+  LoginBaseBubbleView* language_menu_view = right_pane_->GetLanguageMenuView();
+  LoginBaseBubbleView* keyboard_menu_view = right_pane_->GetKeyboardMenuView();
+  if (language_menu_view) {
+    const gfx::Rect bounds =
+        language_menu_view->GetWidget()->GetWindowBoundsInScreen();
+    if (bounds.Contains(event->root_location()))
+      return;
+  }
+
+  if (keyboard_menu_view) {
+    const gfx::Rect bounds =
+        keyboard_menu_view->GetWidget()->GetWindowBoundsInScreen();
+    if (bounds.Contains(event->root_location()))
+      return;
+  }
+
+  Hide();
 }
 
 void LoginExpandedPublicAccountView::UpdateForUser(
@@ -444,6 +605,12 @@
   return user_view_->current_user();
 }
 
+void LoginExpandedPublicAccountView::Hide() {
+  SetVisible(false);
+  right_pane_->Reset();
+  on_dismissed_.Run();
+}
+
 void LoginExpandedPublicAccountView::OnPaint(gfx::Canvas* canvas) {
   views::View::OnPaint(canvas);
 
@@ -471,8 +638,7 @@
     return;
 
   if (event->key_code() == ui::KeyboardCode::VKEY_ESCAPE) {
-    SetVisible(false);
-    on_dismissed_.Run();
+    Hide();
   }
 }
 
diff --git a/ash/login/ui/login_expanded_public_account_view.h b/ash/login/ui/login_expanded_public_account_view.h
index d51a7cd..f733dd6 100644
--- a/ash/login/ui/login_expanded_public_account_view.h
+++ b/ash/login/ui/login_expanded_public_account_view.h
@@ -43,6 +43,7 @@
   void ProcessPressedEvent(const ui::LocatedEvent* event);
   void UpdateForUser(const mojom::LoginUserInfoPtr& user);
   const mojom::LoginUserInfoPtr& current_user() const;
+  void Hide();
 
   // views::View:
   void OnPaint(gfx::Canvas* canvas) override;
diff --git a/ash/login/ui/login_menu_view.cc b/ash/login/ui/login_menu_view.cc
new file mode 100644
index 0000000..3913e6f9
--- /dev/null
+++ b/ash/login/ui/login_menu_view.cc
@@ -0,0 +1,217 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/login/ui/login_menu_view.h"
+
+#include "ash/login/ui/hover_notifier.h"
+#include "ash/login/ui/non_accessible_view.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/views/controls/button/button.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/scroll_view.h"
+#include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
+#include "ui/views/layout/box_layout.h"
+
+namespace ash {
+
+constexpr int kMenuItemWidthDp = 178;
+constexpr int kMenuItemHeightDp = 28;
+constexpr int kRegularMenuItemLeftPaddingDp = 2;
+constexpr int kGroupMenuItemLeftPaddingDp = 10;
+constexpr int kNonEmptyHeight = 1;
+
+namespace {
+
+constexpr SkColor kMenuBackgroundColor = SkColorSetRGB(0x3C, 0x40, 0x43);
+
+class MenuItemView : public views::Button, public views::ButtonListener {
+ public:
+  MenuItemView(const LoginMenuView::Item& item,
+               const LoginMenuView::OnHighLight& on_highlight)
+      : views::Button(this), item_(item), on_highlight_(on_highlight) {
+    SetFocusBehavior(FocusBehavior::ALWAYS);
+    SetLayoutManager(
+        std::make_unique<views::BoxLayout>(views::BoxLayout::kHorizontal));
+    SetPreferredSize(gfx::Size(kMenuItemWidthDp, kMenuItemHeightDp));
+
+    auto* spacing = new NonAccessibleView();
+    spacing->SetPreferredSize(gfx::Size(item.is_group
+                                            ? kRegularMenuItemLeftPaddingDp
+                                            : kGroupMenuItemLeftPaddingDp,
+                                        kNonEmptyHeight));
+    AddChildView(spacing);
+
+    views::Label* label = new views::Label(base::UTF8ToUTF16(item.title));
+    label->SetEnabledColor(SK_ColorWHITE);
+    label->SetSubpixelRenderingEnabled(false);
+    label->SetAutoColorReadabilityEnabled(false);
+    label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+    AddChildView(label);
+
+    if (item.selected)
+      SetBackground(views::CreateSolidBackground(SK_ColorGRAY));
+
+    hover_notifier_ = std::make_unique<HoverNotifier>(
+        this,
+        base::BindRepeating(&MenuItemView::OnHover, base::Unretained(this)));
+  }
+
+  ~MenuItemView() override = default;
+
+  // views::View:
+  int GetHeightForWidth(int w) const override {
+    // Make row height fixed avoiding layout manager adjustments.
+    return GetPreferredSize().height();
+  }
+
+  // views::ButtonListener:
+  void ButtonPressed(views::Button* sender, const ui::Event& event) override {
+    DCHECK(sender == this);
+    if (item_.is_group)
+      return;
+
+    on_highlight_.Run(true /*by_selection*/);
+    GetWidget()->Close();
+  }
+
+  void OnHover(bool has_hover) {
+    if (has_hover && !item_.is_group)
+      RequestFocus();
+  }
+
+  void OnFocus() override {
+    ScrollViewToVisible();
+    on_highlight_.Run(false /*by_selection*/);
+  }
+
+  const LoginMenuView::Item& item() const { return item_; }
+
+ private:
+  const LoginMenuView::Item item_;
+  const LoginMenuView::OnHighLight on_highlight_;
+  std::unique_ptr<HoverNotifier> hover_notifier_;
+
+  DISALLOW_COPY_AND_ASSIGN(MenuItemView);
+};
+
+class LoginScrollBar : public views::OverlayScrollBar {
+ public:
+  LoginScrollBar() : OverlayScrollBar(false) {}
+
+  // OverlayScrollBar:
+  bool OnKeyPressed(const ui::KeyEvent& event) override {
+    // Let LoginMenuView to handle up/down keypress.
+    return false;
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(LoginScrollBar);
+};
+
+}  // namespace
+
+LoginMenuView::TestApi::TestApi(LoginMenuView* view) : view_(view) {}
+
+LoginMenuView::TestApi::~TestApi() = default;
+
+views::View* LoginMenuView::TestApi::contents() const {
+  return view_->contents_;
+}
+
+LoginMenuView::Item::Item() = default;
+
+LoginMenuView::LoginMenuView(const std::vector<Item>& items,
+                             views::View* anchor_view,
+                             const OnSelect& on_select)
+    : LoginBaseBubbleView(anchor_view), on_select_(on_select) {
+  set_can_activate(true);
+  set_margins(gfx::Insets());
+  set_color(kMenuBackgroundColor);
+  SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
+
+  scroller_ = new views::ScrollView();
+  scroller_->SetBackgroundColor(SK_ColorTRANSPARENT);
+  scroller_->set_draw_overflow_indicator(false);
+  scroller_->ClipHeightTo(kMenuItemHeightDp, kMenuItemHeightDp * 5);
+  AddChildView(scroller_);
+
+  views::BoxLayout* box_layout = SetLayoutManager(
+      std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
+  box_layout->SetFlexForView(scroller_, 1);
+
+  contents_ = new NonAccessibleView();
+  views::BoxLayout* layout = contents_->SetLayoutManager(
+      std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
+  layout->SetDefaultFlex(1);
+  layout->set_minimum_cross_axis_size(kMenuItemWidthDp);
+  layout->set_main_axis_alignment(
+      views::BoxLayout::MainAxisAlignment::MAIN_AXIS_ALIGNMENT_CENTER);
+
+  for (size_t i = 0; i < items.size(); i++) {
+    const Item& item = items[i];
+    contents_->AddChildView(new MenuItemView(
+        item, base::BindRepeating(&LoginMenuView::OnHighLightChange,
+                                  base::Unretained(this), i)));
+
+    if (item.selected)
+      selected_index_ = i;
+  }
+  scroller_->SetContents(contents_);
+  scroller_->SetVerticalScrollBar(new LoginScrollBar());
+}
+
+LoginMenuView::~LoginMenuView() = default;
+
+void LoginMenuView::OnHighLightChange(int item_index, bool by_selection) {
+  selected_index_ = item_index;
+  views::View* highlight_item = contents_->child_at(item_index);
+  for (views::View* child : contents_->GetChildrenInZOrder()) {
+    child->SetBackground(views::CreateSolidBackground(
+        child == highlight_item ? SK_ColorGRAY : SK_ColorTRANSPARENT));
+  }
+
+  if (by_selection) {
+    MenuItemView* menu_view = static_cast<MenuItemView*>(highlight_item);
+    on_select_.Run(menu_view->item());
+  }
+  contents_->SchedulePaint();
+}
+
+int LoginMenuView::FindNextItem(bool reverse) {
+  int delta = reverse ? -1 : 1;
+  int current_index = selected_index_ + delta;
+  while (current_index >= 0 && current_index < contents_->child_count()) {
+    MenuItemView* menu_view =
+        static_cast<MenuItemView*>(contents_->child_at(current_index));
+    if (!menu_view->item().is_group)
+      break;
+    current_index += delta;
+  }
+
+  if (current_index < 0 || current_index == contents_->child_count())
+    return selected_index_;
+  return current_index;
+}
+
+void LoginMenuView::OnFocus() {
+  // Forward the focus to the selected child view.
+  contents_->child_at(selected_index_)->RequestFocus();
+}
+
+bool LoginMenuView::OnKeyPressed(const ui::KeyEvent& event) {
+  const ui::KeyboardCode key = event.key_code();
+  if (key == ui::VKEY_UP || key == ui::VKEY_DOWN) {
+    contents_->child_at(FindNextItem(key == ui::VKEY_UP))->RequestFocus();
+    return true;
+  }
+
+  return false;
+}
+
+void LoginMenuView::VisibilityChanged(View* starting_from, bool is_visible) {
+  if (is_visible)
+    contents_->child_at(selected_index_)->RequestFocus();
+}
+
+}  // namespace ash
diff --git a/ash/login/ui/login_menu_view.h b/ash/login/ui/login_menu_view.h
new file mode 100644
index 0000000..adb2e459
--- /dev/null
+++ b/ash/login/ui/login_menu_view.h
@@ -0,0 +1,75 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_LOGIN_UI_LOGIN_MENU_VIEW_H_
+#define ASH_LOGIN_UI_LOGIN_MENU_VIEW_H_
+
+#include "ash/ash_export.h"
+#include "ash/login/ui/login_base_bubble_view.h"
+#include "base/callback.h"
+#include "ui/views/view.h"
+
+namespace ash {
+
+// Implements a menu view for login screen.
+// This is used instead of views::Combobox because we want a more customisable
+// view for the menu items to support some sepcific styles like nested menu
+// entries which have different left margin (less than regular items) and are
+// not selectable. views::Combobox uses views::MenuItemView which is not very
+// straightforward to customize.
+class ASH_EXPORT LoginMenuView : public LoginBaseBubbleView {
+ public:
+  // TestApi is used for tests to get internal implementation details.
+  class ASH_EXPORT TestApi {
+   public:
+    explicit TestApi(LoginMenuView* view);
+    ~TestApi();
+
+    views::View* contents() const;
+
+   private:
+    LoginMenuView* const view_;
+  };
+
+  struct Item {
+    Item();
+
+    std::string title;
+    std::string value;
+    bool is_group = false;
+    bool selected = false;
+  };
+
+  using OnSelect = base::RepeatingCallback<void(Item item)>;
+  using OnHighLight = base::RepeatingCallback<void(bool by_selection)>;
+
+  LoginMenuView(const std::vector<Item>& items,
+                views::View* anchor_view,
+                const OnSelect& on_select);
+  ~LoginMenuView() override;
+
+  void OnHighLightChange(int item_index, bool by_selection);
+  int FindNextItem(bool reverse);
+
+  // views::View:
+  void OnFocus() override;
+  bool OnKeyPressed(const ui::KeyEvent& event) override;
+  void VisibilityChanged(View* starting_from, bool is_visible) override;
+
+ private:
+  // Owned by this class.
+  views::ScrollView* scroller_ = nullptr;
+
+  // Owned by ScrollView.
+  views::View* contents_ = nullptr;
+
+  const OnSelect on_select_;
+  int selected_index_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(LoginMenuView);
+};
+
+}  // namespace ash
+
+#endif  // ASH_LOGIN_UI_LOGIN_MENU_VIEW_H_
diff --git a/ash/public/cpp/accelerators.cc b/ash/public/cpp/accelerators.cc
index b0361ef..173b4c66 100644
--- a/ash/public/cpp/accelerators.cc
+++ b/ash/public/cpp/accelerators.cc
@@ -64,8 +64,7 @@
      TOGGLE_HIGH_CONTRAST},
     {true, ui::VKEY_Z, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
      TOGGLE_SPOKEN_FEEDBACK},
-    {true, ui::VKEY_S, ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN,
-     TOGGLE_DICTATION},
+    {true, ui::VKEY_D, ui::EF_COMMAND_DOWN, TOGGLE_DICTATION},
     {true, ui::VKEY_OEM_COMMA, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
      SWITCH_TO_PREVIOUS_USER},
     {true, ui::VKEY_OEM_PERIOD, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
diff --git a/ash/public/interfaces/event_rewriter_controller.mojom b/ash/public/interfaces/event_rewriter_controller.mojom
index 4917b6ee..6eded7dc 100644
--- a/ash/public/interfaces/event_rewriter_controller.mojom
+++ b/ash/public/interfaces/event_rewriter_controller.mojom
@@ -4,6 +4,14 @@
 
 module ash.mojom;
 
+import "ui/events/mojo/event.mojom";
+
+// Allows a client to implement spoken feedback features; used for ChromeVox.
+interface SpokenFeedbackEventRewriterDelegate {
+  // Used to send key events to the ChromeVox extension.
+  DispatchKeyEventToChromeVox(ui.mojom.Event event);
+};
+
 // Allows clients to toggle some event rewriting behavior.
 interface EventRewriterController {
   // Enables the KeyboardDrivenEventRewriter, which is disabled by default.
@@ -13,4 +21,12 @@
   // If true, Shift + Arrow keys are rewritten to Tab/Shift-Tab keys.
   // This only applies when the KeyboardDrivenEventRewriter is active.
   SetArrowToTabRewritingEnabled(bool enabled);
+
+  // Set the delegate used by the spoken feedback event rewriter.
+  SetSpokenFeedbackEventRewriterDelegate(
+      SpokenFeedbackEventRewriterDelegate delegate);
+
+  // Continue dispatch of key events that were unhandled by ChromeVox.
+  // TODO: Remove this; ChromeVox should not be able to repost unhandled events.
+  OnUnhandledSpokenFeedbackEvent(ui.mojom.Event event);
 };
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index 1ac7a3b..0be9d30 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -165,7 +165,9 @@
     "system_tray_recording.icon",
     "system_tray_rotation_lock_auto.icon",
     "system_tray_rotation_lock_locked.icon",
+    "system_tray_select_to_speak.icon",
     "system_tray_screen_share.icon",
+    "system_tray_stop.icon",
     "system_tray_tracing.icon",
     "system_tray_update.icon",
     "system_tray_volume_mute.icon",
diff --git a/ash/resources/vector_icons/system_tray_select_to_speak.icon b/ash/resources/vector_icons/system_tray_select_to_speak.icon
new file mode 100644
index 0000000..94dfe21
--- /dev/null
+++ b/ash/resources/vector_icons/system_tray_select_to_speak.icon
@@ -0,0 +1,93 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 16, 28,
+CUBIC_TO, 9.37f, 28, 4, 22.63f, 4, 16,
+CUBIC_TO, 4, 9.37f, 9.37f, 4, 16, 4,
+CUBIC_TO, 22.63f, 4, 28, 9.37f, 28, 16,
+CUBIC_TO, 28, 22.63f, 22.63f, 28, 16, 28,
+CLOSE,
+MOVE_TO, 8, 8,
+LINE_TO, 8, 12,
+LINE_TO, 10, 12,
+LINE_TO, 10, 10,
+LINE_TO, 12, 10,
+LINE_TO, 12, 8,
+LINE_TO, 8, 8,
+CLOSE,
+MOVE_TO, 24, 24,
+LINE_TO, 24, 20,
+LINE_TO, 22, 20,
+LINE_TO, 22, 22,
+LINE_TO, 20, 22,
+LINE_TO, 20, 24,
+LINE_TO, 24, 24,
+CLOSE,
+MOVE_TO, 10, 13.95f,
+LINE_TO, 10, 18.05f,
+LINE_TO, 12.67f, 18.05f,
+LINE_TO, 16, 21.47f,
+LINE_TO, 16, 10.53f,
+LINE_TO, 12.67f, 13.95f,
+LINE_TO, 10, 13.95f,
+CLOSE,
+MOVE_TO, 19, 16,
+CUBIC_TO, 19, 14.79f, 18.32f, 13.75f, 17.33f, 13.24f,
+LINE_TO, 17.33f, 18.75f,
+CUBIC_TO, 18.32f, 18.25f, 19, 17.21f, 19, 16,
+CLOSE,
+MOVE_TO, 17.33f, 10,
+LINE_TO, 17.33f, 11.41f,
+CUBIC_TO, 19.26f, 12, 20.67f, 13.83f, 20.67f, 16,
+CUBIC_TO, 20.67f, 18.17f, 19.26f, 20, 17.33f, 20.59f,
+LINE_TO, 17.33f, 22,
+CUBIC_TO, 20.01f, 21.38f, 22, 18.93f, 22, 16,
+CUBIC_TO, 22, 13.07f, 20.01f, 10.62f, 17.33f, 10,
+CLOSE
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 8, 14,
+CUBIC_TO, 4.69f, 14, 2, 11.31f, 2, 8,
+CUBIC_TO, 2, 4.69f, 4.69f, 2, 8, 2,
+CUBIC_TO, 11.31f, 2, 14, 4.69f, 14, 8,
+CUBIC_TO, 14, 11.31f, 11.31f, 14, 8, 14,
+CLOSE,
+MOVE_TO, 4, 4,
+LINE_TO, 4, 6,
+LINE_TO, 5, 6,
+LINE_TO, 5, 5,
+LINE_TO, 6, 5,
+LINE_TO, 6, 4,
+LINE_TO, 4, 4,
+CLOSE,
+MOVE_TO, 12, 12,
+LINE_TO, 12, 10,
+LINE_TO, 11, 10,
+LINE_TO, 11, 11,
+LINE_TO, 10, 11,
+LINE_TO, 10, 12,
+LINE_TO, 12, 12,
+CLOSE,
+MOVE_TO, 5, 6.97f,
+LINE_TO, 5, 9.03f,
+LINE_TO, 6.33f, 9.03f,
+LINE_TO, 8, 10.74f,
+LINE_TO, 8, 5.26f,
+LINE_TO, 6.33f, 6.97f,
+LINE_TO, 5, 6.97f,
+CLOSE,
+MOVE_TO, 9.5f, 8,
+CUBIC_TO, 9.5f, 7.39f, 9.16f, 6.87f, 8.67f, 6.62f,
+LINE_TO, 8.67f, 9.38f,
+CUBIC_TO, 9.16f, 9.13f, 9.5f, 8.61f, 9.5f, 8,
+CLOSE,
+MOVE_TO, 8.67f, 5,
+LINE_TO, 8.67f, 5.7f,
+CUBIC_TO, 9.63f, 6, 10.33f, 6.92f, 10.33f, 8,
+CUBIC_TO, 10.33f, 9.08f, 9.63f, 10, 8.67f, 10.3f,
+LINE_TO, 8.67f, 11,
+CUBIC_TO, 10, 10.69f, 11, 9.46f, 11, 8,
+CUBIC_TO, 11, 6.54f, 10, 5.31f, 8.67f, 5,
+CLOSE
\ No newline at end of file
diff --git a/ash/resources/vector_icons/system_tray_stop.icon b/ash/resources/vector_icons/system_tray_stop.icon
new file mode 100644
index 0000000..9df06bb1
--- /dev/null
+++ b/ash/resources/vector_icons/system_tray_stop.icon
@@ -0,0 +1,31 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 32,
+MOVE_TO, 16, 28,
+CUBIC_TO, 9.37f, 28, 4, 22.63f, 4, 16,
+CUBIC_TO, 4, 9.37f, 9.37f, 4, 16, 4,
+CUBIC_TO, 22.63f, 4, 28, 9.37f, 28, 16,
+CUBIC_TO, 28, 22.63f, 22.63f, 28, 16, 28,
+CLOSE,
+MOVE_TO, 12, 12,
+LINE_TO, 12, 20,
+LINE_TO, 20, 20,
+LINE_TO, 20, 12,
+LINE_TO, 12, 12,
+CLOSE
+
+CANVAS_DIMENSIONS, 16,
+MOVE_TO, 8, 14,
+CUBIC_TO, 4.69f, 14, 2, 11.31f, 2, 8,
+CUBIC_TO, 2, 4.69f, 4.69f, 2, 8, 2,
+CUBIC_TO, 11.31f, 2, 14, 4.69f, 14, 8,
+CUBIC_TO, 14, 11.31f, 11.31f, 14, 8, 14,
+CLOSE,
+MOVE_TO, 6, 6,
+LINE_TO, 6, 10,
+LINE_TO, 10, 10,
+LINE_TO, 10, 6,
+LINE_TO, 6, 6,
+CLOSE
\ No newline at end of file
diff --git a/ash/shell.cc b/ash/shell.cc
index b9fe93e3..d5fd01b73 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -17,6 +17,7 @@
 #include "ash/accessibility/accessibility_controller.h"
 #include "ash/accessibility/accessibility_delegate.h"
 #include "ash/accessibility/accessibility_focus_ring_controller.h"
+#include "ash/accessibility/key_accessibility_enabler.h"
 #include "ash/app_list/app_list_controller_impl.h"
 #include "ash/ash_constants.h"
 #include "ash/assistant/ash_assistant_controller.h"
@@ -860,6 +861,7 @@
   partial_magnification_controller_.reset();
   highlighter_controller_.reset();
   voice_interaction_controller_.reset();
+  key_accessibility_enabler_.reset();
 
   // This also deletes all RootWindows. Note that we invoke Shutdown() on
   // WindowTreeHostManager before resetting |window_tree_host_manager_|, since
@@ -1261,6 +1263,8 @@
 
   split_view_controller_.reset(new SplitViewController());
 
+  key_accessibility_enabler_ = std::make_unique<KeyAccessibilityEnabler>();
+
   // The compositor thread and main message loop have to be running in
   // order to create mirror window. Run it after the main message loop
   // is started.
diff --git a/ash/shell.h b/ash/shell.h
index 20f8210..93c1ffc60c 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -116,6 +116,7 @@
 class ImeController;
 class ImmersiveContextAsh;
 class ImmersiveHandlerFactoryAsh;
+class KeyAccessibilityEnabler;
 class KeyboardBrightnessControlDelegate;
 class KeyboardUI;
 class LaserPointerController;
@@ -409,6 +410,9 @@
     return high_contrast_controller_.get();
   }
   ImeController* ime_controller() { return ime_controller_.get(); }
+  KeyAccessibilityEnabler* key_accessibility_enabler() {
+    return key_accessibility_enabler_.get();
+  }
   KeyboardBrightnessControlDelegate* keyboard_brightness_control_delegate() {
     return keyboard_brightness_control_delegate_.get();
   }
@@ -859,6 +863,10 @@
   // hide the cursor on Windows.
   std::unique_ptr<::wm::CursorManager> cursor_manager_;
 
+  // Enables spoken feedback accessibility based on a press and hold of both
+  // volume keys.
+  std::unique_ptr<KeyAccessibilityEnabler> key_accessibility_enabler_;
+
   // For testing only: simulate that a modal window is open
   bool simulate_modal_window_open_for_test_ = false;
 
diff --git a/ash/system/accessibility/select_to_speak_tray.cc b/ash/system/accessibility/select_to_speak_tray.cc
new file mode 100644
index 0000000..95829d90
--- /dev/null
+++ b/ash/system/accessibility/select_to_speak_tray.cc
@@ -0,0 +1,102 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/accessibility/select_to_speak_tray.h"
+
+#include "ash/accessibility/accessibility_controller.h"
+#include "ash/resources/vector_icons/vector_icons.h"
+#include "ash/shelf/shelf_constants.h"
+#include "ash/shell.h"
+#include "ash/strings/grit/ash_strings.h"
+#include "ash/system/tray/tray_constants.h"
+#include "ash/system/tray/tray_container.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/border.h"
+#include "ui/views/controls/image_view.h"
+
+namespace views {
+class ImageView;
+}
+
+namespace ash {
+
+// This constant must be kept the same as SELECT_TO_SPEAK_TRAY_CLASS_NAME in
+// chrome/browser/resources/chromeos/select_to_speak/select_to_speak.js.
+const char kSelectToSpeakTrayClassName[] =
+    "tray/TrayBackgroundView/SelectToSpeakTray";
+
+SelectToSpeakTray::SelectToSpeakTray(Shelf* shelf)
+    : TrayBackgroundView(shelf), icon_(new views::ImageView()) {
+  SetInkDropMode(InkDropMode::ON);
+
+  start_selection_image_ =
+      gfx::CreateVectorIcon(kSystemTraySelectToSpeakIcon, kShelfIconColor);
+  cancel_speech_image_ =
+      gfx::CreateVectorIcon(kSystemTrayStopIcon, kShelfIconColor);
+  icon_->SetImage(start_selection_image_);
+  const int vertical_padding =
+      (kTrayItemSize - start_selection_image_.height()) / 2;
+  const int horizontal_padding =
+      (kTrayItemSize - start_selection_image_.width()) / 2;
+  icon_->SetBorder(views::CreateEmptyBorder(
+      gfx::Insets(vertical_padding, horizontal_padding)));
+  tray_container()->AddChildView(icon_);
+  CheckStatusAndUpdateIcon();
+
+  // Observe the accessibility controller state changes to know when Select to
+  // Speak state is updated or when it is disabled/enabled.
+  Shell::Get()->accessibility_controller()->AddObserver(this);
+}
+
+SelectToSpeakTray::~SelectToSpeakTray() {
+  Shell::Get()->accessibility_controller()->RemoveObserver(this);
+}
+
+base::string16 SelectToSpeakTray::GetAccessibleNameForTray() {
+  return l10n_util::GetStringUTF16(
+      IDS_ASH_SELECT_TO_SPEAK_TRAY_ACCESSIBLE_NAME);
+}
+
+const char* SelectToSpeakTray::GetClassName() const {
+  return kSelectToSpeakTrayClassName;
+}
+
+bool SelectToSpeakTray::PerformAction(const ui::Event& event) {
+  Shell::Get()->accessibility_controller()->RequestSelectToSpeakStateChange();
+  return true;
+}
+
+void SelectToSpeakTray::OnAccessibilityStatusChanged() {
+  CheckStatusAndUpdateIcon();
+}
+
+void SelectToSpeakTray::CheckStatusAndUpdateIcon() {
+  if (!Shell::Get()->accessibility_controller()->IsSelectToSpeakEnabled()) {
+    SetVisible(false);
+    return;
+  }
+
+  ash::mojom::SelectToSpeakState state =
+      Shell::Get()->accessibility_controller()->GetSelectToSpeakState();
+  switch (state) {
+    case ash::mojom::SelectToSpeakState::kSelectToSpeakStateInactive:
+      icon_->SetImage(start_selection_image_);
+      SetIsActive(false);
+      break;
+    case ash::mojom::SelectToSpeakState::kSelectToSpeakStateSelecting:
+      // Activate the start selection button during selection.
+      icon_->SetImage(start_selection_image_);
+      SetIsActive(true);
+      break;
+    case ash::mojom::SelectToSpeakState::kSelectToSpeakStateSpeaking:
+      icon_->SetImage(cancel_speech_image_);
+      SetIsActive(true);
+      break;
+  }
+
+  SetVisible(true);
+}
+
+}  // namespace ash
diff --git a/ash/system/accessibility/select_to_speak_tray.h b/ash/system/accessibility/select_to_speak_tray.h
new file mode 100644
index 0000000..6d0eaa62
--- /dev/null
+++ b/ash/system/accessibility/select_to_speak_tray.h
@@ -0,0 +1,55 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_SYSTEM_ACCESSIBILITY_SELECT_TO_SPEAK_TRAY_H_
+#define ASH_SYSTEM_ACCESSIBILITY_SELECT_TO_SPEAK_TRAY_H_
+
+#include "ash/accessibility/accessibility_observer.h"
+#include "ash/ash_export.h"
+#include "ash/system/tray/tray_background_view.h"
+#include "base/macros.h"
+#include "ui/views/controls/image_view.h"
+
+namespace views {
+class ImageView;
+}
+
+namespace ash {
+
+// A button in the tray that lets users start/stop Select-to-Speak.
+class ASH_EXPORT SelectToSpeakTray : public TrayBackgroundView,
+                                     public AccessibilityObserver {
+ public:
+  explicit SelectToSpeakTray(Shelf* shelf);
+  ~SelectToSpeakTray() override;
+
+  // TrayBackgroundView:
+  base::string16 GetAccessibleNameForTray() override;
+  const char* GetClassName() const override;
+  void HideBubbleWithView(const views::TrayBubbleView* bubble_view) override {}
+  void ClickedOutsideBubble() override {}
+  bool PerformAction(const ui::Event& event) override;
+
+  // AccessibilityObserver:
+  void OnAccessibilityStatusChanged() override;
+
+ private:
+  friend class SelectToSpeakTrayTest;
+
+  // Sets the icon when select-to-speak is activated (speaking) / deactivated.
+  // Also updates visibility when select-to-speak is enabled / disabled.
+  void CheckStatusAndUpdateIcon();
+
+  gfx::ImageSkia start_selection_image_;
+  gfx::ImageSkia cancel_speech_image_;
+
+  // Weak pointer, will be parented by TrayContainer for its lifetime.
+  views::ImageView* icon_;
+
+  DISALLOW_COPY_AND_ASSIGN(SelectToSpeakTray);
+};
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_ACCESSIBILITY_SELECT_TO_SPEAK_TRAY_H_
diff --git a/ash/system/accessibility/select_to_speak_tray_unittest.cc b/ash/system/accessibility/select_to_speak_tray_unittest.cc
new file mode 100644
index 0000000..74a2c785
--- /dev/null
+++ b/ash/system/accessibility/select_to_speak_tray_unittest.cc
@@ -0,0 +1,131 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/accessibility/select_to_speak_tray.h"
+
+#include "ash/accelerators/accelerator_controller.h"
+#include "ash/accessibility/accessibility_controller.h"
+#include "ash/accessibility/test_accessibility_controller_client.h"
+#include "ash/shell.h"
+#include "ash/system/status_area_widget.h"
+#include "ash/system/status_area_widget_test_helper.h"
+#include "ash/test/ash_test_base.h"
+#include "base/command_line.h"
+#include "base/run_loop.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/base/ime/ime_bridge.h"
+#include "ui/base/ime/text_input_flags.h"
+#include "ui/events/event.h"
+#include "ui/views/controls/label.h"
+
+namespace ash {
+
+namespace {
+
+SelectToSpeakTray* GetTray() {
+  return StatusAreaWidgetTestHelper::GetStatusAreaWidget()
+      ->select_to_speak_tray();
+}
+
+ui::GestureEvent CreateTapEvent() {
+  return ui::GestureEvent(0, 0, 0, base::TimeTicks(),
+                          ui::GestureEventDetails(ui::ET_GESTURE_TAP));
+}
+
+}  // namespace
+
+class SelectToSpeakTrayTest : public AshTestBase {
+ public:
+  SelectToSpeakTrayTest() = default;
+  ~SelectToSpeakTrayTest() override = default;
+
+  void SetUp() override {
+    base::CommandLine::ForCurrentProcess()->AppendSwitch(
+        chromeos::switches::kEnableExperimentalAccessibilityFeatures);
+    AshTestBase::SetUp();
+    Shell::Get()->accessibility_controller()->SetSelectToSpeakEnabled(true);
+  }
+
+ protected:
+  // Returns true if the Select to Speak tray is visible.
+  bool IsVisible() { return GetTray()->visible(); }
+
+  // Returns true if the background color of the tray is active.
+  bool IsTrayBackgroundActive() { return GetTray()->is_active(); }
+
+  // Gets the current tray image view.
+  views::ImageView* GetImageView() { return GetTray()->icon_; }
+
+  gfx::ImageSkia GetStartSelectionImage() {
+    return GetTray()->start_selection_image_;
+  }
+
+  gfx::ImageSkia GetCancelSpeechImage() {
+    return GetTray()->cancel_speech_image_;
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SelectToSpeakTrayTest);
+};
+
+// Ensures that creation doesn't cause any crashes and adds the image icon.
+// Also checks that the tray is visible.
+TEST_F(SelectToSpeakTrayTest, BasicConstruction) {
+  EXPECT_TRUE(GetImageView());
+  EXPECT_TRUE(IsVisible());
+}
+
+// Tests the icon disapears when select-to-speak is disabled and re-appears
+// when it is enabled.
+TEST_F(SelectToSpeakTrayTest, ShowsAndHidesWithSelectToSpeakEnabled) {
+  Shell::Get()->accessibility_controller()->SetSelectToSpeakEnabled(false);
+  EXPECT_FALSE(IsVisible());
+  Shell::Get()->accessibility_controller()->SetSelectToSpeakEnabled(true);
+  EXPECT_TRUE(IsVisible());
+}
+
+// Test that clicking the button sends a Select to Speak state change request.
+TEST_F(SelectToSpeakTrayTest, ButtonRequestsSelectToSpeakStateChange) {
+  AccessibilityController* controller =
+      Shell::Get()->accessibility_controller();
+  TestAccessibilityControllerClient client;
+  controller->SetClient(client.CreateInterfacePtrAndBind());
+
+  EXPECT_EQ(0, client.select_to_speak_change_change_requests());
+
+  GetTray()->PerformAction(CreateTapEvent());
+  controller->FlushMojoForTest();
+  EXPECT_EQ(1, client.select_to_speak_change_change_requests());
+
+  GetTray()->PerformAction(CreateTapEvent());
+  controller->FlushMojoForTest();
+  EXPECT_EQ(2, client.select_to_speak_change_change_requests());
+}
+
+// Test that changing the SelectToSpeakState in the AccessibilityController
+// results in a change of icon and activation in the tray.
+TEST_F(SelectToSpeakTrayTest, SelectToSpeakStateImpactsImageAndActivation) {
+  AccessibilityController* controller =
+      Shell::Get()->accessibility_controller();
+  controller->SetSelectToSpeakState(
+      ash::mojom::SelectToSpeakState::kSelectToSpeakStateSelecting);
+  EXPECT_TRUE(IsTrayBackgroundActive());
+  EXPECT_TRUE(GetStartSelectionImage().BackedBySameObjectAs(
+      GetImageView()->GetImage()));
+
+  controller->SetSelectToSpeakState(
+      ash::mojom::SelectToSpeakState::kSelectToSpeakStateSpeaking);
+  EXPECT_TRUE(IsTrayBackgroundActive());
+  EXPECT_TRUE(
+      GetCancelSpeechImage().BackedBySameObjectAs(GetImageView()->GetImage()));
+
+  controller->SetSelectToSpeakState(
+      ash::mojom::SelectToSpeakState::kSelectToSpeakStateInactive);
+  EXPECT_FALSE(IsTrayBackgroundActive());
+  EXPECT_TRUE(GetStartSelectionImage().BackedBySameObjectAs(
+      GetImageView()->GetImage()));
+}
+
+}  // namespace ash
diff --git a/ash/system/status_area_widget.cc b/ash/system/status_area_widget.cc
index 33c0992d..e7fba94 100644
--- a/ash/system/status_area_widget.cc
+++ b/ash/system/status_area_widget.cc
@@ -9,6 +9,7 @@
 #include "ash/session/session_controller.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shell.h"
+#include "ash/system/accessibility/select_to_speak_tray.h"
 #include "ash/system/dictation/dictation_button_tray.h"
 #include "ash/system/flag_warning/flag_warning_tray.h"
 #include "ash/system/ime_menu/ime_menu_tray.h"
@@ -73,16 +74,22 @@
   ime_menu_tray_ = std::make_unique<ImeMenuTray>(shelf_);
   status_area_widget_delegate_->AddChildView(ime_menu_tray_.get());
 
-  logout_button_tray_ = std::make_unique<LogoutButtonTray>(shelf_);
-  status_area_widget_delegate_->AddChildView(logout_button_tray_.get());
-
-  // Dictation is currently only available behind the experimental
-  // accessibility features flag.
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           chromeos::switches::kEnableExperimentalAccessibilityFeatures)) {
+    // The Select-to-Speak button is currently only available behind the
+    // experimental accessibility features flag.
+    select_to_speak_tray_ = std::make_unique<SelectToSpeakTray>(shelf_);
+    status_area_widget_delegate_->AddChildView(select_to_speak_tray_.get());
+
+    // Dictation is currently only available behind the experimental
+    // accessibility features flag.
     dictation_button_tray_ = std::make_unique<DictationButtonTray>(shelf_);
     status_area_widget_delegate_->AddChildView(dictation_button_tray_.get());
   }
+
+  logout_button_tray_ = std::make_unique<LogoutButtonTray>(shelf_);
+  status_area_widget_delegate_->AddChildView(logout_button_tray_.get());
+
   if (Shell::GetAshConfig() == ash::Config::MASH) {
     // Flag warning tray is not currently used in non-MASH environments, because
     // mus will roll out via experiment/Finch trial and showing the tray would
@@ -105,9 +112,11 @@
   palette_tray_->Initialize();
   virtual_keyboard_tray_->Initialize();
   ime_menu_tray_->Initialize();
-  overview_button_tray_->Initialize();
+  if (select_to_speak_tray_)
+    select_to_speak_tray_->Initialize();
   if (dictation_button_tray_)
     dictation_button_tray_->Initialize();
+  overview_button_tray_->Initialize();
   UpdateAfterShelfAlignmentChange();
   UpdateAfterLoginStatusChange(
       Shell::Get()->session_controller()->login_status());
@@ -124,11 +133,12 @@
   system_tray_.reset();
   unified_system_tray_.reset();
   ime_menu_tray_.reset();
+  select_to_speak_tray_.reset();
+  dictation_button_tray_.reset();
   virtual_keyboard_tray_.reset();
   palette_tray_.reset();
   logout_button_tray_.reset();
   overview_button_tray_.reset();
-  dictation_button_tray_.reset();
   flag_warning_tray_.reset();
 
   // All child tray views have been removed.
@@ -142,10 +152,12 @@
   logout_button_tray_->UpdateAfterShelfAlignmentChange();
   virtual_keyboard_tray_->UpdateAfterShelfAlignmentChange();
   ime_menu_tray_->UpdateAfterShelfAlignmentChange();
-  palette_tray_->UpdateAfterShelfAlignmentChange();
-  overview_button_tray_->UpdateAfterShelfAlignmentChange();
+  if (select_to_speak_tray_)
+    select_to_speak_tray_->UpdateAfterShelfAlignmentChange();
   if (dictation_button_tray_)
     dictation_button_tray_->UpdateAfterShelfAlignmentChange();
+  palette_tray_->UpdateAfterShelfAlignmentChange();
+  overview_button_tray_->UpdateAfterShelfAlignmentChange();
   if (flag_warning_tray_)
     flag_warning_tray_->UpdateAfterShelfAlignmentChange();
   status_area_widget_delegate_->UpdateLayout();
@@ -204,10 +216,12 @@
   virtual_keyboard_tray_->SchedulePaint();
   logout_button_tray_->SchedulePaint();
   ime_menu_tray_->SchedulePaint();
-  palette_tray_->SchedulePaint();
-  overview_button_tray_->SchedulePaint();
+  if (select_to_speak_tray_)
+    select_to_speak_tray_->SchedulePaint();
   if (dictation_button_tray_)
     dictation_button_tray_->SchedulePaint();
+  palette_tray_->SchedulePaint();
+  overview_button_tray_->SchedulePaint();
   if (flag_warning_tray_)
     flag_warning_tray_->SchedulePaint();
 }
@@ -230,10 +244,12 @@
   system_tray_->UpdateShelfItemBackground(color);
   virtual_keyboard_tray_->UpdateShelfItemBackground(color);
   ime_menu_tray_->UpdateShelfItemBackground(color);
-  palette_tray_->UpdateShelfItemBackground(color);
-  overview_button_tray_->UpdateShelfItemBackground(color);
+  if (select_to_speak_tray_)
+    select_to_speak_tray_->UpdateShelfItemBackground(color);
   if (dictation_button_tray_)
     dictation_button_tray_->UpdateShelfItemBackground(color);
+  palette_tray_->UpdateShelfItemBackground(color);
+  overview_button_tray_->UpdateShelfItemBackground(color);
 }
 
 }  // namespace ash
diff --git a/ash/system/status_area_widget.h b/ash/system/status_area_widget.h
index 17685b7..aeecb4e 100644
--- a/ash/system/status_area_widget.h
+++ b/ash/system/status_area_widget.h
@@ -23,6 +23,7 @@
 class OverviewButtonTray;
 class DictationButtonTray;
 class PaletteTray;
+class SelectToSpeakTray;
 class Shelf;
 class StatusAreaWidgetDelegate;
 class SystemTray;
@@ -81,6 +82,9 @@
   }
   PaletteTray* palette_tray() { return palette_tray_.get(); }
   ImeMenuTray* ime_menu_tray() { return ime_menu_tray_.get(); }
+  SelectToSpeakTray* select_to_speak_tray() {
+    return select_to_speak_tray_.get();
+  }
 
   Shelf* shelf() { return shelf_; }
 
@@ -128,6 +132,7 @@
   std::unique_ptr<PaletteTray> palette_tray_;
   std::unique_ptr<VirtualKeyboardTray> virtual_keyboard_tray_;
   std::unique_ptr<ImeMenuTray> ime_menu_tray_;
+  std::unique_ptr<SelectToSpeakTray> select_to_speak_tray_;
   std::unique_ptr<FlagWarningTray> flag_warning_tray_;
 
   LoginStatus login_status_ = LoginStatus::NOT_LOGGED_IN;
diff --git a/ash/wm/overview/window_grid.cc b/ash/wm/overview/window_grid.cc
index 30459670..22792308 100644
--- a/ash/wm/overview/window_grid.cc
+++ b/ash/wm/overview/window_grid.cc
@@ -493,7 +493,7 @@
 WindowSelectorItem* WindowGrid::GetWindowSelectorItemContaining(
     const aura::Window* window) const {
   for (const auto& window_item : window_list_) {
-    if (window_item->Contains(window))
+    if (window_item && window_item->Contains(window))
       return window_item.get();
   }
   return nullptr;
diff --git a/build/check_gn_headers_whitelist.txt b/build/check_gn_headers_whitelist.txt
index be45dbe..79c2f67 100644
--- a/build/check_gn_headers_whitelist.txt
+++ b/build/check_gn_headers_whitelist.txt
@@ -239,7 +239,6 @@
 services/ui/ws/ids.h
 skia/ext/convolver_mips_dspr2.h
 skia/ext/skia_commit_hash.h
-skia/ext/texture_handle.h
 testing/gmock_mutant.h
 third_party/blink/renderer/bindings/modules/v8/serialization/WebCryptoSubTags.h
 third_party/blink/renderer/core/animation/CSSInterpolationEnvironment.h
diff --git a/build/config/fuchsia/build_manifest.py b/build/config/fuchsia/build_manifest.py
index 6528c9dc..c953fa001 100644
--- a/build/config/fuchsia/build_manifest.py
+++ b/build/config/fuchsia/build_manifest.py
@@ -90,10 +90,13 @@
 
 
 def BuildManifest(root_dir, out_dir, app_name, app_filename,
-                  sandbox_policy_path, runtime_deps_file, output_path):
-  with open(output_path, 'w') as output:
+                  sandbox_policy_path, runtime_deps_file, depfile_path,
+                  output_path):
+  with open(output_path, 'w') as manifest, open(depfile_path, 'w') as depfile:
     # Process the runtime deps file for file paths, recursively walking
-    # directories as needed.
+    # directories as needed. File paths are stored in absolute form,
+    # so that MakePackagePath() may relativize to either the source root or
+    # output directory.
     # runtime_deps may contain duplicate paths, so use a set for
     # de-duplication.
     expanded_files = set()
@@ -124,14 +127,15 @@
       # The source path is relativized so that it can be used on multiple
       # environments with differing parent directory structures,
       # e.g. builder bots and swarming clients.
-      output.write('%s=%s\n' % (in_package_path,
-                                os.path.relpath(current_file, out_dir)))
+      manifest.write('%s=%s\n' % (in_package_path,
+                                  os.path.relpath(current_file, out_dir)))
 
       # Use libc.so's dynamic linker by aliasing libc.so to ld.so.1.
       # Fuchsia always looks for the linker implementation in ld.so.1.
       if os.path.basename(in_package_path) == 'libc.so':
-        output.write('%s=%s\n' % (os.path.dirname(in_package_path) + '/ld.so.1',
-                                  os.path.relpath(current_file, out_dir)))
+        manifest.write(
+            '%s=%s\n' % (os.path.dirname(in_package_path) + '/ld.so.1',
+                         os.path.relpath(current_file, out_dir)))
 
     if not app_found:
       raise Exception('Could not locate executable inside runtime_deps.')
@@ -139,12 +143,16 @@
     with open(os.path.join(os.path.dirname(output_path), 'package'), 'w') \
         as package_json:
       json.dump({'version': '0', 'name': app_name}, package_json)
-      output.write('meta/package=%s\n' %
+      manifest.write('meta/package=%s\n' %
                    os.path.relpath(package_json.name, out_dir))
 
-    output.write('meta/sandbox=%s\n' %
+    manifest.write('meta/sandbox=%s\n' %
                  os.path.relpath(os.path.join(root_dir, sandbox_policy_path),
                                  out_dir))
+    depfile.write(
+        "%s: %s" % (os.path.relpath(output_path, out_dir),
+                    " ".join([os.path.relpath(f, out_dir)
+                              for f in expanded_files])))
 
   return 0
 
diff --git a/build/config/fuchsia/package.gni b/build/config/fuchsia/package.gni
index c8a59bd..3d7f50af 100644
--- a/build/config/fuchsia/package.gni
+++ b/build/config/fuchsia/package.gni
@@ -38,6 +38,8 @@
   # Generates a manifest file based on the GN runtime deps
   # suitable for "pm" tool consumption.
   action(_write_manifest_target) {
+    _depfile = "${target_gen_dir}/${target_name}_stamp.d"
+
     forward_variables_from(invoker,
                            [
                              "deps",
@@ -58,6 +60,10 @@
 
     data_deps = pkg.deps
 
+    # Use a depfile to trigger package rebuilds if any of the files (static
+    # assets, shared libraries, etc.) included by the package have changed.
+    depfile = _depfile
+
     # Include the SDK's core dynamic libraries in the package.
     data = [
       dist_libroot,
@@ -71,6 +77,7 @@
       pkg.binary,
       rebase_path(pkg.sandbox_policy),
       rebase_path(_runtime_deps_file),
+      rebase_path(_depfile),
       rebase_path(_manifest_file),
     ]
 
diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni
index 049a1f1..52f49a8 100644
--- a/build/config/sanitizers/sanitizers.gni
+++ b/build/config/sanitizers/sanitizers.gni
@@ -61,8 +61,7 @@
   # Enable checks for indirect function calls via a function pointer.
   # TODO(pcc): remove this when we're ready to add these checks by default.
   # https://crbug.com/701919
-  use_cfi_icall = target_os == "linux" && !is_chromeos && target_cpu == "x64" &&
-                  is_official_build
+  use_cfi_icall = false
 
   # Print detailed diagnostics when Control Flow Integrity detects a violation.
   use_cfi_diag = false
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc
index 8b44ed4..32d1c40 100644
--- a/cc/paint/oop_pixeltest.cc
+++ b/cc/paint/oop_pixeltest.cc
@@ -54,15 +54,6 @@
   virtual bool UseRasterDecoder() = 0;
 
   void SetUp() override {
-    // Add an OOP rasterization command line flag so that we set
-    // |chromium_raster_transport| features flag.
-    // TODO(vmpstr): Is there a better way to do this?
-    if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
-            switches::kEnableOOPRasterization)) {
-      base::CommandLine::ForCurrentProcess()->AppendSwitch(
-          switches::kEnableOOPRasterization);
-    }
-
     raster_context_provider_ =
         base::MakeRefCounted<TestInProcessContextProvider>(
             /*enable_oop_rasterization=*/true,
diff --git a/cc/paint/transfer_cache_unittest.cc b/cc/paint/transfer_cache_unittest.cc
index 6902a482..8685b37 100644
--- a/cc/paint/transfer_cache_unittest.cc
+++ b/cc/paint/transfer_cache_unittest.cc
@@ -45,20 +45,8 @@
     // Enable OOP rasterization.
     attribs.enable_oop_rasterization = true;
     attribs.enable_raster_interface = true;
-
-    // |true| will test RasterDecoder, |false| will test GLES2Decoder.
-    attribs.enable_raster_decoder = UseRasterDecoder();
     attribs.enable_gles2_interface = !UseRasterDecoder();
 
-    // Add an OOP rasterization command line flag so that we set
-    // |chromium_raster_transport| features flag.
-    // TODO(vmpstr): Is there a better way to do this?
-    if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
-            switches::kEnableOOPRasterization)) {
-      base::CommandLine::ForCurrentProcess()->AppendSwitch(
-          switches::kEnableOOPRasterization);
-    }
-
     context_ = std::make_unique<gpu::RasterInProcessContext>();
     auto result = context_->Initialize(
         /*service=*/nullptr, attribs, gpu::SharedMemoryLimits(),
diff --git a/cc/test/test_in_process_context_provider.cc b/cc/test/test_in_process_context_provider.cc
index 92e8492f..f4b8793 100644
--- a/cc/test/test_in_process_context_provider.cc
+++ b/cc/test/test_in_process_context_provider.cc
@@ -66,29 +66,14 @@
 TestInProcessContextProvider::TestInProcessContextProvider(
     bool enable_oop_rasterization,
     bool support_gles2_interface) {
-  if (support_gles2_interface) {
-    // TODO(enne): make this always support oop rasterization.  Some tests
-    // fail to create the context when oop rasterization is turned on.
-    gles2_context_ = CreateGLInProcessContext(
-        &gpu_memory_buffer_manager_, &image_factory_,
-        base::ThreadTaskRunnerHandle::Get(), enable_oop_rasterization);
-    cache_controller_.reset(
-        new viz::ContextCacheController(gles2_context_->GetImplementation(),
-                                        base::ThreadTaskRunnerHandle::Get()));
-
-    raster_implementation_gles2_ =
-        std::make_unique<gpu::raster::RasterImplementationGLES>(
-            gles2_context_->GetImplementation(),
-            gles2_context_->GetImplementation(),
-            gles2_context_->GetImplementation()->command_buffer(),
-            gles2_context_->GetCapabilities());
-  } else {
+  if (enable_oop_rasterization) {
     gpu::ContextCreationAttribs attribs;
     attribs.bind_generates_resource = false;
-    attribs.enable_oop_rasterization = enable_oop_rasterization;
+    attribs.enable_oop_rasterization = true;
     attribs.enable_raster_interface = true;
-    attribs.enable_gles2_interface = false;
-    attribs.enable_raster_decoder = true;
+    // TODO(crbug.com/834313): Remove this once we start tearing down OOP-R in
+    // GLES2Decoder.
+    attribs.enable_gles2_interface = support_gles2_interface;
 
     raster_context_.reset(new gpu::RasterInProcessContext);
     auto result = raster_context_->Initialize(
@@ -101,6 +86,19 @@
     cache_controller_.reset(
         new viz::ContextCacheController(raster_context_->GetContextSupport(),
                                         base::ThreadTaskRunnerHandle::Get()));
+  } else {
+    gles2_context_ = CreateGLInProcessContext(
+        &gpu_memory_buffer_manager_, &image_factory_,
+        base::ThreadTaskRunnerHandle::Get(), enable_oop_rasterization);
+    cache_controller_.reset(
+        new viz::ContextCacheController(gles2_context_->GetImplementation(),
+                                        base::ThreadTaskRunnerHandle::Get()));
+    raster_implementation_gles2_ =
+        std::make_unique<gpu::raster::RasterImplementationGLES>(
+            gles2_context_->GetImplementation(),
+            gles2_context_->GetImplementation(),
+            gles2_context_->GetImplementation()->command_buffer(),
+            gles2_context_->GetCapabilities());
   }
 }
 
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index 3b703da..3b1e14c4 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -650,12 +650,6 @@
   if (SkipImage(draw_image))
     return TaskResult(false);
 
-  // For non-lazy images a decode isn't necessary.
-  // TODO(khushalsagar): We can still have only the upload task to upload ahead
-  // of raster.
-  if (!draw_image.paint_image().IsLazyGenerated())
-    return TaskResult(false);
-
   base::AutoLock lock(lock_);
   const PaintImage::FrameKey frame_key = draw_image.frame_key();
   ImageData* image_data = GetImageDataForDrawImage(draw_image);
diff --git a/cc/tiles/gpu_image_decode_cache_unittest.cc b/cc/tiles/gpu_image_decode_cache_unittest.cc
index 9bd02cd..c304be03 100644
--- a/cc/tiles/gpu_image_decode_cache_unittest.cc
+++ b/cc/tiles/gpu_image_decode_cache_unittest.cc
@@ -2281,6 +2281,26 @@
   EXPECT_FALSE(cache->GetSWImageDecodeForTesting(draw_image));
 }
 
+TEST_P(GpuImageDecodeCacheTest, NonLazyImageUploadNoScaleTask) {
+  auto cache = CreateCache();
+  bool is_decomposable = true;
+  SkFilterQuality quality = kHigh_SkFilterQuality;
+
+  PaintImage image = CreateBitmapImage(gfx::Size(10, 10));
+  DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()),
+                       quality,
+                       CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
+                       PaintImage::kDefaultFrameIndex, DefaultColorSpace());
+  auto result =
+      cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo());
+  EXPECT_TRUE(result.need_unref);
+  EXPECT_TRUE(result.task);
+  TestTileTaskRunner::ProcessTask(result.task->dependencies()[0].get());
+  TestTileTaskRunner::ProcessTask(result.task.get());
+
+  cache->UnrefImage(draw_image);
+}
+
 TEST_P(GpuImageDecodeCacheTest, NonLazyImageUploadDownscaled) {
   auto cache = CreateCache();
   bool is_decomposable = true;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java
new file mode 100644
index 0000000..2289ed3e
--- /dev/null
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java
@@ -0,0 +1,62 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.feed;
+
+import com.google.android.libraries.feed.common.functional.Consumer;
+import com.google.android.libraries.feed.host.network.HttpRequest;
+import com.google.android.libraries.feed.host.network.HttpResponse;
+import com.google.android.libraries.feed.host.network.NetworkClient;
+
+import org.chromium.base.Callback;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.chrome.browser.profiles.Profile;
+
+/**
+ * Provides access to native implementations of NetworkClient.
+ */
+@JNINamespace("feed")
+public class FeedNetworkBridge implements NetworkClient {
+    private long mNativeBridge;
+
+    /**
+     * Creates a FeedNetworkBridge for accessing native network implementation for the current
+     * user.
+     *
+     * @param profile Profile of the user we are rendering the Feed for.
+     */
+    public FeedNetworkBridge(Profile profile) {
+        mNativeBridge = nativeInit(profile);
+    }
+
+    /*
+     * Cleans up native half of this bridge.
+     */
+    public void destroy() {
+        assert mNativeBridge != 0;
+        nativeDestroy(mNativeBridge);
+        mNativeBridge = 0;
+    }
+
+    @Override
+    public void send(HttpRequest request, Consumer<HttpResponse> responseConsumer) {
+        assert mNativeBridge != 0;
+        nativeSendNetworkRequest(mNativeBridge, request.getUri().toString(), request.getMethod(),
+                request.getBody(), result -> responseConsumer.accept(result));
+    }
+
+    @Override
+    public void close() {}
+
+    @CalledByNative
+    private static HttpResponse createHttpResponse(int code, byte[] body) {
+        return new HttpResponse(code, body);
+    }
+
+    private native long nativeInit(Profile profile);
+    private native void nativeDestroy(long nativeFeedNetworkBridge);
+    private native void nativeSendNetworkRequest(long nativeFeedNetworkBridge, String url,
+            String requestType, byte[] body, Callback<HttpResponse> resultCallback);
+}
diff --git a/chrome/android/feed/feed_java_sources.gni b/chrome/android/feed/feed_java_sources.gni
index 691366e5..cdec6df 100644
--- a/chrome/android/feed/feed_java_sources.gni
+++ b/chrome/android/feed/feed_java_sources.gni
@@ -9,6 +9,7 @@
   feed_deps = [ "//third_party/feed:feed_lib_java" ]
 
   feed_java_sources = [
+    "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java",
     "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java",
     "//chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/action/FeedActionHandler.java",
   ]
diff --git a/chrome/android/java/res/layout/bottom_sheet.xml b/chrome/android/java/res/layout/bottom_sheet.xml
index 25112ea..eaaf9f2 100644
--- a/chrome/android/java/res/layout/bottom_sheet.xml
+++ b/chrome/android/java/res/layout/bottom_sheet.xml
@@ -41,7 +41,7 @@
             <View
                 android:id="@+id/bottom_sheet_toolbar"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
+                android:layout_height="@dimen/bottom_control_container_peek_height"
                 android:background="@color/modern_primary_color" />
         </view>
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java
index b7c5e5d..4baef34e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java
@@ -2326,7 +2326,7 @@
         setWarpState(true, false);
         final float opaqueTopPadding = mBorderTopPadding - mBorderTransparentTop;
         mAnimationFactory = StackAnimation.createAnimationFactory(this, mLayout.getWidth(),
-                mLayout.getHeight(), mLayout.getHeightMinusBrowserControls(), mBorderTopPadding,
+                mLayout.getHeight(), mLayout.getTopBrowserControlsHeight(), mBorderTopPadding,
                 opaqueTopPadding, mBorderLeftPadding, mCurrentMode);
         float dpToPx = mLayout.getContext().getResources().getDisplayMetrics().density;
         mViewAnimationFactory = new StackViewAnimation(dpToPx, mLayout.getWidth());
@@ -2457,7 +2457,7 @@
     public void swipeUpdated(long time, float x, float y, float dx, float dy, float tx, float ty) {
         if (!mInSwipe) return;
 
-        final float toolbarSize = mLayout.getHeight() - mLayout.getHeightMinusBrowserControls();
+        final float toolbarSize = mLayout.getTopBrowserControlsHeight();
         if (ty > toolbarSize) mSwipeCanScroll = true;
         if (!mSwipeCanScroll) return;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java
index e3a4e9d..c3c72f4f9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java
@@ -14,8 +14,6 @@
 import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable;
 import org.chromium.chrome.browser.compositor.layouts.Layout.Orientation;
 import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
-import org.chromium.chrome.browser.compositor.layouts.phone.StackLayout;
-import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.ui.interpolators.BakedBezierInterpolator;
 
 /**
@@ -77,7 +75,7 @@
 
     protected final float mWidth;
     protected final float mHeight;
-    protected final float mHeightMinusBrowserControls;
+    protected final float mTopBrowserControlsHeight;
     protected final float mBorderTopHeight;
     protected final float mBorderTopOpaqueHeight;
     protected final float mBorderLeftWidth;
@@ -94,13 +92,13 @@
      * @param borderFramePaddingTopOpaque The opaque top padding of the border frame in dp.
      * @param borderFramePaddingLeft      The left padding of the border frame in dp.
      */
-    protected StackAnimation(Stack stack, float width, float height,
-            float heightMinusBrowserControls, float borderFramePaddingTop,
-            float borderFramePaddingTopOpaque, float borderFramePaddingLeft) {
+    protected StackAnimation(Stack stack, float width, float height, float topBrowserControlsHeight,
+            float borderFramePaddingTop, float borderFramePaddingTopOpaque,
+            float borderFramePaddingLeft) {
         mStack = stack;
         mWidth = width;
         mHeight = height;
-        mHeightMinusBrowserControls = heightMinusBrowserControls;
+        mTopBrowserControlsHeight = topBrowserControlsHeight;
 
         mBorderTopHeight = borderFramePaddingTop;
         mBorderTopOpaqueHeight = borderFramePaddingTopOpaque;
@@ -123,20 +121,19 @@
      * @return                            The TabSwitcherAnimationFactory instance.
      */
     public static StackAnimation createAnimationFactory(Stack stack, float width, float height,
-            float heightMinusBrowserControls, float borderFramePaddingTop,
+            float topBrowserControlsHeight, float borderFramePaddingTop,
             float borderFramePaddingTopOpaque, float borderFramePaddingLeft, int orientation) {
         StackAnimation factory = null;
         switch (orientation) {
             case Orientation.LANDSCAPE:
                 factory = new StackAnimationLandscape(stack, width, height,
-                        heightMinusBrowserControls, borderFramePaddingTop,
+                        topBrowserControlsHeight, borderFramePaddingTop,
                         borderFramePaddingTopOpaque, borderFramePaddingLeft);
                 break;
             case Orientation.PORTRAIT:
             default:
-                factory = new StackAnimationPortrait(stack, width, height,
-                        heightMinusBrowserControls, borderFramePaddingTop,
-                        borderFramePaddingTopOpaque, borderFramePaddingLeft);
+                factory = new StackAnimationPortrait(stack, width, height, topBrowserControlsHeight,
+                        borderFramePaddingTop, borderFramePaddingTopOpaque, borderFramePaddingLeft);
                 break;
         }
 
@@ -418,22 +415,13 @@
      *         border.
      */
     protected float getToolbarOffsetToLineUpWithBorder() {
-        final float toolbarHeight = mHeight - mHeightMinusBrowserControls;
-        return toolbarHeight - mBorderTopOpaqueHeight;
+        return mTopBrowserControlsHeight - mBorderTopOpaqueHeight;
     }
 
     /**
      * @return The position of the static tab when entering or exiting the tab switcher.
      */
     protected float getStaticTabPosition() {
-        // The y position of the tab will depend on whether or not the toolbar is at the top or
-        // bottom of the screen. All values are in DP.
-        float yPos = -mBorderTopHeight;
-        if (!FeatureUtilities.isChromeHomeEnabled()) {
-            yPos += mHeight - mHeightMinusBrowserControls;
-        } else {
-            yPos -= StackLayout.MODERN_TOP_MARGIN_DP;
-        }
-        return yPos;
+        return mTopBrowserControlsHeight - mBorderTopHeight;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape.java
index ff662a9..f46f95c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape.java
@@ -30,9 +30,9 @@
      * Only Constructor.
      */
     public StackAnimationLandscape(Stack stack, float width, float height,
-            float heightMinusBrowserControls, float borderFramePaddingTop,
+            float topBrowserControlsHeight, float borderFramePaddingTop,
             float borderFramePaddingTopOpaque, float borderFramePaddingLeft) {
-        super(stack, width, height, heightMinusBrowserControls, borderFramePaddingTop,
+        super(stack, width, height, topBrowserControlsHeight, borderFramePaddingTop,
                 borderFramePaddingTopOpaque, borderFramePaddingLeft);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationPortrait.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationPortrait.java
index 630f3a6..3475350 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationPortrait.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationPortrait.java
@@ -29,9 +29,9 @@
      * Only Constructor.
      */
     public StackAnimationPortrait(Stack stack, float width, float height,
-            float heightMinusBrowserControls, float borderFramePaddingTop,
+            float topBrowserControlsHeight, float borderFramePaddingTop,
             float borderFramePaddingTopOpaque, float borderFramePaddingLeft) {
-        super(stack, width, height, heightMinusBrowserControls, borderFramePaddingTop,
+        super(stack, width, height, topBrowserControlsHeight, borderFramePaddingTop,
                 borderFramePaddingTopOpaque, borderFramePaddingLeft);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java
index e98539b..dd421ea 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java
@@ -12,6 +12,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.support.annotation.Nullable;
+import android.support.v4.util.ObjectsCompat;
 import android.view.Gravity;
 import android.view.View;
 import android.view.View.OnLayoutChangeListener;
@@ -124,10 +125,8 @@
                             == SYSTEM_UI_FLAG_FULLSCREEN) {
                         return;
                     }
-                    systemUiVisibility |= SYSTEM_UI_FLAG_FULLSCREEN;
-                    systemUiVisibility |= SYSTEM_UI_FLAG_LOW_PROFILE;
-                    systemUiVisibility |=
-                            getExtraFullscreenUIFlags(fullscreenHtmlApiHandler.mFullscreenOptions);
+                    systemUiVisibility = fullscreenHtmlApiHandler.applyEnterFullscreenUIFlags(
+                            systemUiVisibility);
                     contentView.setSystemUiVisibility(systemUiVisibility);
 
                     // Trigger a update to clear the SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN flag
@@ -189,7 +188,9 @@
      * @param options Options to choose mode of fullscreen.
      */
     public void enterPersistentFullscreenMode(FullscreenOptions options) {
-        if (mIsPersistentMode) return;
+        if (mIsPersistentMode && ObjectsCompat.equals(mFullscreenOptions, options)) {
+            return;
+        }
 
         mIsPersistentMode = true;
         mDelegate.onEnterFullscreen(options);
@@ -213,6 +214,7 @@
         }
         mWebContentsInFullscreen = null;
         mTabInFullscreen = null;
+        mFullscreenOptions = null;
     }
 
     /**
@@ -230,12 +232,11 @@
         mHandler.removeMessages(MSG_ID_CLEAR_LAYOUT_FULLSCREEN_FLAG);
 
         int systemUiVisibility = contentView.getSystemUiVisibility();
-        systemUiVisibility &= ~SYSTEM_UI_FLAG_LOW_PROFILE;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
             systemUiVisibility &= ~SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
-            systemUiVisibility &= ~SYSTEM_UI_FLAG_FULLSCREEN;
-            systemUiVisibility &= ~getExtraFullscreenUIFlags(null);
+            systemUiVisibility = applyExitFullscreenUIFlags(systemUiVisibility);
         } else {
+            systemUiVisibility &= ~SYSTEM_UI_FLAG_LOW_PROFILE;
             mWindow.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
             mWindow.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
         }
@@ -266,18 +267,23 @@
     public void enterFullscreen(final Tab tab, FullscreenOptions options) {
         WebContents webContents = tab.getWebContents();
         if (webContents == null) return;
+        mFullscreenOptions = options;
         final View contentView = tab.getContentView();
         int systemUiVisibility = contentView.getSystemUiVisibility();
-        systemUiVisibility |= SYSTEM_UI_FLAG_LOW_PROFILE;
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
-            if ((systemUiVisibility & SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
+            if ((systemUiVisibility & SYSTEM_UI_FLAG_FULLSCREEN) == SYSTEM_UI_FLAG_FULLSCREEN) {
+                // Already in full screen mode; just changed options. Mask off old
+                // ones and apply new ones.
+                systemUiVisibility = applyExitFullscreenUIFlags(systemUiVisibility);
+                systemUiVisibility = applyEnterFullscreenUIFlags(systemUiVisibility);
+            } else if ((systemUiVisibility & SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
                     == SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) {
-                systemUiVisibility |= SYSTEM_UI_FLAG_FULLSCREEN;
-                systemUiVisibility |= getExtraFullscreenUIFlags(options);
+                systemUiVisibility = applyEnterFullscreenUIFlags(systemUiVisibility);
             } else {
                 systemUiVisibility |= SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
             }
         } else {
+            systemUiVisibility |= SYSTEM_UI_FLAG_LOW_PROFILE;
             mWindow.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
             mWindow.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
         }
@@ -369,16 +375,36 @@
     }
 
     /*
-     * Helper method to return extra fullscreen UI flags for Kitkat devices.
+     * Returns system ui flags to enable fullscreen mode based on the current options.
      * @return fullscreen flags to be applied to system UI visibility.
      */
-    private static int getExtraFullscreenUIFlags(FullscreenOptions options) {
-        int flags = 0;
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
-            flags |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
-            flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+    private int applyEnterFullscreenUIFlags(int systemUiVisibility) {
+        boolean showNavigationBar =
+                mFullscreenOptions != null ? mFullscreenOptions.showNavigationBar() : false;
+        int flags = SYSTEM_UI_FLAG_FULLSCREEN;
+        if (!showNavigationBar) {
+            flags |= SYSTEM_UI_FLAG_LOW_PROFILE;
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                flags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+                flags |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+                flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+            }
         }
-        return flags;
+        return flags | systemUiVisibility;
+    }
+
+    /*
+     * Returns system ui flags with any flags that might have been set during
+     * applyEnterFullscreenUIFlags masked off.
+     * @return fullscreen flags to be applied to system UI visibility.
+     */
+    private static int applyExitFullscreenUIFlags(int systemUiVisibility) {
+        int maskOffFlags = SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            maskOffFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+            maskOffFlags |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+            maskOffFlags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+        }
+        return systemUiVisibility & ~maskOffFlags;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenOptions.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenOptions.java
index a9dcacb3..df6d5579 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenOptions.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenOptions.java
@@ -29,6 +29,15 @@
         return mShowNavigationBar;
     }
 
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof FullscreenOptions)) {
+            return false;
+        }
+        FullscreenOptions options = (FullscreenOptions) obj;
+        return mShowNavigationBar == options.mShowNavigationBar;
+    }
+
     /**
      * The Parcelable interface.
      * */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
index 8657c11..0fb4da9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
@@ -153,6 +153,9 @@
     /** The visible rect for the screen taking the keyboard into account. */
     private final Rect mVisibleViewportRect = new Rect();
 
+    /** An out-array for use with getLocationInWindow to prevent constant allocations. */
+    private final int[] mCachedLocation = new int[2];
+
     /** The minimum distance between half and full states to allow the half state. */
     private final float mMinHalfFullDistance;
 
@@ -717,6 +720,15 @@
         return (swipeToDismissEnabled() ? getHiddenRatio() : getPeekRatio()) * mContainerHeight;
     }
 
+    @Override
+    public boolean isTouchEventInToolbar(MotionEvent event) {
+        mToolbarHolder.getLocationInWindow(mCachedLocation);
+        // This check only tests for collision for the Y component since the sheet is the full width
+        // of the screen. We only care if the touch event is above the bottom of the toolbar since
+        // we won't receive an event if the touch is outside the sheet.
+        return mCachedLocation[1] + mToolbarHolder.getHeight() > event.getRawY();
+    }
+
     /**
      * @return Whether flinging down hard enough will close the sheet.
      */
@@ -737,11 +749,6 @@
         return getFullRatio() * mContainerHeight;
     }
 
-    @Override
-    public float getContainerHeightPx() {
-        return mContainerHeight;
-    }
-
     /**
      * Show content in the bottom sheet's content area.
      * @param content The {@link BottomSheetContent} to show, or null if no content should be shown.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetector.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetector.java
index fbe7cb3..ea57d461 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetector.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetector.java
@@ -71,10 +71,10 @@
         float getMaxOffsetPx();
 
         /**
-         * Gets the height of the container that the sheet exists in.
-         * @return The height of the sheet's container.
+         * @param event The motion event to test.
+         * @return Whether the provided motion event is inside the toolbar.
          */
-        float getContainerHeightPx();
+        boolean isTouchEventInToolbar(MotionEvent event);
 
         /**
          * Check if a particular gesture or touch event should move the bottom sheet when in peeking
@@ -123,7 +123,7 @@
                     mSheetDelegate.getCurrentOffsetPx(), mSheetDelegate.getMaxOffsetPx());
 
             // Allow the bottom sheet's content to be scrolled up without dragging the sheet down.
-            if (!isTouchEventInToolbar(e2) && isSheetInMaxPosition
+            if (!mSheetDelegate.isTouchEventInToolbar(e2) && isSheetInMaxPosition
                     && !mSheetDelegate.isContentScrolledToTop()) {
                 return false;
             }
@@ -254,17 +254,6 @@
     }
 
     /**
-     * Determines if a touch event is inside the toolbar. This assumes the toolbar is the full
-     * width of the screen and that the toolbar is at the top of the bottom sheet.
-     * @param e The motion event to test.
-     * @return True if the event occurred in the toolbar region.
-     */
-    private boolean isTouchEventInToolbar(MotionEvent e) {
-        return mSheetDelegate.getContainerHeightPx() - e.getRawY()
-                > mSheetDelegate.getCurrentOffsetPx() - mSheetDelegate.getMinOffsetPx();
-    }
-
-    /**
      * Gets the distance of a fling based on the velocity and the base animation time. This formula
      * assumes the deceleration curve is quadratic (t^2), hence the displacement formula should be:
      * displacement = initialVelocity * duration / 2.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java
index 624afee..29ba15f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java
@@ -28,6 +28,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
@@ -61,6 +62,7 @@
 @CommandLineFlags.Add({
         ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         "disable-features=" + ChromeFeatureList.FULLSCREEN_ACTIVITY,
+        "enable-blink-features=FullscreenUnprefixed,FullscreenOptions",
 })
 @RetryOnFailure
 public class FullscreenManagerTest {
@@ -99,6 +101,33 @@
             + "<body style='height:10000px;' onclick='toggleFullScreen();'>"
             + "</body>"
             + "</html>");
+    private static final String LONG_FULLSCREEN_API_HTML_WITH_OPTIONS_TEST_PAGE =
+            UrlUtils.encodeHtmlDataUri("<html>"
+                    + "<head>"
+                    + "  <meta name=\"viewport\" "
+                    + "    content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\" />"
+                    + "  <script>"
+                    + "    var mode = 0;"
+                    + "    function toggleFullScreen() {"
+                    + "      if (mode == 0) {"
+                    + "        document.body.requestFullscreen({prefersNavigationBar: true});"
+                    + "        mode++;"
+                    + "      } else if (mode == 2) {"
+                    + "        document.body.requestFullscreen({prefersNavigationBar: false});"
+                    + "        mode++;"
+                    + "      } else if (mode == 1 || mode == 3) {"
+                    + "        document.exitFullscreen();"
+                    + "        mode++;"
+                    + "      }"
+                    + "    };"
+                    + "  </script>"
+                    + "  <style>"
+                    + "    body:-webkit-full-screen { background: red; width: 100%; }"
+                    + "  </style>"
+                    + "</head>"
+                    + "<body style='height:10000px;' onclick='toggleFullScreen();'>"
+                    + "</body>"
+                    + "</html>");
 
     @Before
     public void setUp() throws Exception {
@@ -402,6 +431,59 @@
                 mActivityTestRule, mActivityTestRule.getActivity().getActivityTab());
     }
 
+    @Test
+    @LargeTest
+    @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT)
+    @Feature({"Fullscreen"})
+    public void testPersistentFullscreenWithOptions() throws InterruptedException {
+        FullscreenManagerTestUtils.disableBrowserOverrides();
+        mActivityTestRule.startMainActivityWithURL(LONG_FULLSCREEN_API_HTML_WITH_OPTIONS_TEST_PAGE);
+
+        ChromeFullscreenManager fullscreenManager =
+                mActivityTestRule.getActivity().getFullscreenManager();
+        int browserControlsHeight = fullscreenManager.getTopControlsHeight();
+
+        Tab tab = mActivityTestRule.getActivity().getActivityTab();
+        View view = tab.getView();
+        final TabWebContentsDelegateAndroid delegate = tab.getTabWebContentsDelegateAndroid();
+
+        TouchCommon.singleClickView(view);
+        FullscreenTestUtils.waitForPersistentFullscreen(delegate, true);
+
+        FullscreenManagerTestUtils.waitForBrowserControlsPosition(
+                mActivityTestRule, -browserControlsHeight);
+
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            Assert.assertTrue("Navigation bar not hidden.",
+                    (view.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)
+                            == 0);
+        });
+
+        TestTouchUtils.sleepForDoubleTapTimeout(InstrumentationRegistry.getInstrumentation());
+        TouchCommon.singleClickView(view);
+        FullscreenTestUtils.waitForPersistentFullscreen(delegate, false);
+        FullscreenManagerTestUtils.waitForBrowserControlsPosition(mActivityTestRule, 0);
+
+        FullscreenManagerTestUtils.scrollBrowserControls(mActivityTestRule, false);
+        FullscreenManagerTestUtils.scrollBrowserControls(mActivityTestRule, true);
+
+        TestTouchUtils.sleepForDoubleTapTimeout(InstrumentationRegistry.getInstrumentation());
+        TouchCommon.singleClickView(view);
+        FullscreenTestUtils.waitForPersistentFullscreen(delegate, true);
+        FullscreenManagerTestUtils.waitForBrowserControlsPosition(
+                mActivityTestRule, -browserControlsHeight);
+
+        ThreadUtils.runOnUiThreadBlocking(() -> {
+            Assert.assertTrue("Navigation bar hidden.",
+                    (view.getSystemUiVisibility() & View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)
+                            != 0);
+        });
+        TestTouchUtils.sleepForDoubleTapTimeout(InstrumentationRegistry.getInstrumentation());
+        TouchCommon.singleClickView(view);
+        FullscreenTestUtils.waitForPersistentFullscreen(delegate, false);
+        FullscreenManagerTestUtils.waitForBrowserControlsPosition(mActivityTestRule, 0);
+    }
+
     private void waitForEditableNodeToLoseFocus(final Tab tab) {
         CriteriaHelper.pollUiThread(new Criteria() {
             @Override
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetectorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetectorTest.java
index a84cda1..b1c0cc9 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetectorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetSwipeDetectorTest.java
@@ -91,8 +91,10 @@
         }
 
         @Override
-        public float getContainerHeightPx() {
-            return mMaxOffset;
+        public boolean isTouchEventInToolbar(MotionEvent event) {
+            // This will be implementation specific in practice. This checks that the motion event
+            // occured above the bottom of the toolbar.
+            return event.getRawY() < (mMaxOffset - mCurrentSheetOffset) + mMinOffset;
         }
 
         @Override
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index b1dfd1f..04e3bb8 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3431,6 +3431,9 @@
   <message name="IDS_KEYBOARD_OVERLAY_TOGGLE_CHROMEVOX_SPOKEN_FEEDBACK" desc="The text in the keyboard overlay to explain the shortcut (enable or disable spoken feedback).">
     ChromeVox (spoken feedback)
   </message>
+  <message name="IDS_KEYBOARD_OVERLAY_TOGGLE_DICTATION" desc="The text in the keyboard overlay to explain the shortcut (start or stop speak to type).">
+    Dictation
+  </message>
   <message name="IDS_KEYBOARD_OVERLAY_TOGGLE_DOCKED_MAGNIFIER" desc="The text in the keyboard overlay to explain the shortcut (toggle the Docked Magnifier on/off).">
     Toggle Docked Magnifier
   </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index fa32849..cebecaa 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2622,6 +2622,8 @@
       "resource_coordinator/local_site_characteristics_data_reader.h",
       "resource_coordinator/local_site_characteristics_data_store.cc",
       "resource_coordinator/local_site_characteristics_data_store.h",
+      "resource_coordinator/local_site_characteristics_data_writer.cc",
+      "resource_coordinator/local_site_characteristics_data_writer.h",
       "resource_coordinator/local_site_characteristics_feature_usage.h",
       "resource_coordinator/site_characteristics_data_reader.h",
       "resource_coordinator/site_characteristics_data_store.h",
@@ -4196,6 +4198,8 @@
     sources += [
       "android/feed/feed_host_service_factory.cc",
       "android/feed/feed_host_service_factory.h",
+      "android/feed/feed_network_bridge.cc",
+      "android/feed/feed_network_bridge.h",
     ]
     deps += [ "//components/feed/core:feed_core" ]
   }
@@ -4446,6 +4450,11 @@
     if (enable_offline_pages_harness) {
       sources += [ "../android/java/src/org/chromium/chrome/browser/offlinepages/evaluation/OfflinePageEvaluationBridge.java" ]
     }
+
+    if (enable_feed_in_chrome) {
+      sources += [ "../android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNetworkBridge.java" ]
+    }
+
     jni_package = "chrome"
   }
 
diff --git a/chrome/browser/android/feed/feed_host_service_factory.cc b/chrome/browser/android/feed/feed_host_service_factory.cc
index d744d9b..299d22f 100644
--- a/chrome/browser/android/feed/feed_host_service_factory.cc
+++ b/chrome/browser/android/feed/feed_host_service_factory.cc
@@ -8,18 +8,26 @@
 #include <string>
 #include <utility>
 
+#include "base/files/file_path.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search/suggestions/image_decoder_impl.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/common/channel_info.h"
 #include "components/feed/core/feed_host_service.h"
+#include "components/image_fetcher/core/image_fetcher_impl.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/version_info/version_info.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "google_apis/google_api_keys.h"
+#include "net/url_request/url_request_context_getter.h"
 
 namespace feed {
 
+namespace {
+const char kFeedFolder[] = "feed";
+}  // namespace
+
 // static
 FeedHostService* FeedHostServiceFactory::GetForBrowserContext(
     content::BrowserContext* context) {
@@ -42,6 +50,7 @@
 KeyedService* FeedHostServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
   Profile* profile = Profile::FromBrowserContext(context);
+
   content::StoragePartition* storage_partition =
       content::BrowserContext::GetDefaultStoragePartition(context);
 
@@ -58,7 +67,20 @@
       identity_manager, api_key,
       storage_partition->GetURLLoaderFactoryForBrowserProcess());
 
-  return new FeedHostService(std::move(networking_host));
+  scoped_refptr<net::URLRequestContextGetter> request_context =
+      profile->GetRequestContext();
+
+  auto image_fetcher = std::make_unique<image_fetcher::ImageFetcherImpl>(
+      std::make_unique<suggestions::ImageDecoderImpl>(), request_context.get());
+
+  base::FilePath feed_dir(profile->GetPath().Append(kFeedFolder));
+  auto image_database = std::make_unique<FeedImageDatabase>(feed_dir);
+
+  auto image_manager = std::make_unique<FeedImageManager>(
+      std::move(image_fetcher), std::move(image_database));
+
+  return new FeedHostService(std::move(image_manager),
+                             std::move(networking_host));
 }
 
 content::BrowserContext* FeedHostServiceFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/android/feed/feed_network_bridge.cc b/chrome/browser/android/feed/feed_network_bridge.cc
new file mode 100644
index 0000000..dc5c3ec
--- /dev/null
+++ b/chrome/browser/android/feed/feed_network_bridge.cc
@@ -0,0 +1,85 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/feed/feed_network_bridge.h"
+
+#include <jni.h>
+
+#include <utility>
+#include <vector>
+
+#include "base/android/callback_android.h"
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "chrome/browser/android/feed/feed_host_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_android.h"
+#include "components/feed/core/feed_host_service.h"
+#include "components/feed/core/feed_networking_host.h"
+#include "jni/FeedNetworkBridge_jni.h"
+
+using base::android::ConvertJavaStringToUTF8;
+using base::android::JavaParamRef;
+using base::android::ScopedJavaLocalRef;
+using base::android::ScopedJavaGlobalRef;
+
+namespace feed {
+
+namespace {
+
+void OnResult(const ScopedJavaGlobalRef<jobject>& j_callback,
+              int32_t http_code,
+              std::vector<uint8_t> response_bytes) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  ScopedJavaLocalRef<jbyteArray> j_response_bytes =
+      base::android::ToJavaByteArray(env, response_bytes);
+  ScopedJavaLocalRef<jobject> j_http_response =
+      Java_FeedNetworkBridge_createHttpResponse(env, http_code,
+                                                j_response_bytes);
+  base::android::RunCallbackAndroid(j_callback, j_http_response);
+}
+
+}  // namespace
+
+FeedNetworkBridge::FeedNetworkBridge(const JavaParamRef<jobject>& j_profile) {
+  Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
+  FeedHostService* host_service =
+      FeedHostServiceFactory::GetForBrowserContext(profile);
+  networking_host_ = host_service->GetNetworkingHost();
+  DCHECK(networking_host_);
+}
+
+static jlong JNI_FeedNetworkBridge_Init(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& j_this,
+    const JavaParamRef<jobject>& j_profile) {
+  return reinterpret_cast<intptr_t>(new FeedNetworkBridge(j_profile));
+}
+
+void FeedNetworkBridge::Destroy(JNIEnv* env,
+                                const JavaParamRef<jobject>& j_this) {
+  delete this;
+}
+
+void FeedNetworkBridge::SendNetworkRequest(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& j_this,
+    const JavaParamRef<jstring>& j_url,
+    const JavaParamRef<jstring>& j_request_type,
+    const JavaParamRef<jbyteArray>& j_body,
+    const JavaParamRef<jobject>& j_callback) {
+  auto url = GURL(ConvertJavaStringToUTF8(env, j_url));
+  FeedNetworkingHost::ResponseCallback callback =
+      base::BindOnce(&OnResult, ScopedJavaGlobalRef<jobject>(env, j_callback));
+  std::vector<uint8_t> request_body;
+  base::android::JavaByteArrayToByteVector(env, j_body.obj(), &request_body);
+
+  networking_host_->Send(url, ConvertJavaStringToUTF8(env, j_request_type),
+                         std::move(request_body), std::move(callback));
+}
+
+}  // namespace feed
diff --git a/chrome/browser/android/feed/feed_network_bridge.h b/chrome/browser/android/feed/feed_network_bridge.h
new file mode 100644
index 0000000..644b851
--- /dev/null
+++ b/chrome/browser/android/feed/feed_network_bridge.h
@@ -0,0 +1,41 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ANDROID_FEED_FEED_NETWORK_BRIDGE_H_
+#define CHROME_BROWSER_ANDROID_FEED_FEED_NETWORK_BRIDGE_H_
+
+#include "base/android/scoped_java_ref.h"
+
+namespace feed {
+
+class FeedNetworkingHost;
+
+// Native counterpart of FeedNetworkBridge.java. Holds non-owning pointers to
+// native implementation, to which operations are delegated. Results are passed
+// back by a single argument callback so base::android::RunCallbackAndroid() can
+// be used. This bridge is instantiated, owned, and destroyed from Java.
+class FeedNetworkBridge {
+ public:
+  explicit FeedNetworkBridge(
+      const base::android::JavaParamRef<jobject>& j_profile);
+
+  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& j_this);
+
+  void SendNetworkRequest(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& j_this,
+      const base::android::JavaParamRef<jstring>& j_url,
+      const base::android::JavaParamRef<jstring>& j_request_type,
+      const base::android::JavaParamRef<jbyteArray>& j_body,
+      const base::android::JavaParamRef<jobject>& j_callback);
+
+ private:
+  FeedNetworkingHost* networking_host_;
+
+  DISALLOW_COPY_AND_ASSIGN(FeedNetworkBridge);
+};
+
+}  // namespace feed
+
+#endif  // CHROME_BROWSER_ANDROID_FEED_FEED_NETWORK_BRIDGE_H_
diff --git a/chrome/browser/android/webapk/webapk_icon_hasher.cc b/chrome/browser/android/webapk/webapk_icon_hasher.cc
index 8a442952..6f3c3537 100644
--- a/chrome/browser/android/webapk/webapk_icon_hasher.cc
+++ b/chrome/browser/android/webapk/webapk_icon_hasher.cc
@@ -8,9 +8,9 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/base/data_url.h"
-#include "net/http/http_status_code.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "third_party/smhasher/src/MurmurHash2.h"
 
 namespace {
@@ -36,17 +36,16 @@
 
 // static
 void WebApkIconHasher::DownloadAndComputeMurmur2Hash(
-    net::URLRequestContextGetter* request_context_getter,
+    network::mojom::URLLoaderFactory* url_loader_factory,
     const GURL& icon_url,
     const Murmur2HashCallback& callback) {
-  DownloadAndComputeMurmur2HashWithTimeout(request_context_getter, icon_url,
-                                           kDownloadTimeoutInMilliseconds,
-                                           callback);
+  DownloadAndComputeMurmur2HashWithTimeout(
+      url_loader_factory, icon_url, kDownloadTimeoutInMilliseconds, callback);
 }
 
 // static
 void WebApkIconHasher::DownloadAndComputeMurmur2HashWithTimeout(
-    net::URLRequestContextGetter* request_context_getter,
+    network::mojom::URLLoaderFactory* url_loader_factory,
     const GURL& icon_url,
     int timeout_ms,
     const Murmur2HashCallback& callback) {
@@ -69,47 +68,53 @@
   }
 
   // The icon hasher will delete itself when it is done.
-  new WebApkIconHasher(request_context_getter, icon_url, timeout_ms, callback);
+  new WebApkIconHasher(url_loader_factory, icon_url, timeout_ms, callback);
 }
 
 WebApkIconHasher::WebApkIconHasher(
-    net::URLRequestContextGetter* url_request_context_getter,
+    network::mojom::URLLoaderFactory* url_loader_factory,
     const GURL& icon_url,
     int timeout_ms,
     const Murmur2HashCallback& callback)
     : callback_(callback) {
+  DCHECK(url_loader_factory);
+
   download_timeout_timer_.Start(
       FROM_HERE, base::TimeDelta::FromMilliseconds(timeout_ms),
       base::Bind(&WebApkIconHasher::OnDownloadTimedOut,
                  base::Unretained(this)));
 
-  url_fetcher_ = net::URLFetcher::Create(icon_url, net::URLFetcher::GET, this);
-  url_fetcher_->SetRequestContext(url_request_context_getter);
-  url_fetcher_->Start();
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+  resource_request->url = icon_url;
+  simple_url_loader_ = network::SimpleURLLoader::Create(
+      std::move(resource_request), NO_TRAFFIC_ANNOTATION_YET);
+  simple_url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
+      url_loader_factory,
+      base::BindOnce(&WebApkIconHasher::OnSimpleLoaderComplete,
+                     base::Unretained(this)));
 }
 
 WebApkIconHasher::~WebApkIconHasher() {}
 
-void WebApkIconHasher::OnURLFetchComplete(const net::URLFetcher* source) {
+void WebApkIconHasher::OnSimpleLoaderComplete(
+    std::unique_ptr<std::string> response_body) {
   download_timeout_timer_.Stop();
 
-  if (!source->GetStatus().is_success() ||
-      source->GetResponseCode() != net::HTTP_OK) {
+  // Check for non-empty body in case of HTTP 204 (no content) response.
+  if (!response_body || response_body->empty()) {
     RunCallback("");
     return;
   }
 
-  // WARNING: We are running in the browser process. |raw_image_data| is the
-  // image's raw, unsanitized bytes from the web. |raw_image_data| may contain
+  // WARNING: We are running in the browser process. |*response_body| is the
+  // image's raw, unsanitized bytes from the web. |*response_body| may contain
   // malicious data. Decoding unsanitized bitmap data to an SkBitmap in the
   // browser process is a security bug.
-  std::string raw_image_data;
-  source->GetResponseAsString(&raw_image_data);
-  RunCallback(ComputeMurmur2Hash(raw_image_data));
+  RunCallback(ComputeMurmur2Hash(*response_body));
 }
 
 void WebApkIconHasher::OnDownloadTimedOut() {
-  url_fetcher_.reset();
+  simple_url_loader_.reset();
 
   RunCallback("");
 }
diff --git a/chrome/browser/android/webapk/webapk_icon_hasher.h b/chrome/browser/android/webapk/webapk_icon_hasher.h
index 2c5b7b5..d6226ca2 100644
--- a/chrome/browser/android/webapk/webapk_icon_hasher.h
+++ b/chrome/browser/android/webapk/webapk_icon_hasher.h
@@ -11,16 +11,17 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/timer/timer.h"
-#include "net/url_request/url_fetcher_delegate.h"
 #include "url/gurl.h"
 
-namespace net {
-class URLFetcher;
-class URLRequestContextGetter;
-}
+namespace network {
+class SimpleURLLoader;
+namespace mojom {
+class URLLoaderFactory;
+}  // namespace mojom
+}  // namespace network
 
 // Downloads an icon and takes a Murmur2 hash of the downloaded image.
-class WebApkIconHasher : public net::URLFetcherDelegate {
+class WebApkIconHasher {
  public:
   using Murmur2HashCallback =
       base::Callback<void(const std::string& /* icon_murmur2_hash */)>;
@@ -31,25 +32,24 @@
   // encoding/decoding beforehand). |callback| is called with an empty string if
   // the image cannot not be downloaded in time (e.g. 404 HTTP error code).
   static void DownloadAndComputeMurmur2Hash(
-      net::URLRequestContextGetter* request_context_getter,
+      network::mojom::URLLoaderFactory* url_loader_factory,
       const GURL& icon_url,
       const Murmur2HashCallback& callback);
 
   static void DownloadAndComputeMurmur2HashWithTimeout(
-      net::URLRequestContextGetter* request_context_getter,
+      network::mojom::URLLoaderFactory* url_loader_factory,
       const GURL& icon_url,
       int timeout_ms,
       const Murmur2HashCallback& callback);
 
  private:
-  WebApkIconHasher(net::URLRequestContextGetter* request_context_getter,
+  WebApkIconHasher(network::mojom::URLLoaderFactory* url_loader_factory,
                    const GURL& icon_url,
                    int timeout_ms,
                    const Murmur2HashCallback& callback);
-  ~WebApkIconHasher() override;
+  ~WebApkIconHasher();
 
-  // net::URLFetcherDelegate:
-  void OnURLFetchComplete(const net::URLFetcher* source) override;
+  void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
 
   // Called if downloading the icon takes too long.
   void OnDownloadTimedOut();
@@ -60,7 +60,7 @@
   // Called with the image hash.
   Murmur2HashCallback callback_;
 
-  std::unique_ptr<net::URLFetcher> url_fetcher_;
+  std::unique_ptr<network::SimpleURLLoader> simple_url_loader_;
 
   // Fails WebApkIconHasher if the download takes too long.
   base::OneShotTimer download_timeout_timer_;
diff --git a/chrome/browser/android/webapk/webapk_icon_hasher_unittest.cc b/chrome/browser/android/webapk/webapk_icon_hasher_unittest.cc
index 98e703c..f9465ca 100644
--- a/chrome/browser/android/webapk/webapk_icon_hasher_unittest.cc
+++ b/chrome/browser/android/webapk/webapk_icon_hasher_unittest.cc
@@ -9,36 +9,36 @@
 #include "base/bind.h"
 #include "base/callback_forward.h"
 #include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/memory/ref_counted.h"
+#include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
-#include "net/url_request/url_request_test_util.h"
+#include "net/http/http_util.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/resource_response.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
+#include "services/network/test/test_url_loader_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
 namespace {
 
-const base::FilePath::CharType kTestDataDir[] =
-    FILE_PATH_LITERAL("chrome/test/data");
-
-const char kIconUrl[] = "/android/google.png";
-
-// Murmur2 hash for |kIconUrl|.
+// Murmur2 hash for |icon_url| in Success test.
 const char kIconMurmur2Hash[] = "2081059568551351877";
 
 // Runs WebApkIconHasher and blocks till the murmur2 hash is computed.
 class WebApkIconHasherRunner {
  public:
-  WebApkIconHasherRunner()
-      : url_request_context_getter_(new net::TestURLRequestContextGetter(
-            base::ThreadTaskRunnerHandle::Get())) {}
+  WebApkIconHasherRunner() {}
   ~WebApkIconHasherRunner() {}
 
-  void Run(const GURL& icon_url) {
+  void Run(network::mojom::URLLoaderFactory* url_loader_factory,
+           const GURL& icon_url) {
     WebApkIconHasher::DownloadAndComputeMurmur2HashWithTimeout(
-        url_request_context_getter_.get(), icon_url, 300,
+        url_loader_factory, icon_url, 300,
         base::Bind(&WebApkIconHasherRunner::OnCompleted,
                    base::Unretained(this)));
 
@@ -55,8 +55,8 @@
     on_completed_callback_.Run();
   }
 
-  scoped_refptr<net::TestURLRequestContextGetter>
-      url_request_context_getter_;
+  // Fake factory that can be primed to return fake data.
+  network::TestURLLoaderFactory test_url_loader_factory_;
 
   // Called once the Murmur2 hash is taken.
   base::Closure on_completed_callback_;
@@ -75,24 +75,35 @@
       : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {}
   ~WebApkIconHasherTest() override {}
 
-  void SetUp() override {
-    test_server_.AddDefaultHandlers(base::FilePath(kTestDataDir));
-    ASSERT_TRUE(test_server_.Start());
+ protected:
+  network::TestURLLoaderFactory* test_url_loader_factory() {
+    return &test_url_loader_factory_;
   }
 
-  net::test_server::EmbeddedTestServer* test_server() { return &test_server_; }
-
  private:
   content::TestBrowserThreadBundle thread_bundle_;
-  net::EmbeddedTestServer test_server_;
+  network::TestURLLoaderFactory test_url_loader_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(WebApkIconHasherTest);
 };
 
 TEST_F(WebApkIconHasherTest, Success) {
-  GURL icon_url = test_server()->GetURL(kIconUrl);
+  std::string icon_url =
+      "http://www.google.com/chrome/test/data/android/google.png";
+  base::FilePath source_path;
+  base::FilePath icon_path;
+  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &source_path));
+  icon_path = source_path.AppendASCII("chrome")
+                  .AppendASCII("test")
+                  .AppendASCII("data")
+                  .AppendASCII("android")
+                  .AppendASCII("google.png");
+  std::string icon_data;
+  ASSERT_TRUE(base::ReadFileToString(icon_path, &icon_data));
+  test_url_loader_factory()->AddResponse(icon_url, icon_data);
+
   WebApkIconHasherRunner runner;
-  runner.Run(icon_url);
+  runner.Run(test_url_loader_factory(), GURL(icon_url));
   EXPECT_EQ(kIconMurmur2Hash, runner.murmur2_hash());
 }
 
@@ -101,36 +112,45 @@
       "AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO"
       "9TXL0Y4OHwAAAABJRU5ErkJggg==");
   WebApkIconHasherRunner runner;
-  runner.Run(icon_url);
+  runner.Run(test_url_loader_factory(), icon_url);
   EXPECT_EQ("536500236142107998", runner.murmur2_hash());
 }
 
 TEST_F(WebApkIconHasherTest, DataUriInvalid) {
   GURL icon_url("data:image/png;base64");
   WebApkIconHasherRunner runner;
-  runner.Run(icon_url);
+  runner.Run(test_url_loader_factory(), icon_url);
   EXPECT_EQ("", runner.murmur2_hash());
 }
 
 TEST_F(WebApkIconHasherTest, InvalidUrl) {
   GURL icon_url("http::google.com");
   WebApkIconHasherRunner runner;
-  runner.Run(icon_url);
+  runner.Run(test_url_loader_factory(), icon_url);
   EXPECT_EQ("", runner.murmur2_hash());
 }
 
 TEST_F(WebApkIconHasherTest, DownloadTimedOut) {
-  GURL icon_url = test_server()->GetURL("/slow?100");
+  std::string icon_url = "http://www.google.com/timeout";
   WebApkIconHasherRunner runner;
-  runner.Run(icon_url);
+  runner.Run(test_url_loader_factory(), GURL(icon_url));
   EXPECT_EQ("", runner.murmur2_hash());
 }
 
 // Test that the hash callback is called with an empty string if an HTTP error
 // prevents the icon URL from being fetched.
 TEST_F(WebApkIconHasherTest, HTTPError) {
-  GURL icon_url = test_server()->GetURL("/nocontent");
+  std::string icon_url = "http://www.google.com/404";
+  network::ResourceResponseHead head;
+  std::string headers("HTTP/1.1 404 Not Found\nContent-type: text/html\n\n");
+  head.headers = new net::HttpResponseHeaders(
+      net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size()));
+  head.mime_type = "text/html";
+  network::URLLoaderCompletionStatus status;
+  status.decoded_body_length = 0;
+  test_url_loader_factory()->AddResponse(GURL(icon_url), head, "", status);
+
   WebApkIconHasherRunner runner;
-  runner.Run(icon_url);
+  runner.Run(test_url_loader_factory(), GURL(icon_url));
   EXPECT_EQ("", runner.murmur2_hash());
 }
diff --git a/chrome/browser/android/webapk/webapk_installer.cc b/chrome/browser/android/webapk/webapk_installer.cc
index 3f71b5f..bdb282a3 100644
--- a/chrome/browser/android/webapk/webapk_installer.cc
+++ b/chrome/browser/android/webapk/webapk_installer.cc
@@ -36,8 +36,10 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/version_info/version_info.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/browsing_data_remover.h"
+#include "content/public/browser/storage_partition.h"
 #include "content/public/common/manifest_util.h"
 #include "jni/WebApkInstaller_jni.h"
 #include "net/base/load_flags.h"
@@ -580,7 +582,9 @@
   // We redownload the icon in order to take the Murmur2 hash. The redownload
   // should be fast because the icon should be in the HTTP cache.
   WebApkIconHasher::DownloadAndComputeMurmur2Hash(
-      GetRequestContext(browser_context_),
+      content::BrowserContext::GetDefaultStoragePartition(browser_context_)
+          ->GetURLLoaderFactoryForBrowserProcess()
+          .get(),
       install_shortcut_info_->best_primary_icon_url,
       base::Bind(&WebApkInstaller::OnGotPrimaryIconMurmur2Hash,
                  weak_ptr_factory_.GetWeakPtr()));
@@ -598,7 +602,9 @@
       install_shortcut_info_->best_badge_icon_url !=
           install_shortcut_info_->best_primary_icon_url) {
     WebApkIconHasher::DownloadAndComputeMurmur2Hash(
-        GetRequestContext(browser_context_),
+        content::BrowserContext::GetDefaultStoragePartition(browser_context_)
+            ->GetURLLoaderFactoryForBrowserProcess()
+            .get(),
         install_shortcut_info_->best_badge_icon_url,
         base::Bind(&WebApkInstaller::OnGotBadgeIconMurmur2Hash,
                    weak_ptr_factory_.GetWeakPtr(), true, primary_icon_hash));
diff --git a/chrome/browser/android/webapk/webapk_update_data_fetcher.cc b/chrome/browser/android/webapk/webapk_update_data_fetcher.cc
index b332606b..66947e4 100644
--- a/chrome/browser/android/webapk/webapk_update_data_fetcher.cc
+++ b/chrome/browser/android/webapk/webapk_update_data_fetcher.cc
@@ -14,6 +14,8 @@
 #include "chrome/browser/android/webapk/webapk_web_manifest_checker.h"
 #include "chrome/browser/installable/installable_manager.h"
 #include "chrome/browser/profiles/profile.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/manifest.h"
 #include "jni/WebApkUpdateDataFetcher_jni.h"
@@ -151,7 +153,10 @@
       Profile::FromBrowserContext(web_contents()->GetBrowserContext());
 
   WebApkIconHasher::DownloadAndComputeMurmur2Hash(
-      profile->GetRequestContext(), info_.best_primary_icon_url,
+      content::BrowserContext::GetDefaultStoragePartition(profile)
+          ->GetURLLoaderFactoryForBrowserProcess()
+          .get(),
+      info_.best_primary_icon_url,
       base::Bind(&WebApkUpdateDataFetcher::OnGotPrimaryIconMurmur2Hash,
                  weak_ptr_factory_.GetWeakPtr()));
 }
@@ -167,7 +172,10 @@
         Profile::FromBrowserContext(web_contents()->GetBrowserContext());
 
     WebApkIconHasher::DownloadAndComputeMurmur2Hash(
-        profile->GetRequestContext(), info_.best_badge_icon_url,
+        content::BrowserContext::GetDefaultStoragePartition(profile)
+            ->GetURLLoaderFactoryForBrowserProcess()
+            .get(),
+        info_.best_badge_icon_url,
         base::Bind(&WebApkUpdateDataFetcher::OnDataAvailable,
                    weak_ptr_factory_.GetWeakPtr(), primary_icon_murmur2_hash,
                    true));
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
index 2e724740..620df4ba 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
@@ -59,6 +59,12 @@
       return metrics::OmniboxInputType::QUERY;
 
     case ExternalProtocolHandler::UNKNOWN: {
+#if defined(OS_LINUX)
+      // Linux impl of GetApplicationNameForProtocol doesn't distinguish
+      // between URL schemes with handers and those without. This will
+      // make the default behaviour be search on Linux.
+      return metrics::OmniboxInputType::INVALID;
+#endif // defined(OS_LINUX)
       // If block state is unknown, check if there is an application registered
       // for the url scheme.
       GURL url(scheme + "://");
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 3714490..6d80f94 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -88,6 +88,7 @@
 #include "content/public/browser/ssl_host_state_delegate.h"
 #include "content/public/browser/storage_partition.h"
 #include "media/mojo/services/video_decode_perf_history.h"
+#include "mojo/public/cpp/bindings/callback_helpers.h"
 #include "net/cookies/cookie_store.h"
 #include "net/http/http_transaction_factory.h"
 #include "net/net_buildflags.h"
@@ -249,20 +250,6 @@
   io_thread->ClearHostCache(host_filter);
 }
 
-void ClearHttpAuthCacheOnIOThread(
-    scoped_refptr<net::URLRequestContextGetter> context_getter,
-    base::Time delete_begin) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  net::HttpNetworkSession* http_session = context_getter->GetURLRequestContext()
-                                              ->http_transaction_factory()
-                                              ->GetSession();
-  DCHECK(http_session);
-  http_session->http_auth_cache()->ClearEntriesAddedWithin(base::Time::Now() -
-                                                           delete_begin);
-  http_session->CloseAllConnections();
-}
-
 #if BUILDFLAG(ENABLE_REPORTING)
 void ClearReportingCacheOnIOThread(
     net::URLRequestContextGetter* context,
@@ -848,14 +835,10 @@
               CreatePendingTaskCompletionClosure()));
     }
 
-    scoped_refptr<net::URLRequestContextGetter> request_context =
-        BrowserContext::GetDefaultStoragePartition(profile_)
-            ->GetURLRequestContext();
-    BrowserThread::PostTaskAndReply(
-        BrowserThread::IO, FROM_HERE,
-        base::BindOnce(&ClearHttpAuthCacheOnIOThread,
-                       std::move(request_context), delete_begin_),
-        CreatePendingTaskCompletionClosure());
+    BrowserContext::GetDefaultStoragePartition(profile_)
+        ->GetNetworkContext()
+        ->ClearHttpAuthCache(delete_begin_,
+                             CreatePendingTaskCompletionClosureForMojo());
   }
 
   if (remove_mask & content::BrowsingDataRemover::DATA_TYPE_COOKIES) {
@@ -1191,6 +1174,17 @@
                         weak_ptr_factory_.GetWeakPtr());
 }
 
+base::OnceClosure
+ChromeBrowsingDataRemoverDelegate::CreatePendingTaskCompletionClosureForMojo() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // Note num_pending_tasks++ unnecessary here because it's done by the call to
+  // CreatePendingTaskCompletionClosure().
+  return mojo::WrapCallbackWithDropHandler(
+      CreatePendingTaskCompletionClosure(),
+      base::BindOnce(&ChromeBrowsingDataRemoverDelegate::OnTaskComplete,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
 #if defined(OS_ANDROID)
 void ChromeBrowsingDataRemoverDelegate::OverrideWebappRegistryForTesting(
     std::unique_ptr<WebappRegistry> webapp_registry) {
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
index df857b3..0ffa64a 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h
@@ -187,6 +187,11 @@
   // created by this method have been invoked.
   base::OnceClosure CreatePendingTaskCompletionClosure();
 
+  // Same as CreatePendingTaskCompletionClosure() but guarantees that
+  // OnTaskComplete() is called if the task is dropped. That can typically
+  // happen when the connection is closed while an interface call is made.
+  base::OnceClosure CreatePendingTaskCompletionClosureForMojo();
+
   // Callback for when TemplateURLService has finished loading. Clears the data,
   // clears the respective waiting flag, and invokes NotifyIfDone.
   void OnKeywordsLoaded(base::RepeatingCallback<bool(const GURL&)> url_filter,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 1727ad7..a67dd809 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -240,8 +240,8 @@
     "accessibility/magnification_manager.h",
     "accessibility/select_to_speak_event_handler.cc",
     "accessibility/select_to_speak_event_handler.h",
-    "accessibility/spoken_feedback_event_rewriter.cc",
-    "accessibility/spoken_feedback_event_rewriter.h",
+    "accessibility/spoken_feedback_event_rewriter_delegate.cc",
+    "accessibility/spoken_feedback_event_rewriter_delegate.h",
     "accessibility/switch_access_event_handler.cc",
     "accessibility/switch_access_event_handler.h",
     "app_mode/app_launch_utils.cc",
@@ -1838,7 +1838,6 @@
     "../policy/default_geolocation_policy_handler_unittest.cc",
     "../ui/browser_finder_chromeos_unittest.cc",
     "accessibility/select_to_speak_event_handler_unittest.cc",
-    "accessibility/spoken_feedback_event_rewriter_unittest.cc",
     "app_mode/startup_app_launcher_unittest.cc",
     "apps/intent_helper/apps_navigation_throttle_unittest.cc",
     "arc/accessibility/arc_accessibility_helper_bridge_unittest.cc",
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.cc
deleted file mode 100644
index 6ac01750..0000000
--- a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h"
-
-#include <string>
-#include <utility>
-
-#include "ash/shell.h"
-#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
-#include "chrome/browser/chromeos/accessibility/event_handler_common.h"
-#include "chrome/common/extensions/extension_constants.h"
-#include "content/public/browser/web_contents.h"
-#include "extensions/browser/event_router.h"
-#include "extensions/browser/extension_host.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/content_accelerators/accelerator_util.h"
-#include "ui/events/event.h"
-#include "ui/events/event_sink.h"
-
-SpokenFeedbackEventRewriterDelegate::SpokenFeedbackEventRewriterDelegate() {}
-
-bool SpokenFeedbackEventRewriterDelegate::IsSpokenFeedbackEnabled() const {
-  return chromeos::AccessibilityManager::Get()->IsSpokenFeedbackEnabled();
-}
-
-bool SpokenFeedbackEventRewriterDelegate::DispatchKeyEventToChromeVox(
-    const ui::KeyEvent& key_event,
-    bool capture) {
-  // Always capture the Search key.
-  capture |= key_event.IsCommandDown();
-
-  // Don't capture tab as it gets consumed by Blink so never comes back
-  // unhandled. In third_party/WebKit/Source/core/input/EventHandler.cpp, a
-  // default tab handler consumes tab even when no focusable nodes are found; it
-  // sets focus to Chrome and eats the event.
-  if (key_event.GetDomKey() == ui::DomKey::TAB)
-    capture = false;
-
-  extensions::ExtensionHost* host = chromeos::GetAccessibilityExtensionHost(
-      extension_misc::kChromeVoxExtensionId);
-  if (!host)
-    return false;
-
-  // Listen for any unhandled keyboard events from ChromeVox's background page
-  // when capturing keys to reinject.
-  if (capture)
-    host->host_contents()->SetDelegate(this);
-  else
-    host->host_contents()->SetDelegate(nullptr);
-
-  // Forward all key events to ChromeVox's background page.
-  chromeos::ForwardKeyToExtension(key_event, host);
-
-  return capture;
-}
-
-void SpokenFeedbackEventRewriterDelegate::HandleKeyboardEvent(
-    content::WebContents* source,
-    const content::NativeWebKeyboardEvent& event) {
-  ui::KeyEvent key_event(*static_cast<ui::KeyEvent*>(event.os_event));
-
-  ui::EventSink* sink =
-      ash::Shell::GetPrimaryRootWindow()->GetHost()->event_sink();
-
-  if (sink->OnEventFromSource(&key_event).dispatcher_destroyed) {
-    VLOG(0) << "Undispatched key " << key_event.key_code()
-            << " due to destroyed dispatcher.";
-  }
-}
-
-SpokenFeedbackEventRewriter::SpokenFeedbackEventRewriter() {
-  delegate_.reset(new SpokenFeedbackEventRewriterDelegate());
-}
-
-SpokenFeedbackEventRewriter::~SpokenFeedbackEventRewriter() {}
-
-void SpokenFeedbackEventRewriter::SetDelegateForTest(
-    std::unique_ptr<SpokenFeedbackEventRewriterDelegate> delegate) {
-  delegate_ = std::move(delegate);
-}
-
-ui::EventRewriteStatus SpokenFeedbackEventRewriter::RewriteEvent(
-    const ui::Event& event,
-    std::unique_ptr<ui::Event>* new_event) {
-  if (!delegate_->IsSpokenFeedbackEnabled())
-    return ui::EVENT_REWRITE_CONTINUE;
-
-  if ((event.type() != ui::ET_KEY_PRESSED &&
-       event.type() != ui::ET_KEY_RELEASED))
-    return ui::EVENT_REWRITE_CONTINUE;
-
-  std::string extension_id =
-      chromeos::AccessibilityManager::Get()->keyboard_listener_extension_id();
-  if (extension_id.empty())
-    return ui::EVENT_REWRITE_CONTINUE;
-
-  bool capture =
-      chromeos::AccessibilityManager::Get()->keyboard_listener_capture();
-  const ui::KeyEvent key_event = static_cast<const ui::KeyEvent&>(event);
-  if (delegate_->DispatchKeyEventToChromeVox(key_event, capture))
-    return ui::EVENT_REWRITE_DISCARD;
-  return ui::EVENT_REWRITE_CONTINUE;
-}
-
-ui::EventRewriteStatus SpokenFeedbackEventRewriter::NextDispatchEvent(
-    const ui::Event& last_event,
-    std::unique_ptr<ui::Event>* new_event) {
-  return ui::EVENT_REWRITE_CONTINUE;
-}
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h
deleted file mode 100644
index 1b2a4e0..0000000
--- a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_SPOKEN_FEEDBACK_EVENT_REWRITER_H_
-#define CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_SPOKEN_FEEDBACK_EVENT_REWRITER_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "content/public/browser/web_contents_delegate.h"
-#include "ui/events/event_rewriter.h"
-
-namespace ui {
-class KeyEvent;
-}
-
-// Receives requests for spoken feedback enabled state and command dispatch.
-class SpokenFeedbackEventRewriterDelegate
-    : public content::WebContentsDelegate {
- public:
-  SpokenFeedbackEventRewriterDelegate();
-  ~SpokenFeedbackEventRewriterDelegate() override {}
-
-  // Returns true when ChromeVox is enabled.
-  virtual bool IsSpokenFeedbackEnabled() const;
-
-  // Returns true when |key_event| is dispatched to ChromeVox.
-  virtual bool DispatchKeyEventToChromeVox(const ui::KeyEvent& key_event,
-                                           bool capture);
-
-  // WebContentsDelegate:
-  void HandleKeyboardEvent(
-      content::WebContents* source,
-      const content::NativeWebKeyboardEvent& event) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEventRewriterDelegate);
-};
-
-// SpokenFeedbackEventRewriter discards all keyboard events mapped by the spoken
-// feedback manifest commands block. It dispatches the associated command name
-// directly to spoken feedback. This only occurs whenever spoken feedback is
-// enabled.
-class SpokenFeedbackEventRewriter : public ui::EventRewriter {
- public:
-  SpokenFeedbackEventRewriter();
-  ~SpokenFeedbackEventRewriter() override;
-
-  void SetDelegateForTest(
-      std::unique_ptr<SpokenFeedbackEventRewriterDelegate> delegate);
-
- private:
-  // EventRewriter:
-  ui::EventRewriteStatus RewriteEvent(
-      const ui::Event& event,
-      std::unique_ptr<ui::Event>* new_event) override;
-  ui::EventRewriteStatus NextDispatchEvent(
-      const ui::Event& last_event,
-      std::unique_ptr<ui::Event>* new_event) override;
-
-  // Active delegate (used for testing).
-  std::unique_ptr<SpokenFeedbackEventRewriterDelegate> delegate_;
-
-  DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEventRewriter);
-};
-
-#endif  // CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_SPOKEN_FEEDBACK_EVENT_REWRITER_H_
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc
new file mode 100644
index 0000000..d1d46b6
--- /dev/null
+++ b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc
@@ -0,0 +1,98 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h"
+
+#include "ash/public/interfaces/constants.mojom.h"
+#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
+#include "chrome/browser/chromeos/accessibility/event_handler_common.h"
+#include "chrome/common/extensions/extension_constants.h"
+#include "content/public/browser/native_web_keyboard_event.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/service_manager_connection.h"
+#include "extensions/browser/extension_host.h"
+#include "services/service_manager/public/cpp/connector.h"
+#include "ui/events/event.h"
+
+SpokenFeedbackEventRewriterDelegate::SpokenFeedbackEventRewriterDelegate()
+    : binding_(this) {
+  content::ServiceManagerConnection* connection =
+      content::ServiceManagerConnection::GetForProcess();
+  connection->GetConnector()->BindInterface(ash::mojom::kServiceName,
+                                            &event_rewriter_controller_ptr_);
+  // Set this object as the SpokenFeedbackEventRewriterDelegate.
+  ash::mojom::SpokenFeedbackEventRewriterDelegatePtr ptr;
+  binding_.Bind(mojo::MakeRequest(&ptr));
+  event_rewriter_controller_ptr_->SetSpokenFeedbackEventRewriterDelegate(
+      std::move(ptr));
+}
+
+SpokenFeedbackEventRewriterDelegate::~SpokenFeedbackEventRewriterDelegate() {}
+
+void SpokenFeedbackEventRewriterDelegate::DispatchKeyEventToChromeVox(
+    std::unique_ptr<ui::Event> event) {
+  if (!ShouldDispatchKeyEventToChromeVox(event.get())) {
+    OnUnhandledSpokenFeedbackEvent(std::move(event));
+    return;
+  }
+
+  bool capture =
+      chromeos::AccessibilityManager::Get()->keyboard_listener_capture();
+  const ui::KeyEvent* key_event = event->AsKeyEvent();
+
+  // Always capture the Search key.
+  capture |= key_event->IsCommandDown();
+
+  // Don't capture tab as it gets consumed by Blink so never comes back
+  // unhandled. In third_party/WebKit/Source/core/input/EventHandler.cpp, a
+  // default tab handler consumes tab even when no focusable nodes are found; it
+  // sets focus to Chrome and eats the event.
+  if (key_event->GetDomKey() == ui::DomKey::TAB)
+    capture = false;
+
+  extensions::ExtensionHost* host = chromeos::GetAccessibilityExtensionHost(
+      extension_misc::kChromeVoxExtensionId);
+  // Listen for any unhandled keyboard events from ChromeVox's background page
+  // when capturing keys to reinject.
+  host->host_contents()->SetDelegate(capture ? this : nullptr);
+
+  // Forward the event to ChromeVox's background page.
+  chromeos::ForwardKeyToExtension(*key_event, host);
+
+  if (!capture)
+    OnUnhandledSpokenFeedbackEvent(std::move(event));
+}
+
+bool SpokenFeedbackEventRewriterDelegate::ShouldDispatchKeyEventToChromeVox(
+    const ui::Event* event) const {
+  chromeos::AccessibilityManager* accessibility_manager =
+      chromeos::AccessibilityManager::Get();
+  if (!accessibility_manager->IsSpokenFeedbackEnabled() ||
+      accessibility_manager->keyboard_listener_extension_id().empty() ||
+      !chromeos::GetAccessibilityExtensionHost(
+          extension_misc::kChromeVoxExtensionId)) {
+    VLOG(1) << "Event sent to Spoken Feedback when disabled or unavailable";
+    return false;
+  }
+
+  if (!event || !event->IsKeyEvent()) {
+    NOTREACHED() << "Unexpected event sent to Spoken Feedback";
+    return false;
+  }
+
+  return true;
+}
+
+void SpokenFeedbackEventRewriterDelegate::OnUnhandledSpokenFeedbackEvent(
+    std::unique_ptr<ui::Event> event) const {
+  event_rewriter_controller_ptr_->OnUnhandledSpokenFeedbackEvent(
+      std::move(event));
+}
+
+void SpokenFeedbackEventRewriterDelegate::HandleKeyboardEvent(
+    content::WebContents* source,
+    const content::NativeWebKeyboardEvent& event) {
+  OnUnhandledSpokenFeedbackEvent(
+      ui::Event::Clone(*static_cast<ui::Event*>(event.os_event)));
+}
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h
new file mode 100644
index 0000000..cb3246f
--- /dev/null
+++ b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h
@@ -0,0 +1,47 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_SPOKEN_FEEDBACK_EVENT_REWRITER_DELEGATE_H_
+#define CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_SPOKEN_FEEDBACK_EVENT_REWRITER_DELEGATE_H_
+
+#include <memory>
+
+#include "ash/public/interfaces/event_rewriter_controller.mojom.h"
+#include "base/macros.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "mojo/public/cpp/bindings/binding.h"
+
+// Passes key events from Ash's EventRewriter to the ChromeVox extension code.
+// Reports ChromeVox's unhandled key events back to Ash for continued dispatch.
+// TODO(http://crbug.com/839541): Avoid reposting unhandled events.
+class SpokenFeedbackEventRewriterDelegate
+    : public ash::mojom::SpokenFeedbackEventRewriterDelegate,
+      public content::WebContentsDelegate {
+ public:
+  SpokenFeedbackEventRewriterDelegate();
+  ~SpokenFeedbackEventRewriterDelegate() override;
+
+  // ui::mojom::SpokenFeedbackEventRewriterDelegate:
+  void DispatchKeyEventToChromeVox(std::unique_ptr<ui::Event> event) override;
+
+ private:
+  // Returns whether the event should be dispatched to the ChromeVox extension.
+  bool ShouldDispatchKeyEventToChromeVox(const ui::Event* event) const;
+
+  // Reports unhandled key events to the EventRewriterController for dispatch.
+  void OnUnhandledSpokenFeedbackEvent(std::unique_ptr<ui::Event> event) const;
+
+  // WebContentsDelegate:
+  void HandleKeyboardEvent(
+      content::WebContents* source,
+      const content::NativeWebKeyboardEvent& event) override;
+
+  ash::mojom::EventRewriterControllerPtr event_rewriter_controller_ptr_;
+
+  mojo::Binding<ash::mojom::SpokenFeedbackEventRewriterDelegate> binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEventRewriterDelegate);
+};
+
+#endif  // CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_SPOKEN_FEEDBACK_EVENT_REWRITER_DELEGATE_H_
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_unittest.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_unittest.cc
deleted file mode 100644
index dab4e61..0000000
--- a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_unittest.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h"
-
-#include <memory>
-#include <vector>
-
-#include "ash/shell.h"
-#include "ash/test/ash_test_base.h"
-#include "base/macros.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/events/event.h"
-#include "ui/events/event_constants.h"
-#include "ui/events/keycodes/keyboard_codes.h"
-#include "ui/events/test/event_generator.h"
-
-// Records all key events.
-class EventCapturer : public ui::EventHandler {
- public:
-  EventCapturer() {}
-  ~EventCapturer() override {}
-
-  void Reset() { events_.clear(); }
-
-  void OnEvent(ui::Event* event) override {
-    if (event->IsKeyEvent())
-      events_.push_back(std::make_unique<ui::KeyEvent>(*event->AsKeyEvent()));
-  }
-
-  const std::vector<std::unique_ptr<ui::KeyEvent>>& captured_events() const {
-    return events_;
-  }
-
- private:
-  std::vector<std::unique_ptr<ui::KeyEvent>> events_;
-
-  DISALLOW_COPY_AND_ASSIGN(EventCapturer);
-};
-
-class TestDelegate : public SpokenFeedbackEventRewriterDelegate {
- public:
-  TestDelegate()
-      : is_spoken_feedback_enabled_(false), dispatch_result_(false) {}
-
-  ~TestDelegate() override {}
-
-  void set_is_spoken_feedback_enabled(bool enabled) {
-    is_spoken_feedback_enabled_ = enabled;
-  }
-
-  void set_dispatch_result(bool result) { dispatch_result_ = result; }
-
- private:
-  // SpokenFeedbackEventRewriterDelegate:
-  bool IsSpokenFeedbackEnabled() const override {
-    return is_spoken_feedback_enabled_;
-  }
-
-  bool DispatchKeyEventToChromeVox(const ui::KeyEvent& key_event,
-                                   bool capture) override {
-    return dispatch_result_;
-  }
-
-  bool is_spoken_feedback_enabled_;
-  bool dispatch_result_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestDelegate);
-};
-
-class SpokenFeedbackEventRewriterTest : public ash::AshTestBase {
- public:
-  SpokenFeedbackEventRewriterTest()
-      : generator_(nullptr),
-        spoken_feedback_event_rewriter_(new SpokenFeedbackEventRewriter()) {
-    delegate_ = new TestDelegate();
-    spoken_feedback_event_rewriter_->SetDelegateForTest(
-        std::unique_ptr<TestDelegate>(delegate_));
-  }
-
-  void SetUp() override {
-    ash::AshTestBase::SetUp();
-    generator_ = &AshTestBase::GetEventGenerator();
-    CurrentContext()->AddPreTargetHandler(&event_capturer_);
-    CurrentContext()->GetHost()->GetEventSource()->AddEventRewriter(
-        spoken_feedback_event_rewriter_.get());
-  }
-
-  void TearDown() override {
-    CurrentContext()->GetHost()->GetEventSource()->RemoveEventRewriter(
-        spoken_feedback_event_rewriter_.get());
-    CurrentContext()->RemovePreTargetHandler(&event_capturer_);
-    generator_ = nullptr;
-    ash::AshTestBase::TearDown();
-  }
-
- protected:
-  TestDelegate* delegate_;
-  ui::test::EventGenerator* generator_;
-  EventCapturer event_capturer_;
-
- private:
-  std::unique_ptr<SpokenFeedbackEventRewriter> spoken_feedback_event_rewriter_;
-
-  DISALLOW_COPY_AND_ASSIGN(SpokenFeedbackEventRewriterTest);
-};
-
-TEST_F(SpokenFeedbackEventRewriterTest, KeysNotEatenWithChromeVoxDisabled) {
-  // Send Search+Shift+Right.
-  generator_->PressKey(ui::VKEY_LWIN, ui::EF_COMMAND_DOWN);
-  ASSERT_EQ(1U, event_capturer_.captured_events().size());
-  generator_->PressKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
-  ASSERT_EQ(2U, event_capturer_.captured_events().size());
-
-  // Mock successful commands lookup and dispatch; shouldn't matter either way.
-  delegate_->set_dispatch_result(true);
-  generator_->PressKey(ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
-  ASSERT_EQ(3U, event_capturer_.captured_events().size());
-
-  // Released keys shouldn't get eaten.
-  delegate_->set_dispatch_result(false);
-  generator_->ReleaseKey(ui::VKEY_RIGHT,
-                         ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
-  generator_->ReleaseKey(ui::VKEY_SHIFT, ui::EF_COMMAND_DOWN);
-  generator_->ReleaseKey(ui::VKEY_LWIN, 0);
-  ASSERT_EQ(6U, event_capturer_.captured_events().size());
-
-  // Try releasing more keys.
-  generator_->ReleaseKey(ui::VKEY_RIGHT, 0);
-  generator_->ReleaseKey(ui::VKEY_SHIFT, 0);
-  generator_->ReleaseKey(ui::VKEY_LWIN, 0);
-  ASSERT_EQ(9U, event_capturer_.captured_events().size());
-}
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service.cc
index b4dd0aba..df61b3f 100644
--- a/chrome/browser/chromeos/arc/auth/arc_auth_service.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_auth_service.cc
@@ -26,7 +26,10 @@
 #include "components/arc/arc_util.h"
 #include "components/prefs/pref_service.h"
 #include "components/user_manager/user_manager.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/storage_partition.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace arc {
 
@@ -132,6 +135,9 @@
                                ArcBridgeService* arc_bridge_service)
     : profile_(Profile::FromBrowserContext(browser_context)),
       arc_bridge_service_(arc_bridge_service),
+      url_loader_factory_(
+          content::BrowserContext::GetDefaultStoragePartition(profile_)
+              ->GetURLLoaderFactoryForBrowserProcess()),
       weak_ptr_factory_(this) {
   arc_bridge_service_->auth()->SetHost(this);
   arc_bridge_service_->auth()->AddObserver(this);
@@ -244,7 +250,8 @@
   } else {
     // Optionally retrieve auth code in silent mode.
     auth_code_fetcher = std::make_unique<ArcBackgroundAuthCodeFetcher>(
-        profile_, ArcSessionManager::Get()->auth_context(), initial_signin);
+        url_loader_factory_, profile_, ArcSessionManager::Get()->auth_context(),
+        initial_signin);
   }
   auth_code_fetcher->Fetch(base::Bind(&ArcAuthService::OnAuthCodeFetched,
                                       weak_ptr_factory_.GetWeakPtr()));
@@ -306,4 +313,9 @@
   }
 }
 
+void ArcAuthService::SetURLLoaderFactoryForTesting(
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
+  url_loader_factory_ = std::move(url_loader_factory);
+}
+
 }  // namespace arc
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service.h b/chrome/browser/chromeos/arc/auth/arc_auth_service.h
index e4fdfbe..bd06cb17 100644
--- a/chrome/browser/chromeos/arc/auth/arc_auth_service.h
+++ b/chrome/browser/chromeos/arc/auth/arc_auth_service.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.h"
 #include "components/arc/common/auth.mojom.h"
@@ -21,6 +22,10 @@
 class BrowserContext;
 }  // namespace content
 
+namespace network {
+class SharedURLLoaderFactory;
+}  // namespace network
+
 namespace arc {
 
 class ArcFetcherBase;
@@ -54,6 +59,9 @@
   void ReportMetrics(mojom::MetricsType metrics_type, int32_t value) override;
   void ReportAccountCheckStatus(mojom::AccountCheckStatus status) override;
 
+  void SetURLLoaderFactoryForTesting(
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
+
  private:
   // Callbacks when auth info is fetched.
   void OnEnrollmentTokenFetched(
@@ -68,6 +76,7 @@
 
   Profile* const profile_;
   ArcBridgeService* const arc_bridge_service_;
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   std::unique_ptr<ArcFetcherBase> fetcher_;
 
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
index 7cfa304..449e97d 100644
--- a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
@@ -44,7 +44,9 @@
 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "components/user_manager/user_manager.h"
-#include "net/url_request/test_url_fetcher_factory.h"
+#include "content/public/common/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -204,17 +206,21 @@
 // Chrome supplies the info configured in SetAccountAndProfile() method.
 IN_PROC_BROWSER_TEST_F(ArcAuthServiceTest, SuccessfulBackgroundFetch) {
   SetAccountAndProfile(user_manager::USER_TYPE_REGULAR);
-  net::FakeURLFetcherFactory factory(nullptr);
-  factory.SetFakeResponse(
-      GURL(arc::kAuthTokenExchangeEndPoint),
-      "{ \"token\" : \"" + std::string(kFakeAuthCode) + "\" }", net::HTTP_OK,
-      net::URLRequestStatus::SUCCESS);
+  network::TestURLLoaderFactory test_url_loader_factory;
+  test_url_loader_factory.AddResponse(
+      arc::kAuthTokenExchangeEndPoint,
+      "{ \"token\" : \"" + std::string(kFakeAuthCode) + "\" }");
 
   FakeAuthInstance auth_instance;
   ArcAuthService* auth_service =
       ArcAuthService::GetForBrowserContext(profile());
   ASSERT_TRUE(auth_service);
 
+  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory =
+      base::MakeRefCounted<content::WeakWrapperSharedURLLoaderFactory>(
+          &test_url_loader_factory);
+  auth_service->SetURLLoaderFactoryForTesting(test_shared_loader_factory);
+
   ArcBridgeService* arc_bridge_service =
       ArcServiceManager::Get()->arc_bridge_service();
   ASSERT_TRUE(arc_bridge_service);
@@ -258,17 +264,21 @@
 IN_PROC_BROWSER_TEST_F(ArcAuthServiceChildAccountTest, ChildAccountFetch) {
   SetAccountAndProfile(user_manager::USER_TYPE_CHILD);
   EXPECT_TRUE(profile()->IsChild());
-  net::FakeURLFetcherFactory factory(nullptr);
-  factory.SetFakeResponse(
-      GURL(arc::kAuthTokenExchangeEndPoint),
-      "{ \"token\" : \"" + std::string(kFakeAuthCode) + "\" }", net::HTTP_OK,
-      net::URLRequestStatus::SUCCESS);
+  network::TestURLLoaderFactory test_url_loader_factory;
+  test_url_loader_factory.AddResponse(
+      arc::kAuthTokenExchangeEndPoint,
+      "{ \"token\" : \"" + std::string(kFakeAuthCode) + "\" }");
 
   FakeAuthInstance auth_instance;
   ArcAuthService* auth_service =
       ArcAuthService::GetForBrowserContext(profile());
   ASSERT_TRUE(auth_service);
 
+  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory =
+      base::MakeRefCounted<content::WeakWrapperSharedURLLoaderFactory>(
+          &test_url_loader_factory);
+  auth_service->SetURLLoaderFactoryForTesting(test_shared_loader_factory);
+
   ArcBridgeService* arc_bridge_service =
       ArcServiceManager::Get()->arc_bridge_service();
   ASSERT_TRUE(arc_bridge_service);
diff --git a/chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.cc b/chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.cc
index a1ab74ff..ea1df21 100644
--- a/chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.cc
@@ -21,7 +21,10 @@
 #include "google_apis/gaia/gaia_constants.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_status_code.h"
-#include "net/url_request/url_fetcher.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
 
 namespace arc {
 
@@ -46,10 +49,12 @@
     "https://www.googleapis.com/oauth2/v4/ExchangeToken";
 
 ArcBackgroundAuthCodeFetcher::ArcBackgroundAuthCodeFetcher(
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     Profile* profile,
     ArcAuthContext* context,
     bool initial_signin)
     : OAuth2TokenService::Consumer(kConsumerName),
+      url_loader_factory_(std::move(url_loader_factory)),
       profile_(profile),
       context_(context),
       initial_signin_(initial_signin),
@@ -60,7 +65,6 @@
 void ArcBackgroundAuthCodeFetcher::Fetch(const FetchCallback& callback) {
   DCHECK(callback_.is_null());
   callback_ = callback;
-
   context_->Prepare(base::Bind(&ArcBackgroundAuthCodeFetcher::OnPrepared,
                                weak_ptr_factory_.GetWeakPtr()));
 }
@@ -72,9 +76,6 @@
     return;
   }
 
-  DCHECK(!request_context_getter_);
-  request_context_getter_ = request_context_getter;
-
   // Get token service and account ID to fetch auth tokens.
   ProfileOAuth2TokenService* const token_service = context_->token_service();
   const std::string& account_id = context_->account_id();
@@ -101,44 +102,49 @@
   request_data.SetString(kDeviceId, device_id);
   std::string request_string;
   base::JSONWriter::Write(request_data, &request_string);
-
   const net::NetworkTrafficAnnotationTag traffic_annotation =
       net::DefineNetworkTrafficAnnotation("arc_auth_code_fetcher", R"(
-        semantics {
-          sender: "ARC auth code fetcher"
-          description:
-            "Fetches auth code to be used for Google Play Store sign-in."
-          trigger:
-            "The user or administrator initially enables Google Play Store on "
-            "the device, and Google Play Store requests authorization code for "
-            "account setup. This is also triggered when the Google Play Store "
-            "detects that current credentials are revoked or invalid and "
-            "requests extra authorization code for the account re-sign in."
-          data:
-            "Device id and access token."
-          destination: GOOGLE_OWNED_SERVICE
+      semantics {
+        sender: "ARC auth code fetcher"
+        description:
+          "Fetches auth code to be used for Google Play Store sign-in."
+        trigger:
+          "The user or administrator initially enables Google Play Store on"
+          "the device, and Google Play Store requests authorization code for "
+          "account setup. This is also triggered when the Google Play Store "
+          "detects that current credentials are revoked or invalid and "
+          "requests extra authorization code for the account re-sign in."
+        data: "Device id and access token."
+        destination: GOOGLE_OWNED_SERVICE
         }
-        policy {
-          cookies_allowed: NO
-          setting:
-            "There's no direct Chromium's setting to disable this, but you can "
-            "remove Google Play Store in Chrome's settings under the Google "
-            "Play Store section if this is allowed by policy."
-          policy_exception_justification: "Not implemented."
-        })");
-
-  auth_code_fetcher_ =
-      net::URLFetcher::Create(0, GURL(kAuthTokenExchangeEndPoint),
-                              net::URLFetcher::POST, this, traffic_annotation);
-  auth_code_fetcher_->SetRequestContext(request_context_getter_);
-  auth_code_fetcher_->SetUploadData(kContentTypeJSON, request_string);
-  auth_code_fetcher_->SetLoadFlags(
+      policy {
+        cookies_allowed: NO
+        setting:
+          "There's no direct Chromium's setting to disable this, but you can "
+          "remove Google Play Store in Chrome's settings under the Google "
+          "Play Store section if this is allowed by policy."
+        policy_exception_justification: "Not implemented."
+  })");
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+  resource_request->url = GURL(kAuthTokenExchangeEndPoint);
+  resource_request->load_flags =
       net::LOAD_DISABLE_CACHE | net::LOAD_BYPASS_CACHE |
-      net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES);
-  auth_code_fetcher_->SetAutomaticallyRetryOnNetworkChanges(
-      kGetAuthCodeNetworkRetry);
-  auth_code_fetcher_->SetExtraRequestHeaders(kGetAuthCodeHeaders);
-  auth_code_fetcher_->Start();
+      net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES;
+  resource_request->method = "POST";
+  resource_request->headers.AddHeaderFromString(kGetAuthCodeHeaders);
+  simple_url_loader_ = network::SimpleURLLoader::Create(
+      std::move(resource_request), traffic_annotation);
+  simple_url_loader_->AttachStringForUpload(request_string, kContentTypeJSON);
+  simple_url_loader_->SetRetryOptions(
+      kGetAuthCodeNetworkRetry,
+      network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE);
+  simple_url_loader_->SetAllowHttpErrorResults(true);
+  // base::Unretained is safe here since this class owns |simple_url_loader_|'s
+  // lifetime.
+  simple_url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
+      url_loader_factory_.get(),
+      base::BindOnce(&ArcBackgroundAuthCodeFetcher::OnSimpleLoaderComplete,
+                     base::Unretained(this)));
 }
 
 void ArcBackgroundAuthCodeFetcher::OnGetTokenFailure(
@@ -149,11 +155,17 @@
   ReportResult(std::string(), OptInSilentAuthCode::NO_LST_TOKEN);
 }
 
-void ArcBackgroundAuthCodeFetcher::OnURLFetchComplete(
-    const net::URLFetcher* source) {
-  const int response_code = source->GetResponseCode();
+void ArcBackgroundAuthCodeFetcher::OnSimpleLoaderComplete(
+    std::unique_ptr<std::string> response_body) {
+  int response_code = -1;
+  if (simple_url_loader_->ResponseInfo() &&
+      simple_url_loader_->ResponseInfo()->headers) {
+    response_code =
+        simple_url_loader_->ResponseInfo()->headers->response_code();
+  }
   std::string json_string;
-  source->GetResponseAsString(&json_string);
+  if (response_body)
+    json_string = std::move(*response_body);
 
   ResetFetchers();
 
@@ -162,7 +174,7 @@
   std::unique_ptr<base::Value> json_value =
       deserializer.Deserialize(nullptr, &error_msg);
 
-  if (response_code != net::HTTP_OK) {
+  if (!response_body || (response_code != net::HTTP_OK)) {
     const auto* error_value =
         json_value && json_value->is_dict()
             ? json_value->FindKeyOfType(kErrorDescription,
@@ -212,7 +224,7 @@
 
 void ArcBackgroundAuthCodeFetcher::ResetFetchers() {
   login_token_request_.reset();
-  auth_code_fetcher_.reset();
+  simple_url_loader_.reset();
 }
 
 void ArcBackgroundAuthCodeFetcher::ReportResult(
diff --git a/chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.h b/chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.h
index 0f1a3fe..8622bcc 100644
--- a/chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.h
+++ b/chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.h
@@ -20,10 +20,14 @@
 class Profile;
 
 namespace net {
-class URLFetcher;
 class URLRequestContextGetter;
 }  // namespace net
 
+namespace network {
+class SimpleURLLoader;
+class SharedURLLoaderFactory;
+}  // namespace network
+
 namespace arc {
 
 // Exposed for testing.
@@ -32,12 +36,13 @@
 // The instance is not reusable, so for each Fetch(), the instance must be
 // re-created. Deleting the instance cancels inflight operation.
 class ArcBackgroundAuthCodeFetcher : public ArcAuthCodeFetcher,
-                                     public OAuth2TokenService::Consumer,
-                                     public net::URLFetcherDelegate {
+                                     public OAuth2TokenService::Consumer {
  public:
-  ArcBackgroundAuthCodeFetcher(Profile* profile,
-                               ArcAuthContext* context,
-                               bool initial_signin);
+  ArcBackgroundAuthCodeFetcher(
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      Profile* profile,
+      ArcAuthContext* context,
+      bool initial_signin);
   ~ArcBackgroundAuthCodeFetcher() override;
 
   // ArcAuthCodeFetcher:
@@ -54,21 +59,19 @@
   void OnGetTokenFailure(const OAuth2TokenService::Request* request,
                          const GoogleServiceAuthError& error) override;
 
-  // net::URLFetcherDelegate:
-  void OnURLFetchComplete(const net::URLFetcher* source) override;
+  void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
 
   void ReportResult(const std::string& auth_code,
                     OptInSilentAuthCode uma_status);
 
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
   // Unowned pointers.
   Profile* const profile_;
   ArcAuthContext* const context_;
-  net::URLRequestContextGetter* request_context_getter_ = nullptr;
-
   FetchCallback callback_;
 
   std::unique_ptr<OAuth2TokenService::Request> login_token_request_;
-  std::unique_ptr<net::URLFetcher> auth_code_fetcher_;
+  std::unique_ptr<network::SimpleURLLoader> simple_url_loader_;
 
   // Keeps context of account code request. |initial_signin_| is true if request
   // is made for initial sign-in flow.
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index b72a2082..a7bfd27 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -37,7 +37,7 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/chromeos/accessibility/magnification_manager.h"
-#include "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h"
+#include "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
@@ -1061,12 +1061,14 @@
     event_rewriter_controller_ptr->SetKeyboardDrivenEventRewriterEnabled(true);
   }
 
+  // Construct a delegate to connect ChromeVox and SpokenFeedbackEventRewriter.
+  spoken_feedback_event_rewriter_delegate_ =
+      std::make_unique<SpokenFeedbackEventRewriterDelegate>();
+
   if (chromeos::GetAshConfig() != ash::Config::MASH) {
     // TODO(mash): Support EventRewriterController; see crbug.com/647781
     ash::EventRewriterController* event_rewriter_controller =
         ash::Shell::Get()->event_rewriter_controller();
-    event_rewriter_controller->AddEventRewriter(
-        std::unique_ptr<ui::EventRewriter>(new SpokenFeedbackEventRewriter()));
     event_rewriter_delegate_ = std::make_unique<EventRewriterDelegateImpl>();
     event_rewriter_controller->AddEventRewriter(
         std::make_unique<ui::EventRewriterChromeOS>(
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index cbf8b08..9138a1b 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -16,6 +16,7 @@
 #include "chromeos/system/version_loader.h"
 
 class NotificationPlatformBridge;
+class SpokenFeedbackEventRewriterDelegate;
 
 namespace lock_screen_apps {
 class StateController;
@@ -109,6 +110,10 @@
 
   std::unique_ptr<EventRewriterDelegateImpl> event_rewriter_delegate_;
 
+  // Handles event dispatch to the spoken feedback extension (ChromeVox).
+  std::unique_ptr<SpokenFeedbackEventRewriterDelegate>
+      spoken_feedback_event_rewriter_delegate_;
+
   scoped_refptr<chromeos::ExternalMetrics> external_metrics_;
 
   std::unique_ptr<arc::ArcServiceLauncher> arc_service_launcher_;
diff --git a/chrome/browser/chromeos/file_manager/audio_player_browsertest.cc b/chrome/browser/chromeos/file_manager/audio_player_browsertest.cc
index 34b03f0..1640ba6 100644
--- a/chrome/browser/chromeos/file_manager/audio_player_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/audio_player_browsertest.cc
@@ -9,9 +9,9 @@
 template <GuestMode MODE>
 class AudioPlayerBrowserTestBase : public FileManagerBrowserTestBase {
  public:
-  GuestMode GetGuestModeParam() const override { return MODE; }
+  GuestMode GetGuestMode() const override { return MODE; }
 
-  const char* GetTestCaseNameParam() const override {
+  const char* GetTestCaseName() const override {
     return test_case_name_.c_str();
   }
 
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
index b30059f..e4dc375 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -36,11 +36,11 @@
     }
   }
 
-  GuestMode GetGuestModeParam() const override {
+  GuestMode GetGuestMode() const override {
     return std::get<0>(GetParam());
   }
 
-  const char* GetTestCaseNameParam() const override {
+  const char* GetTestCaseName() const override {
     return std::get<1>(GetParam());
   }
 
@@ -50,7 +50,7 @@
 
  private:
   bool shouldEnableLegacyEventDispatch() {
-    const std::string test_case_name = GetTestCaseNameParam();
+    const std::string test_case_name = GetTestCaseName();
     // crbug.com/482121 crbug.com/480491
     return test_case_name.find("tabindex") != std::string::npos;
   }
@@ -639,9 +639,9 @@
                                                  "refresh_token");
   }
 
-  GuestMode GetGuestModeParam() const override { return NOT_IN_GUEST_MODE; }
+  GuestMode GetGuestMode() const override { return NOT_IN_GUEST_MODE; }
 
-  const char* GetTestCaseNameParam() const override {
+  const char* GetTestCaseName() const override {
     return test_case_name_.c_str();
   }
 
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
index a10f9e2..d4443b8 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -334,7 +334,7 @@
   }
 };
 
-// FakeTestVolume: local test volume with a specified volume and device type.
+// FakeTestVolume: local test volume with a given volume and device type.
 class FakeTestVolume : public LocalTestVolume {
  public:
   FakeTestVolume(const std::string& name,
@@ -345,11 +345,13 @@
         device_type_(device_type) {}
   ~FakeTestVolume() override {}
 
-  // Simple test entries used for testing, e.g., read-only volumes.
+  // Add the fake test volume entries.
   bool PrepareTestEntries(Profile* profile) {
     if (!CreateRootDirectory(profile))
       return false;
-    // Must be in sync with BASIC_FAKE_ENTRY_SET in the JS test code.
+
+    // Note: must be kept in sync with BASIC_FAKE_ENTRY_SET defined in the
+    // integration_tests/file_manager JS code.
     CreateEntry(TestEntryInfo(FILE, "text.txt", "hello.txt", "text/plain", NONE,
                               base::Time::Now()));
     CreateEntry(TestEntryInfo(DIRECTORY, std::string(), "A", std::string(),
@@ -360,25 +362,29 @@
   bool Mount(Profile* profile) override {
     if (!CreateRootDirectory(profile))
       return false;
-    storage::ExternalMountPoints* const mount_points =
-        storage::ExternalMountPoints::GetSystemInstance();
 
-    // First revoke the existing mount point (if any).
-    mount_points->RevokeFileSystem(name());
-    const bool result = mount_points->RegisterFileSystem(
+    // Revoke name() mount point first, then re-add its mount point.
+    GetMountPoints()->RevokeFileSystem(name());
+    const bool added = GetMountPoints()->RegisterFileSystem(
         name(), storage::kFileSystemTypeNativeLocal,
         storage::FileSystemMountOption(), root_path());
-    if (!result)
+    if (!added)
       return false;
 
-    VolumeManager::Get(profile)->AddVolumeForTesting(
-        root_path(), volume_type_, device_type_, false /* read_only */);
+    // Expose the mount point with the given volume and device type.
+    VolumeManager::Get(profile)->AddVolumeForTesting(root_path(), volume_type_,
+                                                     device_type_, read_only_);
     return true;
   }
 
  private:
+  storage::ExternalMountPoints* GetMountPoints() {
+    return storage::ExternalMountPoints::GetSystemInstance();
+  }
+
   const VolumeType volume_type_;
   const chromeos::DeviceType device_type_;
+  const bool read_only_ = false;
 };
 
 // DriveTestVolume: test volume for Google Drive.
@@ -422,6 +428,7 @@
                        const std::string& target_name,
                        const base::Time& modification_time) {
     google_apis::DriveApiErrorCode error = google_apis::DRIVE_OTHER_ERROR;
+
     std::unique_ptr<google_apis::FileResource> entry;
     fake_drive_service_->AddNewDirectory(
         parent_id, target_name, drive::AddNewDirectoryOptions(),
@@ -436,6 +443,7 @@
     base::RunLoop().RunUntilIdle();
     ASSERT_TRUE(error == google_apis::HTTP_SUCCESS);
     ASSERT_TRUE(entry);
+
     CheckForUpdates();
   }
 
@@ -528,13 +536,13 @@
 
 void FileManagerBrowserTestBase::SetUpCommandLine(
     base::CommandLine* command_line) {
-  if (GetGuestModeParam() == IN_GUEST_MODE) {
+  if (GetGuestMode() == IN_GUEST_MODE) {
     command_line->AppendSwitch(chromeos::switches::kGuestSession);
     command_line->AppendSwitchNative(chromeos::switches::kLoginUser, "");
     command_line->AppendSwitch(switches::kIncognito);
   }
 
-  if (GetGuestModeParam() == IN_INCOGNITO) {
+  if (GetGuestMode() == IN_INCOGNITO) {
     command_line->AppendSwitch(switches::kIncognito);
   }
 
@@ -546,7 +554,7 @@
 
   local_volume_.reset(new DownloadsTestVolume);
 
-  if (GetGuestModeParam() != IN_GUEST_MODE) {
+  if (GetGuestMode() != IN_GUEST_MODE) {
     create_drive_integration_service_ =
         base::Bind(&FileManagerBrowserTestBase::CreateDriveIntegrationService,
                    base::Unretained(this));
@@ -562,7 +570,7 @@
 
   CHECK(local_volume_->Mount(profile()));
 
-  if (GetGuestModeParam() != IN_GUEST_MODE) {
+  if (GetGuestMode() != IN_GUEST_MODE) {
     // Start the embedded test server to serve the mocked share dialog.
     CHECK(embedded_test_server()->Start());
     const GURL share_url_base(embedded_test_server()->GetURL(
@@ -596,7 +604,7 @@
 }
 
 void FileManagerBrowserTestBase::StartTest() {
-  LOG(INFO) << "FileManagerBrowserTest::StartTest " << GetTestCaseNameParam();
+  LOG(INFO) << "FileManagerBrowserTest::StartTest " << GetTestCaseName();
   static const base::FilePath test_extension_dir =
       base::FilePath(FILE_PATH_LITERAL("ui/file_manager/integration_tests"));
   LaunchExtension(test_extension_dir, GetTestExtensionManifestName());
@@ -646,7 +654,7 @@
     }
 
     // Test FAILED: while processing the command.
-    LOG(INFO) << "[FAILED] " << GetTestCaseNameParam();
+    LOG(INFO) << "[FAILED] " << GetTestCaseName();
     return;
   }
 }
@@ -658,7 +666,7 @@
 
   if (name == "getTestName") {
     // Obtain the test case name.
-    *output = GetTestCaseNameParam();
+    *output = GetTestCaseName();
     return;
   }
 
@@ -678,7 +686,7 @@
 
   if (name == "isInGuestMode") {
     // Obtain whether the test is in guest mode or not.
-    *output = GetGuestModeParam() != NOT_IN_GUEST_MODE ? "true" : "false";
+    *output = GetGuestMode() != NOT_IN_GUEST_MODE ? "true" : "false";
     return;
   }
 
@@ -730,7 +738,7 @@
     usb_volume_.reset(new FakeTestVolume("fake-usb",
                                          VOLUME_TYPE_REMOVABLE_DISK_PARTITION,
                                          chromeos::DEVICE_TYPE_USB));
-    usb_volume_->Mount(profile());
+    ASSERT_TRUE(usb_volume_->Mount(profile()));
     return;
   }
 
@@ -739,7 +747,7 @@
                                          chromeos::DEVICE_TYPE_UNKNOWN));
     ASSERT_TRUE(mtp_volume_->PrepareTestEntries(profile()));
 
-    mtp_volume_->Mount(profile());
+    ASSERT_TRUE(mtp_volume_->Mount(profile()));
     return;
   }
 
@@ -754,17 +762,16 @@
   if (name == "clickNotificationButton") {
     std::string extension_id;
     std::string notification_id;
-    int index;
     ASSERT_TRUE(value.GetString("extensionId", &extension_id));
     ASSERT_TRUE(value.GetString("notificationId", &notification_id));
-    ASSERT_TRUE(value.GetInteger("index", &index));
 
-    const std::string delegate_id = extension_id + "-" + notification_id;
-
+    const auto delegate_id = extension_id + "-" + notification_id;
     base::Optional<message_center::Notification> notification =
         display_service_->GetNotification(delegate_id);
     EXPECT_TRUE(notification);
 
+    int index;
+    ASSERT_TRUE(value.GetInteger("index", &index));
     display_service_->SimulateClick(NotificationHandler::Type::EXTENSION,
                                     delegate_id, index, base::nullopt);
     return;
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
index 57690f9..8cf21d4 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.h
@@ -50,8 +50,8 @@
   void StartTest();
 
   // Overrides for each FileManagerBrowserTest test extension type.
-  virtual GuestMode GetGuestModeParam() const = 0;
-  virtual const char* GetTestCaseNameParam() const = 0;
+  virtual GuestMode GetGuestMode() const = 0;
+  virtual const char* GetTestCaseName() const = 0;
   virtual const char* GetTestExtensionManifestName() const = 0;
 
  private:
diff --git a/chrome/browser/chromeos/file_manager/gallery_browsertest.cc b/chrome/browser/chromeos/file_manager/gallery_browsertest.cc
index f534c98b..9e46bcc1 100644
--- a/chrome/browser/chromeos/file_manager/gallery_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/gallery_browsertest.cc
@@ -9,9 +9,9 @@
 template <GuestMode MODE>
 class GalleryBrowserTestBase : public FileManagerBrowserTestBase {
  public:
-  GuestMode GetGuestModeParam() const override { return MODE; }
+  GuestMode GetGuestMode() const override { return MODE; }
 
-  const char* GetTestCaseNameParam() const override {
+  const char* GetTestCaseName() const override {
     return test_case_name_.c_str();
   }
 
diff --git a/chrome/browser/chromeos/file_manager/video_player_browsertest.cc b/chrome/browser/chromeos/file_manager/video_player_browsertest.cc
index 1ba5746..ccdc360 100644
--- a/chrome/browser/chromeos/file_manager/video_player_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/video_player_browsertest.cc
@@ -17,9 +17,9 @@
     FileManagerBrowserTestBase::SetUpCommandLine(command_line);
   }
 
-  GuestMode GetGuestModeParam() const override { return MODE; }
+  GuestMode GetGuestMode() const override { return MODE; }
 
-  const char* GetTestCaseNameParam() const override {
+  const char* GetTestCaseName() const override {
     return test_case_name_.c_str();
   }
 
diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc
index 0ccccef..de58edd4 100644
--- a/chrome/browser/chromeos/login/chrome_restart_request.cc
+++ b/chrome/browser/chromeos/login/chrome_restart_request.cc
@@ -116,7 +116,6 @@
     ::switches::kEnablePartialRaster,
     ::switches::kEnablePinch,
     ::switches::kEnablePreferCompositingToLCDText,
-    ::switches::kEnableRasterDecoder,
     ::switches::kEnableRGBA4444Textures,
     ::switches::kEnableSlimmingPaintV175,
     ::switches::kEnableSlimmingPaintV2,
diff --git a/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc b/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
index 98389cf..203c04d 100644
--- a/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
+++ b/chrome/browser/conflicts/module_event_sink_impl_win_unittest.cc
@@ -6,12 +6,12 @@
 
 #include <memory>
 
-#include "base/test/scoped_task_environment.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "chrome/browser/conflicts/module_database_win.h"
 #include "chrome/common/conflicts/module_watcher_win.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
+#include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #include <windows.h>
@@ -45,7 +45,7 @@
   }
 
   // Must be before |module_database_|.
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  content::TestBrowserThreadBundle test_browser_thread_bundle_;
   ScopedTestingLocalState scoped_testing_local_state_;
   std::unique_ptr<ModuleDatabase> module_database_;
   std::unique_ptr<ModuleEventSinkImpl> module_event_sink_impl_;
diff --git a/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc b/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
index 31249fc..6625092 100644
--- a/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
+++ b/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc
@@ -124,7 +124,7 @@
     return;
   }
 
-  content::WebContents* web_contents = GetAssociatedWebContentsDeprecated();
+  content::WebContents* web_contents = GetSenderWebContents();
   if (!web_contents) {
     // The browser window has gone away.
     Respond(BuildResponse(api::dashboard_private::RESULT_USER_CANCELLED,
diff --git a/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_connection_manager.cc b/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_connection_manager.cc
index 0ca60a93..646cadc7 100644
--- a/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_connection_manager.cc
+++ b/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_connection_manager.cc
@@ -24,11 +24,11 @@
 api::easy_unlock_private::ConnectionStatus ToApiConnectionStatus(
     Connection::Status status) {
   switch (status) {
-    case Connection::DISCONNECTED:
+    case Connection::Status::DISCONNECTED:
       return api::easy_unlock_private::CONNECTION_STATUS_DISCONNECTED;
-    case Connection::IN_PROGRESS:
+    case Connection::Status::IN_PROGRESS:
       return api::easy_unlock_private::CONNECTION_STATUS_IN_PROGRESS;
-    case Connection::CONNECTED:
+    case Connection::Status::CONNECTED:
       return api::easy_unlock_private::CONNECTION_STATUS_CONNECTED;
   }
   return api::easy_unlock_private::CONNECTION_STATUS_NONE;
diff --git a/chrome/browser/extensions/api/inline_install_private/inline_install_private_api.cc b/chrome/browser/extensions/api/inline_install_private/inline_install_private_api.cc
index daa66dd..66322d8 100644
--- a/chrome/browser/extensions/api/inline_install_private/inline_install_private_api.cc
+++ b/chrome/browser/extensions/api/inline_install_private/inline_install_private_api.cc
@@ -14,6 +14,7 @@
 #include "components/crx_file/id_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/view_type_utils.h"
 
 namespace extensions {
 
@@ -106,10 +107,11 @@
     return RespondNow(CreateResponse("Must be called with a user gesture",
                                      webstore_install::NOT_PERMITTED));
 
-  content::WebContents* web_contents = GetAssociatedWebContentsDeprecated();
-  if (!web_contents)
+  content::WebContents* web_contents = GetSenderWebContents();
+  if (!web_contents || GetViewType(web_contents) != VIEW_TYPE_APP_WINDOW) {
     return RespondNow(CreateResponse("Must be called from a foreground page",
                                      webstore_install::NOT_PERMITTED));
+  }
 
   ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context());
   if (registry->GetExtensionById(params->id, ExtensionRegistry::EVERYTHING))
diff --git a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
index 2d10d17d..ab284e6 100644
--- a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
@@ -198,14 +198,14 @@
                             NULL, TRAFFIC_ANNOTATION_FOR_TESTS));
 
   EXPECT_EQ(
-      PermissionsData::ACCESS_ALLOWED,
+      PermissionsData::PageAccess::kAllowed,
       WebRequestPermissions::CanExtensionAccessURL(
           extension_info_map_.get(), permissionless_extension_->id(),
           request->url(),
           -1,     // No tab id.
           false,  // crosses_incognito
           WebRequestPermissions::DO_NOT_CHECK_HOST, request->initiator()));
-  EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+  EXPECT_EQ(PermissionsData::PageAccess::kDenied,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), permissionless_extension_->id(),
                 request->url(),
@@ -213,7 +213,7 @@
                 false,  // crosses_incognito
                 WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL,
                 request->initiator()));
-  EXPECT_EQ(PermissionsData::ACCESS_ALLOWED,
+  EXPECT_EQ(PermissionsData::PageAccess::kAllowed,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), com_extension_->id(), request->url(),
                 -1,     // No tab id.
@@ -221,14 +221,14 @@
                 WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL,
                 request->initiator()));
   EXPECT_EQ(
-      PermissionsData::ACCESS_ALLOWED,
+      PermissionsData::PageAccess::kAllowed,
       WebRequestPermissions::CanExtensionAccessURL(
           extension_info_map_.get(), com_extension_->id(), request->url(),
           -1,     // No tab id.
           false,  // crosses_incognito
           WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL_AND_INITIATOR,
           request->initiator()));
-  EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+  EXPECT_EQ(PermissionsData::PageAccess::kDenied,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), com_extension_->id(), request->url(),
                 -1,     // No tab id.
@@ -241,7 +241,7 @@
   request_with_initiator->set_initiator(
       url::Origin::Create(GURL("http://www.example.org")));
 
-  EXPECT_EQ(PermissionsData::ACCESS_ALLOWED,
+  EXPECT_EQ(PermissionsData::PageAccess::kAllowed,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), permissionless_extension_->id(),
                 request_with_initiator->url(),
@@ -249,7 +249,7 @@
                 false,  // crosses_incognito
                 WebRequestPermissions::DO_NOT_CHECK_HOST,
                 request_with_initiator->initiator()));
-  EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+  EXPECT_EQ(PermissionsData::PageAccess::kDenied,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), permissionless_extension_->id(),
                 request_with_initiator->url(),
@@ -257,7 +257,7 @@
                 false,  // crosses_incognito
                 WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL,
                 request_with_initiator->initiator()));
-  EXPECT_EQ(PermissionsData::ACCESS_ALLOWED,
+  EXPECT_EQ(PermissionsData::PageAccess::kAllowed,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), com_extension_->id(),
                 request_with_initiator->url(),
@@ -266,7 +266,7 @@
                 WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL,
                 request_with_initiator->initiator()));
   EXPECT_EQ(
-      PermissionsData::ACCESS_DENIED,
+      PermissionsData::PageAccess::kDenied,
       WebRequestPermissions::CanExtensionAccessURL(
           extension_info_map_.get(), com_extension_->id(),
           request_with_initiator->url(),
@@ -274,7 +274,7 @@
           false,  // crosses_incognito
           WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL_AND_INITIATOR,
           request_with_initiator->initiator()));
-  EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+  EXPECT_EQ(PermissionsData::PageAccess::kDenied,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), com_extension_->id(),
                 request_with_initiator->url(),
@@ -289,7 +289,7 @@
       GURL("http://example.org"), net::DEFAULT_PRIORITY, nullptr));
 
   // com_extension_ doesn't have host permission for .org URLs.
-  EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+  EXPECT_EQ(PermissionsData::PageAccess::kDenied,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), com_policy_extension_->id(),
                 org_request->url(),
@@ -302,7 +302,7 @@
 
   // Host permission checks are disabled in Public Sessions, instead all URLs
   // are whitelisted.
-  EXPECT_EQ(PermissionsData::ACCESS_ALLOWED,
+  EXPECT_EQ(PermissionsData::PageAccess::kAllowed,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), com_policy_extension_->id(),
                 org_request->url(),
@@ -312,7 +312,7 @@
                 org_request->initiator()));
 
   EXPECT_EQ(
-      PermissionsData::ACCESS_ALLOWED,
+      PermissionsData::PageAccess::kAllowed,
       WebRequestPermissions::CanExtensionAccessURL(
           extension_info_map_.get(), com_policy_extension_->id(),
           org_request->url(),
@@ -325,7 +325,7 @@
       context.CreateRequest(GURL("chrome://version/"), net::DEFAULT_PRIORITY,
                             nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
 
-  EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+  EXPECT_EQ(PermissionsData::PageAccess::kDenied,
             WebRequestPermissions::CanExtensionAccessURL(
                 extension_info_map_.get(), com_policy_extension_->id(),
                 chrome_request->url(),
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index 2b7b70a..6d06524c 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -36,6 +36,7 @@
 #include "content/public/browser/gpu_feature_checker.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_function_constants.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/common/extension.h"
@@ -309,7 +310,7 @@
     return;
   }
 
-  content::WebContents* web_contents = GetAssociatedWebContentsDeprecated();
+  content::WebContents* web_contents = GetSenderWebContents();
   if (!web_contents) {
     // The browser window has gone away.
     Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED,
@@ -445,6 +446,12 @@
                             params->expected_id));
   }
 
+  content::WebContents* web_contents = GetSenderWebContents();
+  if (!web_contents) {
+    return RespondNow(
+        Error(function_constants::kCouldNotFindSenderWebContents));
+  }
+
   scoped_active_install_.reset(new ScopedActiveInstall(
       InstallTracker::Get(browser_context()), params->expected_id));
 
@@ -454,8 +461,7 @@
   // The extension will install through the normal extension install flow, but
   // the whitelist entry will bypass the normal permissions install dialog.
   scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller(
-      chrome_details_.GetProfile(), this,
-      chrome_details_.GetAssociatedWebContentsDeprecated(), params->expected_id,
+      chrome_details_.GetProfile(), this, web_contents, params->expected_id,
       std::move(approval_), WebstoreInstaller::INSTALL_SOURCE_OTHER);
   installer->Start();
 
diff --git a/chrome/browser/extensions/api/webstore_widget_private/app_installer.cc b/chrome/browser/extensions/api/webstore_widget_private/app_installer.cc
index 3c1af84..003dc82 100644
--- a/chrome/browser/extensions/api/webstore_widget_private/app_installer.cc
+++ b/chrome/browser/extensions/api/webstore_widget_private/app_installer.cc
@@ -42,6 +42,7 @@
       callback_(callback),
       web_contents_(web_contents),
       web_contents_observer_(new WebContentsObserver(web_contents, this)) {
+  DCHECK(web_contents_);
 }
 
 AppInstaller::~AppInstaller() {
diff --git a/chrome/browser/extensions/api/webstore_widget_private/webstore_widget_private_api.cc b/chrome/browser/extensions/api/webstore_widget_private/webstore_widget_private_api.cc
index 332db61c..f8f5aa3 100644
--- a/chrome/browser/extensions/api/webstore_widget_private/webstore_widget_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_widget_private/webstore_widget_private_api.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/extensions/api/webstore_widget_private.h"
 #include "chrome/grit/generated_resources.h"
+#include "extensions/browser/extension_function_constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/webui/web_ui_util.h"
 
@@ -90,9 +91,14 @@
       &WebstoreWidgetPrivateInstallWebstoreItemFunction::OnInstallComplete,
       this);
 
+  content::WebContents* web_contents = GetSenderWebContents();
+  if (!web_contents) {
+    return RespondNow(
+        Error(function_constants::kCouldNotFindSenderWebContents));
+  }
   scoped_refptr<webstore_widget::AppInstaller> installer(
       new webstore_widget::AppInstaller(
-          GetAssociatedWebContentsDeprecated(), params->item_id,
+          web_contents, params->item_id,
           Profile::FromBrowserContext(browser_context()),
           params->silent_installation, callback));
   // installer will be AddRef()'d in BeginInstall().
diff --git a/chrome/browser/extensions/extension_action_runner.cc b/chrome/browser/extensions/extension_action_runner.cc
index dbf216e..d3a0871 100644
--- a/chrome/browser/extensions/extension_action_runner.cc
+++ b/chrome/browser/extensions/extension_action_runner.cc
@@ -193,7 +193,7 @@
   }
 }
 
-PermissionsData::AccessType
+PermissionsData::PageAccess
 ExtensionActionRunner::RequiresUserConsentForScriptInjection(
     const Extension* extension,
     UserScript::InjectionType type) {
@@ -201,7 +201,7 @@
 
   // Allow the extension if it's been explicitly granted permission.
   if (permitted_extensions_.count(extension->id()) > 0)
-    return PermissionsData::ACCESS_ALLOWED;
+    return PermissionsData::PageAccess::kAllowed;
 
   GURL url = web_contents()->GetVisibleURL();
   int tab_id = SessionTabHelper::IdForTab(web_contents()).id();
@@ -215,7 +215,7 @@
   }
 
   NOTREACHED();
-  return PermissionsData::ACCESS_DENIED;
+  return PermissionsData::PageAccess::kDenied;
 }
 
 void ExtensionActionRunner::RequestScriptInjection(
@@ -284,10 +284,10 @@
   ++num_page_requests_;
 
   switch (RequiresUserConsentForScriptInjection(extension, script_type)) {
-    case PermissionsData::ACCESS_ALLOWED:
+    case PermissionsData::PageAccess::kAllowed:
       PermitScriptInjection(request_id);
       break;
-    case PermissionsData::ACCESS_WITHHELD:
+    case PermissionsData::PageAccess::kWithheld:
       // This base::Unretained() is safe, because the callback is only invoked
       // by this object.
       RequestScriptInjection(
@@ -295,7 +295,7 @@
           base::Bind(&ExtensionActionRunner::PermitScriptInjection,
                      base::Unretained(this), request_id));
       break;
-    case PermissionsData::ACCESS_DENIED:
+    case PermissionsData::PageAccess::kDenied:
       // We should usually only get a "deny access" if the page changed (as the
       // renderer wouldn't have requested permission if the answer was always
       // "no"). Just let the request fizzle and die.
diff --git a/chrome/browser/extensions/extension_action_runner.h b/chrome/browser/extensions/extension_action_runner.h
index f29a0d77..09dfc4c 100644
--- a/chrome/browser/extensions/extension_action_runner.h
+++ b/chrome/browser/extensions/extension_action_runner.h
@@ -91,7 +91,7 @@
 
 #if defined(UNIT_TEST)
   // Only used in tests.
-  PermissionsData::AccessType RequiresUserConsentForScriptInjectionForTesting(
+  PermissionsData::PageAccess RequiresUserConsentForScriptInjectionForTesting(
       const Extension* extension,
       UserScript::InjectionType type) {
     return RequiresUserConsentForScriptInjection(extension, type);
@@ -123,7 +123,7 @@
   // Returns true if the extension requesting script injection requires
   // user consent. If this is true, the caller should then register a request
   // via RequestScriptInjection().
-  PermissionsData::AccessType RequiresUserConsentForScriptInjection(
+  PermissionsData::PageAccess RequiresUserConsentForScriptInjection(
       const Extension* extension,
       UserScript::InjectionType type);
 
diff --git a/chrome/browser/extensions/extension_action_runner_unittest.cc b/chrome/browser/extensions/extension_action_runner_unittest.cc
index 0a43874c0..0edd6e0 100644
--- a/chrome/browser/extensions/extension_action_runner_unittest.cc
+++ b/chrome/browser/extensions/extension_action_runner_unittest.cc
@@ -126,12 +126,12 @@
 
 bool ExtensionActionRunnerUnitTest::RequiresUserConsent(
     const Extension* extension) const {
-  PermissionsData::AccessType access_type =
+  PermissionsData::PageAccess access_type =
       runner()->RequiresUserConsentForScriptInjectionForTesting(
           extension, UserScript::PROGRAMMATIC_SCRIPT);
   // We should never downright refuse access in these tests.
-  DCHECK_NE(PermissionsData::ACCESS_DENIED, access_type);
-  return access_type == PermissionsData::ACCESS_WITHHELD;
+  DCHECK_NE(PermissionsData::PageAccess::kDenied, access_type);
+  return access_type == PermissionsData::PageAccess::kWithheld;
 }
 
 void ExtensionActionRunnerUnitTest::RequestInjection(
diff --git a/chrome/browser/extensions/permissions_updater_unittest.cc b/chrome/browser/extensions/permissions_updater_unittest.cc
index c145a3c..9a0a25d 100644
--- a/chrome/browser/extensions/permissions_updater_unittest.cc
+++ b/chrome/browser/extensions/permissions_updater_unittest.cc
@@ -278,10 +278,10 @@
   auto can_access_page =
       [](scoped_refptr<const extensions::Extension> extension,
          const GURL& document_url) -> bool {
-    PermissionsData::AccessType access =
+    PermissionsData::PageAccess access =
         extension.get()->permissions_data()->GetPageAccess(
             extension.get(), document_url, -1, nullptr);
-    return access == PermissionsData::ACCESS_ALLOWED;
+    return access == PermissionsData::PageAccess::kAllowed;
   };
 
   {
diff --git a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
index 7d78ffb1..f03c06d 100644
--- a/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
+++ b/chrome/browser/extensions/scripting_permissions_modifier_unittest.cc
@@ -314,20 +314,20 @@
     return permissions->GetPageAccess(extension.get(), url, 0, nullptr);
   };
 
-  EXPECT_EQ(PermissionsData::ACCESS_WITHHELD, get_page_access(kUrl));
-  EXPECT_EQ(PermissionsData::ACCESS_WITHHELD, get_page_access(kUrl2));
+  EXPECT_EQ(PermissionsData::PageAccess::kWithheld, get_page_access(kUrl));
+  EXPECT_EQ(PermissionsData::PageAccess::kWithheld, get_page_access(kUrl2));
 
   modifier.GrantHostPermission(kUrl);
   EXPECT_TRUE(modifier.HasGrantedHostPermission(kUrl));
   EXPECT_FALSE(modifier.HasGrantedHostPermission(kUrl2));
-  EXPECT_EQ(PermissionsData::ACCESS_ALLOWED, get_page_access(kUrl));
-  EXPECT_EQ(PermissionsData::ACCESS_WITHHELD, get_page_access(kUrl2));
+  EXPECT_EQ(PermissionsData::PageAccess::kAllowed, get_page_access(kUrl));
+  EXPECT_EQ(PermissionsData::PageAccess::kWithheld, get_page_access(kUrl2));
 
   modifier.RemoveGrantedHostPermission(kUrl);
   EXPECT_FALSE(modifier.HasGrantedHostPermission(kUrl));
   EXPECT_FALSE(modifier.HasGrantedHostPermission(kUrl2));
-  EXPECT_EQ(PermissionsData::ACCESS_WITHHELD, get_page_access(kUrl));
-  EXPECT_EQ(PermissionsData::ACCESS_WITHHELD, get_page_access(kUrl2));
+  EXPECT_EQ(PermissionsData::PageAccess::kWithheld, get_page_access(kUrl));
+  EXPECT_EQ(PermissionsData::PageAccess::kWithheld, get_page_access(kUrl2));
 }
 
 // Checks that policy-installed extensions don't have permissions withheld and
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index f6918c5e..9e1f6fb 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -760,15 +760,17 @@
   std::unique_ptr<network::URLRequestContextBuilderMojo> builder =
       std::make_unique<network::URLRequestContextBuilderMojo>();
 
-  auto chrome_network_delegate = std::make_unique<ChromeNetworkDelegate>(
-      extension_event_router_forwarder(), &system_enable_referrers_);
-  // By default, data usage is considered off the record.
-  chrome_network_delegate->set_data_use_aggregator(
-      globals_->data_use_aggregator.get(),
-      true /* is_data_usage_off_the_record */);
-  builder->set_network_delegate(
-      globals_->data_use_ascriber->CreateNetworkDelegate(
-          std::move(chrome_network_delegate), GetMetricsDataUseForwarder()));
+  if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+    auto chrome_network_delegate = std::make_unique<ChromeNetworkDelegate>(
+        extension_event_router_forwarder(), &system_enable_referrers_);
+    // By default, data usage is considered off the record.
+    chrome_network_delegate->set_data_use_aggregator(
+        globals_->data_use_aggregator.get(),
+        true /* is_data_usage_off_the_record */);
+    builder->set_network_delegate(
+        globals_->data_use_ascriber->CreateNetworkDelegate(
+            std::move(chrome_network_delegate), GetMetricsDataUseForwarder()));
+  }
   std::unique_ptr<net::HostResolver> host_resolver(
       CreateGlobalHostResolver(net_log_));
 
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc
index c814c47..a4d5467 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc
@@ -23,8 +23,7 @@
 }
 
 void DialMediaSinkService::Start(
-    const OnSinksDiscoveredCallback& sink_discovery_cb,
-    const OnDialSinkAddedCallback& dial_sink_added_cb) {
+    const OnSinksDiscoveredCallback& sink_discovery_cb) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!impl_);
 
@@ -34,24 +33,16 @@
       base::BindRepeating(&DialMediaSinkService::RunSinksDiscoveredCallback,
                           weak_ptr_factory_.GetWeakPtr(), sink_discovery_cb));
 
-  impl_ = CreateImpl(sink_discovery_cb_impl, dial_sink_added_cb);
+  impl_ = CreateImpl(sink_discovery_cb_impl);
 
   impl_->task_runner()->PostTask(
       FROM_HERE, base::BindOnce(&DialMediaSinkServiceImpl::Start,
                                 base::Unretained(impl_.get())));
 }
 
-void DialMediaSinkService::OnUserGesture() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  impl_->task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&DialMediaSinkServiceImpl::OnUserGesture,
-                                base::Unretained(impl_.get())));
-}
-
 std::unique_ptr<DialMediaSinkServiceImpl, base::OnTaskRunnerDeleter>
 DialMediaSinkService::CreateImpl(
-    const OnSinksDiscoveredCallback& sink_discovery_cb,
-    const OnDialSinkAddedCallback& dial_sink_added_cb) {
+    const OnSinksDiscoveredCallback& sink_discovery_cb) {
   // Clone the connector so it can be used on the IO thread.
   std::unique_ptr<service_manager::Connector> connector =
       content::ServiceManagerConnection::GetForProcess()
@@ -65,7 +56,7 @@
           content::BrowserThread::IO);
   return std::unique_ptr<DialMediaSinkServiceImpl, base::OnTaskRunnerDeleter>(
       new DialMediaSinkServiceImpl(std::move(connector), sink_discovery_cb,
-                                   dial_sink_added_cb, task_runner),
+                                   task_runner),
       base::OnTaskRunnerDeleter(task_runner));
 }
 
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service.h b/chrome/browser/media/router/discovery/dial/dial_media_sink_service.h
index cf23ec82..a7925a7 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service.h
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service.h
@@ -29,6 +29,9 @@
 // Service to discover DIAL media sinks.  All public methods must be invoked on
 // the UI thread.  Delegates to DialMediaSinkServiceImpl by posting tasks to its
 // SequencedTaskRunner.
+// TODO(imcheng): Remove this class and moving the logic into a part
+// of DialMediaSinkServiceImpl that runs on the UI thread, and renaming
+// DialMediaSinkServiceImpl to DialMediaSinkService.
 class DialMediaSinkService {
  public:
   DialMediaSinkService();
@@ -37,19 +40,8 @@
   // Starts discovery of DIAL sinks. Can only be called once.
   // |sink_discovery_cb|: Callback to invoke on UI thread when the list of
   // discovered sinks has been updated.
-  // |dial_sink_added_cb|: Callback to invoke when a new DIAL sink has been
-  // discovered. The callback may be invoked on any thread, and may be invoked
-  // after |this| is destroyed. Can be null.
   // Marked virtual for tests.
-  virtual void Start(const OnSinksDiscoveredCallback& sink_discovery_cb,
-                     const OnDialSinkAddedCallback& dial_sink_added_cb);
-
-  // Initiates discovery immediately in response to a user gesture
-  // (i.e., opening the Media Router dialog). This method can only be called
-  // after |Start()|.
-  // TODO(imcheng): Rename to ManuallyInitiateDiscovery() or similar.
-  // Marked virtual for tests.
-  virtual void OnUserGesture();
+  virtual void Start(const OnSinksDiscoveredCallback& sink_discovery_cb);
 
   // Returns a raw pointer to |impl_|. This method is only valid to call after
   // |Start()| has been called. Always returns non-null.
@@ -61,8 +53,7 @@
  private:
   // Marked virtual for tests.
   virtual std::unique_ptr<DialMediaSinkServiceImpl, base::OnTaskRunnerDeleter>
-  CreateImpl(const OnSinksDiscoveredCallback& sink_discovery_cb,
-             const OnDialSinkAddedCallback& dial_sink_added_cb);
+  CreateImpl(const OnSinksDiscoveredCallback& sink_discovery_cb);
 
   void RunSinksDiscoveredCallback(
       const OnSinksDiscoveredCallback& sinks_discovered_cb,
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.cc
index 71ac495..bdeba40 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.cc
@@ -52,11 +52,9 @@
 DialMediaSinkServiceImpl::DialMediaSinkServiceImpl(
     std::unique_ptr<service_manager::Connector> connector,
     const OnSinksDiscoveredCallback& on_sinks_discovered_cb,
-    const OnDialSinkAddedCallback& dial_sink_added_cb,
     const scoped_refptr<base::SequencedTaskRunner>& task_runner)
     : MediaSinkServiceBase(on_sinks_discovered_cb),
       connector_(std::move(connector)),
-      dial_sink_added_cb_(dial_sink_added_cb),
       task_runner_(task_runner) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
@@ -86,7 +84,7 @@
   app_discovery_service_ =
       std::make_unique<DialAppDiscoveryService>(connector_.get());
 
-  MediaSinkServiceBase::StartTimer();
+  StartTimer();
 
   dial_registry_ =
       test_dial_registry_ ? test_dial_registry_ : DialRegistry::GetInstance();
@@ -96,18 +94,6 @@
 
 void DialMediaSinkServiceImpl::OnUserGesture() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // Re-sync sinks to CastMediaSinkService. It's possible that a DIAL-discovered
-  // sink was added to CastMediaSinkService earlier, but was removed due to
-  // flaky network. This gives CastMediaSinkService an opportunity to recover
-  // even if mDNS is not working for some reason.
-  DVLOG(2) << "OnUserGesture: re-syncing " << current_sinks_.size()
-           << " sinks to CastMediaSinkService";
-
-  if (dial_sink_added_cb_) {
-    for (const auto& sink_it : current_sinks_)
-      dial_sink_added_cb_.Run(sink_it.second);
-  }
-
   RescanAppInfo();
 }
 
@@ -125,8 +111,8 @@
         base::Unretained(this), app_name, callback_list.get()));
 
     // Start checking if |app_name| is available on existing sinks.
-    for (const auto& dial_sink_it : current_sinks_)
-      FetchAppInfoForSink(dial_sink_it.second, app_name);
+    for (const auto& sink : GetSinks())
+      FetchAppInfoForSink(sink.second, app_name);
   }
 
   return callback_list->Add(callback);
@@ -149,9 +135,35 @@
 }
 
 void DialMediaSinkServiceImpl::OnDiscoveryComplete() {
-  MediaSinkServiceBase::OnDiscoveryComplete();
+  std::vector<MediaSinkInternal> sinks_to_update;
+  std::vector<MediaSinkInternal> sinks_to_remove;
+  for (const auto& sink : GetSinks()) {
+    if (!base::ContainsKey(latest_sinks_, sink.first))
+      sinks_to_remove.push_back(sink.second);
+  }
+
+  for (const auto& latest_sink : latest_sinks_) {
+    // Sink is added or updated.
+    const MediaSinkInternal* sink = GetSinkById(latest_sink.first);
+    if (!sink || *sink != latest_sink.second)
+      sinks_to_update.push_back(latest_sink.second);
+  }
+
+  // Note: calling |AddOrUpdateSink()| or |RemoveSink()| here won't cause the
+  // discovery timer to fire again, since it is considered to be still running.
+  for (const auto& sink : sinks_to_update)
+    AddOrUpdateSink(sink);
+
+  for (const auto& sink : sinks_to_remove)
+    RemoveSink(sink);
+
+  latest_sinks_.clear();
+
+  // If discovered sinks are updated, then query results might have changed.
   for (const auto& query : sink_queries_)
     query.second->Notify(query.first);
+
+  MediaSinkServiceBase::OnDiscoveryComplete();
 }
 
 void DialMediaSinkServiceImpl::OnDialDeviceEvent(
@@ -160,13 +172,12 @@
   DVLOG(2) << "DialMediaSinkServiceImpl::OnDialDeviceEvent found "
            << devices.size() << " devices";
 
-  current_sinks_.clear();
   current_devices_ = devices;
 
   description_service_->GetDeviceDescriptions(devices);
 
   // Makes sure the timer fires even if there is no device.
-  MediaSinkServiceBase::RestartTimer();
+  StartTimer();
 }
 
 void DialMediaSinkServiceImpl::OnDialError(DialRegistry::DialErrorCode type) {
@@ -185,7 +196,8 @@
 
   std::string processed_uuid =
       MediaSinkInternal::ProcessDeviceUUID(description_data.unique_id);
-  std::string sink_id = base::StringPrintf("dial:<%s>", processed_uuid.c_str());
+  MediaSink::Id sink_id =
+      base::StringPrintf("dial:<%s>", processed_uuid.c_str());
   MediaSink sink(sink_id, description_data.friendly_name, SinkIconType::GENERIC,
                  MediaRouteProviderId::DIAL);
   DialSinkExtraData extra_data;
@@ -198,19 +210,14 @@
   }
 
   MediaSinkInternal dial_sink(sink, extra_data);
-  current_sinks_.insert_or_assign(sink_id, dial_sink);
-  if (dial_sink_added_cb_)
-    dial_sink_added_cb_.Run(dial_sink);
+  latest_sinks_.insert_or_assign(sink_id, dial_sink);
+  StartTimer();
 
   if (!IsDiscoveryOnly(description_data.model_name)) {
     // Start checking if all registered apps are available on |dial_sink|.
     for (const auto& query : sink_queries_)
       FetchAppInfoForSink(dial_sink, query.first);
   }
-
-  // Start fetch timer again if device description comes back after
-  // |finish_timer_| fires.
-  MediaSinkServiceBase::RestartTimer();
 }
 
 void DialMediaSinkServiceImpl::OnDeviceDescriptionError(
@@ -244,7 +251,7 @@
   // The sink might've been removed before the parse was complete. In that case
   // the callbacks won't be notified, but the app status will be saved for later
   // use.
-  if (!base::ContainsKey(current_sinks_, sink_id))
+  if (!GetSinkById(sink_id))
     return;
 
   auto query_it = sink_queries_.find(app_name);
@@ -274,17 +281,16 @@
 }
 
 void DialMediaSinkServiceImpl::RescanAppInfo() {
-  for (const auto& dial_sink_it : current_sinks_) {
-    std::string model_name = dial_sink_it.second.dial_data().model_name;
+  for (const auto& sink : GetSinks()) {
+    std::string model_name = sink.second.dial_data().model_name;
     if (IsDiscoveryOnly(model_name)) {
       DVLOG(2) << "Model name does not support DIAL app availability: "
                << model_name;
       continue;
     }
 
-    for (const auto& query : sink_queries_) {
-      FetchAppInfoForSink(dial_sink_it.second, query.first);
-    }
+    for (const auto& query : sink_queries_)
+      FetchAppInfoForSink(sink.second, query.first);
   }
 }
 
@@ -306,7 +312,7 @@
 
 void DialMediaSinkServiceImpl::RecordDeviceCounts() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  metrics_.RecordDeviceCountsIfNeeded(current_sinks_.size(),
+  metrics_.RecordDeviceCountsIfNeeded(GetSinks().size(),
                                       current_devices_.size());
 }
 
@@ -324,10 +330,9 @@
     const std::string& app_name) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   std::vector<MediaSinkInternal> sinks;
-  for (const auto& sink_it : current_sinks_) {
-    std::string sink_id = sink_it.second.sink().id();
-    if (GetAppStatus(sink_id, app_name) == SinkAppStatus::kAvailable)
-      sinks.push_back(sink_it.second);
+  for (const auto& sink : GetSinks()) {
+    if (GetAppStatus(sink.first, app_name) == SinkAppStatus::kAvailable)
+      sinks.push_back(sink.second);
   }
   return sinks;
 }
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.h b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.h
index 2573513..1e52f12 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.h
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.h
@@ -39,6 +39,8 @@
   // Callbacks invoked when the list of available sinks for |app_name| changes.
   // The client can call |GetAvailableSinks()| to obtain the latest sink list.
   // |app_name|: app name, e.g. YouTube.
+  // TODO(imcheng): Move sink query logic into DialAppDiscoveryService and
+  // have it use MediaSinkServiceBase::Observer to observe sinks.
   using SinkQueryByAppFunc = void(const std::string& app_name);
   using SinkQueryByAppCallback = base::RepeatingCallback<SinkQueryByAppFunc>;
   using SinkQueryByAppCallbackList = base::CallbackList<SinkQueryByAppFunc>;
@@ -51,20 +53,18 @@
   // |connector|: connector to the ServiceManager suitable to use on
   // |task_runner|.
   // |on_sinks_discovered_cb|: Callback for MediaSinkServiceBase.
-  // |dial_sink_added_cb|: If not null, callback to invoke when a DIAL sink has
-  // been discovered.
   // Note that both callbacks are invoked on |task_runner|.
   // |task_runner|: The SequencedTaskRunner this class runs in.
   DialMediaSinkServiceImpl(
       std::unique_ptr<service_manager::Connector> connector,
       const OnSinksDiscoveredCallback& on_sinks_discovered_cb,
-      const OnDialSinkAddedCallback& dial_sink_added_cb,
       const scoped_refptr<base::SequencedTaskRunner>& task_runner);
   ~DialMediaSinkServiceImpl() override;
 
   virtual void Start();
 
-  void OnUserGesture();
+  // MediaSinkServiceBase implementation.
+  void OnUserGesture() override;
 
   // Returns the SequencedTaskRunner that should be used to invoke methods on
   // this instance. Can be invoked on any thread.
@@ -97,9 +97,6 @@
   void SetAppDiscoveryServiceForTest(
       std::unique_ptr<DialAppDiscoveryService> app_discovery_service);
 
-  // MediaSinkServiceBase implementation.
-  void OnDiscoveryComplete() override;
-
  private:
   friend class DialMediaSinkServiceImplTest;
   friend class MockDialMediaSinkServiceImpl;
@@ -112,8 +109,6 @@
   FRIEND_TEST_ALL_PREFIXES(DialMediaSinkServiceImplTest,
                            OnDeviceDescriptionAvailableIPAddressChanged);
   FRIEND_TEST_ALL_PREFIXES(DialMediaSinkServiceImplTest,
-                           OnDialSinkAddedCallback);
-  FRIEND_TEST_ALL_PREFIXES(DialMediaSinkServiceImplTest,
                            StartStopMonitoringAvailableSinksForApp);
   FRIEND_TEST_ALL_PREFIXES(DialMediaSinkServiceImplTest,
                            OnDialAppInfoAvailableNoStartMonitoring);
@@ -171,6 +166,7 @@
       SinkQueryByAppCallbackList* callback_list);
 
   // MediaSinkServiceBase implementation.
+  void OnDiscoveryComplete() override;
   void RecordDeviceCounts() override;
 
   // Connector to ServiceManager for safe XML parsing requests.
@@ -182,8 +178,6 @@
   // Initialized in |Start()|.
   std::unique_ptr<DialAppDiscoveryService> app_discovery_service_;
 
-  OnDialSinkAddedCallback dial_sink_added_cb_;
-
   // Raw pointer to DialRegistry singleton.
   DialRegistry* dial_registry_ = nullptr;
 
@@ -193,6 +187,11 @@
   // Device data list from current round of discovery.
   DialRegistry::DeviceList current_devices_;
 
+  // Sinks that are added during the latest round of discovery. In
+  // |OnDiscoveryCompleted()| this will be merged into
+  // |MediaSinkServiceBase::sinks_| and then cleared.
+  base::flat_map<MediaSink::Id, MediaSinkInternal> latest_sinks_;
+
   // Map of app status, keyed by <sink id:app name>.
   base::flat_map<std::string, SinkAppStatus> app_statuses_;
 
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
index e6d7cba..fa597c9 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
@@ -49,7 +49,6 @@
         media_sink_service_(new DialMediaSinkServiceImpl(
             std::unique_ptr<service_manager::Connector>(),
             mock_sink_discovered_cb_.Get(),
-            dial_sink_added_cb_.Get(),
             base::SequencedTaskRunnerHandle::Get())) {}
 
   void SetUp() override {
@@ -100,7 +99,6 @@
   const content::TestBrowserThreadBundle thread_bundle_;
 
   base::MockCallback<OnSinksDiscoveredCallback> mock_sink_discovered_cb_;
-  base::MockCallback<OnDialSinkAddedCallback> dial_sink_added_cb_;
   base::MockCallback<
       MockDeviceDescriptionService::DeviceDescriptionParseSuccessCallback>
       mock_success_cb_;
@@ -132,17 +130,18 @@
 
   media_sink_service_->OnDeviceDescriptionAvailable(device_data,
                                                     device_description);
-  EXPECT_TRUE(media_sink_service_->current_sinks_.empty());
+  EXPECT_TRUE(media_sink_service_->GetSinks().empty());
 
   std::vector<DialDeviceData> device_list = {device_data};
   EXPECT_CALL(*mock_description_service_, GetDeviceDescriptions(device_list));
 
-  EXPECT_CALL(dial_sink_added_cb_, Run(_));
   media_sink_service_->OnDialDeviceEvent(device_list);
   media_sink_service_->OnDeviceDescriptionAvailable(device_data,
                                                     device_description);
-
-  EXPECT_EQ(1u, media_sink_service_->current_sinks_.size());
+  EXPECT_TRUE(mock_timer_->IsRunning());
+  EXPECT_CALL(mock_sink_discovered_cb_, Run(Not(IsEmpty())));
+  mock_timer_->Fire();
+  EXPECT_EQ(1u, media_sink_service_->GetSinks().size());
 }
 
 TEST_F(DialMediaSinkServiceImplTest,
@@ -159,18 +158,24 @@
   EXPECT_CALL(*mock_description_service_, GetDeviceDescriptions(device_list));
   media_sink_service_->OnDialDeviceEvent(device_list);
 
-  EXPECT_CALL(dial_sink_added_cb_, Run(_));
   media_sink_service_->OnDeviceDescriptionAvailable(device_data,
                                                     device_description);
-  EXPECT_EQ(1u, media_sink_service_->current_sinks_.size());
 
-  EXPECT_CALL(dial_sink_added_cb_, Run(_));
+  EXPECT_TRUE(mock_timer_->IsRunning());
+  EXPECT_CALL(mock_sink_discovered_cb_, Run(_));
+  mock_timer_->Fire();
+  EXPECT_EQ(1u, media_sink_service_->GetSinks().size());
+
   device_description.app_url = GURL("http://192.168.1.100/apps");
   media_sink_service_->OnDeviceDescriptionAvailable(device_data,
                                                     device_description);
 
-  EXPECT_EQ(1u, media_sink_service_->current_sinks_.size());
-  for (const auto& dial_sink_it : media_sink_service_->current_sinks_) {
+  EXPECT_TRUE(mock_timer_->IsRunning());
+  EXPECT_CALL(mock_sink_discovered_cb_, Run(_));
+  mock_timer_->Fire();
+
+  EXPECT_EQ(1u, media_sink_service_->GetSinks().size());
+  for (const auto& dial_sink_it : media_sink_service_->GetSinks()) {
     EXPECT_EQ(device_description.app_url,
               dial_sink_it.second.dial_data().app_url);
   }
@@ -189,13 +194,11 @@
   EXPECT_CALL(*mock_description_service_, GetDeviceDescriptions(device_list));
 
   EXPECT_FALSE(mock_timer_->IsRunning());
-  EXPECT_CALL(dial_sink_added_cb_, Run(_));
   media_sink_service_->OnDialDeviceEvent(device_list);
   media_sink_service_->OnDeviceDescriptionAvailable(device_data,
                                                     device_description);
   EXPECT_TRUE(mock_timer_->IsRunning());
 
-  EXPECT_CALL(dial_sink_added_cb_, Run(_));
   EXPECT_CALL(mock_sink_discovered_cb_, Run(_));
   mock_timer_->Fire();
 
@@ -207,23 +210,14 @@
 }
 
 TEST_F(DialMediaSinkServiceImplTest, OnDialDeviceEventRestartsTimer) {
-  media_sink_service_->current_sinks_.insert_or_assign(dial_sink_1_.sink().id(),
-                                                       dial_sink_1_);
-
-  EXPECT_CALL(mock_sink_discovered_cb_, Run(_));
-  media_sink_service_->OnDiscoveryComplete();
-
-  EXPECT_FALSE(mock_timer_->IsRunning());
-  EXPECT_CALL(*mock_description_service_,
-              GetDeviceDescriptions(std::vector<DialDeviceData>()));
+  EXPECT_CALL(*mock_description_service_, GetDeviceDescriptions(IsEmpty()));
   media_sink_service_->OnDialDeviceEvent(std::vector<DialDeviceData>());
   EXPECT_TRUE(mock_timer_->IsRunning());
 
-  EXPECT_CALL(mock_sink_discovered_cb_, Run(std::vector<MediaSinkInternal>()));
+  EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).Times(0);
   mock_timer_->Fire();
 
-  EXPECT_CALL(*mock_description_service_,
-              GetDeviceDescriptions(std::vector<DialDeviceData>()));
+  EXPECT_CALL(*mock_description_service_, GetDeviceDescriptions(IsEmpty()));
   media_sink_service_->OnDialDeviceEvent(std::vector<DialDeviceData>());
   EXPECT_TRUE(mock_timer_->IsRunning());
 
@@ -231,47 +225,12 @@
   mock_timer_->Fire();
 }
 
-TEST_F(DialMediaSinkServiceImplTest, OnDialSinkAddedCallback) {
-  DialDeviceData device_data1("first", GURL("http://127.0.0.1/dd.xml"),
-                              base::Time::Now());
-  ParsedDialDeviceDescription device_description1;
-  device_description1.model_name = "model name";
-  device_description1.friendly_name = "friendly name";
-  device_description1.app_url = GURL("http://192.168.1.1/apps");
-  device_description1.unique_id = "unique id 1";
-
-  DialDeviceData device_data2("second", GURL("http://127.0.0.2/dd.xml"),
-                              base::Time::Now());
-  ParsedDialDeviceDescription device_description2;
-  device_description2.model_name = "model name";
-  device_description2.friendly_name = "friendly name";
-  device_description2.app_url = GURL("http://192.168.1.2/apps");
-  device_description2.unique_id = "unique id 2";
-
-  std::vector<DialDeviceData> device_list = {device_data1, device_data2};
-  EXPECT_CALL(*mock_description_service_, GetDeviceDescriptions(device_list));
-  media_sink_service_->OnDialDeviceEvent(device_list);
-
-  EXPECT_CALL(dial_sink_added_cb_, Run(_));
-  media_sink_service_->OnDeviceDescriptionAvailable(device_data1,
-                                                    device_description1);
-
-  EXPECT_CALL(dial_sink_added_cb_, Run(_));
-  media_sink_service_->OnDeviceDescriptionAvailable(device_data2,
-                                                    device_description2);
-
-  // OnUserGesture will "re-sync" all existing sinks to callback.
-  EXPECT_CALL(dial_sink_added_cb_, Run(_)).Times(2);
-  media_sink_service_->OnUserGesture();
-
-}
-
 TEST_F(DialMediaSinkServiceImplTest, StartStopMonitoringAvailableSinksForApp) {
   const MediaSink::Id& sink_id = dial_sink_1_.sink().id();
   EXPECT_CALL(*mock_app_discovery_service_,
               DoFetchDialAppInfo(sink_id, "YouTube"))
       .Times(1);
-  media_sink_service_->current_sinks_.emplace(sink_id, dial_sink_1_);
+  media_sink_service_->AddOrUpdateSink(dial_sink_1_);
   auto sub1 = StartMonitoringAvailableSinksForApp("YouTube");
   auto sub2 = StartMonitoringAvailableSinksForApp("YouTube");
   EXPECT_EQ(1u, media_sink_service_->sink_queries_.size());
@@ -286,13 +245,13 @@
   const MediaSink::Id& sink_id = dial_sink_1_.sink().id();
 
   EXPECT_CALL(*this, OnSinksAvailableForApp(_, _)).Times(0);
-  media_sink_service_->current_sinks_.emplace(sink_id, dial_sink_1_);
+  media_sink_service_->AddOrUpdateSink(dial_sink_1_);
   media_sink_service_->OnAppInfoParseCompleted(
       sink_id, "YouTube", CreateDialAppInfoResult("YouTube"));
 }
 
 TEST_F(DialMediaSinkServiceImplTest, OnDialAppInfoAvailableNoSink) {
-  std::string sink_id = dial_sink_1_.sink().id();
+  const MediaSink::Id& sink_id = dial_sink_1_.sink().id();
 
   EXPECT_CALL(*this, OnSinksAvailableForApp("YouTube", _)).Times(0);
   auto sub = StartMonitoringAvailableSinksForApp("YouTube");
@@ -304,8 +263,8 @@
   const MediaSink::Id& sink_id1 = dial_sink_1_.sink().id();
   const MediaSink::Id& sink_id2 = dial_sink_2_.sink().id();
 
-  media_sink_service_->current_sinks_.emplace(sink_id1, dial_sink_1_);
-  media_sink_service_->current_sinks_.emplace(sink_id2, dial_sink_2_);
+  media_sink_service_->AddOrUpdateSink(dial_sink_1_);
+  media_sink_service_->AddOrUpdateSink(dial_sink_2_);
 
   EXPECT_CALL(*mock_app_discovery_service_,
               DoFetchDialAppInfo(sink_id1, "YouTube"));
@@ -353,7 +312,7 @@
   const MediaSink::Id& sink_id = dial_sink_1_.sink().id();
 
   EXPECT_CALL(*mock_app_discovery_service_, DoFetchDialAppInfo(_, _));
-  media_sink_service_->current_sinks_.emplace(sink_id, dial_sink_1_);
+  media_sink_service_->AddOrUpdateSink(dial_sink_1_);
   auto sub1 = StartMonitoringAvailableSinksForApp("YouTube");
 
   EXPECT_CALL(*this,
@@ -363,15 +322,16 @@
       sink_id, "YouTube", CreateDialAppInfoResult("YouTube"));
 
   EXPECT_CALL(*this, OnSinksAvailableForApp("YouTube", IsEmpty()));
-  media_sink_service_->current_sinks_.clear();
+  media_sink_service_->RemoveSink(dial_sink_1_);
   media_sink_service_->OnDiscoveryComplete();
 }
+
 TEST_F(DialMediaSinkServiceImplTest,
        OnDialAppInfoAvailableWithAlreadyAvailableSinks) {
   const MediaSink::Id& sink_id = dial_sink_1_.sink().id();
 
   EXPECT_CALL(*mock_app_discovery_service_, DoFetchDialAppInfo(_, _));
-  media_sink_service_->current_sinks_.emplace(sink_id, dial_sink_1_);
+  media_sink_service_->AddOrUpdateSink(dial_sink_1_);
   auto sub1 = StartMonitoringAvailableSinksForApp("YouTube");
 
   EXPECT_CALL(*this,
@@ -385,9 +345,8 @@
 }
 
 TEST_F(DialMediaSinkServiceImplTest, StartAfterStopMonitoringForApp) {
-  const MediaSink::Id& sink_id = dial_sink_1_.sink().id();
   EXPECT_CALL(*mock_app_discovery_service_, DoFetchDialAppInfo(_, _));
-  media_sink_service_->current_sinks_.emplace(sink_id, dial_sink_1_);
+  media_sink_service_->AddOrUpdateSink(dial_sink_1_);
   auto sub1 = StartMonitoringAvailableSinksForApp("YouTube");
   std::vector<MediaSinkInternal> expected_sinks = {dial_sink_1_};
 
@@ -409,8 +368,7 @@
   dial_sink_1_.set_dial_data(extra_data);
 
   EXPECT_CALL(*mock_app_discovery_service_, DoFetchDialAppInfo(_, _)).Times(0);
-  media_sink_service_->current_sinks_.emplace(dial_sink_1_.sink().id(),
-                                              dial_sink_1_);
+  media_sink_service_->AddOrUpdateSink(dial_sink_1_);
   auto sub1 = StartMonitoringAvailableSinksForApp("YouTube");
 }
 
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
index 81162cbd..f0efddc 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
@@ -32,7 +32,7 @@
 
 void CastMediaSinkService::Start(
     const OnSinksDiscoveredCallback& sinks_discovered_cb,
-    CastMediaSinkServiceImpl::Observer* observer) {
+    MediaSinkServiceBase* dial_media_sink_service) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!impl_);
 
@@ -49,7 +49,7 @@
                      base::BindRepeating(
                          &CastMediaSinkService::RunSinksDiscoveredCallback,
                          weak_ptr_factory_.GetWeakPtr(), sinks_discovered_cb)),
-                 observer);
+                 dial_media_sink_service);
   impl_->task_runner()->PostTask(
       FROM_HERE, base::BindOnce(&CastMediaSinkServiceImpl::Start,
                                 base::Unretained(impl_.get())));
@@ -62,7 +62,7 @@
 std::unique_ptr<CastMediaSinkServiceImpl, base::OnTaskRunnerDeleter>
 CastMediaSinkService::CreateImpl(
     const OnSinksDiscoveredCallback& sinks_discovered_cb,
-    CastMediaSinkServiceImpl::Observer* observer) {
+    MediaSinkServiceBase* dial_media_sink_service) {
   cast_channel::CastSocketService* cast_socket_service =
       cast_channel::CastSocketService::GetInstance();
   scoped_refptr<base::SequencedTaskRunner> task_runner =
@@ -75,8 +75,8 @@
                           base::Unretained(this)));
   return std::unique_ptr<CastMediaSinkServiceImpl, base::OnTaskRunnerDeleter>(
       new CastMediaSinkServiceImpl(
-          sinks_discovered_cb, observer, cast_socket_service,
-          DiscoveryNetworkMonitor::GetInstance(),
+          sinks_discovered_cb, cast_socket_service,
+          DiscoveryNetworkMonitor::GetInstance(), dial_media_sink_service,
           GetCastAllowAllIPsPref(g_browser_process->local_state())),
       base::OnTaskRunnerDeleter(task_runner));
 }
@@ -109,7 +109,7 @@
   DVLOG(2) << "OnUserGesture: open channel now for " << cast_sinks_.size()
            << " devices discovered in latest round of mDNS";
   impl_->task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&CastMediaSinkServiceImpl::AttemptConnection,
+      FROM_HERE, base::BindOnce(&CastMediaSinkServiceImpl::OpenChannelsNow,
                                 base::Unretained(impl_.get()), cast_sinks_));
 }
 
@@ -148,10 +148,6 @@
                      CastMediaSinkServiceImpl::SinkSource::kMdns));
 }
 
-OnDialSinkAddedCallback CastMediaSinkService::GetDialSinkAddedCallback() {
-  return impl_->GetDialSinkAddedCallback();
-}
-
 void CastMediaSinkService::RunSinksDiscoveredCallback(
     const OnSinksDiscoveredCallback& sinks_discovered_cb,
     std::vector<MediaSinkInternal> sinks) {
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
index cea466f..a58a331a 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
@@ -26,25 +26,23 @@
 // A service which can be used to start background discovery and resolution of
 // Cast devices.
 // This class is not thread safe. All methods must be invoked on the UI thread.
+// TODO(imcheng): Consider removing this class and moving the logic into a part
+// of CastMediaSinkServiceImpl that runs on the UI thread, and renaming
+// CastMediaSinkServiceImpl to CastMediaSinkService. Longer term, we
+// should look into eliminating dependencies on the UI thread.
 class CastMediaSinkService : public DnsSdRegistry::DnsSdObserver {
  public:
   CastMediaSinkService();
   ~CastMediaSinkService() override;
 
-  // Returns a callback to |impl_| when a DIAL sink is added (e.g., in order
-  // to perform dual discovery). The callback must be run on the same sequence
-  // as |impl_| and must not be run after |impl_| is destroyed.
-  // This method can only be called after |Start()| is called.
-  OnDialSinkAddedCallback GetDialSinkAddedCallback();
-
   // Starts Cast sink discovery. No-ops if already started.
   // |sink_discovery_cb|: Callback to invoke when the list of discovered sinks
   // has been updated.
-  // |observer|: Observer passed to |impl_|. Note that unlike the callback, the
-  // observer will be invoked on the sequence |impl_| runs on. Can be nullptr.
+  // |dial_media_sink_service|: Pointer to DIAL MediaSinkService for dual
+  // discovery.
   // Marked virtual for tests.
   virtual void Start(const OnSinksDiscoveredCallback& sinks_discovered_cb,
-                     CastMediaSinkServiceImpl::Observer* observer);
+                     MediaSinkServiceBase* dial_media_sink_service);
 
   // Initiates discovery immediately in response to a user gesture
   // (i.e., opening the Media Router dialog).
@@ -55,7 +53,9 @@
   // Marked virtual for tests.
   virtual std::unique_ptr<CastMediaSinkServiceImpl, base::OnTaskRunnerDeleter>
   CreateImpl(const OnSinksDiscoveredCallback& sinks_discovered_cb,
-             CastMediaSinkServiceImpl::Observer* observer);
+             MediaSinkServiceBase* dial_media_sink_service);
+
+  CastMediaSinkServiceImpl* impl() { return impl_.get(); }
 
   // Registers with DnsSdRegistry to listen for Cast devices. Note that this is
   // called on |Start()| on all platforms except for Windows. On Windows, this
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
index 1cfeea1..222bc914 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
@@ -25,13 +25,11 @@
 
 MediaSinkInternal CreateCastSinkFromDialSink(
     const MediaSinkInternal& dial_sink) {
-  const std::string& dial_sink_id = dial_sink.sink().id();
   const std::string& friendly_name = dial_sink.sink().name();
-  DCHECK_EQ("dial:", dial_sink_id.substr(0, 5))
-      << "unexpected DIAL sink id " << dial_sink_id;
 
   // Replace the "dial:" prefix with "cast:".
-  std::string sink_id = "cast:" + dial_sink_id.substr(5);
+  std::string sink_id =
+      CastMediaSinkServiceImpl::GetCastSinkIdFromDial(dial_sink.sink().id());
 
   // Note that the real sink icon will be determined later using information
   // from the opened cast channel.
@@ -164,17 +162,38 @@
 // static
 constexpr int CastMediaSinkServiceImpl::kMaxDialSinkFailureCount;
 
+// static
+SinkIconType CastMediaSinkServiceImpl::GetCastSinkIconType(
+    uint8_t capabilities) {
+  if (capabilities & cast_channel::CastDeviceCapability::VIDEO_OUT)
+    return SinkIconType::CAST;
+
+  return capabilities & cast_channel::CastDeviceCapability::MULTIZONE_GROUP
+             ? SinkIconType::CAST_AUDIO_GROUP
+             : SinkIconType::CAST_AUDIO;
+}
+
+// static
+MediaSink::Id CastMediaSinkServiceImpl::GetCastSinkIdFromDial(
+    const MediaSink::Id& dial_sink_id) {
+  DCHECK_EQ("dial:", dial_sink_id.substr(0, 5))
+      << "unexpected DIAL sink id " << dial_sink_id;
+
+  // Replace the "dial:" prefix with "cast:".
+  return "cast:" + dial_sink_id.substr(5);
+}
+
 CastMediaSinkServiceImpl::CastMediaSinkServiceImpl(
     const OnSinksDiscoveredCallback& callback,
-    Observer* observer,
     cast_channel::CastSocketService* cast_socket_service,
     DiscoveryNetworkMonitor* network_monitor,
+    MediaSinkServiceBase* dial_media_sink_service,
     bool allow_all_ips)
     : MediaSinkServiceBase(callback),
-      observer_(observer),
       cast_socket_service_(cast_socket_service),
       network_monitor_(network_monitor),
       allow_all_ips_(allow_all_ips),
+      dial_media_sink_service_(dial_media_sink_service),
       task_runner_(cast_socket_service_->task_runner()),
       clock_(base::DefaultClock::GetInstance()),
       weak_ptr_factory_(this) {
@@ -221,6 +240,7 @@
 
 CastMediaSinkServiceImpl::~CastMediaSinkServiceImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  dial_media_sink_service_->RemoveObserver(this);
   network_monitor_->RemoveObserver(this);
   cast_socket_service_->RemoveObserver(this);
 }
@@ -231,7 +251,6 @@
 
 void CastMediaSinkServiceImpl::Start() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  MediaSinkServiceBase::StartTimer();
 
   cast_socket_service_->AddObserver(this);
 
@@ -242,36 +261,29 @@
       &CastMediaSinkServiceImpl::OnNetworksChanged, GetWeakPtr()));
   network_monitor_->AddObserver(this);
 
+  dial_media_sink_service_->AddObserver(this);
+
   std::vector<MediaSinkInternal> test_sinks = GetFixedIPSinksFromCommandLine();
   if (!test_sinks.empty())
     OpenChannels(test_sinks, SinkSource::kMdns);
 }
 
-void CastMediaSinkServiceImpl::OnDiscoveryComplete() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  current_sinks_.clear();
-
-  // Copy cast sink from |current_sinks_map_| to |current_sinks_|.
-  for (const auto& sink_it : current_sinks_map_) {
-    DVLOG(2) << "Discovered by "
-             << (sink_it.second.cast_data().discovered_by_dial ? "DIAL"
-                                                               : "mDNS")
-             << " [name]: " << sink_it.second.sink().name()
-             << " [ip_endpoint]: "
-             << sink_it.second.cast_data().ip_endpoint.ToString();
-    std::string sink_id = sink_it.second.sink().id();
-    current_sinks_.emplace(sink_id, sink_it.second);
-  }
-
-  MediaSinkServiceBase::OnDiscoveryComplete();
-}
-
 void CastMediaSinkServiceImpl::RecordDeviceCounts() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  metrics_.RecordDeviceCountsIfNeeded(current_sinks_.size(),
+  metrics_.RecordDeviceCountsIfNeeded(GetSinks().size(),
                                       known_ip_endpoints_.size());
 }
 
+void CastMediaSinkServiceImpl::OnUserGesture() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // Re-sync sinks from DialMediaSinkService. It's possible that a
+  // DIAL-discovered sink was added here earlier, but was removed due to flaky
+  // network. This gives CastMediaSinkServiceImpl an opportunity to recover even
+  // if mDNS is not working for some reason.
+  for (const auto& sink : dial_media_sink_service_->GetSinks())
+    TryConnectDialDiscoveredSink(sink.second);
+}
+
 void CastMediaSinkServiceImpl::OpenChannelsWithRandomizedDelay(
     const std::vector<MediaSinkInternal>& cast_sinks,
     SinkSource sink_source) {
@@ -297,12 +309,11 @@
   known_ip_endpoints_.clear();
 
   for (const auto& cast_sink : cast_sinks) {
-    const net::IPEndPoint& ip_endpoint = cast_sink.cast_data().ip_endpoint;
-    known_ip_endpoints_.insert(ip_endpoint);
-    OpenChannel(ip_endpoint, cast_sink, nullptr, sink_source);
+    known_ip_endpoints_.insert(cast_sink.cast_data().ip_endpoint);
+    OpenChannel(cast_sink, nullptr, sink_source);
   }
 
-  MediaSinkServiceBase::RestartTimer();
+  StartTimer();
 }
 
 void CastMediaSinkServiceImpl::OnError(const cast_channel::CastSocket& socket,
@@ -321,11 +332,12 @@
   // Need a PostTask() here because RemoveSocket() will release the memory of
   // |socket|. Need to make sure all tasks on |socket| finish before deleting
   // the object.
+  int socket_id = socket.id();
   task_runner_->PostNonNestableTask(
       FROM_HERE,
-      base::Bind(
+      base::BindOnce(
           base::IgnoreResult(&cast_channel::CastSocketService::RemoveSocket),
-          base::Unretained(cast_socket_service_), socket.id()));
+          base::Unretained(cast_socket_service_), socket_id));
 
   // No op if socket is not opened yet. OnChannelOpened will handle this error.
   if (socket.ready_state() == cast_channel::ReadyState::CONNECTING) {
@@ -336,29 +348,31 @@
 
   DVLOG(2) << "OnError starts reopening cast channel: "
            << ip_endpoint.ToString();
-  // Find existing cast sink from |current_sinks_map_|.
-  auto cast_sink_it = current_sinks_map_.find(ip_endpoint);
-  if (cast_sink_it != current_sinks_map_.end()) {
-    task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&CastMediaSinkServiceImpl::OpenChannel, GetWeakPtr(),
-                       ip_endpoint, cast_sink_it->second, nullptr,
-                       SinkSource::kConnectionRetry));
-    // We erase the sink here so that OpenChannel would not find an existing
-    // sink.
-    // Note: a better longer term solution is to introduce a state field to the
-    // sink. We would set it to ERROR here. In OpenChannel(), we would check
-    // create a socket only if the state is not already CONNECTED.
-    if (observer_)
-      observer_->OnSinkRemoved(cast_sink_it->second);
-
-    current_sinks_map_.erase(cast_sink_it);
-    MediaSinkServiceBase::RestartTimer();
+  // Remove existing cast sink from |sinks|. It will be added back if
+  // it can be successfully reconnected.
+  const auto& sinks = GetSinks();
+  auto sink_it =
+      std::find_if(sinks.begin(), sinks.end(), [&socket_id](const auto& entry) {
+        return entry.second.cast_data().cast_channel_id == socket_id;
+      });
+  if (sink_it == sinks.end()) {
+    DVLOG(2) << "Cannot find existing cast sink. Skip reopen cast channel: "
+             << ip_endpoint.ToString();
     return;
   }
 
-  DVLOG(2) << "Cannot find existing cast sink. Skip reopen cast channel: "
-           << ip_endpoint.ToString();
+  const MediaSinkInternal& sink = sink_it->second;
+  task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&CastMediaSinkServiceImpl::OpenChannel, GetWeakPtr(), sink,
+                     nullptr, SinkSource::kConnectionRetry));
+
+  // We erase the sink here so that OpenChannel would not find an existing
+  // sink.
+  // Note: a better longer term solution is to introduce a state field to the
+  // sink. We would set it to ERROR here. In OpenChannel(), we would check
+  // create a socket only if the state is not already CONNECTED.
+  RemoveSink(sink);
 }
 
 void CastMediaSinkServiceImpl::OnMessage(
@@ -378,17 +392,15 @@
   current_network_id_ = network_id;
   dial_sink_failure_count_.clear();
   if (!IsNetworkIdUnknownOrDisconnected(last_network_id)) {
-    // Collect current sinks even if OnFetchCompleted hasn't collected the
-    // latest sinks.
     std::vector<MediaSinkInternal> current_sinks;
-    for (const auto& sink_it : current_sinks_map_) {
-      current_sinks.push_back(sink_it.second);
-    }
+    for (const auto& entry : GetSinks())
+      current_sinks.push_back(entry.second);
+
     sink_cache_[last_network_id] = std::move(current_sinks);
   }
 
-  // TODO(imcheng): Maybe this should clear |current_sinks_map_| and call
-  // |RestartTimer()| so it is more responsive?
+  // TODO(imcheng): Maybe this should clear |sinks_| and call |StartTimer()|
+  // so it is more responsive?
   if (IsNetworkIdUnknownOrDisconnected(network_id))
     return;
 
@@ -407,12 +419,12 @@
 
 cast_channel::CastSocketOpenParams
 CastMediaSinkServiceImpl::CreateCastSocketOpenParams(
-    const net::IPEndPoint& ip_endpoint) {
+    const MediaSinkInternal& sink) {
   int connect_timeout_in_seconds = open_params_.connect_timeout_in_seconds;
   int liveness_timeout_in_seconds = open_params_.liveness_timeout_in_seconds;
   int delta_in_seconds = open_params_.dynamic_timeout_delta_in_seconds;
 
-  auto it = failure_count_map_.find(ip_endpoint);
+  auto it = failure_count_map_.find(sink.sink().id());
   if (it != failure_count_map_.end()) {
     int failure_count = it->second;
     connect_timeout_in_seconds =
@@ -426,7 +438,7 @@
   // TODO(crbug.com/814419): Switching cast socket implementation to use network
   // service will allow us to get back NetLog.
   return cast_channel::CastSocketOpenParams(
-      ip_endpoint, nullptr,
+      sink.cast_data().ip_endpoint, nullptr,
       base::TimeDelta::FromSeconds(connect_timeout_in_seconds),
       base::TimeDelta::FromSeconds(liveness_timeout_in_seconds),
       base::TimeDelta::FromSeconds(open_params_.ping_interval_in_seconds),
@@ -434,12 +446,12 @@
 }
 
 void CastMediaSinkServiceImpl::OpenChannel(
-    const net::IPEndPoint& ip_endpoint,
     const MediaSinkInternal& cast_sink,
     std::unique_ptr<net::BackoffEntry> backoff_entry,
     SinkSource sink_source) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  const net::IPEndPoint& ip_endpoint = cast_sink.cast_data().ip_endpoint;
   if (!allow_all_ips_ && ip_endpoint.address().IsPubliclyRoutable()) {
     DVLOG(2) << "Invalid Cast IP address: " << ip_endpoint.address().ToString();
     return;
@@ -447,11 +459,14 @@
 
   // Erase the entry from |dial_sink_failure_count_| since the device is now
   // known to be a Cast device.
+  const MediaSink::Id& sink_id = cast_sink.sink().id();
   if (sink_source != SinkSource::kDial)
-    dial_sink_failure_count_.erase(ip_endpoint.address());
+    dial_sink_failure_count_.erase(sink_id);
 
-  if (base::ContainsKey(current_sinks_map_, ip_endpoint)) {
-    DVLOG(2) << "A channel already exists for " << ip_endpoint.ToString();
+  const MediaSinkInternal* existing_sink = GetSinkById(sink_id);
+  if (existing_sink && existing_sink->cast_data().ip_endpoint == ip_endpoint) {
+    DVLOG(2) << "A channel already exists for " << sink_id << ", "
+             << ip_endpoint.ToString();
     return;
   }
 
@@ -465,7 +480,7 @@
            << " name: " << cast_sink.sink().name();
 
   cast_channel::CastSocketOpenParams open_params =
-      CreateCastSocketOpenParams(ip_endpoint);
+      CreateCastSocketOpenParams(cast_sink);
   cast_socket_service_->OpenSocket(
       open_params,
       base::BindOnce(&CastMediaSinkServiceImpl::OnChannelOpened, GetWeakPtr(),
@@ -505,12 +520,13 @@
     SinkSource sink_source) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  const MediaSink::Id& sink_id = cast_sink.sink().id();
   const net::IPEndPoint& ip_endpoint = cast_sink.cast_data().ip_endpoint;
   if (sink_source == SinkSource::kDial)
-    ++dial_sink_failure_count_[ip_endpoint.address()];
+    ++dial_sink_failure_count_[sink_id];
 
-  int failure_count = ++failure_count_map_[ip_endpoint];
-  failure_count_map_[ip_endpoint] = std::min(failure_count, kMaxFailureCount);
+  int failure_count = ++failure_count_map_[sink_id];
+  failure_count_map_[sink_id] = std::min(failure_count, kMaxFailureCount);
 
   if (!backoff_entry)
     backoff_entry = std::make_unique<net::BackoffEntry>(&backoff_policy_);
@@ -534,8 +550,7 @@
   task_runner_->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&CastMediaSinkServiceImpl::OpenChannel, GetWeakPtr(),
-                     ip_endpoint, std::move(cast_sink),
-                     std::move(backoff_entry), sink_source),
+                     cast_sink, std::move(backoff_entry), sink_source),
       delay);
 }
 
@@ -564,103 +579,96 @@
   extra_data.cast_channel_id = socket->id();
   cast_sink.set_cast_data(extra_data);
 
-  DVLOG(2) << "Adding sink to current_sinks_ [name]: "
-           << cast_sink.sink().name();
+  DVLOG(2) << "Adding or updating sink [name]: " << cast_sink.sink().name();
 
   // Add or update existing cast sink.
-  auto& ip_endpoint = cast_sink.cast_data().ip_endpoint;
-  auto sink_it = current_sinks_map_.find(ip_endpoint);
-  if (sink_it == current_sinks_map_.end()) {
+  const MediaSink::Id& sink_id = cast_sink.sink().id();
+  const MediaSinkInternal* existing_sink = GetSinkById(sink_id);
+  if (!existing_sink) {
     metrics_.RecordCastSinkDiscoverySource(sink_source);
-    current_sinks_map_.emplace(ip_endpoint, cast_sink);
   } else {
-    if (sink_it->second.cast_data().discovered_by_dial &&
+    if (existing_sink->cast_data().discovered_by_dial &&
         !cast_sink.cast_data().discovered_by_dial) {
       metrics_.RecordCastSinkDiscoverySource(SinkSource::kDialMdns);
     }
-    sink_it->second = cast_sink;
   }
+  AddOrUpdateSink(cast_sink);
+  failure_count_map_.erase(sink_id);
 
-  // If the sink was under a different IP address previously, remove it from
-  // |current_sinks_map_|.
-  auto old_sink_it = std::find_if(
-      current_sinks_map_.begin(), current_sinks_map_.end(),
-      [&cast_sink, &ip_endpoint](
-          const std::pair<net::IPEndPoint, MediaSinkInternal>& entry) {
-        return !(entry.first == ip_endpoint) &&
-               entry.second.sink().id() == cast_sink.sink().id();
-      });
-  if (old_sink_it != current_sinks_map_.end())
-    current_sinks_map_.erase(old_sink_it);
+  // To maintain the invariant that an IPEndpoint appears in at most one entry
+  // in the sink list, we will remove the sink (if any) that has the same
+  // IPEndPoint but different sink ID.
+  const net::IPEndPoint& ip_endpoint = extra_data.ip_endpoint;
+  const auto& sinks = GetSinks();
+  auto old_sink_it =
+      std::find_if(sinks.begin(), sinks.end(),
+                   [&cast_sink, &ip_endpoint](const auto& entry) {
+                     return entry.first != cast_sink.sink().id() &&
+                            entry.second.cast_data().ip_endpoint == ip_endpoint;
+                   });
 
-  if (observer_)
-    observer_->OnSinkAddedOrUpdated(cast_sink, socket);
-
-  failure_count_map_.erase(ip_endpoint);
-  MediaSinkServiceBase::RestartTimer();
+  if (old_sink_it != sinks.end())
+    RemoveSink(old_sink_it->second);
 }
 
 void CastMediaSinkServiceImpl::OnChannelOpenFailed(
     const net::IPEndPoint& ip_endpoint,
     const MediaSinkInternal& sink) {
-  // It is possible that the old sink in |current_sinks_map_| is replaced with
-  // a new sink if a network change happened. Check the sink ID to make sure
-  // this is the sink we want to erase.
-  auto it = current_sinks_map_.find(ip_endpoint);
-  if (it == current_sinks_map_.end() ||
-      it->second.sink().id() != sink.sink().id())
+  // Check that the IPEndPoints match before removing, as it is possible that
+  // the sink was reconnected under a different IP before this method is called.
+  const MediaSinkInternal* existing_sink = GetSinkById(sink.sink().id());
+  if (!existing_sink ||
+      !(ip_endpoint == existing_sink->cast_data().ip_endpoint))
     return;
 
-  if (observer_)
-    observer_->OnSinkRemoved(it->second);
-
-  current_sinks_map_.erase(it);
-  MediaSinkServiceBase::RestartTimer();
+  RemoveSink(sink);
 }
 
-void CastMediaSinkServiceImpl::OnDialSinkAdded(const MediaSinkInternal& sink) {
+void CastMediaSinkServiceImpl::OnSinkAddedOrUpdated(
+    const MediaSinkInternal& sink) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  net::IPEndPoint ip_endpoint(sink.dial_data().ip_address, kCastControlPort);
+  TryConnectDialDiscoveredSink(sink);
+}
 
-  if (base::ContainsKey(current_sinks_map_, ip_endpoint)) {
+void CastMediaSinkServiceImpl::OnSinkRemoved(const MediaSinkInternal& sink) {
+  // No-op
+}
+
+void CastMediaSinkServiceImpl::TryConnectDialDiscoveredSink(
+    const MediaSinkInternal& dial_sink) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // TODO(crbug.com/753175): Dual discovery should not try to open cast channel
+  // for non-Cast device.
+  if (IsProbablyNonCastDevice(dial_sink)) {
+    DVLOG(2) << "Skip open channel for DIAL-discovered device because it "
+             << "is probably not a Cast device: " << dial_sink.sink().name();
+    return;
+  }
+
+  MediaSinkInternal sink = CreateCastSinkFromDialSink(dial_sink);
+  if (GetSinkById(sink.sink().id())) {
     DVLOG(2) << "Sink discovered by mDNS, skip adding [name]: "
              << sink.sink().name();
     metrics_.RecordCastSinkDiscoverySource(SinkSource::kMdnsDial);
     return;
   }
 
-  // TODO(crbug.com/753175): Dual discovery should not try to open cast channel
-  // for non-Cast device.
-  if (IsProbablyNonCastDevice(sink)) {
-    DVLOG(2) << "Skip open channel for DIAL-discovered device because it "
-             << "is probably not a Cast device: " << sink.sink().name();
-    return;
-  }
-
-  OpenChannel(ip_endpoint, CreateCastSinkFromDialSink(sink), nullptr,
-              SinkSource::kDial);
+  OpenChannel(sink, nullptr, SinkSource::kDial);
 }
 
 bool CastMediaSinkServiceImpl::IsProbablyNonCastDevice(
     const MediaSinkInternal& dial_sink) const {
-  auto it = dial_sink_failure_count_.find(dial_sink.dial_data().ip_address);
+  auto it = dial_sink_failure_count_.find(
+      GetCastSinkIdFromDial(dial_sink.sink().id()));
   return it != dial_sink_failure_count_.end() &&
          it->second >= kMaxDialSinkFailureCount;
 }
 
-void CastMediaSinkServiceImpl::AttemptConnection(
+void CastMediaSinkServiceImpl::OpenChannelsNow(
     const std::vector<MediaSinkInternal>& cast_sinks) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  for (const auto& cast_sink : cast_sinks) {
-    const net::IPEndPoint& ip_endpoint = cast_sink.cast_data().ip_endpoint;
-    OpenChannel(ip_endpoint, cast_sink, nullptr, SinkSource::kConnectionRetry);
-  }
-}
-
-OnDialSinkAddedCallback CastMediaSinkServiceImpl::GetDialSinkAddedCallback() {
-  return base::BindRepeating(&CastMediaSinkServiceImpl::OnDialSinkAdded,
-                             base::Unretained(this));
+  OpenChannels(cast_sinks, SinkSource::kConnectionRetry);
 }
 
 void CastMediaSinkServiceImpl::SetCastAllowAllIPs(bool allow_all_ips) {
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h
index 1f2876c..84ec0d0 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h
@@ -28,49 +28,42 @@
 
 namespace media_router {
 
-// Discovers and manages Cast MediaSinks using CastSocketService.
+// Discovers and manages Cast MediaSinks using CastSocketService. This class
+// also observes DialMediaSinkServiceImpl for sinks to connect to (also known
+// as dual discovery).
 // This class may be created on any thread. All methods, unless otherwise noted,
 // must be invoked on the SequencedTaskRunner given by |task_runner_|.
-class CastMediaSinkServiceImpl
-    : public MediaSinkServiceBase,
-      public cast_channel::CastSocket::Observer,
-      public DiscoveryNetworkMonitor::Observer {
+class CastMediaSinkServiceImpl : public MediaSinkServiceBase,
+                                 public cast_channel::CastSocket::Observer,
+                                 public DiscoveryNetworkMonitor::Observer,
+                                 public MediaSinkServiceBase::Observer {
  public:
-  // Listens for sink updates in CastMediaSinkServiceImpl. All observer methods
-  // must run on the same sequence as CastMediaSinkServiceImpl.
-  class Observer {
-   public:
-    virtual ~Observer() {}
-
-    // Invoked when |sink| is added or updated. |socket| is a pointer to the
-    // CastSocket instance associated with |sink|, and is never nullptr.
-    // |socket| is only guaranteed to be valid for the duration of this call;
-    // the caller should not hold onto the pointer.
-    virtual void OnSinkAddedOrUpdated(const MediaSinkInternal& sink,
-                                      cast_channel::CastSocket* socket) = 0;
-
-    // Invoked when |sink| is removed.
-    virtual void OnSinkRemoved(const MediaSinkInternal& sink) = 0;
-  };
-
   using SinkSource = CastDeviceCountMetrics::SinkSource;
 
   // The max number of cast channel open failure for a DIAL-discovered sink
   // before we can say confidently that it is unlikely to be a Cast device.
   static constexpr int kMaxDialSinkFailureCount = 10;
 
+  // Returns the icon type to use according to |capabilities|. |capabilities| is
+  // a bit set of cast_channel::CastDeviceCapabilities in CastSinkExtraData.
+  static SinkIconType GetCastSinkIconType(uint8_t capabilities);
+
+  // Returns a Cast MediaSink ID from a DIAL MediaSink ID |dial_sink_id|.
+  static MediaSink::Id GetCastSinkIdFromDial(const MediaSink::Id& dial_sink_id);
+
   // |callback|: Callback passed to MediaSinkServiceBase.
   // |observer|: Observer to invoke on sink updates. Can be nullptr.
   // |cast_socket_service|: CastSocketService to use to open Cast channels to
   // discovered devices.
   // |network_monitor|: DiscoveryNetworkMonitor to use to listen for network
   // changes.
+  // |dial_media_sink_service|: DialMediaSinkServiceImpl for dual discovery.
   // |allow_all_ips|: If |true|, |this| will try to open channel to
   //     sinks on all IPs, and not just private IPs.
   CastMediaSinkServiceImpl(const OnSinksDiscoveredCallback& callback,
-                           Observer* observer,
                            cast_channel::CastSocketService* cast_socket_service,
                            DiscoveryNetworkMonitor* network_monitor,
+                           MediaSinkServiceBase* dial_media_sink_service,
                            bool allow_all_ips);
   ~CastMediaSinkServiceImpl() override;
 
@@ -86,30 +79,18 @@
   // and network changes.
   virtual void Start();
 
-  // MediaSinkServiceBase implementation
-  // Called when the discovery loop timer expires.
-  void OnDiscoveryComplete() override;
-  void RecordDeviceCounts() override;
-
-  // Opens cast channels on the IO thread. To avoid spamming a device when it
-  // comes online, a randomized delay is introduced before an attempt to open
-  // channel is made.
+  // Attempts to open cast channels for |cast_sinks|. To avoid spamming a device
+  // when it comes online, a randomized delay is introduced before an attempt to
+  // open channel is made.
   void OpenChannelsWithRandomizedDelay(
       const std::vector<MediaSinkInternal>& cast_sinks,
       SinkSource sink_source);
 
-  // Tries to open cast channels for sinks found by current round of mDNS
-  // discovery, but without opened cast channels.
+  // Attempts to open cast channels for |cast_sinks| without delay. This method
+  // is called when a user gesture is detected. |kConnectionRetry| will be used
+  // as the SinkSource.
   // |cast_sinks|: list of sinks found by current round of mDNS discovery.
-  void AttemptConnection(const std::vector<MediaSinkInternal>& cast_sinks);
-
-  // Returns a callback to |this| when a DIAL sink is added (e.g., in order
-  // to perform dual discovery). This callback must be invoked on |impl_|'s
-  // sequence.
-  // It is NOT safe to invoke this callback after |this| is destroyed; the
-  // assumption is that |this| will outlive the invoker
-  // (DialMediaSinkServiceImpl), and that they run on the same sequence.
-  OnDialSinkAddedCallback GetDialSinkAddedCallback();
+  void OpenChannelsNow(const std::vector<MediaSinkInternal>& cast_sinks);
 
   // Called by CastMediaSinkService to set |allow_all_ips_|.
   void SetCastAllowAllIPs(bool allow_all_ips);
@@ -136,7 +117,8 @@
                            TestOnChannelErrorMayRetryForCastSink);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
                            TestOnChannelErrorNoRetryForMissingSink);
-  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest, TestOnDialSinkAdded);
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
+                           TestOnSinkAddedOrUpdated);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
                            TestOnDiscoveryComplete);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
@@ -154,7 +136,7 @@
                            DualDiscoveryDoesntDuplicateCacheItems);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
                            CacheSinksForDirectNetworkChange);
-  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest, TestAttemptConnection);
+  FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest, OpenChannelsNow);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
                            TestInitRetryParametersWithFeatureDisabled);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
@@ -169,7 +151,7 @@
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
                            TestInitRetryParametersWithDefaultValue);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
-                           TestOnDialSinkAddedSkipsIfNonCastDevice);
+                           TestOnSinkAddedOrUpdatedSkipsIfNonCastDevice);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
                            TestOnChannelErrorRetry);
   FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceImplTest,
@@ -220,9 +202,17 @@
     static OpenParams GetFromFieldTrialParam();
   };
 
+  // MediaSinkServiceBase implementation.
+  void RecordDeviceCounts() override;
+  void OnUserGesture() override;
+
+  // MediaSinkServiceBase::Observer implementation.
+  void OnSinkAddedOrUpdated(const MediaSinkInternal& sink) override;
+  void OnSinkRemoved(const MediaSinkInternal& sink) override;
+
   // Attempts to resolve the given DIAL sink as a Cast sink. If successful,
   // the resulting Cast sink is added to the service.
-  void OnDialSinkAdded(const MediaSinkInternal& sink);
+  void TryConnectDialDiscoveredSink(const MediaSinkInternal& sink);
 
   // Marked virtual for testing.
   virtual void OpenChannels(const std::vector<MediaSinkInternal>& cast_sinks,
@@ -239,19 +229,17 @@
 
   // Returns cast socket open parameters. Parameters are read from Finch.
   // Connect / liveness timeout value are dynamically calculated
-  // based on the channel's last error status.
-  // |ip_endpoint|: ip endpoint of cast channel to be connected to.
+  // based on results of previous connection attempts.
+  // |sink|: Sink to open cast channel to.
   cast_channel::CastSocketOpenParams CreateCastSocketOpenParams(
-      const net::IPEndPoint& ip_endpoint);
+      const MediaSinkInternal& sink);
 
   // Opens cast channel. This method will not open a channel if there is already
   // a pending request for |ip_endpoint|, or if a channel for |ip_endpoint|
   // already exists.
-  // |ip_endpoint|: cast channel's target IP endpoint.
   // |cast_sink|: Cast sink created from mDNS service description or DIAL sink.
   // |backoff_entry|: backoff entry passed to |OnChannelOpened| callback.
-  void OpenChannel(const net::IPEndPoint& ip_endpoint,
-                   const MediaSinkInternal& cast_sink,
+  void OpenChannel(const MediaSinkInternal& cast_sink,
                    std::unique_ptr<net::BackoffEntry> backoff_entry,
                    SinkSource sink_source);
 
@@ -317,14 +305,6 @@
   // RecordDeviceCounts().
   std::set<net::IPEndPoint> known_ip_endpoints_;
 
-  using MediaSinkInternalMap = std::map<net::IPEndPoint, MediaSinkInternal>;
-
-  // Map of sinks with opened cast channels keyed by IP endpoint.
-  MediaSinkInternalMap current_sinks_map_;
-
-  // Observer to notify when a sink is added, updated, or removed.
-  Observer* const observer_;
-
   // Raw pointer of leaky singleton CastSocketService, which manages adding and
   // removing Cast channels.
   cast_channel::CastSocketService* const cast_socket_service_;
@@ -350,16 +330,20 @@
   // just private IPs.
   bool allow_all_ips_ = false;
 
-  // Map of consecutive failure count keyed by IP endpoint. Keeps track of
-  // failure counts for each IP endpoint. Used to dynamically adjust timeout
-  // values. If a Cast channel opens successfully, it is removed from the map.
-  std::map<net::IPEndPoint, int> failure_count_map_;
+  // Map of consecutive cast channel failure count keyed by sink ID. Used to
+  // dynamically adjust timeout values. If a Cast channel opens successfully,
+  // the failure count is reset by removing the entry from the map.
+  base::flat_map<MediaSink::Id, int> failure_count_map_;
 
   // Used by |IsProbablyNonCastDevice()| to keep track of how many times we
   // failed to open a cast channel for a sink that is discovered via DIAL
   // exclusively. The count is reset for a sink when it is discovered via mDNS,
   // or if we detected a network change.
-  base::small_map<std::map<net::IPAddress, int>> dial_sink_failure_count_;
+  base::flat_map<MediaSink::Id, int> dial_sink_failure_count_;
+
+  // Non-owned pointer to DIAL MediaSinkService. Observed by |this| for dual
+  // discovery.
+  MediaSinkServiceBase* const dial_media_sink_service_;
 
   // The SequencedTaskRunner on which methods are run. This shares the
   // same SequencedTaskRunner as the one used by |cast_socket_service_|.
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
index d13fef17..de15c858 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/media/router/discovery/mdns/media_sink_util.h"
 #include "chrome/browser/media/router/media_router_feature.h"
 #include "chrome/browser/media/router/test/test_helper.h"
+#include "chrome/common/media_router/test/test_helper.h"
 #include "components/cast_channel/cast_socket.h"
 #include "components/cast_channel/cast_socket_service.h"
 #include "components/cast_channel/cast_test_util.h"
@@ -52,13 +53,12 @@
          expected.ping_interval_in_seconds == arg.ping_interval_in_seconds;
 }
 
-class MockObserver : public CastMediaSinkServiceImpl::Observer {
+class MockObserver : public MediaSinkServiceBase::Observer {
  public:
   MockObserver() {}
   ~MockObserver() override = default;
 
-  MOCK_METHOD2(OnSinkAddedOrUpdated,
-               void(const MediaSinkInternal&, cast_channel::CastSocket*));
+  MOCK_METHOD1(OnSinkAddedOrUpdated, void(const MediaSinkInternal&));
   MOCK_METHOD1(OnSinkRemoved, void(const MediaSinkInternal&));
 };
 
@@ -72,11 +72,12 @@
         mock_cast_socket_service_(
             new cast_channel::MockCastSocketService(mock_time_task_runner_)),
         media_sink_service_impl_(mock_sink_discovered_cb_.Get(),
-                                 &observer_,
                                  mock_cast_socket_service_.get(),
                                  discovery_network_monitor_.get(),
+                                 &dial_media_sink_service_,
                                  /* allow_all_ips */ false) {
     mock_cast_socket_service_->SetTaskRunnerForTest(mock_time_task_runner_);
+    media_sink_service_impl_.AddObserver(&observer_);
   }
 
   void SetUp() override {
@@ -89,6 +90,7 @@
   void TearDown() override {
     content::RunAllTasksUntilIdle();
     fake_network_info_ = fake_ethernet_info_;
+    media_sink_service_impl_.RemoveObserver(&observer_);
   }
 
  protected:
@@ -101,11 +103,6 @@
             }));
   }
 
-  cast_channel::CastSocket::Observer& observer() {
-    return static_cast<cast_channel::CastSocket::Observer&>(
-        media_sink_service_impl_);
-  }
-
   static const std::vector<DiscoveryNetworkInfo> fake_ethernet_info_;
   static const std::vector<DiscoveryNetworkInfo> fake_wifi_info_;
   static const std::vector<DiscoveryNetworkInfo> fake_unknown_info_;
@@ -124,6 +121,7 @@
       DiscoveryNetworkMonitor::CreateInstanceForTest(&FakeGetNetworkInfo);
 
   base::MockCallback<OnSinksDiscoveredCallback> mock_sink_discovered_cb_;
+  TestMediaSinkService dial_media_sink_service_;
   std::unique_ptr<cast_channel::MockCastSocketService>
       mock_cast_socket_service_;
   base::MockTimer* mock_timer_;
@@ -158,14 +156,15 @@
   cast_channel::MockCastSocket socket;
   socket.set_id(1);
 
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink, &socket));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink));
   media_sink_service_impl_.OnChannelOpenSucceeded(
       cast_sink, &socket, CastMediaSinkServiceImpl::SinkSource::kMdns);
 
   // Verify sink content
+  EXPECT_TRUE(mock_timer_->IsRunning());
   EXPECT_CALL(mock_sink_discovered_cb_,
               Run(std::vector<MediaSinkInternal>({cast_sink})));
-  media_sink_service_impl_.OnDiscoveryComplete();
+  mock_timer_->Fire();
 }
 
 TEST_F(CastMediaSinkServiceImplTest, TestMultipleOnChannelOpenSucceeded) {
@@ -185,7 +184,7 @@
   // Current round of Dns discovery finds service1 and service 2.
   // Fail to open channel 1.
   base::HistogramTester tester;
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink2, &socket2));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink2));
   media_sink_service_impl_.OnChannelOpenSucceeded(
       cast_sink2, &socket2, CastMediaSinkServiceImpl::SinkSource::kMdns);
   EXPECT_THAT(
@@ -194,7 +193,7 @@
       ElementsAre(Bucket(
           static_cast<int>(CastMediaSinkServiceImpl::SinkSource::kMdns), 1)));
 
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink3, &socket3));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink3));
   media_sink_service_impl_.OnChannelOpenSucceeded(
       cast_sink3, &socket3, CastMediaSinkServiceImpl::SinkSource::kDial);
   EXPECT_THAT(
@@ -208,7 +207,7 @@
 
   extra_data.discovered_by_dial = false;
   cast_sink3.set_cast_data(extra_data);
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink3, &socket3));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink3));
   media_sink_service_impl_.OnChannelOpenSucceeded(
       cast_sink3, &socket3, CastMediaSinkServiceImpl::SinkSource::kMdns);
   EXPECT_THAT(
@@ -224,9 +223,10 @@
               1)));
 
   // Verify sink content
+  EXPECT_TRUE(mock_timer_->IsRunning());
   EXPECT_CALL(mock_sink_discovered_cb_,
               Run(std::vector<MediaSinkInternal>({cast_sink2, cast_sink3})));
-  media_sink_service_impl_.OnDiscoveryComplete();
+  mock_timer_->Fire();
 }
 
 TEST_F(CastMediaSinkServiceImplTest, TestTimer) {
@@ -237,13 +237,12 @@
 
   EXPECT_FALSE(mock_timer_->IsRunning());
   media_sink_service_impl_.Start();
-  EXPECT_TRUE(mock_timer_->IsRunning());
 
   // Channel 2 is opened.
   cast_channel::MockCastSocket socket2;
   socket2.set_id(2);
 
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink2, &socket2));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink2));
   media_sink_service_impl_.OnChannelOpenSucceeded(
       cast_sink2, &socket2, CastMediaSinkServiceImpl::SinkSource::kMdns);
 
@@ -259,7 +258,7 @@
   cast_channel::MockCastSocket socket1;
   socket1.set_id(1);
 
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink1, &socket1));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink1));
   media_sink_service_impl_.OnChannelOpenSucceeded(
       cast_sink1, &socket1, CastMediaSinkServiceImpl::SinkSource::kMdns);
   EXPECT_TRUE(mock_timer_->IsRunning());
@@ -277,15 +276,13 @@
   EXPECT_CALL(*mock_cast_socket_service_, OpenSocketInternal(ip_endpoint, _, _))
       .Times(1);
   media_sink_service_impl_.OpenChannel(
-      ip_endpoint, cast_sink, nullptr,
-      CastMediaSinkServiceImpl::SinkSource::kMdns);
+      cast_sink, nullptr, CastMediaSinkServiceImpl::SinkSource::kMdns);
 
   // One pending sink, the same as |cast_sink|
   EXPECT_CALL(*mock_cast_socket_service_, OpenSocketInternal(ip_endpoint, _, _))
       .Times(0);
   media_sink_service_impl_.OpenChannel(
-      ip_endpoint, cast_sink, nullptr,
-      CastMediaSinkServiceImpl::SinkSource::kMdns);
+      cast_sink, nullptr, CastMediaSinkServiceImpl::SinkSource::kMdns);
 }
 
 TEST_F(CastMediaSinkServiceImplTest, TestOpenChannelRetryOnce) {
@@ -302,7 +299,7 @@
   media_sink_service_impl_.retry_params_.max_retry_attempts = 3;
   ExpectOpenSocketInternal(&socket);
   media_sink_service_impl_.OpenChannel(
-      ip_endpoint, cast_sink, std::move(backoff_entry),
+      cast_sink, std::move(backoff_entry),
       CastMediaSinkServiceImpl::SinkSource::kMdns);
 
   socket.SetErrorState(cast_channel::ChannelError::NONE);
@@ -313,7 +310,7 @@
 
 TEST_F(CastMediaSinkServiceImplTest, TestOpenChannelFails) {
   MediaSinkInternal cast_sink = CreateCastSink(1);
-  net::IPEndPoint ip_endpoint = CreateIPEndPoint(1);
+  const net::IPEndPoint& ip_endpoint = cast_sink.cast_data().ip_endpoint;
   cast_channel::MockCastSocket socket;
   socket.set_id(1);
   socket.SetIPEndpoint(ip_endpoint);
@@ -325,11 +322,11 @@
             std::move(open_cb).Run(&socket);
           }));
   media_sink_service_impl_.OpenChannel(
-      ip_endpoint, cast_sink, nullptr,
-      CastMediaSinkServiceImpl::SinkSource::kMdns);
+      cast_sink, nullptr, CastMediaSinkServiceImpl::SinkSource::kMdns);
 
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
-  EXPECT_EQ(4, media_sink_service_impl_.failure_count_map_[ip_endpoint]);
+  EXPECT_EQ(4,
+            media_sink_service_impl_.failure_count_map_[cast_sink.sink().id()]);
 }
 
 TEST_F(CastMediaSinkServiceImplTest, TestMultipleOpenChannels) {
@@ -364,7 +361,7 @@
   clock.Advance(delta);
   base::HistogramTester tester;
 
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink2, &socket2));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink2));
   media_sink_service_impl_.OnChannelOpened(
       cast_sink2, nullptr, CastMediaSinkServiceImpl::SinkSource::kMdns,
       start_time, &socket2);
@@ -390,19 +387,20 @@
   socket3.set_id(3);
   socket1.SetErrorState(cast_channel::ChannelError::NONE);
   socket3.SetErrorState(cast_channel::ChannelError::NONE);
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink1, &socket1));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink1));
   media_sink_service_impl_.OnChannelOpened(
       cast_sink1, nullptr, CastMediaSinkServiceImpl::SinkSource::kMdns,
       start_time, &socket1);
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink3, &socket3));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink3));
   media_sink_service_impl_.OnChannelOpened(
       cast_sink3, nullptr, CastMediaSinkServiceImpl::SinkSource::kMdns,
       start_time, &socket3);
 
+  EXPECT_TRUE(mock_timer_->IsRunning());
   EXPECT_CALL(mock_sink_discovered_cb_,
               Run(std::vector<MediaSinkInternal>(
                   {cast_sink1, cast_sink2, cast_sink3})));
-  media_sink_service_impl_.OnDiscoveryComplete();
+  mock_timer_->Fire();
 }
 
 TEST_F(CastMediaSinkServiceImplTest, OpenChannelNewIPSameSink) {
@@ -428,7 +426,7 @@
       sinks1, CastMediaSinkServiceImpl::SinkSource::kMdns);
 
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
-  EXPECT_EQ(1u, media_sink_service_impl_.current_sinks_map_.size());
+  EXPECT_EQ(1u, media_sink_service_impl_.GetSinks().size());
 
   // |cast_sink1| changed IP address and is discovered by mdns before it is
   // removed from |media_sink_service_impl_| first.
@@ -450,10 +448,10 @@
 
   // The entry under old IPEndPoint is removed and replaced with new IPEndPoint.
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
-  const auto& current_sinks_map = media_sink_service_impl_.current_sinks_map_;
-  EXPECT_EQ(1u, current_sinks_map.size());
-  auto sink_it = current_sinks_map.find(ip_endpoint2);
-  ASSERT_TRUE(sink_it != current_sinks_map.end());
+  const auto& current_sinks = media_sink_service_impl_.GetSinks();
+  EXPECT_EQ(1u, current_sinks.size());
+  auto sink_it = current_sinks.find(cast_sink1.sink().id());
+  ASSERT_TRUE(sink_it != current_sinks.end());
   EXPECT_EQ(cast_sink1, sink_it->second);
 }
 
@@ -466,20 +464,20 @@
 
   auto cast_sink2 = CreateCastSink(2);
 
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink, &socket));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink));
   media_sink_service_impl_.OnChannelOpenSucceeded(
       cast_sink, &socket, CastMediaSinkServiceImpl::SinkSource::kMdns);
 
-  EXPECT_EQ(1u, media_sink_service_impl_.current_sinks_map_.size());
+  EXPECT_EQ(1u, media_sink_service_impl_.GetSinks().size());
 
   // OnChannelOpenFailed called with mismatched sink: no-op.
   EXPECT_CALL(observer_, OnSinkRemoved(_)).Times(0);
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1, cast_sink2);
-  EXPECT_FALSE(media_sink_service_impl_.current_sinks_map_.empty());
+  EXPECT_FALSE(media_sink_service_impl_.GetSinks().empty());
 
   EXPECT_CALL(observer_, OnSinkRemoved(cast_sink));
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1, cast_sink);
-  EXPECT_TRUE(media_sink_service_impl_.current_sinks_map_.empty());
+  EXPECT_TRUE(media_sink_service_impl_.GetSinks().empty());
 }
 
 TEST_F(CastMediaSinkServiceImplTest, TestOnChannelErrorRetry) {
@@ -491,7 +489,7 @@
   EXPECT_CALL(socket, ready_state())
       .WillOnce(Return(cast_channel::ReadyState::OPEN));
 
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink, &socket));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink));
   media_sink_service_impl_.OnChannelOpenSucceeded(
       cast_sink, &socket, CastMediaSinkServiceImpl::SinkSource::kMdns);
 
@@ -506,13 +504,13 @@
   media_sink_service_impl_.OnError(socket,
                                    cast_channel::ChannelError::PING_TIMEOUT);
 
-  EXPECT_TRUE(media_sink_service_impl_.current_sinks_map_.empty());
+  EXPECT_TRUE(media_sink_service_impl_.GetSinks().empty());
 
   // Retry succeeds and sink is added back.
-  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink, &socket));
+  EXPECT_CALL(observer_, OnSinkAddedOrUpdated(cast_sink));
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
-  EXPECT_EQ(1u, media_sink_service_impl_.current_sinks_map_.size());
+  EXPECT_EQ(1u, media_sink_service_impl_.GetSinks().size());
 }
 
 TEST_F(CastMediaSinkServiceImplTest,
@@ -547,9 +545,10 @@
       .WillOnce(Return(cast_channel::ReadyState::CLOSED));
 
   // There is no existing cast sink.
+  /* XXX
   media_sink_service_impl_.pending_for_open_ip_endpoints_.clear();
-  media_sink_service_impl_.current_sinks_map_.clear();
-
+  media_sink_service_impl_.current_sinks_.clear();
+  */
   media_sink_service_impl_.OnError(
       socket, cast_channel::ChannelError::CHANNEL_NOT_OPEN);
 
@@ -559,7 +558,7 @@
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
 
-TEST_F(CastMediaSinkServiceImplTest, TestOnDialSinkAdded) {
+TEST_F(CastMediaSinkServiceImplTest, TestOnSinkAddedOrUpdated) {
   MediaSinkInternal dial_sink1 = CreateDialSink(1);
   MediaSinkInternal dial_sink2 = CreateDialSink(2);
   net::IPEndPoint ip_endpoint1(dial_sink1.dial_data().ip_address,
@@ -586,26 +585,30 @@
                   callback) { std::move(callback).Run(&socket2); })));
 
   // Invoke CastSocketService::OpenSocket on the IO thread.
-  media_sink_service_impl_.OnDialSinkAdded(dial_sink1);
+  media_sink_service_impl_.OnSinkAddedOrUpdated(dial_sink1);
   base::RunLoop().RunUntilIdle();
 
   // Invoke CastSocketService::OpenSocket on the IO thread.
-  media_sink_service_impl_.OnDialSinkAdded(dial_sink2);
+  media_sink_service_impl_.OnSinkAddedOrUpdated(dial_sink2);
   base::RunLoop().RunUntilIdle();
+
   // Verify sink content.
-  const auto& sinks_map = media_sink_service_impl_.current_sinks_map_;
-  EXPECT_EQ(2u, sinks_map.size());
+  const auto& sinks = media_sink_service_impl_.GetSinks();
+  EXPECT_EQ(2u, sinks.size());
 
-  auto sink_it = sinks_map.find(ip_endpoint1);
-  ASSERT_TRUE(sink_it != sinks_map.end());
-  EXPECT_EQ(SinkIconType::CAST, sink_it->second.sink().icon_type());
+  const MediaSinkInternal* sink = media_sink_service_impl_.GetSinkById(
+      CastMediaSinkServiceImpl::GetCastSinkIdFromDial(dial_sink1.sink().id()));
+  ASSERT_TRUE(sink);
+  EXPECT_EQ(SinkIconType::CAST, sink->sink().icon_type());
 
-  sink_it = sinks_map.find(ip_endpoint2);
-  ASSERT_TRUE(sink_it != sinks_map.end());
-  EXPECT_EQ(SinkIconType::CAST_AUDIO, sink_it->second.sink().icon_type());
+  sink = media_sink_service_impl_.GetSinkById(
+      CastMediaSinkServiceImpl::GetCastSinkIdFromDial(dial_sink2.sink().id()));
+  ASSERT_TRUE(sink);
+  EXPECT_EQ(SinkIconType::CAST_AUDIO, sink->sink().icon_type());
 }
 
-TEST_F(CastMediaSinkServiceImplTest, TestOnDialSinkAddedSkipsIfNonCastDevice) {
+TEST_F(CastMediaSinkServiceImplTest,
+       TestOnSinkAddedOrUpdatedSkipsIfNonCastDevice) {
   MediaSinkInternal dial_sink1 = CreateDialSink(1);
   net::IPEndPoint ip_endpoint1(dial_sink1.dial_data().ip_address,
                                kCastControlPort);
@@ -621,7 +624,7 @@
           [&socket1](
               const base::Callback<void(cast_channel::CastSocket * socket)>&
                   callback) { std::move(callback).Run(&socket1); })));
-  media_sink_service_impl_.OnDialSinkAdded(dial_sink1);
+  media_sink_service_impl_.OnSinkAddedOrUpdated(dial_sink1);
 
   // We don't trigger retries, thus each iteration will only increment the
   // failure count once.
@@ -634,25 +637,18 @@
             [&socket1](
                 const base::Callback<void(cast_channel::CastSocket * socket)>&
                     callback) { std::move(callback).Run(&socket1); })));
-    media_sink_service_impl_.OnDialSinkAdded(dial_sink1);
+    media_sink_service_impl_.OnSinkAddedOrUpdated(dial_sink1);
   }
 
-  auto& dial_sink_failure_count =
-      media_sink_service_impl_.dial_sink_failure_count_;
-  auto failure_count_it = dial_sink_failure_count.find(ip_endpoint1.address());
-  ASSERT_TRUE(failure_count_it != dial_sink_failure_count.end());
-  int failure_count = failure_count_it->second;
-  EXPECT_GE(failure_count, CastMediaSinkServiceImpl::kMaxDialSinkFailureCount);
-
-  // OnChannelOpenFailed too many times; next time OnDialSinkAdded is called,
-  // we won't attempt to open channel.
+  // OnChannelOpenFailed too many times; next time OnSinkAddedOrUpdated is
+  // called, we won't attempt to open channel.
   EXPECT_CALL(*mock_cast_socket_service_,
               OpenSocketInternal(ip_endpoint1, _, _))
       .Times(0);
 
-  media_sink_service_impl_.OnDialSinkAdded(dial_sink1);
+  media_sink_service_impl_.OnSinkAddedOrUpdated(dial_sink1);
 
-  EXPECT_EQ(0u, media_sink_service_impl_.current_sinks_map_.size());
+  EXPECT_TRUE(media_sink_service_impl_.GetSinks().empty());
 
   // Same IP address as dial_sink1; thus it is considered to be the same device.
   // The outcome of the channel does not matter here; the sink is considered a
@@ -667,49 +663,19 @@
   media_sink_service_impl_.OpenChannels(
       cast_sinks, CastMediaSinkServiceImpl::SinkSource::kMdns);
 
-  failure_count_it = dial_sink_failure_count.find(ip_endpoint1.address());
-  ASSERT_TRUE(failure_count_it == dial_sink_failure_count.end());
-
   // |dial_sink_failure_count| gets cleared on network change.
-  dial_sink_failure_count[ip_endpoint1.address()] = 6;
-
   media_sink_service_impl_.OnNetworksChanged("anotherNetworkId");
-  EXPECT_TRUE(dial_sink_failure_count.empty());
+  EXPECT_TRUE(media_sink_service_impl_.dial_sink_failure_count_.empty());
 }
 
-TEST_F(CastMediaSinkServiceImplTest, TestOnDiscoveryComplete) {
-  std::vector<MediaSinkInternal> sinks;
-  EXPECT_CALL(mock_sink_discovered_cb_, Run(_)).WillOnce(SaveArg<0>(&sinks));
-
-  auto cast_sink1 = CreateCastSink(1);
-  auto cast_sink2 = CreateCastSink(2);
-  auto cast_sink3 = CreateCastSink(3);
-  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
-  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
-  net::IPEndPoint ip_endpoint3 = CreateIPEndPoint(3);
-
-  // Find Cast sink 1, 2, 3
-  media_sink_service_impl_.current_sinks_map_[ip_endpoint1] = cast_sink1;
-  media_sink_service_impl_.current_sinks_map_[ip_endpoint2] = cast_sink2;
-  media_sink_service_impl_.current_sinks_map_[ip_endpoint3] = cast_sink3;
-
-  // Callback returns Cast sink 1, 2, 3
-  media_sink_service_impl_.OnDiscoveryComplete();
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(base::ContainsValue(sinks, cast_sink1));
-  EXPECT_TRUE(base::ContainsValue(sinks, cast_sink2));
-  EXPECT_TRUE(base::ContainsValue(sinks, cast_sink3));
-}
-
-TEST_F(CastMediaSinkServiceImplTest, TestAttemptConnection) {
-  auto cast_sink1 = CreateCastSink(1);
-  auto cast_sink2 = CreateCastSink(2);
-  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
-  net::IPEndPoint ip_endpoint2 = CreateIPEndPoint(2);
+TEST_F(CastMediaSinkServiceImplTest, OpenChannelsNow) {
+  MediaSinkInternal cast_sink1 = CreateCastSink(1);
+  MediaSinkInternal cast_sink2 = CreateCastSink(2);
+  const net::IPEndPoint& ip_endpoint1 = cast_sink1.cast_data().ip_endpoint;
+  const net::IPEndPoint& ip_endpoint2 = cast_sink2.cast_data().ip_endpoint;
 
   // Find Cast sink 1
-  media_sink_service_impl_.current_sinks_map_[ip_endpoint1] = cast_sink1;
+  media_sink_service_impl_.AddOrUpdateSink(cast_sink1);
 
   EXPECT_CALL(*mock_cast_socket_service_,
               OpenSocketInternal(ip_endpoint1, _, _))
@@ -717,9 +683,10 @@
   EXPECT_CALL(*mock_cast_socket_service_,
               OpenSocketInternal(ip_endpoint2, _, _));
 
-  // Attempt to connect to Cast sink 1, 2
+  // Attempt to connect to |cast_sink2| only since |cast_sink1| is already
+  // connected.
   std::vector<MediaSinkInternal> sinks{cast_sink1, cast_sink2};
-  media_sink_service_impl_.AttemptConnection(sinks);
+  media_sink_service_impl_.OpenChannelsNow(sinks);
 }
 
 TEST_F(CastMediaSinkServiceImplTest, CacheSinksForKnownNetwork) {
@@ -1110,7 +1077,7 @@
 
   MediaSinkInternal sink1_cast = CreateCastSink(1);
   MediaSinkInternal sink2_dial = CreateDialSink(2);
-  net::IPEndPoint ip_endpoint1 = CreateIPEndPoint(1);
+  const net::IPEndPoint& ip_endpoint1 = sink1_cast.cast_data().ip_endpoint;
   net::IPEndPoint ip_endpoint2(sink2_dial.dial_data().ip_address,
                                kCastControlPort);
   std::vector<MediaSinkInternal> sink_list1{sink1_cast};
@@ -1126,12 +1093,15 @@
   ExpectOpenSocketInternal(&socket2);
   media_sink_service_impl_.OpenChannels(
       sink_list1, CastMediaSinkServiceImpl::SinkSource::kMdns);
-  media_sink_service_impl_.OnDialSinkAdded(sink2_dial);
+  media_sink_service_impl_.OnSinkAddedOrUpdated(sink2_dial);
 
   // CastMediaSinkServiceImpl generates a Cast sink based on |sink2_dial|.
-  auto sink2_it =
-      media_sink_service_impl_.current_sinks_map_.find(ip_endpoint2);
-  ASSERT_TRUE(sink2_it != media_sink_service_impl_.current_sinks_map_.end());
+  const auto& sinks = media_sink_service_impl_.GetSinks();
+  auto sink2_it = std::find_if(
+      sinks.begin(), sinks.end(), [&ip_endpoint2](const auto& entry) {
+        return entry.second.cast_data().ip_endpoint == ip_endpoint2;
+      });
+  ASSERT_TRUE(sink2_it != sinks.end());
   MediaSinkInternal sink2_cast_from_dial = sink2_it->second;
 
   // Connect to a new network with different sinks.
@@ -1167,7 +1137,7 @@
   ExpectOpenSocketInternal(&socket4);
   media_sink_service_impl_.OpenChannels(
       sink_list2, CastMediaSinkServiceImpl::SinkSource::kMdns);
-  media_sink_service_impl_.OnDialSinkAdded(sink4_dial);
+  media_sink_service_impl_.OnSinkAddedOrUpdated(sink4_dial);
 
   // Reconnecting to the previous ethernet network should restore the same sinks
   // from the cache and attempt to resolve them.
@@ -1209,7 +1179,7 @@
   socket1_dial.SetIPEndpoint(ip_endpoint1_dial);
   socket1_dial.set_id(1);
   ExpectOpenSocketInternal(&socket1_dial);
-  media_sink_service_impl_.OnDialSinkAdded(sink1_dial);
+  media_sink_service_impl_.OnSinkAddedOrUpdated(sink1_dial);
 
   // The same sink is then discovered via mdns. However we won't open channel
   // again.
@@ -1326,7 +1296,8 @@
 }
 
 TEST_F(CastMediaSinkServiceImplTest, TestCreateCastSocketOpenParams) {
-  net::IPEndPoint ip_endpoint = CreateIPEndPoint(1);
+  MediaSinkInternal cast_sink1 = CreateCastSink(1);
+  const MediaSink::Id& sink_id = cast_sink1.sink().id();
   int connect_timeout_in_seconds =
       media_sink_service_impl_.open_params_.connect_timeout_in_seconds;
   int liveness_timeout_in_seconds =
@@ -1337,7 +1308,7 @@
 
   // No error
   auto open_params =
-      media_sink_service_impl_.CreateCastSocketOpenParams(ip_endpoint);
+      media_sink_service_impl_.CreateCastSocketOpenParams(cast_sink1);
   EXPECT_EQ(connect_timeout_in_seconds,
             open_params.connect_timeout.InSeconds());
   EXPECT_EQ(liveness_timeout_in_seconds,
@@ -1346,9 +1317,8 @@
   // One error
   connect_timeout_in_seconds += delta_in_seconds;
   liveness_timeout_in_seconds += delta_in_seconds;
-  media_sink_service_impl_.failure_count_map_[ip_endpoint] = 1;
-  open_params =
-      media_sink_service_impl_.CreateCastSocketOpenParams(ip_endpoint);
+  media_sink_service_impl_.failure_count_map_[sink_id] = 1;
+  open_params = media_sink_service_impl_.CreateCastSocketOpenParams(cast_sink1);
   EXPECT_EQ(connect_timeout_in_seconds,
             open_params.connect_timeout.InSeconds());
   EXPECT_EQ(liveness_timeout_in_seconds,
@@ -1357,9 +1327,8 @@
   // Two errors
   connect_timeout_in_seconds += delta_in_seconds;
   liveness_timeout_in_seconds += delta_in_seconds;
-  media_sink_service_impl_.failure_count_map_[ip_endpoint] = 2;
-  open_params =
-      media_sink_service_impl_.CreateCastSocketOpenParams(ip_endpoint);
+  media_sink_service_impl_.failure_count_map_[sink_id] = 2;
+  open_params = media_sink_service_impl_.CreateCastSocketOpenParams(cast_sink1);
   EXPECT_EQ(connect_timeout_in_seconds,
             open_params.connect_timeout.InSeconds());
   EXPECT_EQ(liveness_timeout_in_seconds,
@@ -1368,9 +1337,8 @@
   // Ten errors
   connect_timeout_in_seconds = 30;
   liveness_timeout_in_seconds = 60;
-  media_sink_service_impl_.failure_count_map_[ip_endpoint] = 10;
-  open_params =
-      media_sink_service_impl_.CreateCastSocketOpenParams(ip_endpoint);
+  media_sink_service_impl_.failure_count_map_[sink_id] = 10;
+  open_params = media_sink_service_impl_.CreateCastSocketOpenParams(cast_sink1);
   EXPECT_EQ(connect_timeout_in_seconds,
             open_params.connect_timeout.InSeconds());
   EXPECT_EQ(liveness_timeout_in_seconds,
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
index af3b327..ec0c72d 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_unittest.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/media/router/discovery/mdns/media_sink_util.h"
 #include "chrome/browser/media/router/test/mock_dns_sd_registry.h"
 #include "chrome/browser/media/router/test/test_helper.h"
+#include "chrome/common/media_router/test/test_helper.h"
 #include "components/cast_channel/cast_socket.h"
 #include "components/cast_channel/cast_socket_service.h"
 #include "components/cast_channel/cast_test_util.h"
@@ -59,13 +60,13 @@
  public:
   MockCastMediaSinkServiceImpl(
       const OnSinksDiscoveredCallback& callback,
-      CastMediaSinkServiceImpl::Observer* observer,
       cast_channel::CastSocketService* cast_socket_service,
-      DiscoveryNetworkMonitor* network_monitor)
+      DiscoveryNetworkMonitor* network_monitor,
+      MediaSinkServiceBase* dial_media_sink_service)
       : CastMediaSinkServiceImpl(callback,
-                                 observer,
                                  cast_socket_service,
                                  network_monitor,
+                                 dial_media_sink_service,
                                  /* allow_all_ips */ false),
         sinks_discovered_cb_(callback) {}
   ~MockCastMediaSinkServiceImpl() override {}
@@ -94,12 +95,12 @@
 
   std::unique_ptr<CastMediaSinkServiceImpl, base::OnTaskRunnerDeleter>
   CreateImpl(const OnSinksDiscoveredCallback& sinks_discovered_cb,
-             CastMediaSinkServiceImpl::Observer* observer) override {
+             MediaSinkServiceBase* dial_media_sink_service) override {
     auto mock_impl = std::unique_ptr<MockCastMediaSinkServiceImpl,
                                      base::OnTaskRunnerDeleter>(
-        new MockCastMediaSinkServiceImpl(sinks_discovered_cb, observer,
-                                         cast_socket_service_,
-                                         network_monitor_),
+        new MockCastMediaSinkServiceImpl(sinks_discovered_cb,
+                                         cast_socket_service_, network_monitor_,
+                                         dial_media_sink_service),
         base::OnTaskRunnerDeleter(cast_socket_service_->task_runner()));
     mock_impl_ = mock_impl.get();
     return mock_impl;
@@ -108,8 +109,8 @@
   MockCastMediaSinkServiceImpl* mock_impl() { return mock_impl_; }
 
  private:
-  cast_channel::CastSocketService* const cast_socket_service_ = nullptr;
-  DiscoveryNetworkMonitor* const network_monitor_ = nullptr;
+  cast_channel::CastSocketService* const cast_socket_service_;
+  DiscoveryNetworkMonitor* const network_monitor_;
   MockCastMediaSinkServiceImpl* mock_impl_ = nullptr;
 };
 
@@ -130,7 +131,7 @@
     EXPECT_CALL(test_dns_sd_registry_, RegisterDnsSdListener(_));
     media_sink_service_->SetDnsSdRegistryForTest(&test_dns_sd_registry_);
     media_sink_service_->Start(mock_sink_discovered_ui_cb_.Get(),
-                               /* observer */ nullptr);
+                               &dial_media_sink_service_);
     mock_impl_ = media_sink_service_->mock_impl();
     ASSERT_TRUE(mock_impl_);
     EXPECT_CALL(*mock_impl_, DoStart()).WillOnce(InvokeWithoutArgs([this]() {
@@ -153,6 +154,7 @@
   std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
 
   base::MockCallback<OnSinksDiscoveredCallback> mock_sink_discovered_ui_cb_;
+  TestMediaSinkService dial_media_sink_service_;
   std::unique_ptr<cast_channel::MockCastSocketService>
       mock_cast_socket_service_;
 
diff --git a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc
index 22ea5d5..291ef691 100644
--- a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc
+++ b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc
@@ -40,19 +40,25 @@
 CastAppDiscoveryService::CastAppDiscoveryService(
     cast_channel::CastMessageHandler* message_handler,
     cast_channel::CastSocketService* socket_service,
+    MediaSinkServiceBase* media_sink_service,
     const base::TickClock* clock)
     : message_handler_(message_handler),
       socket_service_(socket_service),
+      media_sink_service_(media_sink_service),
       clock_(clock),
       weak_ptr_factory_(this) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
   DCHECK(message_handler_);
   DCHECK(socket_service_);
   DCHECK(clock_);
+  socket_service_->task_runner()->PostTask(
+      FROM_HERE,
+      base::BindOnce(&CastAppDiscoveryService::Init, base::Unretained(this)));
 }
 
 CastAppDiscoveryService::~CastAppDiscoveryService() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  media_sink_service_->RemoveObserver(this);
 }
 
 CastAppDiscoveryService::Subscription
@@ -81,10 +87,11 @@
     // it changed.
     base::flat_set<std::string> new_app_ids =
         availability_tracker_.RegisterSource(source);
+    const auto& sinks = media_sink_service_->GetSinks();
     for (const auto& app_id : new_app_ids) {
-      // Note: The following logic assumes |sinks_| will not change as it is
+      // Note: The following logic assumes |sinks| will not change as it is
       // being iterated.
-      for (const auto& sink : sinks_) {
+      for (const auto& sink : sinks) {
         int channel_id = sink.second.cast_data().cast_channel_id;
         cast_channel::CastSocket* socket =
             socket_service_->GetSocket(channel_id);
@@ -102,11 +109,13 @@
 }
 
 void CastAppDiscoveryService::Refresh() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const auto app_ids = availability_tracker_.GetRegisteredApps();
   base::TimeTicks now = clock_->NowTicks();
-  // Note: The following logic assumes |sinks_| will not change as it is
+  const auto& sinks = media_sink_service_->GetSinks();
+  // Note: The following logic assumes |sinks| will not change as it is
   // being iterated.
-  for (const auto& sink : sinks_) {
+  for (const auto& sink : sinks) {
     for (const auto& app_id : app_ids) {
       if (ShouldRefreshAppAvailability(
               availability_tracker_.GetAvailability(sink.first, app_id), now)) {
@@ -136,12 +145,21 @@
   }
 }
 
-void CastAppDiscoveryService::OnSinkAddedOrUpdated(
-    const MediaSinkInternal& sink,
-    cast_channel::CastSocket* socket) {
+void CastAppDiscoveryService::Init() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  media_sink_service_->AddObserver(this);
+}
+
+void CastAppDiscoveryService::OnSinkAddedOrUpdated(
+    const MediaSinkInternal& sink) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  cast_channel::CastSocket* socket =
+      socket_service_->GetSocket(sink.cast_data().cast_channel_id);
+  if (!socket)
+    return;
+
   const MediaSink::Id& sink_id = sink.sink().id();
-  sinks_.insert_or_assign(sink_id, sink);
   for (const std::string& app_id : availability_tracker_.GetRegisteredApps()) {
     auto availability = availability_tracker_.GetAvailability(sink_id, app_id);
     if (availability.first != cast_channel::GetAppAvailabilityResult::kUnknown)
@@ -154,7 +172,6 @@
 void CastAppDiscoveryService::OnSinkRemoved(const MediaSinkInternal& sink) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const MediaSink::Id& sink_id = sink.sink().id();
-  sinks_.erase(sink_id);
   UpdateSinkQueries(availability_tracker_.RemoveResultsForSink(sink_id));
 }
 
@@ -176,7 +193,7 @@
     cast_channel::GetAppAvailabilityResult availability) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   RecordAppAvailabilityResult(availability, clock_->NowTicks() - start_time);
-  if (!base::ContainsKey(sinks_, sink_id))
+  if (!media_sink_service_->GetSinkById(sink_id))
     return;
 
   DVLOG(1) << "App " << app_id << " on sink " << sink_id << " is "
@@ -203,9 +220,9 @@
     const base::flat_set<MediaSink::Id>& sink_ids) const {
   std::vector<MediaSinkInternal> sinks;
   for (const auto& sink_id : sink_ids) {
-    auto it = sinks_.find(sink_id);
-    if (it != sinks_.end())
-      sinks.push_back(it->second);
+    const MediaSinkInternal* sink = media_sink_service_->GetSinkById(sink_id);
+    if (sink)
+      sinks.push_back(*sink);
   }
   return sinks;
 }
diff --git a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.h b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.h
index 639b91e7..4748f6b 100644
--- a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.h
+++ b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.h
@@ -16,8 +16,8 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/time/time.h"
-#include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h"
 #include "chrome/browser/media/router/providers/cast/cast_app_availability_tracker.h"
+#include "chrome/common/media_router/discovery/media_sink_service_base.h"
 #include "chrome/common/media_router/media_sink.h"
 #include "chrome/common/media_router/media_source.h"
 #include "chrome/common/media_router/providers/cast/cast_media_source.h"
@@ -30,6 +30,7 @@
 namespace cast_channel {
 class CastMessageHandler;
 class CastSocket;
+class CastSocketService;
 }  // namespace cast_channel
 
 namespace media_router {
@@ -38,7 +39,7 @@
 // updates, and issues app availability requests based on these signals. This
 // class may be created on any sequence. All other methods must be called on the
 // CastSocketService sequence.
-class CastAppDiscoveryService : public CastMediaSinkServiceImpl::Observer {
+class CastAppDiscoveryService : public MediaSinkServiceBase::Observer {
  public:
   using SinkQueryFunc = void(const MediaSource::Id& source_id,
                              const std::vector<MediaSinkInternal>& sinks);
@@ -48,6 +49,7 @@
 
   CastAppDiscoveryService(cast_channel::CastMessageHandler* message_handler,
                           cast_channel::CastSocketService* socket_service,
+                          MediaSinkServiceBase* media_sink_service,
                           const base::TickClock* clock);
   ~CastAppDiscoveryService() override;
 
@@ -67,9 +69,11 @@
  private:
   friend class CastAppDiscoveryServiceTest;
 
-  // CastMediaSinkServiceImpl::Observer
-  void OnSinkAddedOrUpdated(const MediaSinkInternal& sink,
-                            cast_channel::CastSocket* socket) override;
+  // Called on construction. Registers an observer with |media_sink_service_|.
+  void Init();
+
+  // MediaSinkServiceBase::Observer
+  void OnSinkAddedOrUpdated(const MediaSinkInternal& sink) override;
   void OnSinkRemoved(const MediaSinkInternal& sink) override;
 
   // Issues an app availability request for |app_id| to the sink given by
@@ -104,9 +108,9 @@
 
   cast_channel::CastMessageHandler* const message_handler_;
   cast_channel::CastSocketService* const socket_service_;
+  MediaSinkServiceBase* const media_sink_service_;
 
   CastAppAvailabilityTracker availability_tracker_;
-  base::flat_map<MediaSink::Id, MediaSinkInternal> sinks_;
 
   const base::TickClock* const clock_;
 
diff --git a/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc b/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc
index af2f5dc7..32e2f18 100644
--- a/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc
@@ -8,7 +8,9 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "base/test/test_simple_task_runner.h"
 #include "chrome/browser/media/router/test/test_helper.h"
+#include "chrome/common/media_router/discovery/media_sink_service_base.h"
 #include "chrome/common/media_router/providers/cast/cast_media_source.h"
+#include "chrome/common/media_router/test/test_helper.h"
 #include "components/cast_channel/cast_test_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -28,12 +30,14 @@
         app_discovery_service_(
             std::make_unique<CastAppDiscoveryService>(&message_handler_,
                                                       &socket_service_,
+                                                      &media_sink_service_,
                                                       &clock_)),
         source_a_1_(*CastMediaSource::From("cast:AAAAAAAA?clientId=1")),
         source_a_2_(*CastMediaSource::From("cast:AAAAAAAA?clientId=2")),
         source_b_1_(*CastMediaSource::From("cast:BBBBBBBB?clientId=1")) {
     ON_CALL(socket_service_, GetSocket(_))
         .WillByDefault(testing::Return(&socket_));
+    task_runner_->RunPendingTasks();
   }
 
   ~CastAppDiscoveryServiceTest() override { task_runner_->RunPendingTasks(); }
@@ -43,11 +47,11 @@
                     const std::vector<MediaSinkInternal>&));
 
   void AddOrUpdateSink(const MediaSinkInternal& sink) {
-    app_discovery_service_->OnSinkAddedOrUpdated(sink, &socket_);
+    media_sink_service_.AddOrUpdateSink(sink);
   }
 
   void RemoveSink(const MediaSinkInternal& sink) {
-    app_discovery_service_->OnSinkRemoved(sink);
+    media_sink_service_.RemoveSink(sink);
   }
 
   CastAppDiscoveryService::Subscription StartObservingMediaSinksInitially(
@@ -66,6 +70,7 @@
   cast_channel::MockCastSocketService socket_service_;
   cast_channel::MockCastSocket socket_;
   cast_channel::MockCastMessageHandler message_handler_;
+  TestMediaSinkService media_sink_service_;
   std::unique_ptr<CastAppDiscoveryService> app_discovery_service_;
   CastMediaSource source_a_1_;
   CastMediaSource source_a_2_;
diff --git a/chrome/browser/media/router/providers/cast/dual_media_sink_service.cc b/chrome/browser/media/router/providers/cast/dual_media_sink_service.cc
index e8f6eb2..706f3994 100644
--- a/chrome/browser/media/router/providers/cast/dual_media_sink_service.cc
+++ b/chrome/browser/media/router/providers/cast/dual_media_sink_service.cc
@@ -47,8 +47,7 @@
 
 void DualMediaSinkService::OnUserGesture() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  dial_media_sink_service_->OnUserGesture();
+  // TODO(imcheng): Move this call into CastMediaRouteProvider.
   if (cast_media_sink_service_)
     cast_media_sink_service_->OnUserGesture();
 }
@@ -61,36 +60,34 @@
 }
 
 DualMediaSinkService::DualMediaSinkService() {
-  OnDialSinkAddedCallback dial_sink_added_cb;
+  dial_media_sink_service_ = std::make_unique<DialMediaSinkService>();
+  dial_media_sink_service_->Start(
+      base::BindRepeating(&DualMediaSinkService::OnSinksDiscovered,
+                          base::Unretained(this), "dial"));
+
   if (CastDiscoveryEnabled()) {
+    cast_media_sink_service_ = std::make_unique<CastMediaSinkService>();
+    cast_media_sink_service_->Start(
+        base::BindRepeating(&DualMediaSinkService::OnSinksDiscovered,
+                            base::Unretained(this), "cast"),
+        dial_media_sink_service_->impl());
+
     if (CastMediaRouteProviderEnabled()) {
       cast_channel::CastSocketService* cast_socket_service =
           cast_channel::CastSocketService::GetInstance();
       cast_app_discovery_service_ = std::make_unique<CastAppDiscoveryService>(
           GetCastMessageHandler(), cast_socket_service,
+          cast_media_sink_service_->impl(),
           base::DefaultTickClock::GetInstance());
     }
-
-    cast_media_sink_service_ = std::make_unique<CastMediaSinkService>();
-    cast_media_sink_service_->Start(
-        base::BindRepeating(&DualMediaSinkService::OnSinksDiscovered,
-                            base::Unretained(this), "cast"),
-        cast_app_discovery_service_.get());
-    dial_sink_added_cb = cast_media_sink_service_->GetDialSinkAddedCallback();
   }
-
-  dial_media_sink_service_ = std::make_unique<DialMediaSinkService>();
-  dial_media_sink_service_->Start(
-      base::BindRepeating(&DualMediaSinkService::OnSinksDiscovered,
-                          base::Unretained(this), "dial"),
-      dial_sink_added_cb);
 }
 
 DualMediaSinkService::DualMediaSinkService(
     std::unique_ptr<CastMediaSinkService> cast_media_sink_service,
     std::unique_ptr<DialMediaSinkService> dial_media_sink_service)
-    : cast_media_sink_service_(std::move(cast_media_sink_service)),
-      dial_media_sink_service_(std::move(dial_media_sink_service)) {}
+    : dial_media_sink_service_(std::move(dial_media_sink_service)),
+      cast_media_sink_service_(std::move(cast_media_sink_service)) {}
 
 DualMediaSinkService::~DualMediaSinkService() = default;
 
diff --git a/chrome/browser/media/router/providers/cast/dual_media_sink_service.h b/chrome/browser/media/router/providers/cast/dual_media_sink_service.h
index fd27e65..21a801d 100644
--- a/chrome/browser/media/router/providers/cast/dual_media_sink_service.h
+++ b/chrome/browser/media/router/providers/cast/dual_media_sink_service.h
@@ -15,6 +15,8 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/sequence_checker.h"
+#include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h"
+#include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h"
 #include "chrome/browser/media/router/media_sinks_observer.h"
 #include "chrome/common/media_router/discovery/media_sink_internal.h"
 #include "chrome/common/media_router/media_source.h"
@@ -48,10 +50,6 @@
   static DualMediaSinkService* GetInstance();
   static void SetInstanceForTest(DualMediaSinkService* instance_for_test);
 
-  CastAppDiscoveryService* cast_app_discovery_service() {
-    return cast_app_discovery_service_.get();
-  }
-
   // Returns the current list of sinks, keyed by provider name.
   const base::flat_map<std::string, std::vector<MediaSinkInternal>>&
   current_sinks() {
@@ -61,6 +59,10 @@
   // Used by DialMediaRouteProvider only.
   DialMediaSinkServiceImpl* GetDialMediaSinkServiceImpl();
 
+  CastAppDiscoveryService* cast_app_discovery_service() {
+    return cast_app_discovery_service_.get();
+  }
+
   // Adds |callback| to be notified when the list of discovered sinks changes.
   // The caller is responsible for destroying the returned Subscription when it
   // no longer wishes to receive updates.
@@ -88,18 +90,20 @@
   friend class MediaRouterDesktopTestBase;
   FRIEND_TEST_ALL_PREFIXES(MediaRouterDesktopTest, ProvideSinks);
 
-  friend struct std::default_delete<DualMediaSinkService>;
-
   static DualMediaSinkService* instance_for_test_;
 
+  friend struct std::default_delete<DualMediaSinkService>;
+
   DualMediaSinkService();
 
   void OnSinksDiscovered(const std::string& provider_name,
                          std::vector<MediaSinkInternal> sinks);
 
+  // Note: Dual discovery logic assumes |dial_media_sink_service_| outlives
+  // |cast_media_sink_service_|.
+  std::unique_ptr<DialMediaSinkService> dial_media_sink_service_;
   std::unique_ptr<CastMediaSinkService> cast_media_sink_service_;
   std::unique_ptr<CastAppDiscoveryService> cast_app_discovery_service_;
-  std::unique_ptr<DialMediaSinkService> dial_media_sink_service_;
 
   OnSinksDiscoveredProviderCallbackList sinks_discovered_callbacks_;
   base::flat_map<std::string, std::vector<MediaSinkInternal>> current_sinks_;
diff --git a/chrome/browser/media/router/providers/cast/dual_media_sink_service_unittest.cc b/chrome/browser/media/router/providers/cast/dual_media_sink_service_unittest.cc
index 9d420c74..62cdc8b 100644
--- a/chrome/browser/media/router/providers/cast/dual_media_sink_service_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/dual_media_sink_service_unittest.cc
@@ -46,7 +46,6 @@
 
 TEST_F(DualMediaSinkServiceTest, OnUserGesture) {
   EXPECT_CALL(*cast_media_sink_service(), OnUserGesture());
-  EXPECT_CALL(*dial_media_sink_service(), OnUserGesture());
   dual_media_sink_service()->OnUserGesture();
 }
 
diff --git a/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc b/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc
index f024a77..0082219 100644
--- a/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc
+++ b/chrome/browser/media/router/providers/dial/dial_media_route_provider.cc
@@ -199,7 +199,7 @@
 }
 
 void DialMediaRouteProvider::UpdateMediaSinks(const std::string& media_source) {
-  NOTIMPLEMENTED();
+  media_sink_service_->OnUserGesture();
 }
 
 void DialMediaRouteProvider::SearchSinks(
diff --git a/chrome/browser/media/router/providers/dial/dial_media_route_provider_unittest.cc b/chrome/browser/media/router/providers/dial/dial_media_route_provider_unittest.cc
index 99e228a..f3ab22d 100644
--- a/chrome/browser/media/router/providers/dial/dial_media_route_provider_unittest.cc
+++ b/chrome/browser/media/router/providers/dial/dial_media_route_provider_unittest.cc
@@ -26,7 +26,6 @@
   TestDialMediaSinkServiceImpl()
       : DialMediaSinkServiceImpl(/* connector */ nullptr,
                                  base::DoNothing(),
-                                 base::DoNothing(),
                                  /* task_runner */ nullptr) {}
 
   ~TestDialMediaSinkServiceImpl() override = default;
diff --git a/chrome/browser/media/router/test/test_helper.h b/chrome/browser/media/router/test/test_helper.h
index 08c3e97..bf6b9315 100644
--- a/chrome/browser/media/router/test/test_helper.h
+++ b/chrome/browser/media/router/test/test_helper.h
@@ -123,9 +123,7 @@
   MockDialMediaSinkService();
   ~MockDialMediaSinkService() override;
 
-  MOCK_METHOD2(Start,
-               void(const OnSinksDiscoveredCallback&,
-                    const OnDialSinkAddedCallback&));
+  MOCK_METHOD1(Start, void(const OnSinksDiscoveredCallback&));
   MOCK_METHOD0(OnUserGesture, void());
 };
 
@@ -135,8 +133,7 @@
   ~MockCastMediaSinkService() override;
 
   MOCK_METHOD2(Start,
-               void(const OnSinksDiscoveredCallback&,
-                    CastMediaSinkServiceImpl::Observer*));
+               void(const OnSinksDiscoveredCallback&, MediaSinkServiceBase*));
   MOCK_METHOD0(OnUserGesture, void());
   MOCK_METHOD0(StartMdnsDiscovery, void());
 };
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index 70593a97..208e426 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -1055,42 +1055,47 @@
 
   builder->set_ssl_config_service(profile_params_->ssl_config_service);
 
-  std::unique_ptr<ChromeNetworkDelegate> chrome_network_delegate(
-      new ChromeNetworkDelegate(
+  ChromeNetworkDelegate* chrome_network_delegate_unowned = nullptr;
+  if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+    std::unique_ptr<ChromeNetworkDelegate> chrome_network_delegate(
+        new ChromeNetworkDelegate(
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-          io_thread_globals->extension_event_router_forwarder.get(),
+            io_thread_globals->extension_event_router_forwarder.get(),
 #else
-          NULL,
+            NULL,
 #endif
-          &enable_referrers_));
+            &enable_referrers_));
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-  chrome_network_delegate->set_extension_info_map(
-      profile_params_->extension_info_map.get());
-  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kDisableExtensionsHttpThrottling)) {
-    extension_throttle_manager_.reset(
-        new extensions::ExtensionThrottleManager());
-  }
+    chrome_network_delegate->set_extension_info_map(
+        profile_params_->extension_info_map.get());
+    if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
+            switches::kDisableExtensionsHttpThrottling)) {
+      extension_throttle_manager_.reset(
+          new extensions::ExtensionThrottleManager());
+    }
 #endif
 
-  chrome_network_delegate->set_profile(profile_params_->profile);
-  chrome_network_delegate->set_profile_path(profile_params_->path);
-  chrome_network_delegate->set_cookie_settings(
-      profile_params_->cookie_settings.get());
-  chrome_network_delegate->set_force_google_safe_search(
-      &force_google_safesearch_);
-  chrome_network_delegate->set_force_youtube_restrict(&force_youtube_restrict_);
-  chrome_network_delegate->set_allowed_domains_for_apps(
-      &allowed_domains_for_apps_);
-  chrome_network_delegate->set_data_use_aggregator(
-      io_thread_globals->data_use_aggregator.get(), IsOffTheRecord());
+    chrome_network_delegate->set_profile(profile_params_->profile);
+    chrome_network_delegate->set_profile_path(profile_params_->path);
+    chrome_network_delegate->set_cookie_settings(
+        profile_params_->cookie_settings.get());
+    chrome_network_delegate->set_force_google_safe_search(
+        &force_google_safesearch_);
+    chrome_network_delegate->set_force_youtube_restrict(
+        &force_youtube_restrict_);
+    chrome_network_delegate->set_allowed_domains_for_apps(
+        &allowed_domains_for_apps_);
+    chrome_network_delegate->set_data_use_aggregator(
+        io_thread_globals->data_use_aggregator.get(), IsOffTheRecord());
 
-  ChromeNetworkDelegate* chrome_network_delegate_unowned =
-      chrome_network_delegate.get();
+    chrome_network_delegate_unowned = chrome_network_delegate.get();
 
-  std::unique_ptr<net::NetworkDelegate> network_delegate =
-      ConfigureNetworkDelegate(profile_params_->io_thread,
-                               std::move(chrome_network_delegate));
+    std::unique_ptr<net::NetworkDelegate> network_delegate =
+        ConfigureNetworkDelegate(profile_params_->io_thread,
+                                 std::move(chrome_network_delegate));
+
+    builder->set_network_delegate(std::move(network_delegate));
+  }
 
   builder->set_shared_host_resolver(
       io_thread_globals->system_request_context->host_resolver());
@@ -1100,8 +1105,6 @@
 
   io_thread->SetUpProxyService(builder.get());
 
-  builder->set_network_delegate(std::move(network_delegate));
-
   if (!IsOffTheRecord())
     builder->set_transport_security_persister_path(profile_params_->path);
 
@@ -1218,7 +1221,8 @@
             std::move(builder), &main_request_context_);
   }
 
-  if (chrome_network_delegate_unowned->domain_reliability_monitor()) {
+  if (!base::FeatureList::IsEnabled(network::features::kNetworkService) &&
+      chrome_network_delegate_unowned->domain_reliability_monitor()) {
     // Save a pointer to shut down Domain Reliability cleanly before the
     // URLRequestContext is dismantled.
     domain_reliability_monitor_unowned_ =
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h
index f6d82dae..53396c75f 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h
@@ -19,6 +19,7 @@
 
 class LocalSiteCharacteristicsDataStore;
 class LocalSiteCharacteristicsDataReaderTest;
+class LocalSiteCharacteristicsDataWriterTest;
 
 namespace internal {
 
@@ -84,6 +85,7 @@
   friend class LocalSiteCharacteristicsDataImplTest;
   friend class resource_coordinator::LocalSiteCharacteristicsDataReaderTest;
   friend class resource_coordinator::LocalSiteCharacteristicsDataStore;
+  friend class resource_coordinator::LocalSiteCharacteristicsDataWriterTest;
 
   LocalSiteCharacteristicsDataImpl(const std::string& origin_str,
                                    OnDestroyDelegate* delegate);
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_reader_unittest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_reader_unittest.cc
index 7134034..405ca28e 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_data_reader_unittest.cc
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_reader_unittest.cc
@@ -33,20 +33,11 @@
 
   ~LocalSiteCharacteristicsDataReaderTest() override {
     test_impl_->NotifySiteUnloaded();
-    reader_.reset();
-    test_impl_ = nullptr;
   }
 
   base::SimpleTestTickClock test_clock_;
   ScopedSetTickClockForTesting scoped_set_tick_clock_for_testing_;
 
-  // The LocalSiteCharacteristicsDataImpl object used in these tests.
-  scoped_refptr<internal::LocalSiteCharacteristicsDataImpl> test_impl_;
-
-  // A LocalSiteCharacteristicsDataReader object associated with the origin used
-  // to create this object.
-  std::unique_ptr<LocalSiteCharacteristicsDataReader> reader_;
-
   // The mock delegate used by the LocalSiteCharacteristicsDataImpl objects
   // created by this class, NiceMock is used to avoid having to set expectations
   // in test cases that don't care about this.
@@ -54,6 +45,13 @@
       testing::MockLocalSiteCharacteristicsDataImplOnDestroyDelegate>
       delegate_;
 
+  // The LocalSiteCharacteristicsDataImpl object used in these tests.
+  scoped_refptr<internal::LocalSiteCharacteristicsDataImpl> test_impl_;
+
+  // A LocalSiteCharacteristicsDataReader object associated with the origin used
+  // to create this object.
+  std::unique_ptr<LocalSiteCharacteristicsDataReader> reader_;
+
   DISALLOW_COPY_AND_ASSIGN(LocalSiteCharacteristicsDataReaderTest);
 };
 
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_store.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_store.cc
index 6521917..4214c44b 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_data_store.cc
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_store.cc
@@ -30,12 +30,23 @@
     const std::string& origin_str) {
   internal::LocalSiteCharacteristicsDataImpl* impl =
       GetOrCreateFeatureImpl(origin_str);
-  DCHECK_NE(nullptr, impl);
+  DCHECK(impl);
   SiteCharacteristicsDataReader* data_reader =
       new LocalSiteCharacteristicsDataReader(impl);
   return base::WrapUnique(data_reader);
 }
 
+std::unique_ptr<LocalSiteCharacteristicsDataWriter>
+LocalSiteCharacteristicsDataStore::GetWriterForOrigin(
+    const std::string& origin_str) {
+  internal::LocalSiteCharacteristicsDataImpl* impl =
+      GetOrCreateFeatureImpl(origin_str);
+  DCHECK(impl);
+  LocalSiteCharacteristicsDataWriter* data_writer =
+      new LocalSiteCharacteristicsDataWriter(impl);
+  return base::WrapUnique(data_writer);
+}
+
 internal::LocalSiteCharacteristicsDataImpl*
 LocalSiteCharacteristicsDataStore::GetOrCreateFeatureImpl(
     const std::string& origin_str) {
@@ -57,7 +68,7 @@
 void LocalSiteCharacteristicsDataStore::
     OnLocalSiteCharacteristicsDataImplDestroyed(
         internal::LocalSiteCharacteristicsDataImpl* impl) {
-  DCHECK_NE(nullptr, impl);
+  DCHECK(impl);
   DCHECK(base::ContainsKey(origin_data_map_, impl->origin_str()));
   // Remove the entry for this origin as this is about to get destroyed.
   auto num_erased = origin_data_map_.erase(impl->origin_str());
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_store.h b/chrome/browser/resource_coordinator/local_site_characteristics_data_store.h
index e6d291d..3d89c14 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_data_store.h
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_store.h
@@ -5,11 +5,14 @@
 #ifndef CHROME_BROWSER_RESOURCE_COORDINATOR_LOCAL_SITE_CHARACTERISTICS_DATA_STORE_H_
 #define CHROME_BROWSER_RESOURCE_COORDINATOR_LOCAL_SITE_CHARACTERISTICS_DATA_STORE_H_
 
+#include <string>
+
 #include "base/containers/flat_map.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h"
+#include "chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h"
 #include "chrome/browser/resource_coordinator/site_characteristics_data_store.h"
 #include "components/history/core/browser/history_service_observer.h"
 
@@ -34,6 +37,9 @@
   std::unique_ptr<SiteCharacteristicsDataReader> GetReaderForOrigin(
       const std::string& origin_str) override;
 
+  std::unique_ptr<LocalSiteCharacteristicsDataWriter> GetWriterForOrigin(
+      const std::string& origin_str);
+
   const LocalSiteCharacteristicsMap& origin_data_map_for_testing() const {
     return origin_data_map_;
   }
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc
index 8964e455..3208479 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc
@@ -40,20 +40,19 @@
 
 TEST_F(LocalSiteCharacteristicsDataStoreTest, EndToEnd) {
   auto reader = data_store_.GetReaderForOrigin(kTestOrigin);
-  EXPECT_NE(nullptr, reader.get());
-  EXPECT_EQ(1U, data_store_.origin_data_map_for_testing().size());
+  EXPECT_TRUE(reader);
+  auto writer = data_store_.GetWriterForOrigin(kTestOrigin);
+  EXPECT_TRUE(writer);
 
-  internal::LocalSiteCharacteristicsDataImpl* data =
-      data_store_.origin_data_map_for_testing().find(kTestOrigin)->second;
-  EXPECT_NE(nullptr, data);
+  EXPECT_EQ(1U, data_store_.origin_data_map_for_testing().size());
 
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
             reader->UpdatesTitleInBackground());
-  data->NotifySiteLoaded();
-  data->NotifyUpdatesTitleInBackground();
+  writer->NotifySiteLoaded();
+  writer->NotifyUpdatesTitleInBackground();
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
             reader->UpdatesTitleInBackground());
-  data->NotifySiteUnloaded();
+  writer->NotifySiteUnloaded();
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
             reader->UpdatesTitleInBackground());
 
@@ -66,6 +65,7 @@
   reader_copy.reset();
 
   reader.reset();
+  writer.reset();
   EXPECT_TRUE(data_store_.origin_data_map_for_testing().empty());
 
   data_store_.OnURLsDeleted(nullptr, history::DeletionTimeRange::AllTime(),
@@ -78,6 +78,9 @@
   const std::string kOrigin1Url = GURL(kTestOrigin).GetOrigin().GetContent();
   auto reader = data_store_.GetReaderForOrigin(kOrigin1Url);
   EXPECT_TRUE(reader);
+  auto writer = data_store_.GetWriterForOrigin(kOrigin1Url);
+  EXPECT_TRUE(writer);
+
   internal::LocalSiteCharacteristicsDataImpl* data =
       data_store_.origin_data_map_for_testing().find(kOrigin1Url)->second;
   EXPECT_NE(nullptr, data);
@@ -86,9 +89,9 @@
 
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
             reader->UpdatesTitleInBackground());
-  data->NotifySiteLoaded();
+  writer->NotifySiteLoaded();
   base::TimeDelta last_loaded_time = data->last_loaded_time_for_testing();
-  data->NotifyUpdatesTitleInBackground();
+  writer->NotifyUpdatesTitleInBackground();
   EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
             reader->UpdatesTitleInBackground());
   test_clock_.Advance(kDelay);
@@ -97,11 +100,13 @@
   const std::string kOrigin2Url = GURL(kTestOrigin2).GetOrigin().GetContent();
   auto reader2 = data_store_.GetReaderForOrigin(kOrigin2Url);
   EXPECT_TRUE(reader2);
+  auto writer2 = data_store_.GetWriterForOrigin(kOrigin2Url);
+  EXPECT_TRUE(writer2);
   internal::LocalSiteCharacteristicsDataImpl* data2 =
       data_store_.origin_data_map_for_testing().find(kOrigin2Url)->second;
   EXPECT_NE(nullptr, data2);
-  data2->NotifySiteLoaded();
-  data2->NotifyUpdatesFaviconInBackground();
+  writer2->NotifySiteLoaded();
+  writer2->NotifyUpdatesFaviconInBackground();
 
   // This site hasn'be been unloaded yet, so the last loaded time shouldn't have
   // changed.
@@ -138,8 +143,8 @@
   EXPECT_EQ(data2->last_loaded_time_for_testing(),
             test_clock_.NowTicks() - base::TimeTicks::UnixEpoch());
 
-  data->NotifySiteUnloaded();
-  data2->NotifySiteUnloaded();
+  writer->NotifySiteUnloaded();
+  writer2->NotifySiteUnloaded();
 }
 
 }  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc
new file mode 100644
index 0000000..49b00fa
--- /dev/null
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h"
+
+#include "chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h"
+
+namespace resource_coordinator {
+
+LocalSiteCharacteristicsDataWriter::~LocalSiteCharacteristicsDataWriter() =
+    default;
+
+void LocalSiteCharacteristicsDataWriter::NotifySiteLoaded() {
+  impl_->NotifySiteLoaded();
+}
+
+void LocalSiteCharacteristicsDataWriter::NotifySiteUnloaded() {
+  impl_->NotifySiteUnloaded();
+}
+
+void LocalSiteCharacteristicsDataWriter::NotifyUpdatesFaviconInBackground() {
+  impl_->NotifyUpdatesFaviconInBackground();
+}
+
+void LocalSiteCharacteristicsDataWriter::NotifyUpdatesTitleInBackground() {
+  impl_->NotifyUpdatesTitleInBackground();
+}
+
+void LocalSiteCharacteristicsDataWriter::NotifyUsesAudioInBackground() {
+  impl_->NotifyUsesAudioInBackground();
+}
+
+void LocalSiteCharacteristicsDataWriter::NotifyUsesNotificationsInBackground() {
+  impl_->NotifyUsesNotificationsInBackground();
+}
+
+LocalSiteCharacteristicsDataWriter::LocalSiteCharacteristicsDataWriter(
+    scoped_refptr<internal::LocalSiteCharacteristicsDataImpl> impl)
+    : impl_(std::move(impl)) {}
+
+}  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h
new file mode 100644
index 0000000..b149aa9
--- /dev/null
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h
@@ -0,0 +1,51 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_RESOURCE_COORDINATOR_LOCAL_SITE_CHARACTERISTICS_DATA_WRITER_H_
+#define CHROME_BROWSER_RESOURCE_COORDINATOR_LOCAL_SITE_CHARACTERISTICS_DATA_WRITER_H_
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+
+namespace resource_coordinator {
+
+namespace internal {
+class LocalSiteCharacteristicsDataImpl;
+}  // namespace internal
+
+// Used to record local characteristics usage observations in the local
+// database.
+class LocalSiteCharacteristicsDataWriter {
+ public:
+  ~LocalSiteCharacteristicsDataWriter();
+
+  // Records tab load/unload events.
+  void NotifySiteLoaded();
+  void NotifySiteUnloaded();
+
+  // Records feature usage.
+  void NotifyUpdatesFaviconInBackground();
+  void NotifyUpdatesTitleInBackground();
+  void NotifyUsesAudioInBackground();
+  void NotifyUsesNotificationsInBackground();
+
+ private:
+  friend class LocalSiteCharacteristicsDataWriterTest;
+  friend class LocalSiteCharacteristicsDataStoreTest;
+  friend class LocalSiteCharacteristicsDataStore;
+
+  // Private constructor, these objects are meant to be created by a site
+  // characteristics data store.
+  explicit LocalSiteCharacteristicsDataWriter(
+      scoped_refptr<internal::LocalSiteCharacteristicsDataImpl> impl);
+
+  // The LocalSiteCharacteristicDataInternal object we delegate to.
+  const scoped_refptr<internal::LocalSiteCharacteristicsDataImpl> impl_;
+
+  DISALLOW_COPY_AND_ASSIGN(LocalSiteCharacteristicsDataWriter);
+};
+
+}  // namespace resource_coordinator
+
+#endif  // CHROME_BROWSER_RESOURCE_COORDINATOR_LOCAL_SITE_CHARACTERISTICS_DATA_WRITER_H_
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer_unittest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer_unittest.cc
new file mode 100644
index 0000000..659030b
--- /dev/null
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer_unittest.cc
@@ -0,0 +1,114 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/resource_coordinator/local_site_characteristics_data_writer.h"
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h"
+#include "chrome/browser/resource_coordinator/local_site_characteristics_data_unittest_utils.h"
+#include "chrome/browser/resource_coordinator/local_site_characteristics_feature_usage.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace resource_coordinator {
+
+class LocalSiteCharacteristicsDataWriterTest : public ::testing::Test {
+ protected:
+  // The constructors needs to call 'new' directly rather than using the
+  // base::MakeRefCounted helper function because the constructor of
+  // LocalSiteCharacteristicsDataImpl is protected and not visible to
+  // base::MakeRefCounted.
+  LocalSiteCharacteristicsDataWriterTest()
+      : test_impl_(base::WrapRefCounted(
+            new internal::LocalSiteCharacteristicsDataImpl("foo.com",
+                                                           &delegate_))) {
+    LocalSiteCharacteristicsDataWriter* writer =
+        new LocalSiteCharacteristicsDataWriter(test_impl_.get());
+    writer_ = base::WrapUnique(writer);
+  }
+
+  ~LocalSiteCharacteristicsDataWriterTest() override = default;
+
+  // The mock delegate used by the LocalSiteCharacteristicsDataImpl objects
+  // created by this class, NiceMock is used to avoid having to set
+  // expectations in test cases that don't care about this.
+  ::testing::NiceMock<
+      testing::MockLocalSiteCharacteristicsDataImplOnDestroyDelegate>
+      delegate_;
+
+  // The LocalSiteCharacteristicsDataImpl object used in these tests.
+  scoped_refptr<internal::LocalSiteCharacteristicsDataImpl> test_impl_;
+
+  // A LocalSiteCharacteristicsDataWriter object associated with the origin used
+  // to create this object.
+  std::unique_ptr<LocalSiteCharacteristicsDataWriter> writer_;
+
+  bool TabIsLoaded() { return test_impl_->IsLoaded(); }
+
+  DISALLOW_COPY_AND_ASSIGN(LocalSiteCharacteristicsDataWriterTest);
+};
+
+TEST_F(LocalSiteCharacteristicsDataWriterTest, TestModifiers) {
+  // Make sure that we initially have no information about any of the features
+  // and that the site is in an unloaded state.
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UpdatesFaviconInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UpdatesTitleInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UsesAudioInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UsesNotificationsInBackground());
+
+  // Test the OnTabLoaded function.
+  EXPECT_FALSE(TabIsLoaded());
+  writer_->NotifySiteLoaded();
+  EXPECT_TRUE(TabIsLoaded());
+
+  // Test all the modifiers.
+
+  writer_->NotifyUpdatesFaviconInBackground();
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UpdatesFaviconInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UpdatesTitleInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UsesAudioInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UsesNotificationsInBackground());
+
+  writer_->NotifyUpdatesTitleInBackground();
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UpdatesFaviconInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UpdatesTitleInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UsesAudioInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UsesNotificationsInBackground());
+
+  writer_->NotifyUsesAudioInBackground();
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UpdatesFaviconInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UpdatesTitleInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UsesAudioInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown,
+            test_impl_->UsesNotificationsInBackground());
+
+  writer_->NotifyUsesNotificationsInBackground();
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UpdatesFaviconInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UpdatesTitleInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UsesAudioInBackground());
+  EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse,
+            test_impl_->UsesNotificationsInBackground());
+
+  writer_->NotifySiteUnloaded();
+}
+
+}  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe.cc b/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe.cc
index 53eafce1..fd7b17dc 100644
--- a/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe.cc
+++ b/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe.cc
@@ -7,7 +7,6 @@
 #include <vector>
 
 #include "base/bind.h"
-#include "base/values.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
@@ -27,9 +26,6 @@
 constexpr base::TimeDelta kDefaultMeasurementInterval =
     base::TimeDelta::FromMinutes(10);
 
-base::LazyInstance<ResourceCoordinatorRenderProcessProbe>::DestructorAtExit
-    g_probe = LAZY_INSTANCE_INITIALIZER;
-
 }  // namespace
 
 ResourceCoordinatorRenderProcessProbe::RenderProcessInfo::RenderProcessInfo() =
@@ -49,7 +45,8 @@
 // static
 ResourceCoordinatorRenderProcessProbe*
 ResourceCoordinatorRenderProcessProbe::GetInstance() {
-  return g_probe.Pointer();
+  static base::NoDestructor<ResourceCoordinatorRenderProcessProbe> probe;
+  return probe.get();
 }
 
 // static
@@ -132,16 +129,24 @@
 
   content::BrowserThread::PostTask(
       content::BrowserThread::IO, FROM_HERE,
-      base::BindOnce(&ResourceCoordinatorRenderProcessProbe::
-                         CollectAndDispatchRenderProcessMetricsOnIOThread,
-                     base::Unretained(this)));
+      base::BindOnce(
+          &ResourceCoordinatorRenderProcessProbe::
+              CollectRenderProcessMetricsAndStartMemoryDumpOnIOThread,
+          base::Unretained(this)));
 }
 
 void ResourceCoordinatorRenderProcessProbe::
-    CollectAndDispatchRenderProcessMetricsOnIOThread() {
+    CollectRenderProcessMetricsAndStartMemoryDumpOnIOThread() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
   DCHECK(is_gathering_);
 
+  // Dispatch the memory collection request.
+  memory_instrumentation::MemoryInstrumentation::GetInstance()
+      ->RequestGlobalDump(
+          base::BindRepeating(&ResourceCoordinatorRenderProcessProbe::
+                                  ProcessGlobalMemoryDumpAndDispatchOnIOThread,
+                              base::Unretained(this)));
+
   RenderProcessInfoMap::iterator iter = render_process_info_map_.begin();
   while (iter != render_process_info_map_.end()) {
     auto& render_process_info = iter->second;
@@ -157,12 +162,21 @@
       continue;
     }
   }
+}
 
+void ResourceCoordinatorRenderProcessProbe::
+    ProcessGlobalMemoryDumpAndDispatchOnIOThread(
+        bool global_success,
+        std::unique_ptr<memory_instrumentation::GlobalMemoryDump> dump) {
   // Create the measurement batch.
   mojom::ProcessResourceMeasurementBatchPtr batch =
       mojom::ProcessResourceMeasurementBatch::New();
 
-  for (auto& render_process_info_map_entry : render_process_info_map_) {
+  // TODO(siggi): Add start/end times. This will need some support from
+  //     the memory_instrumentation code.
+
+  // Start by adding the render process hosts we know about to the batch.
+  for (const auto& render_process_info_map_entry : render_process_info_map_) {
     auto& render_process_info = render_process_info_map_entry.second;
     // TODO(oysteine): Move the multiplier used to avoid precision loss
     // into a shared location, when this property gets used.
@@ -171,13 +185,35 @@
 
     measurement->pid = render_process_info.process.Pid();
     measurement->cpu_usage = render_process_info.cpu_usage;
-    // TODO(siggi): Add the private footprint.
 
     batch->measurements.push_back(std::move(measurement));
   }
 
-  bool should_restart = DispatchMetrics(std::move(batch));
+  if (dump) {
+    // Then amend the ones we have memory metrics for with their private
+    // footprint. The global dump may contain non-renderer processes, it may
+    // contain renderer processes we didn't capture at the start of the cycle,
+    // and it may not contain all the renderer processes we know about.
+    // This may happen due to the inherent race between the request and
+    // starting/stopping renderers, or because of other failures
+    // This may therefore provide incomplete information.
+    for (const auto& dump_entry : dump->process_dumps()) {
+      base::ProcessId pid = dump_entry.pid();
 
+      for (const auto& measurement : batch->measurements) {
+        if (measurement->pid == pid) {
+          measurement->private_footprint_kb =
+              dump_entry.os_dump().private_footprint_kb;
+          break;
+        }
+      }
+    }
+  } else {
+    // We should only get a nullptr in case of failure.
+    DCHECK(!global_success);
+  }
+
+  bool should_restart = DispatchMetrics(std::move(batch));
   content::BrowserThread::PostTask(
       content::BrowserThread::UI, FROM_HERE,
       base::BindOnce(
diff --git a/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe.h b/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe.h
index 7849d48..057ec82 100644
--- a/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe.h
+++ b/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe.h
@@ -9,11 +9,12 @@
 #include <memory>
 #include <utility>
 
-#include "base/lazy_instance.h"
 #include "base/macros.h"
+#include "base/no_destructor.h"
 #include "base/process/process.h"
 #include "base/process/process_metrics.h"
 #include "base/timer/timer.h"
+#include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
 #include "services/resource_coordinator/public/cpp/system_resource_coordinator.h"
 
 namespace resource_coordinator {
@@ -41,6 +42,7 @@
   void StartSingleGather();
 
  protected:
+  // Internal state protected for testing.
   struct RenderProcessInfo {
     RenderProcessInfo();
     ~RenderProcessInfo();
@@ -51,9 +53,7 @@
   };
   using RenderProcessInfoMap = std::map<int, RenderProcessInfo>;
 
-  // Internal state protected for testing.
-  friend struct base::LazyInstanceTraitsBase<
-      ResourceCoordinatorRenderProcessProbe>;
+  friend class base::NoDestructor<ResourceCoordinatorRenderProcessProbe>;
 
   ResourceCoordinatorRenderProcessProbe();
   virtual ~ResourceCoordinatorRenderProcessProbe();
@@ -61,10 +61,13 @@
   // (1) Identify all of the render processes that are active to measure.
   // Child render processes can only be discovered in the browser's UI thread.
   void RegisterAliveRenderProcessesOnUIThread();
-  // (2) Collect and dispatch the render process metrics to the system
-  // coordination unit.
-  void CollectAndDispatchRenderProcessMetricsOnIOThread();
-  // (3) Initiate the next render process metrics collection cycle if the
+  // (2) Collect the render process CPU metrics and initiate a memory dump.
+  void CollectRenderProcessMetricsAndStartMemoryDumpOnIOThread();
+  // (3) Process the results of the memory dump and dispatch the results.
+  void ProcessGlobalMemoryDumpAndDispatchOnIOThread(
+      bool success,
+      std::unique_ptr<memory_instrumentation::GlobalMemoryDump> dump);
+  // (4) Initiate the next render process metrics collection cycle if the
   // cycle has been started and |restart_cycle| is true, which consists of a
   // delayed call to perform (1) via a timer.
   // Virtual for testing.
diff --git a/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe_browsertest.cc b/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe_browsertest.cc
index 80d9718..4e7a783 100644
--- a/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe_browsertest.cc
+++ b/chrome/browser/resource_coordinator/resource_coordinator_render_process_probe_browsertest.cc
@@ -135,8 +135,10 @@
   EXPECT_EQ(initial_size, probe.last_measurement_batch()->measurements.size());
   // A quirk of the process_metrics implementation is that the first CPU
   // measurement returns zero.
-  for (const auto& measurement : probe.last_measurement_batch()->measurements)
+  for (const auto& measurement : probe.last_measurement_batch()->measurements) {
     EXPECT_EQ(0.0, measurement->cpu_usage);
+    EXPECT_NE(0u, measurement->private_footprint_kb);
+  }
 
   // Open a second tab and complete a navigation.
   ui_test_utils::NavigateToURLWithDisposition(
@@ -164,8 +166,10 @@
   size_t info_map_size = info_map.size();
   probe.StartGatherCycleAndWait();
   // The second and subsequent CPU measurements should return some data.
-  for (const auto& measurement : probe.last_measurement_batch()->measurements)
+  for (const auto& measurement : probe.last_measurement_batch()->measurements) {
     EXPECT_LE(0.0, measurement->cpu_usage);
+    EXPECT_NE(0u, measurement->private_footprint_kb);
+  }
 
   EXPECT_EQ(info_map_size, info_map.size());
   for (const auto& entry : probe.render_process_info_map()) {
diff --git a/chrome/browser/resources/chromeos/keyboard_overlay.js b/chrome/browser/resources/chromeos/keyboard_overlay.js
index 8391478..51f97ec6 100644
--- a/chrome/browser/resources/chromeos/keyboard_overlay.js
+++ b/chrome/browser/resources/chromeos/keyboard_overlay.js
@@ -611,8 +611,7 @@
       continue;
     }
 
-    // Currently hidden behind experimental accessibility features flag. The
-    // accelerator is not yet approved and a placeholder.
+    // Currently hidden behind experimental accessibility features flag.
     if (shortcutId == 'keyboardOverlayToggleDictation')
       continue;
 
diff --git a/chrome/browser/resources/chromeos/keyboard_overlay_data.js b/chrome/browser/resources/chromeos/keyboard_overlay_data.js
index 7c658034..4024ecd 100644
--- a/chrome/browser/resources/chromeos/keyboard_overlay_data.js
+++ b/chrome/browser/resources/chromeos/keyboard_overlay_data.js
@@ -4180,6 +4180,7 @@
     'd<>CTRL': 'keyboardOverlayBookmarkCurrentPage',
     'd<>CTRL<>SEARCH': 'keyboardOverlayToggleDockedMagnifier',
     'd<>CTRL<>SHIFT': 'keyboardOverlayBookmarkAllTabs',
+    'd<>SEARCH': 'keyboardOverlayToggleDictation',
     'down<>ALT': 'keyboardOverlayPageDown',
     'down<>ALT<>CTRL': 'keyboardOverlayEnd',
     'down<>SEARCH': 'keyboardOverlayPageDown',
@@ -4296,6 +4297,5 @@
     'z<>ALT<>CTRL': 'keyboardOverlayToggleChromevoxSpokenFeedback',
     'z<>CTRL': 'keyboardOverlayUndo',
     'a<>SEARCH': 'keyboardOverlayVoiceInteraction',
-    's<>SEARCH<>SHIFT': 'keyboardOverlayToggleDictation'
   }
 };
diff --git a/chrome/browser/safe_xml_parser_browsertest.cc b/chrome/browser/safe_xml_parser_browsertest.cc
index b14abec..7572320 100644
--- a/chrome/browser/safe_xml_parser_browsertest.cc
+++ b/chrome/browser/safe_xml_parser_browsertest.cc
@@ -73,7 +73,7 @@
                       std::unique_ptr<base::Value> expected_value,
                       std::unique_ptr<base::Value> actual_value,
                       const base::Optional<std::string>& error) {
-    base::ScopedClosureRunner(std::move(quit_loop_closure));
+    base::ScopedClosureRunner runner(std::move(quit_loop_closure));
     if (!expected_value) {
       EXPECT_FALSE(actual_value);
       EXPECT_TRUE(error);
diff --git a/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc b/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc
index 03eff06..a42d3c3 100644
--- a/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc
+++ b/chrome/browser/ui/ash/ksv/keyboard_shortcut_viewer_metadata_unittest.cc
@@ -22,7 +22,7 @@
 // The total number of Ash accelerators.
 constexpr int kAshAcceleratorsTotalNum = 100;
 // The hash of Ash accelerators.
-constexpr char kAshAcceleratorsHash[] = "10386e18df70fa4704da5b451ea5f50d";
+constexpr char kAshAcceleratorsHash[] = "4232f3c0c55cc5e487c820b1c2813dcc";
 #if defined(GOOGLE_CHROME_BUILD)
 // Internal builds add an extra accelerator for the Feedback app.
 // The total number of Chrome accelerators (available on Chrome OS).
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 93a6657e..4b44f0b 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -219,8 +219,7 @@
   switch (disposition) {
     case WindowOpenDisposition::NEW_FOREGROUND_TAB:
     case WindowOpenDisposition::NEW_BACKGROUND_TAB: {
-      std::unique_ptr<WebContents> new_tab =
-          base::WrapUnique(current_tab->Clone());
+      std::unique_ptr<WebContents> new_tab = current_tab->Clone();
       WebContents* raw_new_tab = new_tab.get();
       if (disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB)
         new_tab->WasHidden();
@@ -232,8 +231,7 @@
       return raw_new_tab;
     }
     case WindowOpenDisposition::NEW_WINDOW: {
-      std::unique_ptr<WebContents> new_tab =
-          base::WrapUnique(current_tab->Clone());
+      std::unique_ptr<WebContents> new_tab = current_tab->Clone();
       WebContents* raw_new_tab = new_tab.get();
       Browser* new_browser =
           new Browser(Browser::CreateParams(browser->profile(), true));
@@ -670,8 +668,7 @@
 WebContents* DuplicateTabAt(Browser* browser, int index) {
   WebContents* contents = browser->tab_strip_model()->GetWebContentsAt(index);
   CHECK(contents);
-  std::unique_ptr<WebContents> contents_dupe =
-      base::WrapUnique(contents->Clone());
+  std::unique_ptr<WebContents> contents_dupe = contents->Clone();
   WebContents* raw_contents_dupe = contents_dupe.get();
 
   bool pinned = false;
diff --git a/chrome/browser/ui/cocoa/framed_browser_window.mm b/chrome/browser/ui/cocoa/framed_browser_window.mm
index c564b79..d3b279f 100644
--- a/chrome/browser/ui/cocoa/framed_browser_window.mm
+++ b/chrome/browser/ui/cocoa/framed_browser_window.mm
@@ -27,10 +27,6 @@
 #import "ui/base/cocoa/nsview_additions.h"
 #import "ui/base/cocoa/touch_bar_forward_declarations.h"
 
-@interface FramedBrowserWindow ()
-- (void)childWindowsDidChange;
-@end
-
 @implementation FramedBrowserWindow
 
 + (CGFloat)browserFrameViewPaintHeight {
@@ -212,21 +208,4 @@
     return [NSColor windowFrameTextColor];
 }
 
-- (void)addChildWindow:(NSWindow*)childWindow
-               ordered:(NSWindowOrderingMode)orderingMode {
-  [super addChildWindow:childWindow ordered:orderingMode];
-  [self childWindowsDidChange];
-}
-
-- (void)removeChildWindow:(NSWindow*)childWindow {
-  [super removeChildWindow:childWindow];
-  [self childWindowsDidChange];
-}
-
-- (void)childWindowsDidChange {
-  id delegate = [self delegate];
-  if ([delegate respondsToSelector:@selector(childWindowsDidChange)])
-    [delegate childWindowsDidChange];
-}
-
 @end
diff --git a/chrome/browser/ui/cocoa/hover_close_button.mm b/chrome/browser/ui/cocoa/hover_close_button.mm
index e442c62..dc63099 100644
--- a/chrome/browser/ui/cocoa/hover_close_button.mm
+++ b/chrome/browser/ui/cocoa/hover_close_button.mm
@@ -172,8 +172,9 @@
       break;
   }
 
-  const gfx::ImageSkia& iconImage = gfx::CreateVectorIcon(
-      kTabCloseNormalIcon, kTabCloseButtonSize, iconColor_);
+  const gfx::ImageSkia& iconImage =
+      gfx::CreateVectorIcon(kTabCloseNormalIcon, kTabCloseButtonSize,
+                            vectorHighlightIcon ? SK_ColorWHITE : iconColor_);
 
   if (vectorHighlightIcon) {
     const gfx::ImageSkia& highlight = gfx::CreateVectorIcon(
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc
index a3809f89..4f8dc21 100644
--- a/chrome/browser/ui/startup/startup_browser_creator.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -759,7 +759,6 @@
   // On Windows, when chrome is launched by notification activation where the
   // kNotificationLaunchId switch is used, always use |last_used_profile| which
   // contains the profile id extracted from the notification launch id.
-  // TODO(chengx): Investigate adding a test for this startup behavior.
   bool was_windows_notification_launch = false;
 #if defined(OS_WIN)
   was_windows_notification_launch =
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
index c330bc8..87c14a4 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -468,11 +468,6 @@
 
 #if defined(OS_WIN)
 IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, ValidNotificationLaunchId) {
-  // This test execises NotificationPlatformBridgeWin, which is not enabled in
-  // older versions of Windows.
-  if (base::win::GetVersion() < base::win::VERSION_WIN8)
-    return;
-
   // Simulate a launch from the notification_helper process which appends the
   // kNotificationLaunchId switch to the command line.
   base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
@@ -491,11 +486,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest, InvalidNotificationLaunchId) {
-  // This test execises NotificationPlatformBridgeWin, which is not enabled in
-  // older versions of Windows.
-  if (base::win::GetVersion() < base::win::VERSION_WIN8)
-    return;
-
   // Simulate a launch with invalid launch id, which will fail.
   base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
   command_line.AppendSwitchNative(switches::kNotificationLaunchId, L"");
@@ -508,6 +498,48 @@
   // No new browser window is open.
   ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile()));
 }
+
+IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
+                       NotificationLaunchIdDisablesLastOpenProfiles) {
+  Profile* default_profile = browser()->profile();
+
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  // Create another profile.
+  base::FilePath dest_path = profile_manager->user_data_dir();
+  dest_path = dest_path.Append(FILE_PATH_LITERAL("New Profile 1"));
+
+  Profile* other_profile = nullptr;
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    other_profile = profile_manager->GetProfile(dest_path);
+  }
+  ASSERT_TRUE(other_profile);
+
+  // Close the browser.
+  CloseBrowserAsynchronously(browser());
+
+  // Simulate a launch.
+  base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+  command_line.AppendSwitchNative(
+      switches::kNotificationLaunchId,
+      L"1|1|0|Default|0|https://example.com/|notification_id");
+
+  std::vector<Profile*> last_opened_profiles;
+  last_opened_profiles.push_back(other_profile);
+
+  StartupBrowserCreator browser_creator;
+  browser_creator.Start(command_line, profile_manager->user_data_dir(),
+                        default_profile, last_opened_profiles);
+
+  // |browser()| is still around at this point, even though we've closed its
+  // window. Thus the browser count for default_profile is 1.
+  ASSERT_EQ(1u, chrome::GetBrowserCount(default_profile));
+
+  // When the kNotificationLaunchId switch is present, any last opened profile
+  // is ignored. Thus there is no browser for other_profile.
+  ASSERT_EQ(0u, chrome::GetBrowserCount(other_profile));
+}
+
 #endif  // defined(OS_WIN)
 
 IN_PROC_BROWSER_TEST_F(StartupBrowserCreatorTest,
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc
index 8cfcf7d..b02fb9c 100644
--- a/chrome/browser/ui/views/frame/browser_frame.cc
+++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -61,13 +61,6 @@
 BrowserFrame::~BrowserFrame() {
 }
 
-// static
-const gfx::FontList& BrowserFrame::GetTitleFontList() {
-  static const gfx::FontList* title_font_list = new gfx::FontList();
-  ANNOTATE_LEAKING_OBJECT_PTR(title_font_list);
-  return *title_font_list;
-}
-
 void BrowserFrame::InitBrowserFrame() {
   native_browser_frame_ =
       NativeBrowserFrameFactory::CreateNativeBrowserFrame(this, browser_view_);
diff --git a/chrome/browser/ui/views/frame/browser_frame.h b/chrome/browser/ui/views/frame/browser_frame.h
index 401330eda..5ec2824 100644
--- a/chrome/browser/ui/views/frame/browser_frame.h
+++ b/chrome/browser/ui/views/frame/browser_frame.h
@@ -24,7 +24,6 @@
 }
 
 namespace gfx {
-class FontList;
 class Rect;
 }
 
@@ -47,8 +46,6 @@
   explicit BrowserFrame(BrowserView* browser_view);
   ~BrowserFrame() override;
 
-  static const gfx::FontList& GetTitleFontList();
-
   // Initialize the frame (creates the underlying native window).
   void InitBrowserFrame();
 
diff --git a/chrome/browser/ui/views/frame/browser_frame_header_ash.cc b/chrome/browser/ui/views/frame/browser_frame_header_ash.cc
index e4ec9fc7..933f6846 100644
--- a/chrome/browser/ui/views/frame/browser_frame_header_ash.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_header_ash.cc
@@ -10,28 +10,21 @@
 #include "ash/frame/frame_header_util.h"
 #include "ash/public/cpp/vector_icons/vector_icons.h"
 #include "base/logging.h"
-#include "chrome/browser/themes/theme_properties.h"
-#include "chrome/browser/ui/ash/tablet_mode_client.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/views/frame/browser_frame.h"
-#include "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h"
-#include "chrome/browser/ui/views/frame/browser_view.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkPaint.h"
 #include "third_party/skia/include/core/SkPath.h"
-#include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/canvas.h"
+#include "ui/gfx/font_list.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/scoped_canvas.h"
 #include "ui/gfx/skia_util.h"
 #include "ui/views/view.h"
+#include "ui/views/widget/native_widget_aura.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_delegate.h"
 
-using views::Widget;
-
 namespace {
 
 // Color for the window title text.
@@ -109,46 +102,29 @@
 ///////////////////////////////////////////////////////////////////////////////
 // BrowserFrameHeaderAsh, public:
 
-BrowserFrameHeaderAsh::BrowserFrameHeaderAsh()
-    : frame_(nullptr),
-      is_tabbed_(false),
-      is_incognito_(false),
-      view_(nullptr),
-      window_icon_(nullptr),
-      caption_button_container_(nullptr),
-      painted_height_(0),
-      initial_paint_(true),
-      mode_(MODE_INACTIVE),
-      activation_animation_(new gfx::SlideAnimation(this)) {}
+BrowserFrameHeaderAsh::BrowserFrameHeaderAsh() = default;
 
-BrowserFrameHeaderAsh::~BrowserFrameHeaderAsh() {}
+BrowserFrameHeaderAsh::~BrowserFrameHeaderAsh() = default;
 
 void BrowserFrameHeaderAsh::Init(
-    views::Widget* frame,
-    BrowserView* browser_view,
-    BrowserNonClientFrameViewAsh* header_view,
+    views::View* view,
+    AppearanceProvider* appearance_provider,
+    bool incognito,
     views::View* window_icon,
     ash::FrameCaptionButtonContainerView* caption_button_container,
     ash::FrameCaptionButton* back_button) {
-  DCHECK(frame);
-  DCHECK(browser_view);
-  DCHECK(header_view);
+  DCHECK(view);
+  DCHECK(appearance_provider);
   // window_icon may be null.
   DCHECK(caption_button_container);
-  frame_ = frame;
+  // back_button may be null.
 
-  is_tabbed_ = browser_view->browser()->is_type_tabbed();
-  is_incognito_ = !browser_view->IsRegularOrGuestSession();
-
-  view_ = header_view;
+  view_ = view;
+  appearance_provider_ = appearance_provider;
+  is_incognito_ = incognito;
   window_icon_ = window_icon;
-  SkColor frame_color = view_->GetFrameColor(true);
   caption_button_container_ = caption_button_container;
-  caption_button_container_->SetBackgroundColor(frame_color);
-
   back_button_ = back_button;
-  if (back_button_)
-    back_button_->set_background_color(frame_color);
 }
 
 int BrowserFrameHeaderAsh::GetMinimumHeaderWidth() const {
@@ -163,17 +139,18 @@
   mode_ = mode;
 
   if (mode_ != old_mode) {
-    if (!initial_paint_ && ash::FrameHeaderUtil::CanAnimateActivation(frame_)) {
-      activation_animation_->SetSlideDuration(kActivationCrossfadeDurationMs);
+    if (!initial_paint_ &&
+        ash::FrameHeaderUtil::CanAnimateActivation(GetWidget())) {
+      activation_animation_.SetSlideDuration(kActivationCrossfadeDurationMs);
       if (mode_ == MODE_ACTIVE)
-        activation_animation_->Show();
+        activation_animation_.Show();
       else
-        activation_animation_->Hide();
+        activation_animation_.Hide();
     } else {
       if (mode_ == MODE_ACTIVE)
-        activation_animation_->Reset(1);
+        activation_animation_.Reset(1);
       else
-        activation_animation_->Reset(0);
+        activation_animation_.Reset(0);
     }
     initial_paint_ = false;
   }
@@ -181,8 +158,8 @@
   PaintFrameImages(canvas, false);
   PaintFrameImages(canvas, true);
 
-  if (frame_->widget_delegate() &&
-      frame_->widget_delegate()->ShouldShowWindowTitle()) {
+  if (GetWidget()->widget_delegate() &&
+      GetWidget()->widget_delegate()->ShouldShowWindowTitle()) {
     PaintTitleBar(canvas);
   }
 }
@@ -212,12 +189,13 @@
 }
 
 void BrowserFrameHeaderAsh::SetPaintAsActive(bool paint_as_active) {
-  SkColor frame_color = view_->GetFrameColor(paint_as_active);
+  SkColor frame_color =
+      appearance_provider_->GetFrameHeaderColor(paint_as_active);
   caption_button_container_->SetPaintAsActive(paint_as_active);
   caption_button_container_->SetBackgroundColor(frame_color);
   if (back_button_) {
     back_button_->set_paint_as_active(paint_as_active);
-    back_button_->set_background_color(frame_color);
+    back_button_->SetBackgroundColor(frame_color);
   }
 }
 
@@ -263,19 +241,22 @@
 }
 
 void BrowserFrameHeaderAsh::PaintFrameImages(gfx::Canvas* canvas, bool active) {
-  int alpha = activation_animation_->CurrentValueBetween(0, 0xFF);
+  int alpha = activation_animation_.CurrentValueBetween(0, 0xFF);
   if (!active)
     alpha = 0xFF - alpha;
 
   if (alpha == 0)
     return;
 
-  gfx::ImageSkia frame_image = view_->GetFrameImage(active);
-  gfx::ImageSkia frame_overlay_image = view_->GetFrameOverlayImage(active);
-  SkColor background_color = SkColorSetA(view_->GetFrameColor(active), alpha);
+  gfx::ImageSkia frame_image =
+      appearance_provider_->GetFrameHeaderImage(active);
+  gfx::ImageSkia frame_overlay_image =
+      appearance_provider_->GetFrameHeaderOverlayImage(active);
+  SkColor background_color =
+      SkColorSetA(appearance_provider_->GetFrameHeaderColor(active), alpha);
 
   int corner_radius = 0;
-  if (!frame_->IsMaximized() && !frame_->IsFullscreen())
+  if (!GetWidget()->IsMaximized() && !GetWidget()->IsFullscreen())
     corner_radius = ash::FrameHeaderUtil::GetTopCornerRadiusWhenRestored();
 
   PaintFrameImagesInRoundRect(canvas, frame_image, frame_overlay_image, alpha,
@@ -286,18 +267,19 @@
 
 void BrowserFrameHeaderAsh::PaintTitleBar(gfx::Canvas* canvas) {
   // The window icon is painted by its own views::View.
-  canvas->DrawStringRectWithFlags(frame_->widget_delegate()->GetWindowTitle(),
-                                  BrowserFrame::GetTitleFontList(),
-                                  is_incognito_ ? kIncognitoWindowTitleTextColor
-                                                : kNormalWindowTitleTextColor,
-                                  view_->GetMirroredRect(GetTitleBounds()),
-                                  gfx::Canvas::NO_SUBPIXEL_RENDERING);
+  canvas->DrawStringRectWithFlags(
+      GetWidget()->widget_delegate()->GetWindowTitle(),
+      views::NativeWidgetAura::GetWindowTitleFontList(),
+      is_incognito_ ? kIncognitoWindowTitleTextColor
+                    : kNormalWindowTitleTextColor,
+      view_->GetMirroredRect(GetTitleBounds()),
+      gfx::Canvas::NO_SUBPIXEL_RENDERING);
 }
 
 void BrowserFrameHeaderAsh::UpdateCaptionButtons() {
   // When |frame_| minimized, avoid tablet mode toggling to update caption
   // buttons as it would cause mismatch beteen window state and size button.
-  if (frame_->IsMinimized())
+  if (GetWidget()->IsMinimized())
     return;
   caption_button_container_->SetButtonImage(ash::CAPTION_BUTTON_ICON_MINIMIZE,
                                             ash::kWindowControlMinimizeIcon);
@@ -310,12 +292,10 @@
       ash::CAPTION_BUTTON_ICON_RIGHT_SNAPPED,
       ash::kWindowControlRightSnappedIcon);
 
-  const bool is_in_tablet_mode =
-      TabletModeClient::Get() && TabletModeClient::Get()->tablet_mode_enabled();
   const bool is_maximized_or_fullscreen =
-      frame_->IsMaximized() || frame_->IsFullscreen();
+      GetWidget()->IsMaximized() || GetWidget()->IsFullscreen();
   const AshLayoutSize button_size_type =
-      is_maximized_or_fullscreen || is_in_tablet_mode
+      is_maximized_or_fullscreen || appearance_provider_->IsTabletMode()
           ? AshLayoutSize::kBrowserCaptionMaximized
           : AshLayoutSize::kBrowserCaptionRestored;
   const gfx::VectorIcon* const size_icon =
@@ -334,6 +314,9 @@
 gfx::Rect BrowserFrameHeaderAsh::GetTitleBounds() const {
   views::View* left_view = window_icon_ ? window_icon_ : back_button_;
   return ash::FrameHeaderUtil::GetAvailableTitleBounds(
-      left_view, caption_button_container_, BrowserFrame::GetTitleFontList(),
-      GetHeaderHeight());
+      left_view, caption_button_container_, GetHeaderHeight());
+}
+
+views::Widget* BrowserFrameHeaderAsh::GetWidget() {
+  return view_->GetWidget();
 }
diff --git a/chrome/browser/ui/views/frame/browser_frame_header_ash.h b/chrome/browser/ui/views/frame/browser_frame_header_ash.h
index b5581f9..0a7db2d 100644
--- a/chrome/browser/ui/views/frame/browser_frame_header_ash.h
+++ b/chrome/browser/ui/views/frame/browser_frame_header_ash.h
@@ -5,14 +5,11 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_HEADER_ASH_H_
 #define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_HEADER_ASH_H_
 
-#include <memory>
-
 #include "ash/frame/frame_header.h"
+#include "base/callback.h"
 #include "base/macros.h"
 #include "ui/gfx/animation/animation_delegate.h"
-
-class BrowserNonClientFrameViewAsh;
-class BrowserView;
+#include "ui/gfx/animation/slide_animation.h"
 
 namespace ash {
 class FrameCaptionButton;
@@ -20,8 +17,8 @@
 }  // namespace ash
 
 namespace gfx {
+class ImageSkia;
 class Rect;
-class SlideAnimation;
 }  // namespace gfx
 namespace views {
 class View;
@@ -32,14 +29,23 @@
 class BrowserFrameHeaderAsh : public ash::FrameHeader,
                               public gfx::AnimationDelegate {
  public:
+  class AppearanceProvider {
+   public:
+    virtual SkColor GetFrameHeaderColor(bool active) = 0;
+    virtual gfx::ImageSkia GetFrameHeaderImage(bool active) = 0;
+    virtual gfx::ImageSkia GetFrameHeaderOverlayImage(bool active) = 0;
+    virtual bool IsTabletMode() = 0;
+  };
+
   BrowserFrameHeaderAsh();
   ~BrowserFrameHeaderAsh() override;
 
   // BrowserFrameHeaderAsh does not take ownership of any of the parameters.
-  // |back_button| can be nullptr, and the frame will not have a back button.
-  void Init(views::Widget* frame,
-            BrowserView* browser_view,
-            BrowserNonClientFrameViewAsh* header_view,
+  // |view| is the view into which |this| will paint. |back_button| can be
+  // nullptr, and the frame will not have a back button.
+  void Init(views::View* view,
+            AppearanceProvider* appearance_provider,
+            bool incognito,
             views::View* window_icon,
             ash::FrameCaptionButtonContainerView* caption_button_container,
             ash::FrameCaptionButton* back_button);
@@ -81,29 +87,28 @@
   // Returns the bounds for the title.
   gfx::Rect GetTitleBounds() const;
 
-  views::Widget* frame_;
+  views::Widget* GetWidget();
 
-  // Whether the header is for a tabbed browser window.
-  bool is_tabbed_;
+  // The view that owns |this|, into which the header is painted.
+  views::View* view_ = nullptr;
+
+  AppearanceProvider* appearance_provider_ = nullptr;
 
   // Whether the header is for an incognito browser window.
-  bool is_incognito_;
+  bool is_incognito_ = false;
 
-  // The header view.
-  BrowserNonClientFrameViewAsh* view_;
-
-  views::View* window_icon_;
+  views::View* window_icon_ = nullptr;
   ash::FrameCaptionButton* back_button_ = nullptr;
-  ash::FrameCaptionButtonContainerView* caption_button_container_;
-  int painted_height_;
+  ash::FrameCaptionButtonContainerView* caption_button_container_ = nullptr;
+  int painted_height_ = 0;
 
   // Whether the header is painted for the first time.
-  bool initial_paint_;
+  bool initial_paint_ = true;
 
   // Whether the header should be painted as active.
-  Mode mode_;
+  Mode mode_ = MODE_INACTIVE;
 
-  std::unique_ptr<gfx::SlideAnimation> activation_animation_;
+  gfx::SlideAnimation activation_animation_{this};
 
   DISALLOW_COPY_AND_ASSIGN(BrowserFrameHeaderAsh);
 };
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
index 847dcd8..0d9e6b2 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
@@ -436,6 +436,27 @@
 }
 
 ///////////////////////////////////////////////////////////////////////////////
+// BrowserFrameHeaderAsh::AppearanceProvider:
+
+SkColor BrowserNonClientFrameViewAsh::GetFrameHeaderColor(bool active) {
+  return GetFrameColor(active);
+}
+
+gfx::ImageSkia BrowserNonClientFrameViewAsh::GetFrameHeaderImage(bool active) {
+  return GetFrameImage(active);
+}
+
+gfx::ImageSkia BrowserNonClientFrameViewAsh::GetFrameHeaderOverlayImage(
+    bool active) {
+  return GetFrameOverlayImage(active);
+}
+
+bool BrowserNonClientFrameViewAsh::IsTabletMode() {
+  return TabletModeClient::Get() &&
+         TabletModeClient::Get()->tablet_mode_enabled();
+}
+
+///////////////////////////////////////////////////////////////////////////////
 // ash::ShellObserver:
 
 void BrowserNonClientFrameViewAsh::OnOverviewModeStarting() {
@@ -619,8 +640,9 @@
   Browser* browser = browser_view()->browser();
   if (!UsePackagedAppHeaderStyle()) {
     auto browser_frame_header = std::make_unique<BrowserFrameHeaderAsh>();
-    browser_frame_header->Init(frame(), browser_view(), this, window_icon_,
-                               caption_button_container_, back_button_);
+    browser_frame_header->Init(
+        this, this, !browser_view()->IsRegularOrGuestSession(), window_icon_,
+        caption_button_container_, back_button_);
     return browser_frame_header;
   }
   std::unique_ptr<ash::DefaultFrameHeader> default_frame_header =
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
index 1f1fb91..750c0b75 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "chrome/browser/command_observer.h"
 #include "chrome/browser/ui/ash/tablet_mode_client_observer.h"
+#include "chrome/browser/ui/views/frame/browser_frame_header_ash.h"
 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
 #include "chrome/browser/ui/views/tab_icon_view_model.h"
 #include "mojo/public/cpp/bindings/binding.h"
@@ -28,18 +29,19 @@
 namespace ash {
 class FrameCaptionButton;
 class FrameCaptionButtonContainerView;
-class FrameHeader;
 class FrameHeaderOriginText;
 }
 
 // Provides the BrowserNonClientFrameView for Chrome OS.
-class BrowserNonClientFrameViewAsh : public BrowserNonClientFrameView,
-                                     public ash::ShellObserver,
-                                     public TabletModeClientObserver,
-                                     public TabIconViewModel,
-                                     public CommandObserver,
-                                     public ash::mojom::SplitViewObserver,
-                                     public aura::WindowObserver {
+class BrowserNonClientFrameViewAsh
+    : public BrowserNonClientFrameView,
+      public BrowserFrameHeaderAsh::AppearanceProvider,
+      public ash::ShellObserver,
+      public TabletModeClientObserver,
+      public TabIconViewModel,
+      public CommandObserver,
+      public ash::mojom::SplitViewObserver,
+      public aura::WindowObserver {
  public:
   BrowserNonClientFrameViewAsh(BrowserFrame* frame, BrowserView* browser_view);
   ~BrowserNonClientFrameViewAsh() override;
@@ -74,6 +76,12 @@
   gfx::Size GetMinimumSize() const override;
   void ChildPreferredSizeChanged(views::View* child) override;
 
+  // BrowserFrameHeaderAsh::AppearanceProvider:
+  SkColor GetFrameHeaderColor(bool active) override;
+  gfx::ImageSkia GetFrameHeaderImage(bool active) override;
+  gfx::ImageSkia GetFrameHeaderOverlayImage(bool active) override;
+  bool IsTabletMode() override;
+
   // ash::ShellObserver:
   void OnOverviewModeStarting() override;
   void OnOverviewModeEnded() override;
@@ -138,8 +146,8 @@
   // scheme than browser windows.
   bool UsePackagedAppHeaderStyle() const;
 
-  // Returns true if there is anything to paint. Some fullscreen windows do not
-  // need their frames painted.
+  // Returns true if there is anything to paint. Some fullscreen windows do
+  // not need their frames painted.
   bool ShouldPaint() const;
 
   // Helps to hide or show the header as needed when overview mode starts or
@@ -149,8 +157,8 @@
   // Creates the frame header for the browser window.
   std::unique_ptr<ash::FrameHeader> CreateFrameHeader();
 
-  // Triggers the hosted app origin and icon animations, assumes the hosted app
-  // UI elements exist.
+  // Triggers the hosted app origin and icon animations, assumes the hosted
+  // app UI elements exist.
   void StartHostedAppAnimation();
 
   // View which contains the window controls.
diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
index 63293b8..74b4b8a 100644
--- a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
@@ -98,9 +98,7 @@
   }
 
   if (browser_view->ShouldShowWindowTitle()) {
-    window_title_ =
-        new views::Label(browser_view->GetWindowTitle(),
-                         {gfx::FontList(BrowserFrame::GetTitleFontList())});
+    window_title_ = new views::Label(browser_view->GetWindowTitle());
     window_title_->SetSubpixelRenderingEnabled(false);
     window_title_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
     window_title_->set_id(VIEW_ID_WINDOW_TITLE);
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
index b6ef185..2d198ac7 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -110,9 +110,7 @@
     window_icon_->Update();
   }
 
-  window_title_ = new views::Label(browser_view->GetWindowTitle(),
-                                   views::Label::CustomFont{gfx::FontList(
-                                       BrowserFrame::GetTitleFontList())});
+  window_title_ = new views::Label(browser_view->GetWindowTitle());
   window_title_->SetVisible(browser_view->ShouldShowWindowTitle());
   window_title_->SetEnabledColor(SK_ColorWHITE);
   window_title_->SetSubpixelRenderingEnabled(false);
@@ -383,8 +381,7 @@
 #else
   // The icon never shrinks below 16 px on a side.
   const int kIconMinimumSize = 16;
-  return std::max(BrowserFrame::GetTitleFontList().GetHeight(),
-                  kIconMinimumSize);
+  return std::max(gfx::FontList().GetHeight(), kIconMinimumSize);
 #endif
 }
 
diff --git a/chrome/browser/ui/views/fullscreen_control/fullscreen_control_view_interactive_uitest.cc b/chrome/browser/ui/views/fullscreen_control/fullscreen_control_view_interactive_uitest.cc
index 2029772..8d05333 100644
--- a/chrome/browser/ui/views/fullscreen_control/fullscreen_control_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/fullscreen_control/fullscreen_control_view_interactive_uitest.cc
@@ -21,6 +21,7 @@
 #include "content/public/common/content_features.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/web/web_fullscreen_options.h"
+#include "ui/events/base_event_utils.h"
 #include "ui/events/event.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/view.h"
@@ -222,6 +223,169 @@
 
 #if defined(OS_MACOSX)
 // Entering fullscreen is flaky on Mac: http://crbug.com/824517
+#define MAYBE_TouchPopupInteraction DISABLED_TouchPopupInteraction
+#else
+#define MAYBE_TouchPopupInteraction TouchPopupInteraction
+#endif
+IN_PROC_BROWSER_TEST_F(FullscreenControlViewTest, MAYBE_TouchPopupInteraction) {
+  EnterActiveTabFullscreen();
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
+  ASSERT_TRUE(browser_view->IsFullscreen());
+
+  FullscreenControlHost* host = GetFullscreenControlHost();
+  host->Hide(false);
+  ASSERT_FALSE(host->IsVisible());
+
+  // Simulate a short tap that doesn't trigger the popup.
+  ui::TouchEvent touch_event(
+      ui::ET_TOUCH_PRESSED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_RELEASED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+
+  ASSERT_FALSE(host->IsVisible());
+
+  // Simulate a press-and-hold.
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_PRESSED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+
+  ui::GestureEvent gesture(1, 1, 0, ui::EventTimeForNow(),
+                           ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
+  host->OnGestureEvent(&gesture);
+
+  // Wait until the popup is fully shown then release the touch.
+  RunLoopUntilVisibilityChanges();
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_RELEASED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+
+  ASSERT_TRUE(host->IsVisible());
+  // Wait for the popup to time out.
+  RunLoopUntilVisibilityChanges();
+  ASSERT_FALSE(host->IsVisible());
+
+  // Simulate a press-and-hold again.
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_PRESSED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+
+  gesture =
+      ui::GestureEvent(1, 1, 0, ui::EventTimeForNow(),
+                       ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
+  host->OnGestureEvent(&gesture);
+
+  RunLoopUntilVisibilityChanges();
+
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_RELEASED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+  ASSERT_TRUE(host->IsVisible());
+
+  // Simulate pressing the button.
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_PRESSED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  GetFullscreenControlView()->ButtonPressed(GetFullscreenExitButton(),
+                                            touch_event);
+
+  ASSERT_FALSE(host->IsVisible());
+  ASSERT_FALSE(browser_view->IsFullscreen());
+}
+
+#if defined(OS_MACOSX)
+// Entering fullscreen is flaky on Mac: http://crbug.com/824517
+#define MAYBE_MouseAndTouchInteraction_NoInterference \
+  DISABLED_MouseAndTouchInteraction_NoInterference
+#else
+#define MAYBE_MouseAndTouchInteraction_NoInterference \
+  MouseAndTouchInteraction_NoInterference
+#endif
+IN_PROC_BROWSER_TEST_F(FullscreenControlViewTest,
+                       MAYBE_MouseAndTouchInteraction_NoInterference) {
+  EnterActiveTabFullscreen();
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
+  ASSERT_TRUE(browser_view->IsFullscreen());
+
+  FullscreenControlHost* host = GetFullscreenControlHost();
+  host->Hide(false);
+  ASSERT_FALSE(host->IsVisible());
+
+  // Move cursor to the top.
+  ui::MouseEvent mouse_move(ui::ET_MOUSE_MOVED, gfx::Point(1, 1), gfx::Point(),
+                            base::TimeTicks(), 0, 0);
+  host->OnMouseEvent(&mouse_move);
+  RunLoopUntilVisibilityChanges();
+  ASSERT_TRUE(host->IsVisible());
+
+  // Simulate a press-and-hold.
+  ui::TouchEvent touch_event(
+      ui::ET_TOUCH_PRESSED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+  ui::GestureEvent gesture(1, 1, 0, ui::EventTimeForNow(),
+                           ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
+  host->OnGestureEvent(&gesture);
+
+  // Move cursor out of the buffer area, which should hide the exit UI.
+  mouse_move = ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(2, 1000),
+                              gfx::Point(), base::TimeTicks(), 0, 0);
+  host->OnMouseEvent(&mouse_move);
+  RunLoopUntilVisibilityChanges();
+  ASSERT_FALSE(host->IsVisible());
+
+  // Release the touch, which should have no effect.
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_RELEASED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+  ASSERT_FALSE(host->IsVisible());
+
+  // Simulate a press-and-hold to trigger the UI.
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_PRESSED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+  gesture =
+      ui::GestureEvent(1, 1, 0, ui::EventTimeForNow(),
+                       ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
+  host->OnGestureEvent(&gesture);
+  RunLoopUntilVisibilityChanges();
+  ASSERT_TRUE(host->IsVisible());
+
+  // Move the cursor to the top.
+  mouse_move = ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(1, 1),
+                              gfx::Point(), base::TimeTicks(), 0, 0);
+  host->OnMouseEvent(&mouse_move);
+  ASSERT_TRUE(host->IsVisible());
+
+  // Move the cursor out of the buffer area, which will have no effect.
+  mouse_move = ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(2, 1000),
+                              gfx::Point(), base::TimeTicks(), 0, 0);
+  host->OnMouseEvent(&mouse_move);
+  // This simply times out.
+  RunLoopUntilVisibilityChanges();
+  ASSERT_TRUE(host->IsVisible());
+
+  // Release the touch. The UI should then timeout.
+  touch_event = ui::TouchEvent(
+      ui::ET_TOUCH_RELEASED, gfx::Point(1, 1), ui::EventTimeForNow(),
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0));
+  host->OnTouchEvent(&touch_event);
+  RunLoopUntilVisibilityChanges();
+  ASSERT_FALSE(host->IsVisible());
+}
+
+#if defined(OS_MACOSX)
+// Entering fullscreen is flaky on Mac: http://crbug.com/824517
 #define MAYBE_KeyboardPopupInteraction DISABLED_KeyboardPopupInteraction
 #else
 #define MAYBE_KeyboardPopupInteraction KeyboardPopupInteraction
diff --git a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
index 62faf0c..b248e268 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
@@ -110,7 +110,7 @@
                                            const gfx::FontList& font_list,
                                            int text_height)
     : is_old_style_answer_(false),
-      is_entity_(false),
+      is_rich_suggestion_(false),
       is_search_type_(false),
       text_height_(text_height) {
   AddChildView(icon_view_ = new OmniboxImageView());
@@ -129,10 +129,11 @@
 gfx::Size OmniboxMatchCellView::CalculatePreferredSize() const {
   int height = text_height_ +
                GetVerticalInsets(text_height_, is_old_style_answer_).height();
-  if (is_old_style_answer_)
-    height += GetOldStyleAnswerHeight();
-  if (is_entity_)
+  if (is_rich_suggestion_) {
     height += text_height_;
+  } else if (is_old_style_answer_) {
+    height += GetOldStyleAnswerHeight();
+  }
   return gfx::Size(0, height);
 }
 bool OmniboxMatchCellView::CanProcessEventsWithinSubtree() const {
@@ -144,9 +145,7 @@
   int answer_icon_size = image_view_->visible()
                              ? image_view_->height() + kAnswerIconToTextPadding
                              : 0;
-  // TODO(dschuyler): The GetIconAlignmentOffset() is applied an extra time to
-  // match the math in Layout(). This seems like a (minor) mistake.
-  int deduction = (GetIconAlignmentOffset() * 2) + icon_width +
+  int deduction = GetIconAlignmentOffset() + icon_width +
                   (HorizontalPadding() * 3) + answer_icon_size;
   int description_width = std::max(width() - deduction, 0);
   return description_view_->GetHeightForWidth(description_width) +
@@ -155,14 +154,16 @@
 
 void OmniboxMatchCellView::OnMatchUpdate(const AutocompleteMatch& match) {
   is_old_style_answer_ = !!match.answer;
-  if (base::FeatureList::IsEnabled(omnibox::kOmniboxRichEntitySuggestions)) {
-    is_entity_ = !match.image_url.empty();
-  }
+  is_rich_suggestion_ =
+      (base::FeatureList::IsEnabled(omnibox::kOmniboxNewAnswerLayout) &&
+       !!match.answer) ||
+      (base::FeatureList::IsEnabled(omnibox::kOmniboxRichEntitySuggestions) &&
+       !match.image_url.empty());
   is_search_type_ = AutocompleteMatch::IsSearchType(match.type);
-  if (is_old_style_answer_ || is_entity_) {
+  if (is_old_style_answer_ || is_rich_suggestion_) {
     separator_view_->SetSize(gfx::Size());
   }
-  if (is_entity_) {
+  if (is_rich_suggestion_) {
     icon_view_->SetSize(gfx::Size());
   }
 }
@@ -173,8 +174,8 @@
 
 void OmniboxMatchCellView::Layout() {
   views::View::Layout();
-  if (is_entity_) {
-    LayoutEntity();
+  if (is_rich_suggestion_) {
+    LayoutRichSuggestion();
   } else if (is_old_style_answer_) {
     LayoutOldStyleAnswer();
   } else {
@@ -184,7 +185,7 @@
 
 void OmniboxMatchCellView::LayoutOldStyleAnswer() {
   const int start_x = GetIconAlignmentOffset() + HorizontalPadding();
-  int x = start_x + LocationBarView::GetBorderThicknessDip();
+  int x = start_x;
   int y = GetVerticalInsets(text_height_, /*is_old_style_answer=*/true).top();
   icon_view_->SetSize(icon_view_->CalculatePreferredSize());
   icon_view_->SetPosition(
@@ -209,9 +210,8 @@
           kVerticalPadding);
 }
 
-void OmniboxMatchCellView::LayoutEntity() {
-  int x = GetIconAlignmentOffset() + HorizontalPadding() +
-          LocationBarView::GetBorderThicknessDip();
+void OmniboxMatchCellView::LayoutRichSuggestion() {
+  int x = GetIconAlignmentOffset() + HorizontalPadding();
   int y = GetVerticalInsets(text_height_, /*is_old_style_answer=*/false).top();
   int image_edge_length = text_height_ * 2;
   image_view_->SetImageSize(gfx::Size(image_edge_length, image_edge_length));
@@ -223,8 +223,7 @@
 }
 
 void OmniboxMatchCellView::LayoutSplit() {
-  int x = GetIconAlignmentOffset() + HorizontalPadding() +
-          LocationBarView::GetBorderThicknessDip();
+  int x = GetIconAlignmentOffset() + HorizontalPadding();
   icon_view_->SetSize(icon_view_->CalculatePreferredSize());
   int y = GetVerticalInsets(text_height_, /*is_old_style_answer=*/false).top();
   icon_view_->SetPosition(
diff --git a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h
index 95d4645..3ac6bf6a 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h
@@ -47,11 +47,11 @@
   int GetOldStyleAnswerHeight() const;
 
   void LayoutOldStyleAnswer();
-  void LayoutEntity();
+  void LayoutRichSuggestion();
   void LayoutSplit();
 
   bool is_old_style_answer_;
-  bool is_entity_;
+  bool is_rich_suggestion_;
   bool is_search_type_;
   int text_height_;
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
index 206e223..c6f8d0c 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -239,10 +239,6 @@
                                           keyword_match->description_class);
     keyword_view_->description()->Dim();
   }
-
-  // TODO(dschuyler): without this Layout call the text will shift slightly when
-  // hovered. Look into removing this call (without the text shifting).
-  Layout();
 }
 
 void OmniboxResultView::OnSelected() {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
index 41d8aff..1cf1f10c 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
@@ -27,7 +27,7 @@
 constexpr int kTextStyle = views::style::STYLE_PRIMARY;
 
 // Indicates to use CONTEXT_OMNIBOX_PRIMARY when picking a font size in legacy
-// codepaths.
+// code paths.
 constexpr int kInherit = INT_MIN;
 
 struct TextStyle {
@@ -224,13 +224,11 @@
                               const ACMatchClassifications& classifications) {
   render_text_.reset();
   render_text_ = CreateClassifiedRenderText(text, classifications);
-  SizeToPreferredSize();
 }
 
 void OmniboxTextView::SetText(const base::string16& text) {
   render_text_.reset();
   render_text_ = CreateRenderText(text);
-  SizeToPreferredSize();
 }
 
 void OmniboxTextView::SetText(const SuggestionAnswer::ImageLine& line) {
@@ -242,7 +240,6 @@
   render_text_.reset();
   render_text_ = CreateText(line, GetFontForType(line.text_fields()[0].type()));
   font_height_ = render_text_->font_list().GetHeight();
-  SizeToPreferredSize();
 }
 
 std::unique_ptr<gfx::RenderText> OmniboxTextView::CreateText(
diff --git a/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc b/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
index 8842b6c..bf1b2908 100644
--- a/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
@@ -274,6 +274,7 @@
     {"keyboardOverlayDisableCapsLock", IDS_KEYBOARD_OVERLAY_DISABLE_CAPS_LOCK},
     {"keyboardOverlayToggleChromevoxSpokenFeedback",
      IDS_KEYBOARD_OVERLAY_TOGGLE_CHROMEVOX_SPOKEN_FEEDBACK},
+    {"keyboardOverlayToggleDictation", IDS_KEYBOARD_OVERLAY_TOGGLE_DICTATION},
     {"keyboardOverlayToggleDockedMagnifier",
      IDS_KEYBOARD_OVERLAY_TOGGLE_DOCKED_MAGNIFIER},
     {"keyboardOverlayToggleFullscreenMagnifier",
diff --git a/chrome/browser/vr/text_perftest.cc b/chrome/browser/vr/text_perftest.cc
index 4f8aad3..a821b80 100644
--- a/chrome/browser/vr/text_perftest.cc
+++ b/chrome/browser/vr/text_perftest.cc
@@ -9,7 +9,6 @@
 #include "chrome/browser/vr/ganesh_surface_provider.h"
 #include "chrome/browser/vr/test/constants.h"
 #include "chrome/browser/vr/test/gl_test_environment.h"
-#include "skia/ext/texture_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_test.h"
 #include "third_party/skia/include/core/SkSurface.h"
diff --git a/chrome/common/extensions/permissions/permissions_data_unittest.cc b/chrome/common/extensions/permissions/permissions_data_unittest.cc
index 7522bf0..d8d5f6b8 100644
--- a/chrome/common/extensions/permissions/permissions_data_unittest.cc
+++ b/chrome/common/extensions/permissions/permissions_data_unittest.cc
@@ -881,19 +881,19 @@
     extension->permissions_data()->UpdateTabSpecificPermissions(
         kTabId, tab_permissions);
     for (const GURL& url : kWebstoreUrls) {
-      EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+      EXPECT_EQ(PermissionsData::PageAccess::kDenied,
                 extension->permissions_data()->GetPageAccess(extension, url, -1,
                                                              &error))
           << extension->name() << ": " << url;
-      EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+      EXPECT_EQ(PermissionsData::PageAccess::kDenied,
                 extension->permissions_data()->GetContentScriptAccess(
                     extension, url, -1, &error))
           << extension->name() << ": " << url;
-      EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+      EXPECT_EQ(PermissionsData::PageAccess::kDenied,
                 extension->permissions_data()->GetPageAccess(extension, url,
                                                              kTabId, &error))
           << extension->name() << ": " << url;
-      EXPECT_EQ(PermissionsData::ACCESS_DENIED,
+      EXPECT_EQ(PermissionsData::PageAccess::kDenied,
                 extension->permissions_data()->GetContentScriptAccess(
                     extension, url, kTabId, &error))
           << extension->name() << ": " << url;
diff --git a/chrome/common/media_router/BUILD.gn b/chrome/common/media_router/BUILD.gn
index 2973167..1e7ac9c4 100644
--- a/chrome/common/media_router/BUILD.gn
+++ b/chrome/common/media_router/BUILD.gn
@@ -50,3 +50,18 @@
     deps += [ "//components/cast_channel:cast_channel" ]
   }
 }
+
+static_library("test_support") {
+  testonly = true
+  deps = [
+    "//base:base",
+    "//chrome/test:test_support",
+  ]
+  public_deps = [
+    ":router",
+  ]
+  sources = [
+    "test/test_helper.cc",
+    "test/test_helper.h",
+  ]
+}
diff --git a/chrome/common/media_router/discovery/media_sink_service_base.cc b/chrome/common/media_router/discovery/media_sink_service_base.cc
index f3f62c19..9f62d24 100644
--- a/chrome/common/media_router/discovery/media_sink_service_base.cc
+++ b/chrome/common/media_router/discovery/media_sink_service_base.cc
@@ -7,69 +7,105 @@
 #include <vector>
 
 namespace {
-// Time interval when media sink service sends sinks to MRP.
-const int kFetchCompleteTimeoutSecs = 3;
+// Timeout amount for |discovery_timer_|.
+const constexpr base::TimeDelta kDiscoveryTimeout =
+    base::TimeDelta::FromSeconds(3);
 }  // namespace
 
 namespace media_router {
 
 MediaSinkServiceBase::MediaSinkServiceBase(
     const OnSinksDiscoveredCallback& callback)
-    : on_sinks_discovered_cb_(callback) {
+    : discovery_timer_(std::make_unique<base::OneShotTimer>()),
+      on_sinks_discovered_cb_(callback) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
-  DCHECK(!on_sinks_discovered_cb_.is_null());
 }
 
 MediaSinkServiceBase::~MediaSinkServiceBase() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
-void MediaSinkServiceBase::SetTimerForTest(std::unique_ptr<base::Timer> timer) {
-  DCHECK(!discovery_timer_);
-  discovery_timer_ = std::move(timer);
+void MediaSinkServiceBase::AddObserver(Observer* observer) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  observers_.AddObserver(observer);
 }
 
-void MediaSinkServiceBase::OnDiscoveryComplete() {
+void MediaSinkServiceBase::RemoveObserver(Observer* observer) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (current_sinks_ == mrp_sinks_) {
-    DVLOG(2) << "No update to sink list.";
+  observers_.RemoveObserver(observer);
+}
+
+const base::flat_map<MediaSink::Id, MediaSinkInternal>&
+MediaSinkServiceBase::GetSinks() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  return sinks_;
+}
+
+const MediaSinkInternal* MediaSinkServiceBase::GetSinkById(
+    const MediaSink::Id& sink_id) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  auto it = sinks_.find(sink_id);
+  return it != sinks_.end() ? &it->second : nullptr;
+}
+
+void MediaSinkServiceBase::AddOrUpdateSink(const MediaSinkInternal& sink) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  sinks_.insert_or_assign(sink.sink().id(), sink);
+  for (auto& observer : observers_)
+    observer.OnSinkAddedOrUpdated(sink);
+
+  StartTimer();
+}
+
+void MediaSinkServiceBase::RemoveSink(const MediaSinkInternal& sink) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // Make a copy of the sink to avoid potential use-after-free.
+  MediaSink::Id sink_id = sink.sink().id();
+  MediaSinkInternal sink_copy = sink;
+  if (!sinks_.erase(sink_id))
     return;
-  }
 
-  DVLOG(2) << "Send sinks to media router, [size]: " << current_sinks_.size();
+  for (auto& observer : observers_)
+    observer.OnSinkRemoved(sink_copy);
 
-  std::vector<MediaSinkInternal> sinks;
-  for (const auto& sink_it : current_sinks_)
-    sinks.push_back(sink_it.second);
+  StartTimer();
+}
 
-  on_sinks_discovered_cb_.Run(std::move(sinks));
-  mrp_sinks_ = current_sinks_;
-  discovery_timer_->Stop();
-  RecordDeviceCounts();
+void MediaSinkServiceBase::SetTimerForTest(std::unique_ptr<base::Timer> timer) {
+  discovery_timer_ = std::move(timer);
 }
 
 void MediaSinkServiceBase::StartTimer() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  // |discovery_timer_| is already set to a mock timer in unit tests only.
-  if (!discovery_timer_)
-    discovery_timer_.reset(new base::OneShotTimer());
+  if (discovery_timer_->IsRunning())
+    return;
 
-  DoStart();
-}
-
-void MediaSinkServiceBase::RestartTimer() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!discovery_timer_->IsRunning())
-    DoStart();
-}
-
-void MediaSinkServiceBase::DoStart() {
-  base::TimeDelta finish_delay =
-      base::TimeDelta::FromSeconds(kFetchCompleteTimeoutSecs);
   discovery_timer_->Start(
-      FROM_HERE, finish_delay,
+      FROM_HERE, kDiscoveryTimeout,
       base::BindRepeating(&MediaSinkServiceBase::OnDiscoveryComplete,
                           base::Unretained(this)));
 }
 
+void MediaSinkServiceBase::OnDiscoveryComplete() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  discovery_timer_->Stop();
+  RecordDeviceCounts();
+
+  // Only send discovered sinks back to MediaRouter if the list changed.
+  if (sinks_ == previous_sinks_) {
+    DVLOG(2) << "No update to sink list.";
+    return;
+  }
+
+  DVLOG(2) << "Send sinks to media router, [size]: " << sinks_.size();
+
+  std::vector<MediaSinkInternal> sinks;
+  for (const auto& sink_it : sinks_)
+    sinks.push_back(sink_it.second);
+
+  on_sinks_discovered_cb_.Run(std::move(sinks));
+  previous_sinks_ = sinks_;
+}
+
 }  // namespace media_router
diff --git a/chrome/common/media_router/discovery/media_sink_service_base.h b/chrome/common/media_router/discovery/media_sink_service_base.h
index 4332100..b2446063 100644
--- a/chrome/common/media_router/discovery/media_sink_service_base.h
+++ b/chrome/common/media_router/discovery/media_sink_service_base.h
@@ -9,6 +9,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/gtest_prod_util.h"
+#include "base/observer_list.h"
 #include "base/sequence_checker.h"
 #include "base/timer/timer.h"
 #include "chrome/common/media_router/discovery/media_sink_internal.h"
@@ -16,40 +17,69 @@
 
 namespace media_router {
 
-// Base class for discovering MediaSinks and notifying the caller with updated
-// list. The class rate-limits notifications to |callback|, so that multiple
-// updates received in quick succession will be batched.
+// Base class for discovering MediaSinks. Responsible for bookkeeping of
+// current set of discovered sinks, and notifying observers when there are
+// updates.
+// In addition, this class maintains a "discovery timer", used for batching
+// updates in quick succession. The timer fires when it is assumed that
+// discovery has reached a relatively steady state. When the timer fires:
+// - The batched updated sink list will be sent back to the Media Router
+// extension via |callback|. This back-channel is necessary until all logic
+// dependent on MediaSinks are moved out of the extension.
+// - Subclasses may record discovered related metrics.
 // This class may be created on any thread, but all subsequent methods must be
 // invoked on the same thread.
 class MediaSinkServiceBase {
  public:
-  // |callback|: The callback to invoke when the list of MediaSinks has been
-  // updated.
+  // Listens for sink updates in MediaSinkServiceBase.
+  class Observer {
+   public:
+    virtual ~Observer() = default;
+
+    // Invoked when |sink| is added or updated.
+    virtual void OnSinkAddedOrUpdated(const MediaSinkInternal& sink) = 0;
+
+    // Invoked when |sink| is removed.
+    virtual void OnSinkRemoved(const MediaSinkInternal& sink) = 0;
+  };
+
+  // |callback|: Callback to invoke inform MediaRouter of discovered sinks
+  // updates.
   explicit MediaSinkServiceBase(const OnSinksDiscoveredCallback& callback);
   virtual ~MediaSinkServiceBase();
 
- protected:
+  // Adds |observer| to observe |this| for sink updates.
+  // Caller is responsible for calling |RemoveObserver| before it is destroyed.
+  // Both methods are safe to call on any thread.
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
+  // Overridden by subclass to initiate action triggered by user gesture, e.g.
+  // start one-off round of discovery.
+  virtual void OnUserGesture() {}
+
+  // Adds or updates, or removes a sink.
+  // Notifies |observers_| that the sink has been added, updated, or removed.
+  // Also invokes |StartTimer()|.
+  void AddOrUpdateSink(const MediaSinkInternal& sink);
+  void RemoveSink(const MediaSinkInternal& sink);
+
+  const base::flat_map<MediaSink::Id, MediaSinkInternal>& GetSinks() const;
+  const MediaSinkInternal* GetSinkById(const MediaSink::Id& sink_id) const;
+
   void SetTimerForTest(std::unique_ptr<base::Timer> timer);
 
-  // Called when |discovery_timer_| expires.
+ protected:
+  // Called when |discovery_timer_| expires. Informs subclass to report device
+  // counts. Also informs Media Router of updated list of discovered sinks.
+  // May be overridden by subclass to perform additional operations, such as
+  // pruning old sinks.
   virtual void OnDiscoveryComplete();
 
-  // Overriden by subclass to report device counts.
-  virtual void RecordDeviceCounts() {}
-
-  // Creates |discovery_timer_| and starts it.
+  // Starts |discovery_timer_| to invoke |OnDiscoveryComplete()|. Subclasses
+  // may call this at the start of a round of discovery.
   void StartTimer();
 
-  // Restarts |discovery_timer| if it is stopped. Can only be called after
-  // |StartTimer()| is called.
-  void RestartTimer();
-
-  // Sorted sinks from current round of discovery, keyed by sink ID. Subclasses
-  // may make modifications to this map while discovery is active. At the
-  // completion of the current round of discovery, |current_sinks_| will be
-  // copied over to |mrp_sinks_|, which will be used for |GetSink()| calls.
-  base::flat_map<std::string, MediaSinkInternal> current_sinks_;
-
  private:
   friend class MediaSinkServiceBaseTest;
   FRIEND_TEST_ALL_PREFIXES(MediaSinkServiceBaseTest,
@@ -57,17 +87,33 @@
   FRIEND_TEST_ALL_PREFIXES(MediaSinkServiceBaseTest,
                            TestOnDiscoveryComplete_SameSinkDifferentOrders);
 
-  // Helper method to start |discovery_timer_|.
-  void DoStart();
+  // Overriden by subclass to report device counts.
+  virtual void RecordDeviceCounts() {}
 
+  // The current set of discovered sinks keyed by MediaSink ID.
+  base::flat_map<MediaSink::Id, MediaSinkInternal> sinks_;
+
+  // Observers to notify when a sink is added, updated, or removed.
+  base::ObserverList<Observer> observers_;
+
+  // Timer for recording device counts after a sink list has changed. To ensure
+  // the metrics are recorded accurately, a small delay is introduced after a
+  // sink list change in order for the discovery process to reach a steady
+  // state before the metrics are recorded.
+  std::unique_ptr<base::Timer> discovery_timer_;
+
+  // The following fields exist temporarily for sending back discovered sinks to
+  // the Media Router extension.
+  // TODO(https://crbug.com/809249): Remove once the extension no longer need
+  // the sinks.
+
+  // Callback to MediaRouter to provide sinks to the MR extension.
   OnSinksDiscoveredCallback on_sinks_discovered_cb_;
 
-  // Sorted sinks sent to Media Router Provider in last |OnDiscoveryComplete()|,
-  // keyed by sink ID.
-  base::flat_map<std::string, MediaSinkInternal> mrp_sinks_;
-
-  // Timer for completing the current round of discovery.
-  std::unique_ptr<base::Timer> discovery_timer_;
+  // Sinks saved in the previous |OnDiscoveryComplete()| invocation. Checked
+  // against |sinks_| during |OnDiscoveryComplete()| before invoking
+  // |on_sinks_discovered_cb_|.
+  base::flat_map<MediaSink::Id, MediaSinkInternal> previous_sinks_;
 
   SEQUENCE_CHECKER(sequence_checker_);
   DISALLOW_COPY_AND_ASSIGN(MediaSinkServiceBase);
diff --git a/chrome/common/media_router/discovery/media_sink_service_base_unittest.cc b/chrome/common/media_router/discovery/media_sink_service_base_unittest.cc
index 953c8ba..6f3bc33 100644
--- a/chrome/common/media_router/discovery/media_sink_service_base_unittest.cc
+++ b/chrome/common/media_router/discovery/media_sink_service_base_unittest.cc
@@ -3,9 +3,11 @@
 // found in the LICENSE file.
 
 #include "chrome/common/media_router/discovery/media_sink_service_base.h"
+
 #include "base/memory/ptr_util.h"
 #include "base/test/mock_callback.h"
 #include "base/timer/mock_timer.h"
+#include "chrome/common/media_router/test/test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -52,25 +54,16 @@
       : media_sink_service_(mock_sink_discovered_cb_.Get()) {}
   ~MediaSinkServiceBaseTest() override {}
 
-  void SetUp() override {
-    mock_timer_ =
-        new base::MockTimer(true /*retain_user_task*/, false /*is_repeating*/);
-    media_sink_service_.SetTimerForTest(base::WrapUnique(mock_timer_));
-  }
-
   void PopulateSinks(const std::vector<MediaSinkInternal>& old_sinks,
                      const std::vector<MediaSinkInternal>& new_sinks) {
-    media_sink_service_.mrp_sinks_.clear();
-    for (const auto& old_sink : old_sinks) {
-      std::string sink_id = old_sink.sink().id();
-      media_sink_service_.mrp_sinks_[sink_id] = old_sink;
-    }
+    media_sink_service_.previous_sinks_.clear();
+    for (const auto& old_sink : old_sinks)
+      media_sink_service_.previous_sinks_.emplace(old_sink.sink().id(),
+                                                  old_sink);
 
-    media_sink_service_.current_sinks_.clear();
-    for (const auto& new_sink : new_sinks) {
-      std::string sink_id = new_sink.sink().id();
-      media_sink_service_.current_sinks_[sink_id] = new_sink;
-    }
+    media_sink_service_.sinks_.clear();
+    for (const auto& new_sink : new_sinks)
+      media_sink_service_.sinks_.emplace(new_sink.sink().id(), new_sink);
   }
 
   void TestOnDiscoveryComplete(
@@ -83,9 +76,7 @@
 
  protected:
   base::MockCallback<OnSinksDiscoveredCallback> mock_sink_discovered_cb_;
-  base::MockTimer* mock_timer_;
-
-  MediaSinkServiceBase media_sink_service_;
+  TestMediaSinkService media_sink_service_;
 
   DISALLOW_COPY_AND_ASSIGN(MediaSinkServiceBaseTest);
 };
diff --git a/chrome/common/media_router/test/test_helper.cc b/chrome/common/media_router/test/test_helper.cc
new file mode 100644
index 0000000..1bd4289e
--- /dev/null
+++ b/chrome/common/media_router/test/test_helper.cc
@@ -0,0 +1,27 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/media_router/test/test_helper.h"
+
+#include "base/bind_helpers.h"
+#include "base/memory/ptr_util.h"
+
+namespace media_router {
+
+#if !defined(OS_ANDROID)
+TestMediaSinkService::TestMediaSinkService()
+    : TestMediaSinkService(base::DoNothing()) {}
+
+TestMediaSinkService::TestMediaSinkService(
+    const OnSinksDiscoveredCallback& callback)
+    : MediaSinkServiceBase(callback),
+      timer_(new base::MockTimer(true /*retain_user_task*/,
+                                 false /*is_repeating*/)) {
+  SetTimerForTest(base::WrapUnique(timer_));
+}
+
+TestMediaSinkService::~TestMediaSinkService() = default;
+#endif  // !defined(OS_ANDROID)
+
+}  // namespace media_router
diff --git a/chrome/common/media_router/test/test_helper.h b/chrome/common/media_router/test/test_helper.h
new file mode 100644
index 0000000..a6b2d7c
--- /dev/null
+++ b/chrome/common/media_router/test/test_helper.h
@@ -0,0 +1,33 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_COMMON_MEDIA_ROUTER_TEST_TEST_HELPER_H_
+#define CHROME_COMMON_MEDIA_ROUTER_TEST_TEST_HELPER_H_
+
+#include "base/macros.h"
+#include "base/timer/mock_timer.h"
+#include "build/build_config.h"
+#include "chrome/common/media_router/discovery/media_sink_service_base.h"
+
+namespace media_router {
+
+#if !defined(OS_ANDROID)
+class TestMediaSinkService : public MediaSinkServiceBase {
+ public:
+  TestMediaSinkService();
+  explicit TestMediaSinkService(const OnSinksDiscoveredCallback& callback);
+  ~TestMediaSinkService() override;
+
+  base::MockTimer* timer() { return timer_; }
+
+ private:
+  // Owned by MediaSinkService.
+  base::MockTimer* timer_;
+  DISALLOW_COPY_AND_ASSIGN(TestMediaSinkService);
+};
+#endif  // !defined(OS_ANDROID)
+
+}  // namespace media_router
+
+#endif  // CHROME_COMMON_MEDIA_ROUTER_TEST_TEST_HELPER_H_
diff --git a/chrome/renderer/extensions/chrome_extensions_renderer_client.cc b/chrome/renderer/extensions/chrome_extensions_renderer_client.cc
index 79941c8..6ed1a8f 100644
--- a/chrome/renderer/extensions/chrome_extensions_renderer_client.cc
+++ b/chrome/renderer/extensions/chrome_extensions_renderer_client.cc
@@ -237,10 +237,10 @@
       GURL request_url(url);
       if (extension->permissions_data()->GetPageAccess(extension, request_url,
                                                        tab_id, nullptr) ==
-              extensions::PermissionsData::ACCESS_ALLOWED ||
+              extensions::PermissionsData::PageAccess::kAllowed ||
           extension->permissions_data()->GetContentScriptAccess(
               extension, request_url, tab_id, nullptr) ==
-              extensions::PermissionsData::ACCESS_ALLOWED) {
+              extensions::PermissionsData::PageAccess::kAllowed) {
         *attach_same_site_cookies = true;
       }
     }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 806fc7e..4545de1 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2180,6 +2180,16 @@
   ]
 }
 
+# Difference between this and performance_test_suite is that this runs a devil
+# script before the build, to remove the system webview. See
+# //testing/buildbot/gn_isolate_map.pyl
+group("performance_webview_test_suite") {
+  testonly = true
+  deps = [
+    "//chrome/test:performance_test_suite",
+  ]
+}
+
 # Difference between this and telemetry_perf_tests is that this runs a devil
 # script before the build, to remove the system webview. See
 # //testing/buildbot/gn_isolate_map.pyl
@@ -2746,6 +2756,7 @@
     "//chrome:strings",
     "//chrome/browser/media/router:test_support",
     "//chrome/common:test_support",
+    "//chrome/common/media_router:test_support",
     "//components/autofill/content/renderer:test_support",
     "//components/browser_sync:test_support",
     "//components/component_updater:test_support",
@@ -2929,6 +2940,7 @@
       "../browser/resource_coordinator/local_site_characteristics_data_store_unittest.cc",
       "../browser/resource_coordinator/local_site_characteristics_data_unittest_utils.cc",
       "../browser/resource_coordinator/local_site_characteristics_data_unittest_utils.h",
+      "../browser/resource_coordinator/local_site_characteristics_data_writer_unittest.cc",
       "../browser/resource_coordinator/tab_activity_watcher_unittest.cc",
       "../browser/resource_coordinator/tab_lifecycle_unit_source_unittest.cc",
       "../browser/resource_coordinator/tab_lifecycle_unit_unittest.cc",
diff --git a/chromecast/media/base/media_resource_tracker_unittest.cc b/chromecast/media/base/media_resource_tracker_unittest.cc
index 6a910b63..473e799 100644
--- a/chromecast/media/base/media_resource_tracker_unittest.cc
+++ b/chromecast/media/base/media_resource_tracker_unittest.cc
@@ -204,6 +204,8 @@
   }
   EXPECT_EQ(0u, resource_tracker_->media_use_count());
 
+  EXPECT_CALL(*test_mocks_, Finalize()).Times(1);
+  EXPECT_CALL(*test_mocks_, Destroyed()).Times(1);
   resource_tracker_->FinalizeAndDestroy();
   base::RunLoop().RunUntilIdle();
 }
diff --git a/chromecast/media/cma/backend/audio_decoder_software_wrapper_unittest.cc b/chromecast/media/cma/backend/audio_decoder_software_wrapper_unittest.cc
index 8ea030d..09cbde4 100644
--- a/chromecast/media/cma/backend/audio_decoder_software_wrapper_unittest.cc
+++ b/chromecast/media/cma/backend/audio_decoder_software_wrapper_unittest.cc
@@ -22,6 +22,8 @@
 
 class MockAudioDecoder : public MediaPipelineBackend::AudioDecoder {
  public:
+  MockAudioDecoder() { EXPECT_CALL(*this, SetDelegate(_)); }
+
   MOCK_METHOD1(SetDelegate, void(Delegate*));
   MOCK_METHOD1(PushBuffer, BufferStatus(CastDecoderBuffer*));
   MOCK_METHOD1(SetConfig, bool(const AudioConfig&));
diff --git a/chromecast/media/cma/pipeline/audio_video_pipeline_impl_unittest.cc b/chromecast/media/cma/pipeline/audio_video_pipeline_impl_unittest.cc
index 874b8609..83e6d2b0 100644
--- a/chromecast/media/cma/pipeline/audio_video_pipeline_impl_unittest.cc
+++ b/chromecast/media/cma/pipeline/audio_video_pipeline_impl_unittest.cc
@@ -172,6 +172,22 @@
     }
   }
 
+  void SetPipelineStartExpectations() {
+    // The pipeline will be paused first, for the initial data buffering. Then
+    // it will be resumed, once enough data is buffered to start playback.
+    EXPECT_CALL(*pipeline_backend_, GetCurrentPts());
+    EXPECT_CALL(*pipeline_backend_, Pause());
+    EXPECT_CALL(*pipeline_backend_, SetPlaybackRate(1.0f));
+    EXPECT_CALL(*pipeline_backend_, Resume());
+  }
+
+  // This is used for the Flush test case, where the pipeline start sequence is
+  // interrupted by the Flush, and the initial buffering never completes.
+  void SetPipelineStartFlushExpectations() {
+    EXPECT_CALL(*pipeline_backend_, GetCurrentPts());
+    EXPECT_CALL(*pipeline_backend_, Pause());
+  }
+
   void Start(const base::Closure& eos_cb) {
     eos_cb_ = eos_cb;
     eos_[STREAM_AUDIO] = !media_pipeline_->HasAudio();
@@ -290,6 +306,7 @@
 TEST_P(AudioVideoPipelineImplTest, Play) {
   base::Closure verify_task =
       base::Bind(&VerifyPlay, base::Unretained(pipeline_helper_.get()));
+  pipeline_helper_->SetPipelineStartExpectations();
   scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&PipelineHelper::Start,
@@ -314,6 +331,7 @@
 TEST_P(AudioVideoPipelineImplTest, Flush) {
   base::Closure verify_task =
       base::Bind(&VerifyFlush, base::Unretained(pipeline_helper_.get()));
+  pipeline_helper_->SetPipelineStartFlushExpectations();
   scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&PipelineHelper::Start,
                                 base::Unretained(pipeline_helper_.get()),
@@ -333,6 +351,7 @@
       base::Bind(&PipelineHelper::Flush,
                  base::Unretained(pipeline_helper_.get()), stop_task);
 
+  pipeline_helper_->SetPipelineStartExpectations();
   scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&PipelineHelper::Start,
@@ -376,6 +395,7 @@
   scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&PipelineHelper::SetCdmLicenseInstalled,
                                 base::Unretained(pipeline_helper_.get())));
+  pipeline_helper_->SetPipelineStartExpectations();
   scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&PipelineHelper::Start,
@@ -387,6 +407,7 @@
 TEST_F(EncryptedAVPipelineImplTest, SetCdmWithLicenseAfterStart) {
   base::Closure verify_task =
       base::Bind(&VerifyPlay, base::Unretained(pipeline_helper_.get()));
+  pipeline_helper_->SetPipelineStartExpectations();
   scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&PipelineHelper::Start,
@@ -406,6 +427,7 @@
 TEST_F(EncryptedAVPipelineImplTest, SetCdmAndInstallLicenseAfterStart) {
   base::Closure verify_task =
       base::Bind(&VerifyPlay, base::Unretained(pipeline_helper_.get()));
+  pipeline_helper_->SetPipelineStartExpectations();
   scoped_task_environment_.GetMainThreadTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&PipelineHelper::Start,
diff --git a/chromeos/components/proximity_auth/BUILD.gn b/chromeos/components/proximity_auth/BUILD.gn
index f7f065d..9352027 100644
--- a/chromeos/components/proximity_auth/BUILD.gn
+++ b/chromeos/components/proximity_auth/BUILD.gn
@@ -35,6 +35,7 @@
     "proximity_monitor_impl.cc",
     "proximity_monitor_impl.h",
     "proximity_monitor_observer.h",
+    "remote_device_life_cycle.cc",
     "remote_device_life_cycle.h",
     "remote_device_life_cycle_impl.cc",
     "remote_device_life_cycle_impl.h",
@@ -42,6 +43,7 @@
     "remote_status_update.h",
     "screenlock_bridge.cc",
     "screenlock_bridge.h",
+    "screenlock_state.cc",
     "screenlock_state.h",
     "switches.cc",
     "switches.h",
diff --git a/chromeos/components/proximity_auth/bluetooth_low_energy_connection_finder.cc b/chromeos/components/proximity_auth/bluetooth_low_energy_connection_finder.cc
index 1953a6f..3d0b1f0 100644
--- a/chromeos/components/proximity_auth/bluetooth_low_energy_connection_finder.cc
+++ b/chromeos/components/proximity_auth/bluetooth_low_energy_connection_finder.cc
@@ -158,7 +158,6 @@
   if (!service_data)
     return false;
 
-  PA_LOG(INFO) << "Generating EIDs for: " << device->GetAddress();
   std::string service_data_string(service_data->begin(), service_data->end());
   std::vector<cryptauth::DataWithTimestamp> nearest_eids =
       eid_generator_->GenerateNearestEids(remote_device_.beacon_seeds);
@@ -252,7 +251,7 @@
         FROM_HERE,
         base::BindOnce(&BluetoothLowEnergyConnectionFinder::InvokeCallbackAsync,
                        weak_ptr_factory_.GetWeakPtr()));
-  } else if (old_status == cryptauth::Connection::IN_PROGRESS) {
+  } else if (old_status == cryptauth::Connection::Status::IN_PROGRESS) {
     PA_LOG(WARNING) << "Connection failed. Retrying.";
     connection_->RemoveObserver(this);
     connection_.reset();
diff --git a/chromeos/components/proximity_auth/bluetooth_low_energy_connection_finder_unittest.cc b/chromeos/components/proximity_auth/bluetooth_low_energy_connection_finder_unittest.cc
index 74a87a08..1543c68 100644
--- a/chromeos/components/proximity_auth/bluetooth_low_energy_connection_finder_unittest.cc
+++ b/chromeos/components/proximity_auth/bluetooth_low_energy_connection_finder_unittest.cc
@@ -322,8 +322,8 @@
   // Creating a connection.
   base::RunLoop run_loop;
   EXPECT_FALSE(last_found_connection_);
-  connection->SetStatus(cryptauth::Connection::IN_PROGRESS);
-  connection->SetStatus(cryptauth::Connection::CONNECTED);
+  connection->SetStatus(cryptauth::Connection::Status::IN_PROGRESS);
+  connection->SetStatus(cryptauth::Connection::Status::CONNECTED);
   run_loop.RunUntilIdle();
   EXPECT_TRUE(last_found_connection_);
 }
@@ -341,7 +341,7 @@
   // Trying to create a connection.
   connection_finder_.DeviceAdded(adapter_.get(), device_.get());
   ASSERT_FALSE(last_found_connection_);
-  connection->SetStatus(cryptauth::Connection::IN_PROGRESS);
+  connection->SetStatus(cryptauth::Connection::Status::IN_PROGRESS);
 
   // Preparing to restart the discovery session.
   device::BluetoothAdapter::DiscoverySessionCallback discovery_callback;
@@ -353,7 +353,7 @@
   // Connection fails.
   {
     base::RunLoop run_loop;
-    connection->SetStatus(cryptauth::Connection::DISCONNECTED);
+    connection->SetStatus(cryptauth::Connection::Status::DISCONNECTED);
     run_loop.RunUntilIdle();
   }
 
@@ -375,8 +375,8 @@
   {
     base::RunLoop run_loop;
     EXPECT_FALSE(last_found_connection_);
-    connection->SetStatus(cryptauth::Connection::IN_PROGRESS);
-    connection->SetStatus(cryptauth::Connection::CONNECTED);
+    connection->SetStatus(cryptauth::Connection::Status::IN_PROGRESS);
+    connection->SetStatus(cryptauth::Connection::Status::CONNECTED);
     run_loop.RunUntilIdle();
   }
   EXPECT_TRUE(last_found_connection_);
@@ -426,8 +426,8 @@
   // Completing the connection.
   base::RunLoop run_loop;
   ASSERT_FALSE(last_found_connection_);
-  connection->SetStatus(cryptauth::Connection::IN_PROGRESS);
-  connection->SetStatus(cryptauth::Connection::CONNECTED);
+  connection->SetStatus(cryptauth::Connection::Status::IN_PROGRESS);
+  connection->SetStatus(cryptauth::Connection::Status::CONNECTED);
   run_loop.RunUntilIdle();
   EXPECT_TRUE(last_found_connection_);
 }
diff --git a/chromeos/components/proximity_auth/messenger_impl.cc b/chromeos/components/proximity_auth/messenger_impl.cc
index 6be476a..4408bf9 100644
--- a/chromeos/components/proximity_auth/messenger_impl.cc
+++ b/chromeos/components/proximity_auth/messenger_impl.cc
@@ -271,7 +271,7 @@
     cryptauth::Connection::Status old_status,
     cryptauth::Connection::Status new_status) {
   DCHECK_EQ(connection, connection_.get());
-  if (new_status == cryptauth::Connection::DISCONNECTED) {
+  if (new_status == cryptauth::Connection::Status::DISCONNECTED) {
     PA_LOG(INFO) << "Secure channel disconnected...";
     connection_->RemoveObserver(this);
     for (auto& observer : observers_)
diff --git a/chromeos/components/proximity_auth/remote_device_life_cycle.cc b/chromeos/components/proximity_auth/remote_device_life_cycle.cc
new file mode 100644
index 0000000..7ce1157
--- /dev/null
+++ b/chromeos/components/proximity_auth/remote_device_life_cycle.cc
@@ -0,0 +1,35 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/components/proximity_auth/remote_device_life_cycle.h"
+
+namespace proximity_auth {
+
+namespace {
+using State = RemoteDeviceLifeCycle::State;
+}  // namespace
+
+std::ostream& operator<<(std::ostream& stream, const State& state) {
+  switch (state) {
+    case State::STOPPED:
+      stream << "[stopped]";
+      break;
+    case State::FINDING_CONNECTION:
+      stream << "[finding connection]";
+      break;
+    case State::AUTHENTICATING:
+      stream << "[authenticating]";
+      break;
+    case State::SECURE_CHANNEL_ESTABLISHED:
+      stream << "[secure channel established]";
+      break;
+    case State::AUTHENTICATION_FAILED:
+      stream << "[authentication failed]";
+      break;
+  }
+
+  return stream;
+}
+
+}  // namespace proximity_auth
\ No newline at end of file
diff --git a/chromeos/components/proximity_auth/remote_device_life_cycle.h b/chromeos/components/proximity_auth/remote_device_life_cycle.h
index f585b5e..85e16f3 100644
--- a/chromeos/components/proximity_auth/remote_device_life_cycle.h
+++ b/chromeos/components/proximity_auth/remote_device_life_cycle.h
@@ -5,6 +5,8 @@
 #ifndef CHROMEOS_COMPONENTS_PROXIMITY_AUTH_REMOTE_DEVICE_LIFE_CYCLE_H_
 #define CHROMEOS_COMPONENTS_PROXIMITY_AUTH_REMOTE_DEVICE_LIFE_CYCLE_H_
 
+#include <ostream>
+
 #include "base/macros.h"
 #include "components/cryptauth/connection.h"
 #include "components/cryptauth/remote_device.h"
@@ -76,6 +78,9 @@
   virtual void RemoveObserver(Observer* observer) = 0;
 };
 
+std::ostream& operator<<(std::ostream& stream,
+                         const RemoteDeviceLifeCycle::State& state);
+
 }  // namespace proximity_auth
 
 #endif  // CHROMEOS_COMPONENTS_PROXIMITY_AUTH_REMOTE_DEVICE_LIFE_CYCLE_H_
diff --git a/chromeos/components/proximity_auth/remote_device_life_cycle_impl.cc b/chromeos/components/proximity_auth/remote_device_life_cycle_impl.cc
index 0a67194..d282d6d 100644
--- a/chromeos/components/proximity_auth/remote_device_life_cycle_impl.cc
+++ b/chromeos/components/proximity_auth/remote_device_life_cycle_impl.cc
@@ -87,8 +87,7 @@
 
 void RemoteDeviceLifeCycleImpl::TransitionToState(
     RemoteDeviceLifeCycle::State new_state) {
-  PA_LOG(INFO) << "Life cycle transition: " << static_cast<int>(state_)
-               << " => " << static_cast<int>(new_state);
+  PA_LOG(INFO) << "Life cycle transition: " << state_ << " => " << new_state;
   RemoteDeviceLifeCycle::State old_state = state_;
   state_ = new_state;
   for (auto& observer : observers_)
diff --git a/chromeos/components/proximity_auth/screenlock_state.cc b/chromeos/components/proximity_auth/screenlock_state.cc
new file mode 100644
index 0000000..93aafa7c
--- /dev/null
+++ b/chromeos/components/proximity_auth/screenlock_state.cc
@@ -0,0 +1,52 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/components/proximity_auth/screenlock_state.h"
+
+namespace proximity_auth {
+
+std::ostream& operator<<(std::ostream& stream, const ScreenlockState& state) {
+  switch (state) {
+    case ScreenlockState::INACTIVE:
+      stream << "[inactive]";
+      break;
+    case ScreenlockState::NO_BLUETOOTH:
+      stream << "[no bluetooth]";
+      break;
+    case ScreenlockState::BLUETOOTH_CONNECTING:
+      stream << "[bluetooth connecting]";
+      break;
+    case ScreenlockState::NO_PHONE:
+      stream << "[no phone]";
+      break;
+    case ScreenlockState::PHONE_NOT_AUTHENTICATED:
+      stream << "[phone not authenticated]";
+      break;
+    case ScreenlockState::PHONE_LOCKED:
+      stream << "[phone locked]";
+      break;
+    case ScreenlockState::PHONE_NOT_LOCKABLE:
+      stream << "[phone not lockable]";
+      break;
+    case ScreenlockState::PHONE_UNSUPPORTED:
+      stream << "[phone unsupported]";
+      break;
+    case ScreenlockState::RSSI_TOO_LOW:
+      stream << "[rssi too low]";
+      break;
+    case ScreenlockState::PHONE_LOCKED_AND_RSSI_TOO_LOW:
+      stream << "[phone locked and rssi too low]";
+      break;
+    case ScreenlockState::AUTHENTICATED:
+      stream << "[authenticated]";
+      break;
+    case ScreenlockState::PASSWORD_REAUTH:
+      stream << "[password reauth]";
+      break;
+  }
+
+  return stream;
+}
+
+}  // namespace proximity_auth
\ No newline at end of file
diff --git a/chromeos/components/proximity_auth/screenlock_state.h b/chromeos/components/proximity_auth/screenlock_state.h
index 4909c6e2..5545ec9 100644
--- a/chromeos/components/proximity_auth/screenlock_state.h
+++ b/chromeos/components/proximity_auth/screenlock_state.h
@@ -5,6 +5,8 @@
 #ifndef CHROMEOS_COMPONENTS_PROXIMITY_AUTH_SCREENLOCK_STATE_H_
 #define CHROMEOS_COMPONENTS_PROXIMITY_AUTH_SCREENLOCK_STATE_H_
 
+#include <ostream>
+
 namespace proximity_auth {
 
 // Possible user states of the proximity auth feature on the lock or sign-in
@@ -46,6 +48,8 @@
   PASSWORD_REAUTH,
 };
 
+std::ostream& operator<<(std::ostream& stream, const ScreenlockState& state);
+
 }  // namespace proximity_auth
 
 #endif  // CHROMEOS_COMPONENTS_PROXIMITY_AUTH_SCREENLOCK_STATE_H_
diff --git a/chromeos/components/proximity_auth/unlock_manager_impl.cc b/chromeos/components/proximity_auth/unlock_manager_impl.cc
index 7412ed01..6caf0d4 100644
--- a/chromeos/components/proximity_auth/unlock_manager_impl.cc
+++ b/chromeos/components/proximity_auth/unlock_manager_impl.cc
@@ -151,8 +151,6 @@
 
 void UnlockManagerImpl::OnLifeCycleStateChanged() {
   RemoteDeviceLifeCycle::State state = life_cycle_->GetState();
-  PA_LOG(INFO) << "RemoteDeviceLifeCycle state changed: "
-               << static_cast<int>(state);
 
   remote_screenlock_state_.reset();
   if (state == RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) {
@@ -419,9 +417,8 @@
   if (screenlock_state_ == new_state)
     return;
 
-  PA_LOG(INFO) << "Updating screenlock state from "
-               << static_cast<int>(screenlock_state_) << " to "
-               << static_cast<int>(new_state);
+  PA_LOG(INFO) << "Updating screenlock state from " << screenlock_state_
+               << " to " << new_state;
   proximity_auth_client_->UpdateScreenlockState(new_state);
   screenlock_state_ = new_state;
 }
diff --git a/components/assist_ranker/OWNERS b/components/assist_ranker/OWNERS
index 36ad72d71e..8aee8cf0 100644
--- a/components/assist_ranker/OWNERS
+++ b/components/assist_ranker/OWNERS
@@ -1,3 +1,5 @@
+amoylan@chromium.org
 charleszhao@chromium.org
 hamelphi@chromium.org
+jiameng@chromium.org
 rogerm@chromium.org
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index b25819f3..9ba54632 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -248,6 +248,7 @@
   registry->RegisterIntegerPref(
       prefs::kAutofillLastVersionDisusedCreditCardsDeleted, 0);
   registry->RegisterBooleanPref(prefs::kAutofillCreditCardEnabled, true);
+  registry->RegisterBooleanPref(prefs::kAutofillOrphanRowsRemoved, false);
 }
 
 void AutofillManager::SetExternalDelegate(AutofillExternalDelegate* delegate) {
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index bef012f..f775ea2 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -418,20 +418,14 @@
   // If the sync service is not enabled for autofill address profiles then run
   // address cleanup/startup code here. Otherwise, defer until after sync has
   // started.
-  if (!IsSyncEnabledFor(sync_service, syncer::AUTOFILL_PROFILE)) {
-    ApplyProfileUseDatesFix();  // One-time fix, otherwise NOP.
-    ApplyDedupingRoutine();     // Once per major version, otherwise NOP.
-    DeleteDisusedAddresses();   // Once per major version, otherwise NOP.
-    CreateTestAddresses();      // Once per user profile startup.
-  }
+  if (!IsSyncEnabledFor(sync_service, syncer::AUTOFILL_PROFILE))
+    ApplyAddressFixesAndCleanups();
 
   // Similarly, if the sync service is not enabled for autofill credit cards
   // then run credit card address cleanup/startup code here. Otherwise, defer
   // until after sync has started.
-  if (!IsSyncEnabledFor(sync_service, syncer::AUTOFILL_WALLET_DATA)) {
-    DeleteDisusedCreditCards();  // Once per major version, otherwise NOP.
-    CreateTestCreditCards();     // Once per user profile startup.
-  }
+  if (!IsSyncEnabledFor(sync_service, syncer::AUTOFILL_WALLET_DATA))
+    ApplyCardFixesAndCleanups();
 
   if (sync_service_ != sync_service) {
     // Before the sync service pointer gets changed, remove the observer.
@@ -522,19 +516,13 @@
 void PersonalDataManager::SyncStarted(syncer::ModelType model_type) {
   // Run deferred autofill address profile startup code.
   // See: OnSyncServiceInitialized
-  if (model_type == syncer::AUTOFILL_PROFILE) {
-    ApplyProfileUseDatesFix();  // One-time fix, otherwise NOP.
-    ApplyDedupingRoutine();     // Once per major version, otherwise NOP.
-    DeleteDisusedAddresses();   // Once per major version, otherwise NOP.
-    CreateTestAddresses();      // Once per user profile startup.
-  }
+  if (model_type == syncer::AUTOFILL_PROFILE)
+    ApplyAddressFixesAndCleanups();
 
   // Run deferred credit card startup code.
   // See: OnSyncServiceInitialized
-  if (model_type == syncer::AUTOFILL_WALLET_DATA) {
-    DeleteDisusedCreditCards();  // Once per major version, otherwise NOP.
-    CreateTestCreditCards();     // Once per user profile startup.
-  }
+  if (model_type == syncer::AUTOFILL_WALLET_DATA)
+    ApplyCardFixesAndCleanups();
 }
 
 void PersonalDataManager::OnStateChanged(syncer::SyncService* sync_service) {
@@ -1723,6 +1711,20 @@
     SetProfiles(&profiles);
 }
 
+void PersonalDataManager::RemoveOrphanAutofillTableRows() {
+  // Don't run if the fix has already been applied.
+  if (pref_service_->GetBoolean(prefs::kAutofillOrphanRowsRemoved))
+    return;
+
+  if (!database_)
+    return;
+
+  database_->RemoveOrphanAutofillTableRows();
+
+  // Set the pref so that this fix is never run again.
+  pref_service_->SetBoolean(prefs::kAutofillOrphanRowsRemoved, true);
+}
+
 bool PersonalDataManager::ApplyDedupingRoutine() {
   if (!is_autofill_profile_cleanup_pending_)
     return false;
@@ -2067,7 +2069,7 @@
   return guid;
 }
 
-void PersonalDataManager::CreateTestAddresses() {
+void PersonalDataManager::MaybeCreateTestAddresses() {
   if (has_created_test_addresses_)
     return;
 
@@ -2080,7 +2082,7 @@
   AddProfile(CreateDisusedDeletableTestAddress(app_locale_));
 }
 
-void PersonalDataManager::CreateTestCreditCards() {
+void PersonalDataManager::MaybeCreateTestCreditCards() {
   if (has_created_test_credit_cards_)
     return;
 
@@ -2231,4 +2233,17 @@
          syncer::UploadState::ACTIVE;
 }
 
+void PersonalDataManager::ApplyAddressFixesAndCleanups() {
+  ApplyProfileUseDatesFix();        // One-time fix, otherwise NOP.
+  RemoveOrphanAutofillTableRows();  // One-time fix, otherwise NOP.
+  ApplyDedupingRoutine();           // Once per major version, otherwise NOP.
+  DeleteDisusedAddresses();         // Once per major version, otherwise NOP.
+  MaybeCreateTestAddresses();       // Once per user profile startup.
+}
+
+void PersonalDataManager::ApplyCardFixesAndCleanups() {
+  DeleteDisusedCreditCards();    // Once per major version, otherwise NOP.
+  MaybeCreateTestCreditCards();  // Once per user profile startup.
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h
index b811307..7f584776 100644
--- a/components/autofill/core/browser/personal_data_manager.h
+++ b/components/autofill/core/browser/personal_data_manager.h
@@ -504,6 +504,10 @@
   // whether the routine was run.
   void ApplyProfileUseDatesFix();
 
+  // Runs the routine that removes the orphan rows in the autofill tables if
+  // it's never been done.
+  void RemoveOrphanAutofillTableRows();
+
   // Applies the deduping routine once per major version if the feature is
   // enabled. Calls DedupeProfiles with the content of |web_profiles_| as a
   // parameter. Removes the profiles to delete from the database and updates the
@@ -582,16 +586,22 @@
   // If the AutofillCreateDataForTest feature is enabled, this helper creates
   // autofill address data that would otherwise be difficult to create
   // manually using the UI.
-  void CreateTestAddresses();
+  void MaybeCreateTestAddresses();
 
   // If the AutofillCreateDataForTest feature is enabled, this helper creates
   // autofill credit card data that would otherwise be difficult to create
   // manually using the UI.
-  void CreateTestCreditCards();
+  void MaybeCreateTestCreditCards();
 
   // Whether the server cards are enabled and should be suggested to the user.
   bool ShouldSuggestServerCards() const;
 
+  // Applies various fixes and cleanups on autofill addresses.
+  void ApplyAddressFixesAndCleanups();
+
+  // Applies various fixes and cleanups on autofill credit cards.
+  void ApplyCardFixesAndCleanups();
+
   const std::string app_locale_;
 
   // The default country code for new addresses.
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc
index 7b0d130c..31cbe83 100644
--- a/components/autofill/core/browser/webdata/autofill_table.cc
+++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -1854,6 +1854,31 @@
   return s.Run();
 }
 
+bool AutofillTable::RemoveOrphanAutofillTableRows() {
+  // Get all the orphan guids.
+  std::set<std::string> orphan_guids;
+  sql::Statement s_orphan_profile_pieces_get(db_->GetUniqueStatement(
+      "SELECT guid FROM (SELECT guid FROM autofill_profile_names UNION SELECT "
+      "guid FROM autofill_profile_emails UNION SELECT guid FROM "
+      "autofill_profile_phones) WHERE guid NOT IN (SELECT guid FROM "
+      "autofill_profiles)"));
+
+  // Put the orphan guids in a set.
+  while (s_orphan_profile_pieces_get.Step())
+    orphan_guids.insert(s_orphan_profile_pieces_get.ColumnString(0));
+
+  if (!s_orphan_profile_pieces_get.Succeeded())
+    return false;
+
+  // Remove the profile pieces for the orphan guids.
+  for (const std::string& guid : orphan_guids) {
+    if (!RemoveAutofillProfilePieces(guid, db_))
+      return false;
+  }
+
+  return true;
+}
+
 bool AutofillTable::InitMainTable() {
   if (!db_->DoesTableExist("autofill")) {
     if (!db_->Execute("CREATE TABLE autofill ("
diff --git a/components/autofill/core/browser/webdata/autofill_table.h b/components/autofill/core/browser/webdata/autofill_table.h
index 28c783d..2d720be 100644
--- a/components/autofill/core/browser/webdata/autofill_table.h
+++ b/components/autofill/core/browser/webdata/autofill_table.h
@@ -451,6 +451,12 @@
       const sync_pb::ModelTypeState& model_type_state) override;
   bool ClearModelTypeState(syncer::ModelType model_type) override;
 
+  // Removes the orphan rows in the autofill_profile_names,
+  // autofill_profile_emails and autofill_profile_phones table that were not
+  // removed in the previous implementation of
+  // RemoveAutofillDataModifiedBetween(see crbug.com/836737).
+  bool RemoveOrphanAutofillTableRows();
+
   // Table migration functions. NB: These do not and should not rely on other
   // functions in this class. The implementation of a function such as
   // GetCreditCard may change over time, but MigrateToVersionXX should never
diff --git a/components/autofill/core/browser/webdata/autofill_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
index d0c7784..fed5711 100644
--- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
@@ -2437,4 +2437,153 @@
   EXPECT_FALSE(table_->GetAllSyncMetadata(syncer::AUTOFILL, &metadata_batch));
 }
 
+TEST_F(AutofillTableTest, RemoveOrphanAutofillTableRows) {
+  // Populate the different tables.
+  ASSERT_TRUE(db_->GetSQLConnection()->Execute(
+      // Add a profile in all the tables
+      "INSERT INTO autofill_profiles (guid, date_modified) "
+      "VALUES('00000000-0000-0000-0000-000000000000', 11);"
+      "INSERT INTO autofill_profile_names (guid, full_name) "
+      "VALUES('00000000-0000-0000-0000-000000000000', 'John Jones');"
+      "INSERT INTO autofill_profile_emails (guid, email) "
+      "VALUES('00000000-0000-0000-0000-000000000000', 'john@jones.com');"
+      "INSERT INTO autofill_profile_phones (guid, number) "
+      "VALUES('00000000-0000-0000-0000-000000000000', '111-111-1111');"
+
+      // Add a profile in profiles, names and emails tables.
+      "INSERT INTO autofill_profiles (guid, date_modified) "
+      "VALUES('00000000-0000-0000-0000-000000000001', 21);"
+      "INSERT INTO autofill_profile_names (guid, full_name) "
+      "VALUES('00000000-0000-0000-0000-000000000001', 'John Jones2');"
+      "INSERT INTO autofill_profile_emails (guid, email) "
+      "VALUES('00000000-0000-0000-0000-000000000001', 'john@jones2.com');"
+
+      // Add a profile in profiles, names and phones tables.
+      "INSERT INTO autofill_profiles (guid, date_modified) "
+      "VALUES('00000000-0000-0000-0000-000000000002', 31);"
+      "INSERT INTO autofill_profile_names (guid, full_name) "
+      "VALUES('00000000-0000-0000-0000-000000000002', 'John Jones3');"
+      "INSERT INTO autofill_profile_phones (guid, number) "
+      "VALUES('00000000-0000-0000-0000-000000000002', '333-333-3333');"
+
+      // Add a profile in profiles, emails and phones tables.
+      "INSERT INTO autofill_profiles (guid, date_modified) "
+      "VALUES('00000000-0000-0000-0000-000000000003', 41);"
+      "INSERT INTO autofill_profile_emails (guid, email) "
+      "VALUES('00000000-0000-0000-0000-000000000003', 'john@jones4.com');"
+      "INSERT INTO autofill_profile_phones (guid, number) "
+      "VALUES('00000000-0000-0000-0000-000000000003', '444-444-4444');"
+
+      // Add a orphan profile in names, emails and phones tables.
+      "INSERT INTO autofill_profile_names (guid, full_name) "
+      "VALUES('00000000-0000-0000-0000-000000000004', 'John Jones5');"
+      "INSERT INTO autofill_profile_emails (guid, email) "
+      "VALUES('00000000-0000-0000-0000-000000000004', 'john@jones5.com');"
+      "INSERT INTO autofill_profile_phones (guid, number) "
+      "VALUES('00000000-0000-0000-0000-000000000004', '555-555-5555');"
+
+      // Add a orphan profile in names and emails tables.
+      "INSERT INTO autofill_profile_names (guid, full_name) "
+      "VALUES('00000000-0000-0000-0000-000000000005', 'John Jones6');"
+      "INSERT INTO autofill_profile_emails (guid, email) "
+      "VALUES('00000000-0000-0000-0000-000000000005', 'john@jones6.com');"
+
+      // Add a orphan profile in names and phones tables.
+      "INSERT INTO autofill_profile_names (guid, full_name) "
+      "VALUES('00000000-0000-0000-0000-000000000006', 'John Jones7');"
+      "INSERT INTO autofill_profile_phones (guid, number) "
+      "VALUES('00000000-0000-0000-0000-000000000006', '777-777-7777');"
+
+      // Add a orphan profile in emails and phones tables.
+      "INSERT INTO autofill_profile_emails (guid, email) "
+      "VALUES('00000000-0000-0000-0000-000000000007', 'john@jones8.com');"
+      "INSERT INTO autofill_profile_phones (guid, number) "
+      "VALUES('00000000-0000-0000-0000-000000000007', '999-999-9999');"
+
+      // Add a orphan profile in the names table.
+      "INSERT INTO autofill_profile_names (guid, full_name) "
+      "VALUES('00000000-0000-0000-0000-000000000008', 'John Jones9');"
+
+      // Add a orphan profile in the emails table.
+      "INSERT INTO autofill_profile_emails (guid, email) "
+      "VALUES('00000000-0000-0000-0000-000000000009', 'john@jones10.com');"
+
+      // Add a orphan profile in the phones table.
+      "INSERT INTO autofill_profile_phones (guid, number) "
+      "VALUES('00000000-0000-0000-0000-000000000010', '101-010-1010');"));
+
+  ASSERT_TRUE(table_->RemoveOrphanAutofillTableRows());
+
+  // Make sure that all the rows in the autofill_profiles table are still
+  // present.
+  sql::Statement s_autofill_profiles(
+      db_->GetSQLConnection()->GetUniqueStatement(
+          "SELECT guid FROM autofill_profiles"));
+  ASSERT_TRUE(s_autofill_profiles.is_valid());
+  ASSERT_TRUE(s_autofill_profiles.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000000",
+            s_autofill_profiles.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profiles.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000001",
+            s_autofill_profiles.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profiles.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000002",
+            s_autofill_profiles.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profiles.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000003",
+            s_autofill_profiles.ColumnString(0));
+  EXPECT_FALSE(s_autofill_profiles.Step());
+
+  // Make sure that only the rows present in the autofill_profiles table are
+  // present in the autofill_profile_names table.
+  sql::Statement s_autofill_profile_names(
+      db_->GetSQLConnection()->GetUniqueStatement(
+          "SELECT guid FROM autofill_profile_names"));
+  ASSERT_TRUE(s_autofill_profile_names.is_valid());
+  ASSERT_TRUE(s_autofill_profile_names.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000000",
+            s_autofill_profile_names.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profile_names.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000001",
+            s_autofill_profile_names.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profile_names.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000002",
+            s_autofill_profile_names.ColumnString(0));
+  EXPECT_FALSE(s_autofill_profile_names.Step());
+
+  // Make sure that only the rows present in the autofill_profiles table are
+  // present in the autofill_profile_emails table.
+  sql::Statement s_autofill_profile_emails(
+      db_->GetSQLConnection()->GetUniqueStatement(
+          "SELECT guid FROM autofill_profile_emails"));
+  ASSERT_TRUE(s_autofill_profile_emails.is_valid());
+  ASSERT_TRUE(s_autofill_profile_emails.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000000",
+            s_autofill_profile_emails.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profile_emails.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000001",
+            s_autofill_profile_emails.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profile_emails.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000003",
+            s_autofill_profile_emails.ColumnString(0));
+  EXPECT_FALSE(s_autofill_profile_emails.Step());
+
+  // Make sure that only the rows present in the autofill_profiles table are
+  // present in the autofill_profile_phones table.
+  sql::Statement s_autofill_profile_phones(
+      db_->GetSQLConnection()->GetUniqueStatement(
+          "SELECT guid FROM autofill_profile_phones"));
+  ASSERT_TRUE(s_autofill_profile_phones.is_valid());
+  ASSERT_TRUE(s_autofill_profile_phones.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000000",
+            s_autofill_profile_phones.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profile_phones.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000002",
+            s_autofill_profile_phones.ColumnString(0));
+  ASSERT_TRUE(s_autofill_profile_phones.Step());
+  EXPECT_EQ("00000000-0000-0000-0000-000000000003",
+            s_autofill_profile_phones.ColumnString(0));
+  EXPECT_FALSE(s_autofill_profile_phones.Step());
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/webdata/autofill_webdata.h b/components/autofill/core/browser/webdata/autofill_webdata.h
index 07fe500..fc715a0 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata.h
+++ b/components/autofill/core/browser/webdata/autofill_webdata.h
@@ -126,6 +126,10 @@
   // the database.
   virtual void RemoveOriginURLsModifiedBetween(
       const base::Time& delete_begin, const base::Time& delete_end) = 0;
+
+  // Removes the orphan rows in the autofill_profile_names,
+  // autofill_profile_emails and autofill_profile_phones tables.
+  virtual void RemoveOrphanAutofillTableRows() = 0;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
index 67de789..27f562f9 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
+++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
@@ -501,4 +501,13 @@
   return WebDatabase::COMMIT_NOT_NEEDED;
 }
 
+WebDatabase::State AutofillWebDataBackendImpl::RemoveOrphanAutofillTableRows(
+    WebDatabase* db) {
+  DCHECK(owning_task_runner()->RunsTasksInCurrentSequence());
+  if (AutofillTable::FromWebDatabase(db)->RemoveOrphanAutofillTableRows()) {
+    return WebDatabase::COMMIT_NEEDED;
+  }
+  return WebDatabase::COMMIT_NOT_NEEDED;
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
index 9fcbc87..59d7b12c 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
+++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
@@ -179,6 +179,10 @@
       const base::Time& delete_end,
       WebDatabase* db);
 
+  // Removes the orphan rows in the autofill_profile_names,
+  // autofill_profile_emails and autofill_profile_phones tables.
+  WebDatabase::State RemoveOrphanAutofillTableRows(WebDatabase* db);
+
  protected:
   ~AutofillWebDataBackendImpl() override;
 
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service.cc b/components/autofill/core/browser/webdata/autofill_webdata_service.cc
index 2752366..f81b0b5f 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_service.cc
+++ b/components/autofill/core/browser/webdata/autofill_webdata_service.cc
@@ -251,6 +251,13 @@
            autofill_backend_, delete_begin, delete_end));
 }
 
+void AutofillWebDataService::RemoveOrphanAutofillTableRows() {
+  wdbs_->ScheduleDBTask(
+      FROM_HERE,
+      Bind(&AutofillWebDataBackendImpl::RemoveOrphanAutofillTableRows,
+           autofill_backend_));
+}
+
 void AutofillWebDataService::AddObserver(
     AutofillWebDataServiceObserverOnDBSequence* observer) {
   DCHECK(db_task_runner_->RunsTasksInCurrentSequence());
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service.h b/components/autofill/core/browser/webdata/autofill_webdata_service.h
index f6d265b3..fe42a7e 100644
--- a/components/autofill/core/browser/webdata/autofill_webdata_service.h
+++ b/components/autofill/core/browser/webdata/autofill_webdata_service.h
@@ -108,6 +108,8 @@
   void RemoveOriginURLsModifiedBetween(const base::Time& delete_begin,
                                        const base::Time& delete_end) override;
 
+  void RemoveOrphanAutofillTableRows() override;
+
   void AddObserver(AutofillWebDataServiceObserverOnDBSequence* observer);
   void RemoveObserver(AutofillWebDataServiceObserverOnDBSequence* observer);
 
diff --git a/components/autofill/core/common/autofill_pref_names.cc b/components/autofill/core/common/autofill_pref_names.cc
index ec4976a..c24d617 100644
--- a/components/autofill/core/common/autofill_pref_names.cc
+++ b/components/autofill/core/common/autofill_pref_names.cc
@@ -7,10 +7,21 @@
 namespace autofill {
 namespace prefs {
 
+// Integer that is set to the last choice user made when prompted for saving a
+// credit card. The prompt is for user's consent in saving the card in the
+// server for signed in users and saving the card locally for non signed-in
+// users.
+const char kAutofillAcceptSaveCreditCardPromptState[] =
+    "autofill.accept_save_credit_card_prompt_state";
+
 // Integer that is set to the billing customer number fetched from priority
 // preference.
 const char kAutofillBillingCustomerNumber[] = "billing_customer_number";
 
+// Boolean that is true if Autofill is enabled and allowed to save credit card
+// data.
+const char kAutofillCreditCardEnabled[] = "autofill.credit_card_enabled";
+
 // Number of times the credit card signin promo has been shown.
 const char kAutofillCreditCardSigninPromoImpressionCount[] =
     "autofill.credit_card_signin_promo_impression_count";
@@ -18,14 +29,6 @@
 // Boolean that is true if Autofill is enabled and allowed to save profile data.
 const char kAutofillEnabled[] = "autofill.enabled";
 
-// Boolean that is true if Autofill address profiles were fixed regarding their
-// bad use dates.
-const char kAutofillProfileUseDatesFixed[] = "autofill.profile_use_dates_fixed";
-
-// Boolean that's true when Wallet card and address import is enabled by the
-// user.
-const char kAutofillWalletImportEnabled[] = "autofill.wallet_import_enabled";
-
 // Integer that is set to the last version where the profile deduping routine
 // was run. This routine will be run once per version.
 const char kAutofillLastVersionDeduped[] = "autofill.last_version_deduped";
@@ -40,21 +43,21 @@
 const char kAutofillLastVersionDisusedCreditCardsDeleted[] =
     "autofill.last_version_disused_credit_cards_deleted";
 
+// Boolean that is true if the orphan rows in the autofill table were removed.
+const char kAutofillOrphanRowsRemoved[] = "autofill.orphan_rows_removed";
+
+// Boolean that is true if Autofill address profiles were fixed regarding their
+// bad use dates.
+const char kAutofillProfileUseDatesFixed[] = "autofill.profile_use_dates_fixed";
+
+// Boolean that's true when Wallet card and address import is enabled by the
+// user.
+const char kAutofillWalletImportEnabled[] = "autofill.wallet_import_enabled";
+
 // Boolean that is set to the last choice user made when prompted for saving an
 // unmasked server card locally.
 const char kAutofillWalletImportStorageCheckboxState[] =
     "autofill.wallet_import_storage_checkbox_state";
 
-// Integer that is set to the last choice user made when prompted for saving a
-// credit card. The prompt is for user's consent in saving the card in the
-// server for signed in users and saving the card locally for non signed-in
-// users.
-const char kAutofillAcceptSaveCreditCardPromptState[] =
-    "autofill.accept_save_credit_card_prompt_state";
-
-// Boolean that is true if Autofill is enabled and allowed to save credit card
-// data.
-const char kAutofillCreditCardEnabled[] = "autofill.credit_card_enabled";
-
 }  // namespace prefs
 }  // namespace autofill
diff --git a/components/autofill/core/common/autofill_pref_names.h b/components/autofill/core/common/autofill_pref_names.h
index 43c0bdae..53fd353 100644
--- a/components/autofill/core/common/autofill_pref_names.h
+++ b/components/autofill/core/common/autofill_pref_names.h
@@ -19,6 +19,7 @@
 extern const char kAutofillLastVersionDeduped[];
 extern const char kAutofillLastVersionDisusedAddressesDeleted[];
 extern const char kAutofillLastVersionDisusedCreditCardsDeleted[];
+extern const char kAutofillOrphanRowsRemoved[];
 extern const char kAutofillProfileUseDatesFixed[];
 extern const char kAutofillWalletImportEnabled[];
 extern const char kAutofillWalletImportStorageCheckboxState[];
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc
index 0586b890..58d9823 100644
--- a/components/bookmarks/browser/bookmark_model.cc
+++ b/components/bookmarks/browser/bookmark_model.cc
@@ -27,6 +27,7 @@
 #include "components/bookmarks/browser/titled_url_match.h"
 #include "components/bookmarks/browser/typed_count_sorter.h"
 #include "components/bookmarks/browser/url_and_title.h"
+#include "components/bookmarks/common/bookmark_constants.h"
 #include "components/favicon_base/favicon_types.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -55,10 +56,14 @@
   explicit VisibilityComparator(BookmarkClient* client) : client_(client) {}
 
   // Returns true if |n1| precedes |n2|.
-  bool operator()(const std::unique_ptr<BookmarkPermanentNode>& n1,
-                  const std::unique_ptr<BookmarkPermanentNode>& n2) {
-    bool n1_visible = client_->IsPermanentNodeVisible(n1.get());
-    bool n2_visible = client_->IsPermanentNodeVisible(n2.get());
+  bool operator()(const std::unique_ptr<BookmarkNode>& n1,
+                  const std::unique_ptr<BookmarkNode>& n2) {
+    DCHECK(n1->is_permanent_node());
+    DCHECK(n2->is_permanent_node());
+    bool n1_visible = client_->IsPermanentNodeVisible(
+        static_cast<BookmarkPermanentNode*>(n1.get()));
+    bool n2_visible = client_->IsPermanentNodeVisible(
+        static_cast<BookmarkPermanentNode*>(n2.get()));
     return n1_visible != n2_visible && n1_visible;
   }
 
@@ -107,24 +112,34 @@
   DISALLOW_COPY_AND_ASSIGN(EmptyUndoDelegate);
 };
 
+void FinishedLoadOnMainThread(
+    base::OnceCallback<void(std::unique_ptr<BookmarkLoadDetails>)> callback,
+    std::unique_ptr<BookmarkLoadDetails> details) {
+  std::move(callback).Run(std::move(details));
+}
+
+void DoLoadOnBackgroundThread(
+    const base::FilePath& profile_path,
+    scoped_refptr<base::SequencedTaskRunner> result_task_runner,
+    base::OnceCallback<void(std::unique_ptr<BookmarkLoadDetails>)> callback,
+    std::unique_ptr<BookmarkLoadDetails> details) {
+  LoadBookmarks(profile_path, details.get());
+  result_task_runner->PostTask(
+      FROM_HERE, base::BindOnce(&FinishedLoadOnMainThread, std::move(callback),
+                                std::move(details)));
+}
+
 }  // namespace
 
 // BookmarkModel --------------------------------------------------------------
 
 BookmarkModel::BookmarkModel(std::unique_ptr<BookmarkClient> client)
     : client_(std::move(client)),
-      loaded_(false),
-      root_(GURL()),
-      bookmark_bar_node_(nullptr),
-      other_node_(nullptr),
-      mobile_node_(nullptr),
-      next_node_id_(1),
+      root_(std::make_unique<BookmarkNode>(GURL())),
       observers_(base::ObserverListPolicy::EXISTING_ONLY),
       loaded_signal_(base::WaitableEvent::ResetPolicy::MANUAL,
                      base::WaitableEvent::InitialState::NOT_SIGNALED),
-      extensive_changes_(0),
-      undo_delegate_(nullptr),
-      empty_undo_delegate_(new EmptyUndoDelegate) {
+      empty_undo_delegate_(std::make_unique<EmptyUndoDelegate>()) {
   DCHECK(client_);
   client_->Init(this);
 }
@@ -154,19 +169,23 @@
     const base::FilePath& profile_path,
     const scoped_refptr<base::SequencedTaskRunner>& io_task_runner,
     const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner) {
-  if (store_.get()) {
-    // If the store is non-null, it means Load was already invoked. Load should
-    // only be invoked once.
-    NOTREACHED();
-    return;
-  }
+  // If the store is non-null, it means Load was already invoked. Load should
+  // only be invoked once.
+  DCHECK(!store_);
 
-  expanded_state_tracker_.reset(
-      new BookmarkExpandedStateTracker(this, pref_service));
+  expanded_state_tracker_ =
+      std::make_unique<BookmarkExpandedStateTracker>(this, pref_service);
 
-  // Load the bookmarks. BookmarkStorage notifies us when done.
-  store_.reset(new BookmarkStorage(this, profile_path, io_task_runner.get()));
-  store_->LoadBookmarks(CreateLoadDetails(), ui_task_runner);
+  store_ = std::make_unique<BookmarkStorage>(this, profile_path,
+                                             io_task_runner.get());
+  auto done_loading_callback =
+      base::BindOnce(&BookmarkModel::DoneLoading, weak_factory_.GetWeakPtr());
+  io_task_runner->PostTask(
+      FROM_HERE,
+      base::BindOnce(&DoLoadOnBackgroundThread,
+                     profile_path.Append(kBookmarksFileName), ui_task_runner,
+                     std::move(done_loading_callback),
+                     std::make_unique<BookmarkLoadDetails>(client_.get())));
 }
 
 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) {
@@ -228,8 +247,8 @@
   // all children of non-root permanent nodes.
   {
     base::AutoLock url_lock(url_lock_);
-    for (int i = 0; i < root_.child_count(); ++i) {
-      const BookmarkNode* permanent_node = root_.GetChild(i);
+    for (int i = 0; i < root_->child_count(); ++i) {
+      const BookmarkNode* permanent_node = root_->GetChild(i);
 
       if (!client_->CanBeEditedByUser(permanent_node))
         continue;
@@ -789,10 +808,9 @@
 
 void BookmarkModel::RemoveNode(BookmarkNode* node,
                                std::set<GURL>* removed_urls) {
-  if (!loaded_ || !node || is_permanent_node(node)) {
-    NOTREACHED();
-    return;
-  }
+  DCHECK(node);
+  DCHECK(loaded_);
+  DCHECK(!is_permanent_node(node));
 
   url_lock_.AssertAcquired();
   if (node->is_url()) {
@@ -809,11 +827,7 @@
 
 void BookmarkModel::DoneLoading(std::unique_ptr<BookmarkLoadDetails> details) {
   DCHECK(details);
-  if (loaded_) {
-    // We should only ever be loaded once.
-    NOTREACHED();
-    return;
-  }
+  DCHECK(!loaded_);
 
   next_node_id_ = details->max_id();
   if (details->computed_checksum() != details->stored_checksum() ||
@@ -822,48 +836,30 @@
     // externally. In that case, the decoder may have reassigned IDs to make
     // them unique. So when the file has changed externally, we should save the
     // bookmarks file to persist new IDs.
-    if (store_.get())
+    if (store_)
       store_->ScheduleSave();
   }
-  std::unique_ptr<BookmarkPermanentNode> owned_bb_node =
-      details->owned_bb_node();
-  std::unique_ptr<BookmarkPermanentNode> owned_other_folder_node =
-      details->owned_other_folder_node();
-  std::unique_ptr<BookmarkPermanentNode> owned_mobile_folder_node =
-      details->owned_mobile_folder_node();
+
+  root_ = details->owned_root_node();
+  bookmark_bar_node_ = details->bb_node();
+  other_node_ = details->other_folder_node();
+  mobile_node_ = details->mobile_folder_node();
+
   index_ = details->owned_index();
-
-  bookmark_bar_node_ = owned_bb_node.get();
-  other_node_ = owned_other_folder_node.get();
-  mobile_node_ = owned_mobile_folder_node.get();
-
-  // Get any extra nodes and take ownership of them at the |root_|.
-  std::vector<std::unique_ptr<BookmarkPermanentNode>> extra_nodes =
-      details->owned_extra_nodes();
-
-  // WARNING: order is important here, various places assume the order is
-  // constant (but can vary between embedders with the initial visibility
-  // of permanent nodes).
-  std::vector<std::unique_ptr<BookmarkPermanentNode>> root_children;
-  root_children.push_back(std::move(owned_bb_node));
-  root_children.push_back(std::move(owned_other_folder_node));
-  root_children.push_back(std::move(owned_mobile_folder_node));
-  std::move(extra_nodes.begin(), extra_nodes.end(),
-            std::back_inserter(root_children));
-
-  std::stable_sort(root_children.begin(),
-                   root_children.end(),
+  index_->SetNodeSorter(std::make_unique<TypedCountSorter>(client_.get()));
+  // Sorting the permanent nodes has to happen on the main thread, so we do it
+  // here, after loading completes.
+  std::stable_sort(root_->children().begin(), root_->children().end(),
                    VisibilityComparator(client_.get()));
-  for (size_t i = 0; i < root_children.size(); ++i)
-    root_.Add(std::move(root_children[i]), static_cast<int>(i));
 
-  root_.SetMetaInfoMap(details->model_meta_info_map());
-  root_.set_sync_transaction_version(details->model_sync_transaction_version());
+  root_->SetMetaInfoMap(details->model_meta_info_map());
+  root_->set_sync_transaction_version(
+      details->model_sync_transaction_version());
 
   {
     base::AutoLock url_lock(url_lock_);
     // Update nodes_ordered_by_url_set_ from the nodes.
-    PopulateNodesByURL(&root_);
+    PopulateNodesByURL(root_.get());
   }
 
   loaded_ = true;
@@ -982,36 +978,6 @@
                           (allow_end && index == parent->child_count()))));
 }
 
-BookmarkPermanentNode* BookmarkModel::CreatePermanentNode(
-    BookmarkNode::Type type) {
-  DCHECK(type == BookmarkNode::BOOKMARK_BAR ||
-         type == BookmarkNode::OTHER_NODE ||
-         type == BookmarkNode::MOBILE);
-  BookmarkPermanentNode* node =
-      new BookmarkPermanentNode(generate_next_node_id());
-  node->set_type(type);
-  node->set_visible(client_->IsPermanentNodeVisible(node));
-
-  int title_id;
-  switch (type) {
-    case BookmarkNode::BOOKMARK_BAR:
-      title_id = IDS_BOOKMARK_BAR_FOLDER_NAME;
-      break;
-    case BookmarkNode::OTHER_NODE:
-      title_id = IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME;
-      break;
-    case BookmarkNode::MOBILE:
-      title_id = IDS_BOOKMARK_BAR_MOBILE_FOLDER_NAME;
-      break;
-    default:
-      NOTREACHED();
-      title_id = IDS_BOOKMARK_BAR_FOLDER_NAME;
-      break;
-  }
-  node->SetTitle(l10n_util::GetStringUTF16(title_id));
-  return node;
-}
-
 void BookmarkModel::OnFaviconDataAvailable(
     BookmarkNode* node,
     favicon_base::IconType icon_type,
@@ -1077,23 +1043,10 @@
 }
 
 int64_t BookmarkModel::generate_next_node_id() {
+  DCHECK(loaded_);
   return next_node_id_++;
 }
 
-std::unique_ptr<BookmarkLoadDetails> BookmarkModel::CreateLoadDetails() {
-  BookmarkPermanentNode* bb_node =
-      CreatePermanentNode(BookmarkNode::BOOKMARK_BAR);
-  BookmarkPermanentNode* other_node =
-      CreatePermanentNode(BookmarkNode::OTHER_NODE);
-  BookmarkPermanentNode* mobile_node =
-      CreatePermanentNode(BookmarkNode::MOBILE);
-  std::unique_ptr<TitledUrlNodeSorter> node_sorter =
-      std::make_unique<TypedCountSorter>(client_.get());
-  return std::unique_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails(
-      bb_node, other_node, mobile_node, client_->GetLoadExtraNodesCallback(),
-      new TitledUrlIndex(std::move(node_sorter)), next_node_id_));
-}
-
 void BookmarkModel::SetUndoDelegate(BookmarkUndoDelegate* undo_delegate) {
   undo_delegate_ = undo_delegate;
   if (undo_delegate_)
diff --git a/components/bookmarks/browser/bookmark_model.h b/components/bookmarks/browser/bookmark_model.h
index 17300ca6..65eb2ce 100644
--- a/components/bookmarks/browser/bookmark_model.h
+++ b/components/bookmarks/browser/bookmark_model.h
@@ -16,6 +16,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/strings/string16.h"
 #include "base/synchronization/lock.h"
@@ -76,10 +77,9 @@
   // KeyedService:
   void Shutdown() override;
 
-  // Loads the bookmarks. This is called upon creation of the
-  // BookmarkModel. You need not invoke this directly.
-  // All load operations will be executed on |io_task_runner| and the completion
-  // callback will be called from |ui_task_runner|.
+  // Loads the bookmarks. This is called upon creation of the BookmarkModel. You
+  // need not invoke this directly. All load operations will be executed on
+  // |io_task_runner|. |ui_task_runner| is the task runner the model runs on.
   void Load(PrefService* pref_service,
             const base::FilePath& profile_path,
             const scoped_refptr<base::SequencedTaskRunner>& io_task_runner,
@@ -90,7 +90,7 @@
 
   // Returns the root node. The 'bookmark bar' node and 'other' node are
   // children of the root node.
-  const BookmarkNode* root_node() const { return &root_; }
+  const BookmarkNode* root_node() const { return root_.get(); }
 
   // Returns the 'bookmark bar' node. This is NULL until loaded.
   const BookmarkNode* bookmark_bar_node() const { return bookmark_bar_node_; }
@@ -101,13 +101,15 @@
   // Returns the 'mobile' node. This is NULL until loaded.
   const BookmarkNode* mobile_node() const { return mobile_node_; }
 
-  bool is_root_node(const BookmarkNode* node) const { return node == &root_; }
+  bool is_root_node(const BookmarkNode* node) const {
+    return node == root_.get();
+  }
 
   // Returns whether the given |node| is one of the permanent nodes - root node,
   // 'bookmark bar' node, 'other' node or 'mobile' node, or one of the root
   // nodes supplied by the |client_|.
   bool is_permanent_node(const BookmarkNode* node) const {
-    return node && (node == &root_ || node->parent() == &root_);
+    return node && (node == root_.get() || node->parent() == root_.get());
   }
 
   void AddObserver(BookmarkModelObserver* observer);
@@ -346,8 +348,7 @@
   // This does NOT delete the node.
   void RemoveNode(BookmarkNode* node, std::set<GURL>* removed_urls);
 
-  // Invoked when loading is finished. Sets |loaded_| and notifies observers.
-  // BookmarkModel takes ownership of |details|.
+  // Called when done loading. Updates internal state and notifies observers.
   void DoneLoading(std::unique_ptr<BookmarkLoadDetails> details);
 
   // Populates |nodes_ordered_by_url_set_| from root.
@@ -380,10 +381,6 @@
   // Returns true if the parent and index are valid.
   bool IsValidIndex(const BookmarkNode* parent, int index, bool allow_end);
 
-  // Creates one of the possible permanent nodes (bookmark bar node, other node
-  // and mobile node) from |type|.
-  BookmarkPermanentNode* CreatePermanentNode(BookmarkNode::Type type);
-
   // Notification that a favicon has finished loading. If we can decode the
   // favicon, FaviconLoaded is invoked.
   void OnFaviconDataAvailable(
@@ -414,27 +411,23 @@
   // decoding since during decoding codec assigns node IDs.
   void set_next_node_id(int64_t id) { next_node_id_ = id; }
 
-  // Creates and returns a new BookmarkLoadDetails. It's up to the caller to
-  // delete the returned object.
-  std::unique_ptr<BookmarkLoadDetails> CreateLoadDetails();
-
   BookmarkUndoDelegate* undo_delegate() const;
 
   std::unique_ptr<BookmarkClient> client_;
 
   // Whether the initial set of data has been loaded.
-  bool loaded_;
+  bool loaded_ = false;
 
   // The root node. This contains the bookmark bar node, the 'other' node and
   // the mobile node as children.
-  BookmarkNode root_;
+  std::unique_ptr<BookmarkNode> root_;
 
-  BookmarkPermanentNode* bookmark_bar_node_;
-  BookmarkPermanentNode* other_node_;
-  BookmarkPermanentNode* mobile_node_;
+  BookmarkPermanentNode* bookmark_bar_node_ = nullptr;
+  BookmarkPermanentNode* other_node_ = nullptr;
+  BookmarkPermanentNode* mobile_node_ = nullptr;
 
   // The maximum ID assigned to the bookmark nodes in the model.
-  int64_t next_node_id_;
+  int64_t next_node_id_ = 1;
 
   // The observers.
   base::ObserverList<BookmarkModelObserver> observers_;
@@ -458,15 +451,17 @@
   base::WaitableEvent loaded_signal_;
 
   // See description of IsDoingExtensiveChanges above.
-  int extensive_changes_;
+  int extensive_changes_ = 0;
 
   std::unique_ptr<BookmarkExpandedStateTracker> expanded_state_tracker_;
 
   std::set<std::string> non_cloned_keys_;
 
-  BookmarkUndoDelegate* undo_delegate_;
+  BookmarkUndoDelegate* undo_delegate_ = nullptr;
   std::unique_ptr<BookmarkUndoDelegate> empty_undo_delegate_;
 
+  base::WeakPtrFactory<BookmarkModel> weak_factory_{this};
+
   DISALLOW_COPY_AND_ASSIGN(BookmarkModel);
 };
 
diff --git a/components/bookmarks/browser/bookmark_node.cc b/components/bookmarks/browser/bookmark_node.cc
index 5c2522a..8b68d4e 100644
--- a/components/bookmarks/browser/bookmark_node.cc
+++ b/components/bookmarks/browser/bookmark_node.cc
@@ -26,19 +26,15 @@
 
 // BookmarkNode ---------------------------------------------------------------
 
+// static
 const int64_t BookmarkNode::kInvalidSyncTransactionVersion = -1;
 
-BookmarkNode::BookmarkNode(const GURL& url)
-    : url_(url) {
-  Initialize(0);
-}
+BookmarkNode::BookmarkNode(const GURL& url) : BookmarkNode(0, url, false) {}
 
-BookmarkNode::BookmarkNode(int64_t id, const GURL& url) : url_(url) {
-  Initialize(id);
-}
+BookmarkNode::BookmarkNode(int64_t id, const GURL& url)
+    : BookmarkNode(id, url, false) {}
 
-BookmarkNode::~BookmarkNode() {
-}
+BookmarkNode::~BookmarkNode() = default;
 
 void BookmarkNode::SetTitle(const base::string16& title) {
   // Replace newlines and other problematic whitespace characters in
@@ -111,16 +107,13 @@
   return url_;
 }
 
-void BookmarkNode::Initialize(int64_t id) {
-  id_ = id;
-  type_ = url_.is_empty() ? FOLDER : URL;
-  date_added_ = base::Time::Now();
-  favicon_type_ = favicon_base::IconType::kInvalid;
-  favicon_state_ = INVALID_FAVICON;
-  favicon_load_task_id_ = base::CancelableTaskTracker::kBadTaskId;
-  meta_info_map_.reset();
-  sync_transaction_version_ = kInvalidSyncTransactionVersion;
-}
+BookmarkNode::BookmarkNode(int64_t id, const GURL& url, bool is_permanent_node)
+    : id_(id),
+      url_(url),
+      type_(url_.is_empty() ? FOLDER : URL),
+      date_added_(base::Time::Now()),
+      favicon_type_(favicon_base::IconType::kInvalid),
+      is_permanent_node_(is_permanent_node) {}
 
 void BookmarkNode::InvalidateFavicon() {
   icon_url_.reset();
@@ -132,10 +125,9 @@
 // BookmarkPermanentNode -------------------------------------------------------
 
 BookmarkPermanentNode::BookmarkPermanentNode(int64_t id)
-    : BookmarkNode(id, GURL()), visible_(true) {}
+    : BookmarkNode(id, GURL(), true) {}
 
-BookmarkPermanentNode::~BookmarkPermanentNode() {
-}
+BookmarkPermanentNode::~BookmarkPermanentNode() = default;
 
 bool BookmarkPermanentNode::IsVisible() const {
   return visible_ || !empty();
diff --git a/components/bookmarks/browser/bookmark_node.h b/components/bookmarks/browser/bookmark_node.h
index 7576f6c..e6ce83ca 100644
--- a/components/bookmarks/browser/bookmark_node.h
+++ b/components/bookmarks/browser/bookmark_node.h
@@ -53,6 +53,10 @@
 
   ~BookmarkNode() override;
 
+  // Returns true if the node is a BookmarkPermanentNode (which does not include
+  // the root).
+  bool is_permanent_node() const { return is_permanent_node_; }
+
   // Set the node's internal title. Note that this neither invokes observers
   // nor updates any bookmark model this node may be in. For that functionality,
   // BookmarkModel::SetTitle(..) should be used instead.
@@ -123,12 +127,12 @@
   // TODO(sky): Consider adding last visit time here, it'll greatly simplify
   // HistoryContentsProvider.
 
+ protected:
+  BookmarkNode(int64_t id, const GURL& url, bool is_permanent_node);
+
  private:
   friend class BookmarkModel;
 
-  // A helper function to initialize various fields during construction.
-  void Initialize(int64_t id);
-
   // Called when the favicon becomes invalid.
   void InvalidateFavicon();
 
@@ -182,18 +186,21 @@
   std::unique_ptr<GURL> icon_url_;
 
   // The loading state of the favicon.
-  FaviconState favicon_state_;
+  FaviconState favicon_state_ = INVALID_FAVICON;
 
   // If not base::CancelableTaskTracker::kBadTaskId, it indicates
   // we're loading the
   // favicon and the task is tracked by CancelabelTaskTracker.
-  base::CancelableTaskTracker::TaskId favicon_load_task_id_;
+  base::CancelableTaskTracker::TaskId favicon_load_task_id_ =
+      base::CancelableTaskTracker::kBadTaskId;
 
   // A map that stores arbitrary meta information about the node.
   std::unique_ptr<MetaInfoMap> meta_info_map_;
 
-  // The sync transaction version. Defaults to kInvalidSyncTransactionVersion.
-  int64_t sync_transaction_version_;
+  // The sync transaction version.
+  int64_t sync_transaction_version_ = kInvalidSyncTransactionVersion;
+
+  const bool is_permanent_node_;
 
   DISALLOW_COPY_AND_ASSIGN(BookmarkNode);
 };
@@ -213,7 +220,7 @@
   bool IsVisible() const override;
 
  private:
-  bool visible_;
+  bool visible_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(BookmarkPermanentNode);
 };
diff --git a/components/bookmarks/browser/bookmark_storage.cc b/components/bookmarks/browser/bookmark_storage.cc
index cf64723..d1af975 100644
--- a/components/bookmarks/browser/bookmark_storage.cc
+++ b/components/bookmarks/browser/bookmark_storage.cc
@@ -16,11 +16,15 @@
 #include "base/json/json_string_value_serializer.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
+#include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "components/bookmarks/browser/bookmark_codec.h"
 #include "components/bookmarks/browser/bookmark_model.h"
+#include "components/bookmarks/browser/bookmark_node.h"
 #include "components/bookmarks/browser/titled_url_index.h"
 #include "components/bookmarks/common/bookmark_constants.h"
+#include "components/strings/grit/components_strings.h"
+#include "ui/base/l10n/l10n_util.h"
 
 using base::TimeTicks;
 
@@ -51,10 +55,10 @@
   }
 }
 
-void LoadCallback(const base::FilePath& path,
-                  const base::WeakPtr<BookmarkStorage>& storage,
-                  std::unique_ptr<BookmarkLoadDetails> details,
-                  base::SequencedTaskRunner* task_runner) {
+}  // namespace
+
+void LoadBookmarks(const base::FilePath& path, BookmarkLoadDetails* details) {
+  base::AssertBlockingAllowed();
   bool load_index = false;
   bool bookmark_file_exists = base::PathExists(path);
   if (bookmark_file_exists) {
@@ -98,60 +102,82 @@
 
   // Load any extra root nodes now, after the IDs have been potentially
   // reassigned.
-  details->LoadExtraNodes();
-
-  // Load the index if there are any bookmarks in the extra nodes.
-  const BookmarkPermanentNodeList& extra_nodes = details->extra_nodes();
-  for (size_t i = 0; i < extra_nodes.size(); ++i) {
-    if (!extra_nodes[i]->empty()) {
-      load_index = true;
-      break;
-    }
-  }
-
-  if (load_index) {
+  if (details->LoadExtraNodes()) {
     TimeTicks start_time = TimeTicks::Now();
-    AddBookmarksToIndex(details.get(), details->bb_node());
-    AddBookmarksToIndex(details.get(), details->other_folder_node());
-    AddBookmarksToIndex(details.get(), details->mobile_folder_node());
-    for (size_t i = 0; i < extra_nodes.size(); ++i)
-      AddBookmarksToIndex(details.get(), extra_nodes[i].get());
+    AddBookmarksToIndex(details, details->root_node());
     UMA_HISTOGRAM_TIMES("Bookmarks.CreateBookmarkIndexTime",
                         TimeTicks::Now() - start_time);
   }
-
-  task_runner->PostTask(
-      FROM_HERE, base::BindOnce(&BookmarkStorage::OnLoadFinished, storage,
-                                std::move(details)));
 }
 
-}  // namespace
-
 // BookmarkLoadDetails ---------------------------------------------------------
 
-BookmarkLoadDetails::BookmarkLoadDetails(
-    BookmarkPermanentNode* bb_node,
-    BookmarkPermanentNode* other_folder_node,
-    BookmarkPermanentNode* mobile_folder_node,
-    const LoadExtraCallback& load_extra_callback,
-    TitledUrlIndex* index,
-    int64_t max_id)
-    : bb_node_(bb_node),
-      other_folder_node_(other_folder_node),
-      mobile_folder_node_(mobile_folder_node),
-      load_extra_callback_(load_extra_callback),
-      index_(index),
+BookmarkLoadDetails::BookmarkLoadDetails(BookmarkClient* client)
+    : load_extra_callback_(client->GetLoadExtraNodesCallback()),
+      index_(std::make_unique<TitledUrlIndex>()),
       model_sync_transaction_version_(
-          BookmarkNode::kInvalidSyncTransactionVersion),
-      max_id_(max_id),
-      ids_reassigned_(false) {}
+          BookmarkNode::kInvalidSyncTransactionVersion) {
+  // WARNING: do NOT add |client| as a member. Much of this code runs on another
+  // thread, and |client_| is not thread safe, and/or may be destroyed before
+  // this.
+  root_node_ = std::make_unique<BookmarkNode>(GURL());
+  root_node_ptr_ = root_node_.get();
+  // WARNING: order is important here, various places assume the order is
+  // constant (but can vary between embedders with the initial visibility
+  // of permanent nodes).
+  bb_node_ = CreatePermanentNode(client, BookmarkNode::BOOKMARK_BAR);
+  other_folder_node_ = CreatePermanentNode(client, BookmarkNode::OTHER_NODE);
+  mobile_folder_node_ = CreatePermanentNode(client, BookmarkNode::MOBILE);
+}
 
 BookmarkLoadDetails::~BookmarkLoadDetails() {
 }
 
-void BookmarkLoadDetails::LoadExtraNodes() {
-  if (!load_extra_callback_.is_null())
-    extra_nodes_ = load_extra_callback_.Run(&max_id_);
+bool BookmarkLoadDetails::LoadExtraNodes() {
+  if (!load_extra_callback_)
+    return false;
+
+  BookmarkPermanentNodeList extra_nodes =
+      std::move(load_extra_callback_).Run(&max_id_);
+  bool has_non_empty_node = false;
+  for (auto& node : extra_nodes) {
+    if (node->child_count() != 0)
+      has_non_empty_node = true;
+    root_node_->Add(std::move(node), root_node_->child_count());
+  }
+  return has_non_empty_node;
+}
+
+BookmarkPermanentNode* BookmarkLoadDetails::CreatePermanentNode(
+    BookmarkClient* client,
+    BookmarkNode::Type type) {
+  DCHECK(type == BookmarkNode::BOOKMARK_BAR ||
+         type == BookmarkNode::OTHER_NODE || type == BookmarkNode::MOBILE);
+  std::unique_ptr<BookmarkPermanentNode> node =
+      std::make_unique<BookmarkPermanentNode>(max_id_++);
+  node->set_type(type);
+  node->set_visible(client->IsPermanentNodeVisible(node.get()));
+
+  int title_id;
+  switch (type) {
+    case BookmarkNode::BOOKMARK_BAR:
+      title_id = IDS_BOOKMARK_BAR_FOLDER_NAME;
+      break;
+    case BookmarkNode::OTHER_NODE:
+      title_id = IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME;
+      break;
+    case BookmarkNode::MOBILE:
+      title_id = IDS_BOOKMARK_BAR_MOBILE_FOLDER_NAME;
+      break;
+    default:
+      NOTREACHED();
+      title_id = IDS_BOOKMARK_BAR_FOLDER_NAME;
+      break;
+  }
+  node->SetTitle(l10n_util::GetStringUTF16(title_id));
+  BookmarkPermanentNode* permanent_node = node.get();
+  root_node_->Add(std::move(node), root_node_->child_count());
+  return permanent_node;
 }
 
 // BookmarkStorage -------------------------------------------------------------
@@ -173,15 +199,6 @@
     writer_.DoScheduledWrite();
 }
 
-void BookmarkStorage::LoadBookmarks(
-    std::unique_ptr<BookmarkLoadDetails> details,
-    const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
-  sequenced_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&LoadCallback, writer_.path(), weak_factory_.GetWeakPtr(),
-                     std::move(details), base::RetainedRef(task_runner)));
-}
-
 void BookmarkStorage::ScheduleSave() {
   switch (backup_state_) {
     case BACKUP_NONE:
@@ -222,14 +239,6 @@
   return serializer.Serialize(*(value.get()));
 }
 
-void BookmarkStorage::OnLoadFinished(
-    std::unique_ptr<BookmarkLoadDetails> details) {
-  if (!model_)
-    return;
-
-  model_->DoneLoading(std::move(details));
-}
-
 bool BookmarkStorage::SaveNow() {
   if (!model_ || !model_->loaded()) {
     // We should only get here if we have a valid model and it's finished
diff --git a/components/bookmarks/browser/bookmark_storage.h b/components/bookmarks/browser/bookmark_storage.h
index 6f86188..cad8b244 100644
--- a/components/bookmarks/browser/bookmark_storage.h
+++ b/components/bookmarks/browser/bookmark_storage.h
@@ -26,7 +26,9 @@
 
 namespace bookmarks {
 
+class BookmarkClient;
 class BookmarkModel;
+class BookmarkNode;
 
 // A list of BookmarkPermanentNodes that owns them.
 using BookmarkPermanentNodeList =
@@ -35,7 +37,8 @@
 // A callback that generates a BookmarkPermanentNodeList, given a max ID to
 // use. The max ID argument will be updated after any new nodes have been
 // created and assigned IDs.
-using LoadExtraCallback = base::Callback<BookmarkPermanentNodeList(int64_t*)>;
+using LoadExtraCallback =
+    base::OnceCallback<BookmarkPermanentNodeList(int64_t*)>;
 
 // BookmarkLoadDetails is used by BookmarkStorage when loading bookmarks.
 // BookmarkModel creates a BookmarkLoadDetails and passes it (including
@@ -47,38 +50,21 @@
 // threading problems.
 class BookmarkLoadDetails {
  public:
-  BookmarkLoadDetails(BookmarkPermanentNode* bb_node,
-                      BookmarkPermanentNode* other_folder_node,
-                      BookmarkPermanentNode* mobile_folder_node,
-                      const LoadExtraCallback& load_extra_callback,
-                      TitledUrlIndex* index,
-                      int64_t max_id);
+  explicit BookmarkLoadDetails(BookmarkClient* client);
   ~BookmarkLoadDetails();
 
-  void LoadExtraNodes();
+  // Loads the extra nodes and adds them to |root_|. Returns true if at least
+  // one node was added that has children.
+  bool LoadExtraNodes();
 
-  BookmarkPermanentNode* bb_node() { return bb_node_.get(); }
-  std::unique_ptr<BookmarkPermanentNode> owned_bb_node() {
-    return std::move(bb_node_);
+  std::unique_ptr<BookmarkNode> owned_root_node() {
+    return std::move(root_node_);
   }
-  BookmarkPermanentNode* mobile_folder_node() {
-    return mobile_folder_node_.get();
-  }
-  std::unique_ptr<BookmarkPermanentNode> owned_mobile_folder_node() {
-    return std::move(mobile_folder_node_);
-  }
-  BookmarkPermanentNode* other_folder_node() {
-    return other_folder_node_.get();
-  }
-  std::unique_ptr<BookmarkPermanentNode> owned_other_folder_node() {
-    return std::move(other_folder_node_);
-  }
-  const BookmarkPermanentNodeList& extra_nodes() {
-    return extra_nodes_;
-  }
-  BookmarkPermanentNodeList owned_extra_nodes() {
-    return std::move(extra_nodes_);
-  }
+  BookmarkNode* root_node() { return root_node_ptr_; }
+  BookmarkPermanentNode* bb_node() { return bb_node_; }
+  BookmarkPermanentNode* mobile_folder_node() { return mobile_folder_node_; }
+  BookmarkPermanentNode* other_folder_node() { return other_folder_node_; }
+
   TitledUrlIndex* index() { return index_.get(); }
   std::unique_ptr<TitledUrlIndex> owned_index() { return std::move(index_); }
 
@@ -120,22 +106,33 @@
   bool ids_reassigned() const { return ids_reassigned_; }
 
  private:
-  std::unique_ptr<BookmarkPermanentNode> bb_node_;
-  std::unique_ptr<BookmarkPermanentNode> other_folder_node_;
-  std::unique_ptr<BookmarkPermanentNode> mobile_folder_node_;
+  // Creates one of the possible permanent nodes (bookmark bar node, other node
+  // and mobile node) from |type|. The node is added to (and owned by) |root_|.
+  BookmarkPermanentNode* CreatePermanentNode(BookmarkClient* client,
+                                             BookmarkNode::Type type);
+
+  std::unique_ptr<BookmarkNode> root_node_;
+  BookmarkNode* root_node_ptr_;
+  BookmarkPermanentNode* bb_node_ = nullptr;
+  BookmarkPermanentNode* other_folder_node_ = nullptr;
+  BookmarkPermanentNode* mobile_folder_node_ = nullptr;
   LoadExtraCallback load_extra_callback_;
-  BookmarkPermanentNodeList extra_nodes_;
   std::unique_ptr<TitledUrlIndex> index_;
   BookmarkNode::MetaInfoMap model_meta_info_map_;
   int64_t model_sync_transaction_version_;
-  int64_t max_id_;
+  int64_t max_id_ = 1;
   std::string computed_checksum_;
   std::string stored_checksum_;
-  bool ids_reassigned_;
+  bool ids_reassigned_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(BookmarkLoadDetails);
 };
 
+// Loads the bookmarks. This is intended to be called on the background thread.
+// Updates state in |details| based on the load.
+void LoadBookmarks(const base::FilePath& profile_path,
+                   BookmarkLoadDetails* details);
+
 // BookmarkStorage handles reading/write the bookmark bar model. The
 // BookmarkModel uses the BookmarkStorage to load bookmarks from disk, as well
 // as notifying the BookmarkStorage every time the model changes.
@@ -151,13 +148,6 @@
                   base::SequencedTaskRunner* sequenced_task_runner);
   ~BookmarkStorage() override;
 
-  // Loads the bookmarks into the model, notifying the model when done. This
-  // takes ownership of |details| and send the |OnLoadFinished| callback from
-  // a task in |task_runner|. See BookmarkLoadDetails for details.
-  void LoadBookmarks(
-      std::unique_ptr<BookmarkLoadDetails> details,
-      const scoped_refptr<base::SequencedTaskRunner>& task_runner);
-
   // Schedules saving the bookmark bar model to disk.
   void ScheduleSave();
 
@@ -165,9 +155,6 @@
   // a pending save, it is saved immediately.
   void BookmarkModelDeleted();
 
-  // Callback from backend after loading the bookmark file.
-  void OnLoadFinished(std::unique_ptr<BookmarkLoadDetails> details);
-
   // ImportantFileWriter::DataSerializer implementation.
   bool SerializeData(std::string* output) override;
 
diff --git a/components/bookmarks/browser/titled_url_index.cc b/components/bookmarks/browser/titled_url_index.cc
index 5cde7f53..bacf382 100644
--- a/components/bookmarks/browser/titled_url_index.cc
+++ b/components/bookmarks/browser/titled_url_index.cc
@@ -15,7 +15,6 @@
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "components/bookmarks/browser/titled_url_match.h"
 #include "components/bookmarks/browser/titled_url_node.h"
-#include "components/bookmarks/browser/titled_url_node_sorter.h"
 #include "components/query_parser/snippet.h"
 #include "third_party/icu/source/common/unicode/normalizer2.h"
 #include "third_party/icu/source/common/unicode/utypes.h"
@@ -55,6 +54,11 @@
 TitledUrlIndex::~TitledUrlIndex() {
 }
 
+void TitledUrlIndex::SetNodeSorter(
+    std::unique_ptr<TitledUrlNodeSorter> sorter) {
+  sorter_ = std::move(sorter);
+}
+
 void TitledUrlIndex::Add(const TitledUrlNode* node) {
   std::vector<base::string16> terms =
       ExtractQueryWords(Normalize(node->GetTitledUrlNodeTitle()));
diff --git a/components/bookmarks/browser/titled_url_index.h b/components/bookmarks/browser/titled_url_index.h
index f6df598..37602fb 100644
--- a/components/bookmarks/browser/titled_url_index.h
+++ b/components/bookmarks/browser/titled_url_index.h
@@ -14,12 +14,13 @@
 #include "base/containers/flat_set.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
+#include "components/bookmarks/browser/titled_url_node_sorter.h"
 #include "components/query_parser/query_parser.h"
 
 namespace bookmarks {
 
 class TitledUrlNode;
-class TitledUrlNodeSorter;
+
 struct TitledUrlMatch;
 
 // TitledUrlIndex maintains an index of paired titles and URLs for quick lookup.
@@ -32,9 +33,12 @@
   // Constructs a TitledUrlIndex. |sorter| is used to construct a sorted list
   // of matches when matches are returned from the index. If null, matches are
   // returned unsorted.
-  TitledUrlIndex(std::unique_ptr<TitledUrlNodeSorter> sorter);
+  explicit TitledUrlIndex(
+      std::unique_ptr<TitledUrlNodeSorter> sorter = nullptr);
   ~TitledUrlIndex();
 
+  void SetNodeSorter(std::unique_ptr<TitledUrlNodeSorter> sorter);
+
   // Invoked when a title/URL pair has been added to the model.
   void Add(const TitledUrlNode* node);
 
diff --git a/components/bookmarks/test/test_bookmark_client.cc b/components/bookmarks/test/test_bookmark_client.cc
index e6c485d..e0c7877 100644
--- a/components/bookmarks/test/test_bookmark_client.cc
+++ b/components/bookmarks/test/test_bookmark_client.cc
@@ -30,10 +30,11 @@
 // static
 std::unique_ptr<BookmarkModel> TestBookmarkClient::CreateModelWithClient(
     std::unique_ptr<BookmarkClient> client) {
+  BookmarkClient* client_ptr = client.get();
   std::unique_ptr<BookmarkModel> bookmark_model(
       new BookmarkModel(std::move(client)));
   std::unique_ptr<BookmarkLoadDetails> details =
-      bookmark_model->CreateLoadDetails();
+      std::make_unique<BookmarkLoadDetails>(client_ptr);
   details->LoadExtraNodes();
   bookmark_model->DoneLoading(std::move(details));
   return bookmark_model;
diff --git a/components/browser_sync/profile_sync_service_autofill_unittest.cc b/components/browser_sync/profile_sync_service_autofill_unittest.cc
index 3cee5d12..5ced147 100644
--- a/components/browser_sync/profile_sync_service_autofill_unittest.cc
+++ b/components/browser_sync/profile_sync_service_autofill_unittest.cc
@@ -104,6 +104,8 @@
                                 atoi(version_info::GetVersionNumber().c_str()));
   registry->RegisterDoublePref(autofill::prefs::kAutofillBillingCustomerNumber,
                                0.0);
+  registry->RegisterBooleanPref(autofill::prefs::kAutofillOrphanRowsRemoved,
+                                true);
 }
 
 void RunAndSignal(base::OnceClosure cb, WaitableEvent* event) {
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn
index 08ca006..8bb028d 100644
--- a/components/cronet/android/BUILD.gn
+++ b/components/cronet/android/BUILD.gn
@@ -1596,6 +1596,8 @@
 _maven_dir = "$_package_dir/maven-$current_cpu"
 _maven_modules_dir = "$_maven_dir/org/chromium/net"
 _maven_test_dir = "$_maven_dir/test"
+_maven_version =
+    "$chrome_version_major.$chrome_version_build.$chrome_version_patch"
 
 copy("cronet_maven_test_copy") {
   sources = [
@@ -1663,7 +1665,7 @@
       "//build/util/LASTCHANGE",
       "//chrome/VERSION",
     ]
-    output = "$_maven_modules_dir/$_module_name/$chrome_version_full/$_module_name-$chrome_version_full.pom"
+    output = "$_maven_modules_dir/$_module_name/$_maven_version/$_module_name-$_maven_version.pom"
   }
 
   if (defined(invoker.resource_dir)) {
@@ -1699,7 +1701,7 @@
   copy(_aar_copy_target_name) {
     sources = get_target_outputs(":$_aar_target_name")
     outputs = [
-      "$_maven_modules_dir/$_module_name/$chrome_version_full/$_module_name-$chrome_version_full.aar",
+      "$_maven_modules_dir/$_module_name/$_maven_version/$_module_name-$_maven_version.aar",
     ]
     deps = [
       ":$_aar_target_name",
@@ -1712,7 +1714,7 @@
     copy(_copy_target_name) {
       sources = get_target_outputs(invoker.src_jar_dep)
       outputs = [
-        "$_maven_modules_dir/$_module_name/$chrome_version_full/$_module_name-$chrome_version_full-sources.jar",
+        "$_maven_modules_dir/$_module_name/$_maven_version/$_module_name-$_maven_version-sources.jar",
       ]
       deps = [
         invoker.src_jar_dep,
@@ -1726,7 +1728,7 @@
     copy(_copy_target_name) {
       sources = get_target_outputs(invoker.javadoc_jar_dep)
       outputs = [
-        "$_maven_modules_dir/$_module_name/$chrome_version_full/$_module_name-$chrome_version_full-javadoc.jar",
+        "$_maven_modules_dir/$_module_name/$_maven_version/$_module_name-$_maven_version-javadoc.jar",
       ]
       deps = [
         invoker.javadoc_jar_dep,
diff --git a/components/cronet/android/maven/cronet-api.pom.template b/components/cronet/android/maven/cronet-api.pom.template
index fb2aeef..94671f74 100644
--- a/components/cronet/android/maven/cronet-api.pom.template
+++ b/components/cronet/android/maven/cronet-api.pom.template
@@ -2,8 +2,15 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.chromium.net</groupId>
   <artifactId>cronet-api</artifactId>
-  <version>@MAJOR@.@MINOR@.@BUILD@.@PATCH@</version>
+  <version>@MAJOR@.@BUILD@.@PATCH@</version>
   <packaging>aar</packaging>
   <name>Cronet</name>
   <description>Cronet API. Does not contain implementation.</description>
+  <licenses>
+    <license>
+      <name>Chromium and built-in dependencies</name>
+      <url>https://storage.cloud.google.com/chromium-cronet/android/@MAJOR@.@MINOR@.@BUILD@.@PATCH@/Release/cronet/LICENSE</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
 </project>
diff --git a/components/cronet/android/maven/cronet-common.pom.template b/components/cronet/android/maven/cronet-common.pom.template
index 3181c59..d4769bb4 100644
--- a/components/cronet/android/maven/cronet-common.pom.template
+++ b/components/cronet/android/maven/cronet-common.pom.template
@@ -2,7 +2,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.chromium.net</groupId>
   <artifactId>cronet-common</artifactId>
-  <version>@MAJOR@.@MINOR@.@BUILD@.@PATCH@</version>
+  <version>@MAJOR@.@BUILD@.@PATCH@</version>
   <packaging>aar</packaging>
   <name>Cronet</name>
   <description>Cronet shared implementation. Not a complete implementation; apps and libraries should not depend on this target directly.</description>
@@ -13,4 +13,11 @@
       <version>${project.version}</version>
     </dependency>
   </dependencies>
+  <licenses>
+    <license>
+      <name>Chromium and built-in dependencies</name>
+      <url>https://storage.cloud.google.com/chromium-cronet/android/@MAJOR@.@MINOR@.@BUILD@.@PATCH@/Release/cronet/LICENSE</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
 </project>
diff --git a/components/cronet/android/maven/cronet-embedded.pom.template b/components/cronet/android/maven/cronet-embedded.pom.template
index f72a8d7..b268006 100644
--- a/components/cronet/android/maven/cronet-embedded.pom.template
+++ b/components/cronet/android/maven/cronet-embedded.pom.template
@@ -2,7 +2,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.chromium.net</groupId>
   <artifactId>cronet-embedded</artifactId>
-  <version>@MAJOR@.@MINOR@.@BUILD@.@PATCH@</version>
+  <version>@MAJOR@.@BUILD@.@PATCH@</version>
   <packaging>aar</packaging>
   <name>Cronet</name>
   <description>High performance implementation of Cronet using native libraries.</description>
@@ -18,4 +18,11 @@
       <version>3.0.1</version>
     </dependency>
   </dependencies>
+  <licenses>
+    <license>
+      <name>Chromium and built-in dependencies</name>
+      <url>https://storage.cloud.google.com/chromium-cronet/android/@MAJOR@.@MINOR@.@BUILD@.@PATCH@/Release/cronet/LICENSE</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
 </project>
diff --git a/components/cronet/android/maven/cronet-fallback.pom.template b/components/cronet/android/maven/cronet-fallback.pom.template
index 1654965d..dddd7fd4 100644
--- a/components/cronet/android/maven/cronet-fallback.pom.template
+++ b/components/cronet/android/maven/cronet-fallback.pom.template
@@ -2,7 +2,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.chromium.net</groupId>
   <artifactId>cronet-fallback</artifactId>
-  <version>@MAJOR@.@MINOR@.@BUILD@.@PATCH@</version>
+  <version>@MAJOR@.@BUILD@.@PATCH@</version>
   <packaging>aar</packaging>
   <name>Cronet</name>
   <description>Low performance fallback Cronet implementation based on Android system HttpURLConnection implementation. Should only be used as a backup when Cronet native library implementation fails to load.</description>
@@ -13,4 +13,11 @@
       <version>${project.version}</version>
     </dependency>
   </dependencies>
+  <licenses>
+    <license>
+      <name>Chromium and built-in dependencies</name>
+      <url>https://storage.cloud.google.com/chromium-cronet/android/@MAJOR@.@MINOR@.@BUILD@.@PATCH@/Release/cronet/LICENSE</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
 </project>
diff --git a/components/cronet/android/maven/test/build.gradle.template b/components/cronet/android/maven/test/build.gradle.template
index 19902a9..7a18557 100644
--- a/components/cronet/android/maven/test/build.gradle.template
+++ b/components/cronet/android/maven/test/build.gradle.template
@@ -58,6 +58,6 @@
     androidTestImplementation 'com.android.support.test:runner:1.0.1'
     androidTestImplementation 'com.android.support.test:rules:1.0.1'
     implementation 'com.android.support:appcompat-v7:25.4.0'
-    implementation 'org.chromium.net:cronet-embedded:@MAJOR@.@MINOR@.@BUILD@.@PATCH@'
+    implementation 'org.chromium.net:cronet-embedded:@MAJOR@.@BUILD@.@PATCH@'
     androidTestUtil 'com.android.support.test:orchestrator:1.0.1'
 }
diff --git a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.cc b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.cc
index 88b97a737..8d708c6 100644
--- a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.cc
+++ b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection.cc
@@ -207,8 +207,6 @@
     return;
   }
 
-  PA_LOG(INFO) << "Setting connection latency for " << GetDeviceInfoLogString()
-               << ".";
   bluetooth_device->SetConnectionLatency(
       device::BluetoothDevice::ConnectionLatency::CONNECTION_LATENCY_LOW,
       base::Bind(&BluetoothLowEnergyWeaveClientConnection::CreateGattConnection,
diff --git a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc
index 2572194..5b193df 100644
--- a/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc
+++ b/components/cryptauth/ble/bluetooth_low_energy_weave_client_connection_unittest.cc
@@ -405,7 +405,7 @@
             mock_bluetooth_device_.get(), should_set_low_connection_latency));
 
     EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-    EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+    EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
     // Add the mock observer to observe on OnDidMessageSend.
     connection_observer_ =
@@ -445,14 +445,14 @@
       // Handle setting the connection latency.
       EXPECT_EQ(connection->sub_status(),
                 SubStatus::WAITING_CONNECTION_LATENCY);
-      EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+      EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
       ASSERT_FALSE(connection_latency_callback_.is_null());
       ASSERT_FALSE(connection_latency_error_callback_.is_null());
       connection_latency_callback_.Run();
     }
 
     EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_GATT_CONNECTION);
-    EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+    EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
 
     // Preparing |connection| to run |create_gatt_connection_success_callback_|.
     EXPECT_FALSE(create_gatt_connection_error_callback_.is_null());
@@ -468,7 +468,7 @@
             adapter_, kTestRemoteDeviceBluetoothAddress));
 
     EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CHARACTERISTICS);
-    EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+    EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
   }
 
   // Transitions |connection| from WAITING_CHARACTERISTICS to
@@ -487,7 +487,7 @@
         {rx_characteristic_uuid_, kRXCharacteristicID});
 
     EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_NOTIFY_SESSION);
-    EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+    EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
   }
 
   // Transitions |connection| from WAITING_NOTIFY_SESSION to
@@ -516,7 +516,7 @@
     EXPECT_EQ(last_value_written_on_tx_characteristic_, kConnectionRequest);
 
     EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CONNECTION_RESPONSE);
-    EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+    EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
   }
 
   // Transitions |connection| from WAITING_CONNECTION_RESPONSE to CONNECTED.
@@ -547,7 +547,7 @@
     }
 
     EXPECT_EQ(connection->sub_status(), SubStatus::CONNECTED_AND_IDLE);
-    EXPECT_EQ(connection->status(), Connection::CONNECTED);
+    EXPECT_EQ(connection->status(), Connection::Status::CONNECTED);
   }
 
   // Transitions |connection| to a DISCONNECTED state regardless of its initial
@@ -570,7 +570,7 @@
     }
 
     EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-    EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+    EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
   }
 
   void DeleteConnectionWithoutCallingDisconnect(
@@ -775,7 +775,7 @@
   RunWriteCharacteristicSuccessCallback();
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
           BLE_WEAVE_CONNECTION_RESULT_CLOSED_NORMALLY);
@@ -849,7 +849,7 @@
       {rx_characteristic_uuid_, kRXCharacteristicID});
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyGattServicesUnavailableEventSent();
   VerifyBleWeaveConnectionResult(
@@ -876,7 +876,7 @@
       {rx_characteristic_uuid_, kRXCharacteristicID});
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyGattServicesUnavailableEventSent();
   VerifyBleWeaveConnectionResult(
@@ -901,7 +901,7 @@
   VerifyGattNotifySessionResult(false);
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -940,7 +940,7 @@
   }
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1112,7 +1112,7 @@
   }
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1130,7 +1130,7 @@
 
   EXPECT_EQ(receiver_->GetReasonForClose(), ReasonForClose::UNKNOWN_ERROR);
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1160,7 +1160,7 @@
   RunWriteCharacteristicSuccessCallback();
   VerifyGattWriteCharacteristicResult(true /* success */, 2 /* num_writes */);
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1204,7 +1204,7 @@
   RunWriteCharacteristicSuccessCallback();
   VerifyGattWriteCharacteristicResult(true /* success */, 3 /* num_writes */);
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1320,7 +1320,7 @@
   }
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1344,7 +1344,7 @@
   // No GATT connection should be created before the delay.
   connection->Connect();
   EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CONNECTION_LATENCY);
-  EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
   EXPECT_TRUE(create_gatt_connection_error_callback_.is_null());
   EXPECT_TRUE(create_gatt_connection_success_callback_.is_null());
 
@@ -1439,7 +1439,7 @@
   // Call Connect(), which should set the connection latency.
   connection->Connect();
   EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CONNECTION_LATENCY);
-  EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
   ASSERT_FALSE(connection_latency_callback_.is_null());
   ASSERT_FALSE(connection_latency_error_callback_.is_null());
 
@@ -1447,7 +1447,7 @@
   test_timer_->Fire();
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1474,19 +1474,19 @@
 
   // Handle setting the connection latency.
   EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CONNECTION_LATENCY);
-  EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
   ASSERT_FALSE(connection_latency_callback_.is_null());
   ASSERT_FALSE(connection_latency_error_callback_.is_null());
   connection_latency_callback_.Run();
 
   EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_GATT_CONNECTION);
-  EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
 
   // Simulate a timeout.
   test_timer_->Fire();
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1499,13 +1499,13 @@
       CreateConnection(true /* should_set_low_connection_latency */));
   ConnectGatt(connection.get());
   EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_CHARACTERISTICS);
-  EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
 
   // Simulate a timeout.
   test_timer_->Fire();
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyGattServicesUnavailableEventSent();
   VerifyBleWeaveConnectionResult(
@@ -1520,13 +1520,13 @@
   ConnectGatt(connection.get());
   CharacteristicsFound(connection.get());
   EXPECT_EQ(connection->sub_status(), SubStatus::WAITING_NOTIFY_SESSION);
-  EXPECT_EQ(connection->status(), Connection::IN_PROGRESS);
+  EXPECT_EQ(connection->status(), Connection::Status::IN_PROGRESS);
 
   // Simulate a timeout.
   test_timer_->Fire();
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1545,7 +1545,7 @@
   test_timer_->Fire();
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
@@ -1569,7 +1569,7 @@
   test_timer_->Fire();
 
   EXPECT_EQ(connection->sub_status(), SubStatus::DISCONNECTED);
-  EXPECT_EQ(connection->status(), Connection::DISCONNECTED);
+  EXPECT_EQ(connection->status(), Connection::Status::DISCONNECTED);
 
   VerifyBleWeaveConnectionResult(
       BluetoothLowEnergyWeaveClientConnection::BleWeaveConnectionResult::
diff --git a/components/cryptauth/connection.cc b/components/cryptauth/connection.cc
index 2c413b33..4b3c631 100644
--- a/components/cryptauth/connection.cc
+++ b/components/cryptauth/connection.cc
@@ -16,13 +16,13 @@
 
 Connection::Connection(const RemoteDevice& remote_device)
     : remote_device_(remote_device),
-      status_(DISCONNECTED),
+      status_(Status::DISCONNECTED),
       is_sending_message_(false) {}
 
 Connection::~Connection() {}
 
 bool Connection::IsConnected() const {
-  return status_ == CONNECTED;
+  return status_ == Status::CONNECTED;
 }
 
 void Connection::SendMessage(std::unique_ptr<WireMessage> message) {
@@ -116,4 +116,21 @@
   return ss.str();
 }
 
+std::ostream& operator<<(std::ostream& stream,
+                         const Connection::Status& status) {
+  switch (status) {
+    case Connection::Status::DISCONNECTED:
+      stream << "[disconnected]";
+      break;
+    case Connection::Status::IN_PROGRESS:
+      stream << "[in progress]";
+      break;
+    case Connection::Status::CONNECTED:
+      stream << "[connected]";
+      break;
+  }
+
+  return stream;
+}
+
 }  // namespace cryptauth
diff --git a/components/cryptauth/connection.h b/components/cryptauth/connection.h
index 949e6f5..631bc70b 100644
--- a/components/cryptauth/connection.h
+++ b/components/cryptauth/connection.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_CRYPTAUTH_CONNECTION_H_
 
 #include <memory>
+#include <ostream>
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
@@ -21,7 +22,7 @@
 // persistent bidirectional channel for sending and receiving wire messages.
 class Connection {
  public:
-  enum Status {
+  enum class Status {
     DISCONNECTED,
     IN_PROGRESS,
     CONNECTED,
@@ -117,6 +118,9 @@
   DISALLOW_COPY_AND_ASSIGN(Connection);
 };
 
+std::ostream& operator<<(std::ostream& stream,
+                         const Connection::Status& status);
+
 }  // namespace cryptauth
 
 #endif  // COMPONENTS_CRYPTAUTH_CONNECTION_H_
diff --git a/components/cryptauth/connection_unittest.cc b/components/cryptauth/connection_unittest.cc
index 2c59e942..f023548 100644
--- a/components/cryptauth/connection_unittest.cc
+++ b/components/cryptauth/connection_unittest.cc
@@ -101,19 +101,19 @@
   StrictMock<MockConnection> connection;
   EXPECT_FALSE(connection.IsConnected());
 
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
   EXPECT_TRUE(connection.IsConnected());
 
-  connection.SetStatus(Connection::DISCONNECTED);
+  connection.SetStatus(Connection::Status::DISCONNECTED);
   EXPECT_FALSE(connection.IsConnected());
 
-  connection.SetStatus(Connection::IN_PROGRESS);
+  connection.SetStatus(Connection::Status::IN_PROGRESS);
   EXPECT_FALSE(connection.IsConnected());
 }
 
 TEST(CryptAuthConnectionTest, SendMessage_FailsWhenNotConnected) {
   StrictMock<MockConnection> connection;
-  connection.SetStatus(Connection::IN_PROGRESS);
+  connection.SetStatus(Connection::Status::IN_PROGRESS);
 
   EXPECT_CALL(connection, GetDeviceAddress()).Times(1);
   EXPECT_CALL(connection, SendMessageImplProxy(_)).Times(0);
@@ -123,7 +123,7 @@
 TEST(CryptAuthConnectionTest,
      SendMessage_FailsWhenAnotherMessageSendIsInProgress) {
   NiceMock<MockConnection> connection;
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
   connection.SendMessage(std::unique_ptr<WireMessage>());
 
   EXPECT_CALL(connection, SendMessageImplProxy(_)).Times(0);
@@ -132,7 +132,7 @@
 
 TEST(CryptAuthConnectionTest, SendMessage_SucceedsWhenConnected) {
   StrictMock<MockConnection> connection;
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
 
   EXPECT_CALL(connection, SendMessageImplProxy(_));
   connection.SendMessage(std::unique_ptr<WireMessage>());
@@ -141,7 +141,7 @@
 TEST(CryptAuthConnectionTest,
      SendMessage_SucceedsAfterPreviousMessageSendCompletes) {
   NiceMock<MockConnection> connection;
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
   connection.SendMessage(std::unique_ptr<WireMessage>());
   connection.OnDidSendMessage(TestWireMessage(), true /* success */);
 
@@ -151,33 +151,33 @@
 
 TEST(CryptAuthConnectionTest, SetStatus_NotifiesObserversOfStatusChange) {
   StrictMock<MockConnection> connection;
-  EXPECT_EQ(Connection::DISCONNECTED, connection.status());
+  EXPECT_EQ(Connection::Status::DISCONNECTED, connection.status());
 
   StrictMock<MockConnectionObserver> observer;
   connection.AddObserver(&observer);
 
-  EXPECT_CALL(observer,
-              OnConnectionStatusChanged(&connection, Connection::DISCONNECTED,
-                                        Connection::CONNECTED));
-  connection.SetStatus(Connection::CONNECTED);
+  EXPECT_CALL(observer, OnConnectionStatusChanged(
+                            &connection, Connection::Status::DISCONNECTED,
+                            Connection::Status::CONNECTED));
+  connection.SetStatus(Connection::Status::CONNECTED);
 }
 
 TEST(CryptAuthConnectionTest,
      SetStatus_DoesntNotifyObserversIfStatusUnchanged) {
   StrictMock<MockConnection> connection;
-  EXPECT_EQ(Connection::DISCONNECTED, connection.status());
+  EXPECT_EQ(Connection::Status::DISCONNECTED, connection.status());
 
   StrictMock<MockConnectionObserver> observer;
   connection.AddObserver(&observer);
 
   EXPECT_CALL(observer, OnConnectionStatusChanged(_, _, _)).Times(0);
-  connection.SetStatus(Connection::DISCONNECTED);
+  connection.SetStatus(Connection::Status::DISCONNECTED);
 }
 
 TEST(CryptAuthConnectionTest,
      OnDidSendMessage_NotifiesObserversIfMessageSendInProgress) {
   NiceMock<MockConnection> connection;
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
   connection.SendMessage(std::unique_ptr<WireMessage>());
 
   StrictMock<MockConnectionObserver> observer;
@@ -190,7 +190,7 @@
 TEST(CryptAuthConnectionTest,
      OnDidSendMessage_DoesntNotifyObserversIfNoMessageSendInProgress) {
   NiceMock<MockConnection> connection;
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
 
   StrictMock<MockConnectionObserver> observer;
   connection.AddObserver(&observer);
@@ -202,7 +202,7 @@
 TEST(CryptAuthConnectionTest,
      OnBytesReceived_NotifiesObserversOnValidMessage) {
   NiceMock<MockConnection> connection;
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
 
   StrictMock<MockConnectionObserver> observer;
   connection.AddObserver(&observer);
@@ -217,7 +217,7 @@
 TEST(CryptAuthConnectionTest,
      OnBytesReceived_DoesntNotifyObserversIfNotConnected) {
   StrictMock<MockConnection> connection;
-  connection.SetStatus(Connection::IN_PROGRESS);
+  connection.SetStatus(Connection::Status::IN_PROGRESS);
 
   StrictMock<MockConnectionObserver> observer;
   connection.AddObserver(&observer);
@@ -230,7 +230,7 @@
 TEST(CryptAuthConnectionTest,
      OnBytesReceived_DoesntNotifyObserversIfMessageIsIncomplete) {
   NiceMock<MockConnection> connection;
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
 
   StrictMock<MockConnectionObserver> observer;
   connection.AddObserver(&observer);
@@ -244,7 +244,7 @@
 TEST(CryptAuthConnectionTest,
      OnBytesReceived_DoesntNotifyObserversIfMessageIsInvalid) {
   NiceMock<MockConnection> connection;
-  connection.SetStatus(Connection::CONNECTED);
+  connection.SetStatus(Connection::Status::CONNECTED);
 
   StrictMock<MockConnectionObserver> observer;
   connection.AddObserver(&observer);
diff --git a/components/cryptauth/cryptauth_device_manager_impl.cc b/components/cryptauth/cryptauth_device_manager_impl.cc
index 1eb495e04..82f85d1 100644
--- a/components/cryptauth/cryptauth_device_manager_impl.cc
+++ b/components/cryptauth/cryptauth_device_manager_impl.cc
@@ -50,6 +50,12 @@
 const char kExternalDeviceKeyBeaconSeeds[] = "beacon_seeds";
 const char kExternalDeviceKeyArcPlusPlus[] = "arc_plus_plus";
 const char kExternalDeviceKeyPixelPhone[] = "pixel_phone";
+const char kExternalDeviceKeySupportedSoftwareFeatures[] =
+    "supported_software_features";
+const char kExternalDeviceKeyEnabledSoftwareFeatures[] =
+    "enabled_software_features";
+
+// Keys for ExternalDeviceInfo's BeaconSeed.
 const char kExternalDeviceKeyBeaconSeedData[] = "beacon_seed_data";
 const char kExternalDeviceKeyBeaconSeedStartMs[] = "beacon_seed_start_ms";
 const char kExternalDeviceKeyBeaconSeedEndMs[] = "beacon_seed_end_ms";
@@ -94,6 +100,16 @@
   return list;
 }
 
+// Converts SoftwareFeature protos to a list value that can be stored in user
+// prefs.
+std::unique_ptr<base::ListValue> SoftwareFeaturesToListValue(
+    const google::protobuf::RepeatedField<int>& software_features) {
+  std::unique_ptr<base::ListValue> list = std::make_unique<base::ListValue>();
+  for (auto software_feature : software_features)
+    list->AppendInteger(software_feature);
+  return list;
+}
+
 // Converts an unlock key proto to a dictionary that can be stored in user
 // prefs.
 std::unique_ptr<base::DictionaryValue> UnlockKeyToDictionary(
@@ -153,6 +169,9 @@
     dictionary->SetInteger(kExternalDeviceKeyDeviceType, device.device_type());
   }
 
+  dictionary->Set(kExternalDeviceKeyBeaconSeeds,
+                  BeaconSeedsToListValue(device.beacon_seeds()));
+
   if (device.has_arc_plus_plus()) {
     dictionary->SetBoolean(kExternalDeviceKeyArcPlusPlus,
                            device.arc_plus_plus());
@@ -162,15 +181,18 @@
     dictionary->SetBoolean(kExternalDeviceKeyPixelPhone, device.pixel_phone());
   }
 
-  std::unique_ptr<base::ListValue> beacon_seed_list =
-      BeaconSeedsToListValue(device.beacon_seeds());
-  dictionary->Set(kExternalDeviceKeyBeaconSeeds, std::move(beacon_seed_list));
+  dictionary->Set(
+      kExternalDeviceKeySupportedSoftwareFeatures,
+      SoftwareFeaturesToListValue(device.supported_software_features()));
+  dictionary->Set(
+      kExternalDeviceKeyEnabledSoftwareFeatures,
+      SoftwareFeaturesToListValue(device.enabled_software_features()));
 
   return dictionary;
 }
 
 void AddBeaconSeedsToExternalDevice(const base::ListValue& beacon_seeds,
-                                    ExternalDeviceInfo& external_device) {
+                                    ExternalDeviceInfo* external_device) {
   for (size_t i = 0; i < beacon_seeds.GetSize(); i++) {
     const base::DictionaryValue* seed_dictionary = nullptr;
     if (!beacon_seeds.GetDictionary(i, &seed_dictionary)) {
@@ -208,13 +230,46 @@
       continue;
     }
 
-    BeaconSeed* seed = external_device.add_beacon_seeds();
+    BeaconSeed* seed = external_device->add_beacon_seeds();
     seed->set_data(seed_data);
     seed->set_start_time_millis(start_time_millis);
     seed->set_end_time_millis(end_time_millis);
   }
 }
 
+void AddSoftwareFeaturesToExternalDevice(
+    const base::DictionaryValue& dictionary,
+    const std::string& software_feature_dictionary_key,
+    ExternalDeviceInfo* external_device) {
+  DCHECK(software_feature_dictionary_key ==
+             kExternalDeviceKeySupportedSoftwareFeatures ||
+         software_feature_dictionary_key ==
+             kExternalDeviceKeyEnabledSoftwareFeatures);
+
+  const base::ListValue* software_features;
+  if (!dictionary.GetList(software_feature_dictionary_key, &software_features))
+    return;
+
+  for (size_t i = 0; i < software_features->GetSize(); i++) {
+    int software_feature;
+    if (!software_features->GetInteger(i, &software_feature) ||
+        !SoftwareFeature_IsValid(software_feature)) {
+      PA_LOG(WARNING) << "Unable to retrieve SoftwareFeature; skipping.";
+      continue;
+    }
+
+    if (software_feature_dictionary_key ==
+        kExternalDeviceKeySupportedSoftwareFeatures) {
+      external_device->add_supported_software_features(
+          static_cast<SoftwareFeature>(software_feature));
+    } else if (software_feature_dictionary_key ==
+               kExternalDeviceKeyEnabledSoftwareFeatures) {
+      external_device->add_enabled_software_features(
+          static_cast<SoftwareFeature>(software_feature));
+    }
+  }
+}
+
 // Converts an unlock key dictionary stored in user prefs to an
 // ExternalDeviceInfo proto. Returns true if the dictionary is valid, and the
 // parsed proto is written to |external_device|.
@@ -294,7 +349,7 @@
   const base::ListValue* beacon_seeds = nullptr;
   dictionary.GetList(kExternalDeviceKeyBeaconSeeds, &beacon_seeds);
   if (beacon_seeds)
-    AddBeaconSeedsToExternalDevice(*beacon_seeds, *external_device);
+    AddBeaconSeedsToExternalDevice(*beacon_seeds, external_device);
 
   bool arc_plus_plus;
   if (dictionary.GetBoolean(kExternalDeviceKeyArcPlusPlus, &arc_plus_plus))
@@ -304,6 +359,11 @@
   if (dictionary.GetBoolean(kExternalDeviceKeyPixelPhone, &pixel_phone))
     external_device->set_pixel_phone(pixel_phone);
 
+  AddSoftwareFeaturesToExternalDevice(
+      dictionary, kExternalDeviceKeySupportedSoftwareFeatures, external_device);
+  AddSoftwareFeaturesToExternalDevice(
+      dictionary, kExternalDeviceKeyEnabledSoftwareFeatures, external_device);
+
   return true;
 }
 
diff --git a/components/cryptauth/cryptauth_device_manager_impl_unittest.cc b/components/cryptauth/cryptauth_device_manager_impl_unittest.cc
index 98ecf9b..8b498ae 100644
--- a/components/cryptauth/cryptauth_device_manager_impl_unittest.cc
+++ b/components/cryptauth/cryptauth_device_manager_impl_unittest.cc
@@ -141,6 +141,27 @@
       EXPECT_TRUE(seed.has_end_time_millis());
       EXPECT_EQ(expected_seed.end_time_millis(), seed.end_time_millis());
     }
+
+    EXPECT_EQ(expected_device.has_arc_plus_plus(), device.has_arc_plus_plus());
+    EXPECT_EQ(expected_device.arc_plus_plus(), device.arc_plus_plus());
+
+    EXPECT_EQ(expected_device.has_pixel_phone(), device.has_pixel_phone());
+    EXPECT_EQ(expected_device.pixel_phone(), device.pixel_phone());
+
+    ASSERT_EQ(expected_device.supported_software_features_size(),
+              device.supported_software_features_size());
+    for (int i = 0; i < expected_device.supported_software_features_size();
+         i++) {
+      EXPECT_EQ(expected_device.supported_software_features(i),
+                device.supported_software_features(i));
+    }
+
+    ASSERT_EQ(expected_device.enabled_software_features_size(),
+              device.enabled_software_features_size());
+    for (int i = 0; i < expected_device.enabled_software_features_size(); i++) {
+      EXPECT_EQ(expected_device.enabled_software_features(i),
+                device.enabled_software_features(i));
+    }
   }
 }
 
@@ -243,7 +264,7 @@
 
     const base::ListValue* beacon_seeds_from_prefs;
     if (device_dictionary->GetList("beacon_seeds", &beacon_seeds_from_prefs)) {
-      ASSERT_EQ((size_t)expected_device.beacon_seeds_size(),
+      ASSERT_EQ(static_cast<size_t>(expected_device.beacon_seeds_size()),
                 beacon_seeds_from_prefs->GetSize());
       for (size_t i = 0; i < beacon_seeds_from_prefs->GetSize(); i++) {
         const base::DictionaryValue* seed;
@@ -271,6 +292,58 @@
     } else {
       EXPECT_FALSE(expected_device.beacon_seeds_size());
     }
+
+    bool arc_plus_plus;
+    if (device_dictionary->GetBoolean("arc_plus_plus", &arc_plus_plus)) {
+      EXPECT_TRUE(expected_device.has_arc_plus_plus());
+      EXPECT_EQ(expected_device.arc_plus_plus(), arc_plus_plus);
+    } else {
+      EXPECT_FALSE(expected_device.has_arc_plus_plus());
+    }
+
+    bool pixel_phone;
+    if (device_dictionary->GetBoolean("pixel_phone", &pixel_phone)) {
+      EXPECT_TRUE(expected_device.has_pixel_phone());
+      EXPECT_EQ(expected_device.pixel_phone(), pixel_phone);
+    } else {
+      EXPECT_FALSE(expected_device.has_pixel_phone());
+    }
+
+    const base::ListValue* supported_software_features_from_prefs;
+    if (device_dictionary->GetList("supported_software_features",
+                                   &supported_software_features_from_prefs)) {
+      ASSERT_EQ(static_cast<size_t>(
+                    expected_device.supported_software_features_size()),
+                supported_software_features_from_prefs->GetSize());
+      for (size_t i = 0; i < supported_software_features_from_prefs->GetSize();
+           i++) {
+        int supported_software_feature;
+        ASSERT_TRUE(supported_software_features_from_prefs->GetInteger(
+            i, &supported_software_feature));
+        EXPECT_EQ(expected_device.supported_software_features(i),
+                  supported_software_feature);
+      }
+    } else {
+      EXPECT_FALSE(expected_device.supported_software_features_size());
+    }
+
+    const base::ListValue* enabled_software_features_from_prefs;
+    if (device_dictionary->GetList("enabled_software_features",
+                                   &enabled_software_features_from_prefs)) {
+      ASSERT_EQ(
+          static_cast<size_t>(expected_device.enabled_software_features_size()),
+          enabled_software_features_from_prefs->GetSize());
+      for (size_t i = 0; i < enabled_software_features_from_prefs->GetSize();
+           i++) {
+        int enabled_software_feature;
+        ASSERT_TRUE(enabled_software_features_from_prefs->GetInteger(
+            i, &enabled_software_feature));
+        EXPECT_EQ(expected_device.enabled_software_features(i),
+                  enabled_software_feature);
+      }
+    } else {
+      EXPECT_FALSE(expected_device.enabled_software_features_size());
+    }
   }
 }
 
@@ -340,6 +413,12 @@
     seed2->set_end_time_millis(kBeaconSeed2EndTime);
     unlock_key.set_arc_plus_plus(kArcPlusPlus1);
     unlock_key.set_pixel_phone(kPixelPhone1);
+    unlock_key.add_supported_software_features(
+        SoftwareFeature::BETTER_TOGETHER_HOST);
+    unlock_key.add_supported_software_features(
+        SoftwareFeature::BETTER_TOGETHER_CLIENT);
+    unlock_key.add_enabled_software_features(
+        SoftwareFeature::BETTER_TOGETHER_HOST);
     devices_in_response_.push_back(unlock_key);
 
     ExternalDeviceInfo unlockable_device;
@@ -358,6 +437,12 @@
     seed4->set_end_time_millis(kBeaconSeed4EndTime);
     unlockable_device.set_arc_plus_plus(kArcPlusPlus2);
     unlockable_device.set_pixel_phone(kPixelPhone2);
+    unlock_key.add_supported_software_features(
+        SoftwareFeature::MAGIC_TETHER_HOST);
+    unlock_key.add_supported_software_features(
+        SoftwareFeature::MAGIC_TETHER_CLIENT);
+    unlock_key.add_enabled_software_features(
+        SoftwareFeature::MAGIC_TETHER_HOST);
     devices_in_response_.push_back(unlockable_device);
   }
 
@@ -397,9 +482,13 @@
     device_dictionary->SetString("bluetooth_address", bluetooth_address_b64);
     device_dictionary->SetBoolean("unlock_key", kStoredUnlockKey);
     device_dictionary->SetBoolean("unlockable", kStoredUnlockable);
-    device_dictionary->Set("beacon_seeds", std::make_unique<base::ListValue>());
     device_dictionary->SetBoolean("mobile_hotspot_supported",
                                   kStoredMobileHotspotSupported);
+    device_dictionary->Set("beacon_seeds", std::make_unique<base::ListValue>());
+    device_dictionary->Set("supported_software_features",
+                           std::make_unique<base::ListValue>());
+    device_dictionary->Set("enabled_software_features",
+                           std::make_unique<base::ListValue>());
     {
       ListPrefUpdate update(&pref_service_,
                             prefs::kCryptAuthDeviceSyncUnlockKeys);
@@ -797,8 +886,6 @@
 }
 
 TEST_F(CryptAuthDeviceManagerImplTest, SyncFullyDetailedExternalDeviceInfos) {
-  GetMyDevicesResponse response;
-
   // First, use a device with only a public key (a public key is the only
   // required field). This ensures devices work properly when they do not have
   // all fields filled out.
@@ -809,7 +896,6 @@
   // TODO(khorimoto): Remove this when support for storing all types of devices
   // is added.
   device_with_only_public_key.set_unlock_key(true);
-  response.add_devices()->CopyFrom(device_with_only_public_key);
 
   // Second, use a device with all fields filled out. This ensures that all
   // device details are properly saved.
@@ -822,17 +908,29 @@
   device_with_all_fields.set_last_update_time_millis(123456789L);
   device_with_all_fields.set_mobile_hotspot_supported(true);
   device_with_all_fields.set_device_type(DeviceType::ANDROIDOS);
+
   BeaconSeed seed1;
   seed1.set_data(kBeaconSeed1Data);
   seed1.set_start_time_millis(kBeaconSeed1StartTime);
   seed1.set_end_time_millis(kBeaconSeed1EndTime);
   device_with_all_fields.add_beacon_seeds()->CopyFrom(seed1);
+
   BeaconSeed seed2;
   seed2.set_data(kBeaconSeed2Data);
   seed2.set_start_time_millis(kBeaconSeed2StartTime);
   seed2.set_end_time_millis(kBeaconSeed2EndTime);
   device_with_all_fields.add_beacon_seeds()->CopyFrom(seed2);
-  response.add_devices()->CopyFrom(device_with_all_fields);
+
+  device_with_all_fields.set_arc_plus_plus(true);
+  device_with_all_fields.set_pixel_phone(true);
+
+  device_with_all_fields.add_supported_software_features(
+      SoftwareFeature::EASY_UNLOCK_HOST);
+  device_with_all_fields.add_supported_software_features(
+      SoftwareFeature::MAGIC_TETHER_HOST);
+
+  device_with_all_fields.add_enabled_software_features(
+      SoftwareFeature::MAGIC_TETHER_HOST);
 
   std::vector<ExternalDeviceInfo> expected_devices;
   expected_devices.push_back(device_with_only_public_key);
@@ -844,6 +942,10 @@
   EXPECT_CALL(*this, OnSyncFinishedProxy(
                          CryptAuthDeviceManager::SyncResult::SUCCESS,
                          CryptAuthDeviceManager::DeviceChangeResult::CHANGED));
+
+  GetMyDevicesResponse response;
+  response.add_devices()->CopyFrom(device_with_only_public_key);
+  response.add_devices()->CopyFrom(device_with_all_fields);
   success_callback_.Run(response);
 
   ExpectSyncedDevicesAndPrefAreEqual(
diff --git a/components/cryptauth/device_to_device_authenticator.cc b/components/cryptauth/device_to_device_authenticator.cc
index dc0053a..16ea3b7d 100644
--- a/components/cryptauth/device_to_device_authenticator.cc
+++ b/components/cryptauth/device_to_device_authenticator.cc
@@ -224,7 +224,7 @@
     Connection::Status old_status,
     Connection::Status new_status) {
   // We do not expect the connection to drop during authentication.
-  if (new_status == Connection::DISCONNECTED) {
+  if (new_status == Connection::Status::DISCONNECTED) {
     Fail("Disconnected while authentication is in progress",
          Result::DISCONNECTED);
   }
diff --git a/components/cryptauth/fake_connection.cc b/components/cryptauth/fake_connection.cc
index fbe66dd..2d27f53 100644
--- a/components/cryptauth/fake_connection.cc
+++ b/components/cryptauth/fake_connection.cc
@@ -28,14 +28,14 @@
 
 void FakeConnection::Connect() {
   if (should_auto_connect_) {
-    SetStatus(CONNECTED);
+    SetStatus(Status::CONNECTED);
   } else {
-    SetStatus(IN_PROGRESS);
+    SetStatus(Status::IN_PROGRESS);
   }
 }
 
 void FakeConnection::Disconnect() {
-  SetStatus(DISCONNECTED);
+  SetStatus(Status::DISCONNECTED);
 }
 
 std::string FakeConnection::GetDeviceAddress() {
@@ -56,12 +56,12 @@
 
 void FakeConnection::CompleteInProgressConnection(bool success) {
   DCHECK(!should_auto_connect_);
-  DCHECK(status() == IN_PROGRESS);
+  DCHECK(status() == Status::IN_PROGRESS);
 
   if (success) {
-    SetStatus(CONNECTED);
+    SetStatus(Status::CONNECTED);
   } else {
-    SetStatus(DISCONNECTED);
+    SetStatus(Status::DISCONNECTED);
   }
 }
 
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol.cc
index ac307e5..bc20df0d 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol.cc
@@ -8,7 +8,6 @@
 
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_stats.h"
@@ -68,13 +67,6 @@
       proxy_info, bypass_duration, additional_bad_proxies, request->net_log());
 }
 
-void ReportResponseProxyServerStatusHistogram(
-    DataReductionProxyBypassProtocol::ResponseProxyServerStatus status) {
-  UMA_HISTOGRAM_ENUMERATION(
-      "DataReductionProxy.ResponseProxyServerStatus", status,
-      DataReductionProxyBypassProtocol::RESPONSE_PROXY_SERVER_STATUS_MAX);
-}
-
 }  // namespace
 
 DataReductionProxyBypassProtocol::DataReductionProxyBypassProtocol(
@@ -100,7 +92,7 @@
       request->response_info().headers.get();
   bool retry;
   if (!response_headers) {
-    retry = HandleInValidResponseHeadersCase(
+    retry = HandleInvalidResponseHeadersCase(
         *request, data_reduction_proxy_info, &data_reduction_proxy_type_info,
         &bypass_type);
 
@@ -125,7 +117,7 @@
          net::HttpUtil::IsMethodIdempotent(request->method());
 }
 
-bool DataReductionProxyBypassProtocol::HandleInValidResponseHeadersCase(
+bool DataReductionProxyBypassProtocol::HandleInvalidResponseHeadersCase(
     const net::URLRequest& request,
     DataReductionProxyInfo* data_reduction_proxy_info,
     DataReductionProxyTypeInfo* data_reduction_proxy_type_info,
@@ -197,43 +189,11 @@
       request.response_info().headers.get();
 
   DCHECK(response_headers);
-  if (!request.proxy_server().is_valid() ||
-      request.proxy_server().is_direct() ||
-      request.proxy_server().host_port_pair().IsEmpty()) {
-    ReportResponseProxyServerStatusHistogram(
-        RESPONSE_PROXY_SERVER_STATUS_EMPTY);
-    return false;
-  }
 
   if (!config_->WasDataReductionProxyUsed(&request,
                                           data_reduction_proxy_type_info)) {
-    if (!HasDataReductionProxyViaHeader(*response_headers, nullptr)) {
-      ReportResponseProxyServerStatusHistogram(
-          RESPONSE_PROXY_SERVER_STATUS_NON_DRP_NO_VIA);
-      return false;
-    }
-    ReportResponseProxyServerStatusHistogram(
-        RESPONSE_PROXY_SERVER_STATUS_NON_DRP_WITH_VIA);
-
-    // If the |proxy_server| doesn't match any of the currently configured
-    // Data Reduction Proxies, but it still has the Data Reduction Proxy via
-    // header, then apply the bypass logic regardless.
-    // TODO(sclittle): Remove this workaround once http://crbug.com/476610 is
-    // fixed.
-    const net::HostPortPair host_port_pair =
-        !request.proxy_server().is_valid() || request.proxy_server().is_direct()
-            ? net::HostPortPair()
-            : request.proxy_server().host_port_pair();
-    data_reduction_proxy_type_info->proxy_servers.push_back(
-        net::ProxyServer(net::ProxyServer::SCHEME_HTTPS, host_port_pair));
-    data_reduction_proxy_type_info->proxy_servers.push_back(
-        net::ProxyServer(net::ProxyServer::SCHEME_HTTP, host_port_pair));
-    data_reduction_proxy_type_info->proxy_index = 0;
-  } else {
-    ReportResponseProxyServerStatusHistogram(RESPONSE_PROXY_SERVER_STATUS_DRP);
-  }
-  if (data_reduction_proxy_type_info->proxy_servers.empty())
     return false;
+  }
 
   // At this point, the response is expected to have the data reduction proxy
   // via header, so detect and report cases where the via header is missing.
@@ -241,7 +201,7 @@
       data_reduction_proxy_type_info->proxy_index == 0, *response_headers);
 
   // GetDataReductionProxyBypassType will only log a net_log event if a bypass
-  // command was sent via the data reduction proxy headers
+  // command was sent via the data reduction proxy headers.
   *bypass_type = GetDataReductionProxyBypassType(
       request.url_chain(), *response_headers, data_reduction_proxy_info);
 
@@ -252,6 +212,7 @@
 
   DCHECK(request.context());
   DCHECK(request.context()->proxy_resolution_service());
+  DCHECK_LT(0U, data_reduction_proxy_type_info->proxy_servers.size());
   net::ProxyServer proxy_server =
       data_reduction_proxy_type_info->proxy_servers.front();
 
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol.h
index 40aaf09..c0eff9e 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol.h
@@ -23,18 +23,6 @@
 // DataReductionProxyInterceptor.
 class DataReductionProxyBypassProtocol {
  public:
-  // Enum values that can be reported for the
-  // DataReductionProxy.ResponseProxyServerStatus histogram. These values must
-  // be kept in sync with their counterparts in histograms.xml. Visible here for
-  // testing purposes.
-  enum ResponseProxyServerStatus {
-    RESPONSE_PROXY_SERVER_STATUS_EMPTY = 0,
-    RESPONSE_PROXY_SERVER_STATUS_DRP,
-    RESPONSE_PROXY_SERVER_STATUS_NON_DRP_NO_VIA,
-    RESPONSE_PROXY_SERVER_STATUS_NON_DRP_WITH_VIA,
-    RESPONSE_PROXY_SERVER_STATUS_MAX
-  };
-
   // Constructs a DataReductionProxyBypassProtocol object. |config| must be
   // non-NULL and outlive |this|.
   DataReductionProxyBypassProtocol(DataReductionProxyConfig* config);
@@ -57,7 +45,7 @@
   // put it on the proxy retry map. Returns true if the request should be
   // retried. Should be called only when the response of the |request| had null
   // response headers.
-  bool HandleInValidResponseHeadersCase(
+  bool HandleInvalidResponseHeadersCase(
       const net::URLRequest& request,
       DataReductionProxyInfo* data_reduction_proxy_info,
       DataReductionProxyTypeInfo* data_reduction_proxy_type_info,
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol_unittest.cc
index 2df31e2b..3d1df11 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol_unittest.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_bypass_protocol_unittest.cc
@@ -1053,194 +1053,6 @@
   }
 }
 
-class DataReductionProxyBypassProtocolEndToEndTest : public testing::Test {
- public:
-  DataReductionProxyBypassProtocolEndToEndTest() {}
-
-  void ResetDependencies() {
-    context_.reset(new net::TestURLRequestContext(true));
-    storage_.reset(new net::URLRequestContextStorage(context_.get()));
-    mock_socket_factory_.reset(new net::MockClientSocketFactory());
-    context_->set_client_socket_factory(mock_socket_factory_.get());
-    drp_test_context_ =
-        DataReductionProxyTestContext::Builder()
-            .WithMockClientSocketFactory(mock_socket_factory_.get())
-            .WithURLRequestContext(context_.get())
-            .Build();
-    proxy_delegate_ = drp_test_context_->io_data()->CreateProxyDelegate();
-    context_->set_proxy_delegate(proxy_delegate_.get());
-  }
-
-  void AttachToContextAndInit() {
-    drp_test_context_->AttachToURLRequestContext(storage_.get());
-    context_->Init();
-  }
-
-  net::TestURLRequestContext* context() { return context_.get(); }
-  net::URLRequestContextStorage* storage() { return storage_.get(); }
-  net::MockClientSocketFactory* mock_socket_factory() {
-    return mock_socket_factory_.get();
-  }
-  DataReductionProxyTestContext* drp_test_context() {
-    return drp_test_context_.get();
-  }
-
- private:
-  base::MessageLoopForIO loop_;
-  std::unique_ptr<net::TestURLRequestContext> context_;
-  std::unique_ptr<net::URLRequestContextStorage> storage_;
-  std::unique_ptr<net::MockClientSocketFactory> mock_socket_factory_;
-  std::unique_ptr<net::ProxyDelegate> proxy_delegate_;
-  std::unique_ptr<DataReductionProxyTestContext> drp_test_context_;
-
-  DISALLOW_COPY_AND_ASSIGN(DataReductionProxyBypassProtocolEndToEndTest);
-};
-
-TEST_F(DataReductionProxyBypassProtocolEndToEndTest,
-       BypassLogicAlwaysAppliesWhenViaHeaderPresent) {
-  const struct {
-    const char* first_response;
-    bool expected_retry;
-    bool expected_bad_proxy;
-    DataReductionProxyBypassType expected_bypass_type;
-  } test_cases[] = {
-      {"HTTP/1.1 200 OK\r\n"
-       "Server: proxy\r\n"
-       "Chrome-Proxy: block=0\r\n"
-       "Via: 1.1 Chrome-Compression-Proxy\r\n\r\n",
-       true,
-       true,
-       BYPASS_EVENT_TYPE_MEDIUM},
-      {"HTTP/1.1 200 OK\r\n"
-       "Server: proxy\r\n"
-       "Chrome-Proxy: bypass=0\r\n"
-       "Via: 1.1 Chrome-Compression-Proxy\r\n\r\n",
-       true,
-       true,
-       BYPASS_EVENT_TYPE_MEDIUM},
-      {"HTTP/1.1 502 Bad Gateway\r\n"
-       "Server: proxy\r\n"
-       "Via: 1.1 Chrome-Compression-Proxy\r\n\r\n",
-       true,
-       true,
-       BYPASS_EVENT_TYPE_STATUS_502_HTTP_BAD_GATEWAY},
-      {"HTTP/1.1 200 OK\r\n"
-       "Server: proxy\r\n"
-       "Chrome-Proxy: block=0\r\n\r\n",
-       false,
-       false,
-       BYPASS_EVENT_TYPE_MAX},
-      {"HTTP/1.1 502 Bad Gateway\r\n"
-       "Server: proxy\r\n\r\n",
-       false,
-       false,
-       BYPASS_EVENT_TYPE_MAX},
-  };
-
-  for (const auto& test : test_cases) {
-    const std::string kPrimary = "https://unrecognized-drp.net:443";
-
-    ResetDependencies();
-    storage()->set_proxy_resolution_service(ProxyResolutionService::CreateFixed(
-        kPrimary + ",direct://", TRAFFIC_ANNOTATION_FOR_TESTS));
-    AttachToContextAndInit();
-
-    // The proxy is an HTTPS proxy, so set up the fake SSL socket data.
-    net::SSLSocketDataProvider ssl_socket(net::ASYNC, net::OK);
-    mock_socket_factory()->AddSSLSocketDataProvider(&ssl_socket);
-
-    MockRead first_reads[] = {MockRead(test.first_response),
-                              MockRead(""),
-                              MockRead(net::SYNCHRONOUS, net::OK)};
-    net::StaticSocketDataProvider first_socket(
-        first_reads, arraysize(first_reads), nullptr, 0);
-    mock_socket_factory()->AddSocketDataProvider(&first_socket);
-
-    MockRead retry_reads[] = {MockRead("HTTP/1.1 200 OK\n\r\n\r"),
-                              MockRead(""),
-                              MockRead(net::SYNCHRONOUS, net::OK)};
-    net::StaticSocketDataProvider retry_socket(
-        retry_reads, arraysize(retry_reads), nullptr, 0);
-    if (test.expected_retry)
-      mock_socket_factory()->AddSocketDataProvider(&retry_socket);
-
-    net::TestDelegate delegate;
-    std::unique_ptr<net::URLRequest> url_request(
-        context()->CreateRequest(GURL("http://www.google.com"), net::IDLE,
-                                 &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
-    url_request->Start();
-    drp_test_context()->RunUntilIdle();
-
-    EXPECT_EQ(test.expected_bypass_type,
-              drp_test_context()->io_data()->bypass_stats()->GetBypassType());
-    // Check the bad proxy list.
-    EXPECT_EQ(test.expected_bad_proxy, base::ContainsKey(
-        context()->proxy_resolution_service()->proxy_retry_info(),
-        kPrimary));
-  }
-}
-
-TEST_F(DataReductionProxyBypassProtocolEndToEndTest,
-       ResponseProxyServerStateHistogram) {
-  const struct {
-    const char* proxy_rules;
-    bool enable_data_reduction_proxy;
-    const char* response_headers;
-    // |RESPONSE_PROXY_SERVER_STATUS_MAX| indicates no expected value.
-    DataReductionProxyBypassProtocol::ResponseProxyServerStatus expected_status;
-  } test_cases[] = {
-      {"direct://",
-       false,
-       "HTTP/1.1 200 OK\r\n\r\n",
-       DataReductionProxyBypassProtocol::RESPONSE_PROXY_SERVER_STATUS_EMPTY},
-      {"direct://",
-       true,
-       "HTTP/1.1 200 OK\r\nVia: 1.1 Chrome-Compression-Proxy\r\n\r\n",
-       DataReductionProxyBypassProtocol::RESPONSE_PROXY_SERVER_STATUS_DRP},
-      {"unrecognized-drp.net",
-       false,
-       "HTTP/1.1 200 OK\r\n\r\n",
-       DataReductionProxyBypassProtocol::
-           RESPONSE_PROXY_SERVER_STATUS_NON_DRP_NO_VIA},
-      {"unrecognized-drp.net",
-       false,
-       "HTTP/1.1 200 OK\r\nVia: 1.1 Chrome-Compression-Proxy\r\n\r\n",
-       DataReductionProxyBypassProtocol::
-           RESPONSE_PROXY_SERVER_STATUS_NON_DRP_WITH_VIA},
-  };
-
-  for (const auto& test : test_cases) {
-    ResetDependencies();
-    storage()->set_proxy_resolution_service(
-        net::ProxyResolutionService::CreateFixed(test.proxy_rules,
-                                                 TRAFFIC_ANNOTATION_FOR_TESTS));
-    AttachToContextAndInit();
-    if (test.enable_data_reduction_proxy) {
-      drp_test_context()->DisableWarmupURLFetch();
-      drp_test_context()->EnableDataReductionProxyWithSecureProxyCheckSuccess();
-    }
-    drp_test_context()->config()->test_params()->UseNonSecureProxiesForHttp();
-
-    MockRead reads[] = {MockRead(test.response_headers),
-                        MockRead(""),
-                        MockRead(net::SYNCHRONOUS, net::OK)};
-    net::StaticSocketDataProvider socket(reads, arraysize(reads), nullptr, 0);
-    mock_socket_factory()->AddSocketDataProvider(&socket);
-
-    base::HistogramTester histogram_tester;
-    net::TestDelegate delegate;
-    std::unique_ptr<net::URLRequest> request(
-        context()->CreateRequest(GURL("http://google.com"), net::IDLE,
-                                 &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
-    request->Start();
-    drp_test_context()->RunUntilIdle();
-
-    histogram_tester.ExpectUniqueSample(
-        "DataReductionProxy.ResponseProxyServerStatus", test.expected_status,
-        1);
-  }
-}
-
 TEST_F(DataReductionProxyProtocolTest,
        ProxyBypassIgnoredOnDirectConnection) {
   // Verify that a Chrome-Proxy header is ignored when returned from a directly
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc
index 0a61236d..2bcf426 100644
--- a/components/exo/client_controlled_shell_surface_unittest.cc
+++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -457,7 +457,7 @@
   gfx::Rect client_bounds(20, 50, 300, 200);
   gfx::Rect fullscreen_bounds(0, 0, 800, 500);
   // The window bounds is the client bounds + frame size.
-  gfx::Rect normal_window_bounds(20, 17, 300, 233);
+  gfx::Rect normal_window_bounds(20, 18, 300, 232);
 
   auto shell_surface =
       exo_test_helper()->CreateClientControlledShellSurface(surface.get());
@@ -484,7 +484,7 @@
   EXPECT_TRUE(frame_view->visible());
   EXPECT_EQ(fullscreen_bounds, widget->GetWindowBoundsInScreen());
   EXPECT_EQ(
-      gfx::Size(800, 467),
+      gfx::Size(800, 468),
       frame_view->GetClientBoundsForWindowBounds(fullscreen_bounds).size());
 
   // AutoHide
diff --git a/components/exo/shell_surface_unittest.cc b/components/exo/shell_surface_unittest.cc
index 98f4bdf..daa34b9 100644
--- a/components/exo/shell_surface_unittest.cc
+++ b/components/exo/shell_surface_unittest.cc
@@ -364,7 +364,7 @@
                       ->delegate()
                       ->GetMinimumSize());
 
-  gfx::Size size_with_frame(50, 83);
+  gfx::Size size_with_frame(50, 82);
   surface->SetFrame(SurfaceFrameType::NORMAL);
   EXPECT_EQ(size, shell_surface->GetMinimumSize());
   EXPECT_EQ(size_with_frame, shell_surface->GetWidget()->GetMinimumSize());
diff --git a/components/feed/core/feed_host_service.cc b/components/feed/core/feed_host_service.cc
index 7047887b..72e985c 100644
--- a/components/feed/core/feed_host_service.cc
+++ b/components/feed/core/feed_host_service.cc
@@ -9,12 +9,18 @@
 namespace feed {
 
 FeedHostService::FeedHostService(
+    std::unique_ptr<FeedImageManager> image_manager,
     std::unique_ptr<FeedNetworkingHost> networking_host)
-    : networking_host_(std::move(networking_host)) {}
+    : image_manager_(std::move(image_manager)),
+      networking_host_(std::move(networking_host)) {}
 
 FeedHostService::~FeedHostService() = default;
 
-FeedNetworkingHost* FeedHostService::GetFeedNetworkingHost() {
+FeedImageManager* FeedHostService::GetImageManager() {
+  return image_manager_.get();
+}
+
+FeedNetworkingHost* FeedHostService::GetNetworkingHost() {
   return networking_host_.get();
 }
 
diff --git a/components/feed/core/feed_host_service.h b/components/feed/core/feed_host_service.h
index c94f049..4270b31 100644
--- a/components/feed/core/feed_host_service.h
+++ b/components/feed/core/feed_host_service.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "components/feed/core/feed_image_manager.h"
 #include "components/feed/core/feed_networking_host.h"
 #include "components/keyed_service/core/keyed_service.h"
 
@@ -20,11 +21,15 @@
 // yet.
 class FeedHostService : public KeyedService {
  public:
-  explicit FeedHostService(std::unique_ptr<FeedNetworkingHost> networking_host);
+  FeedHostService(std::unique_ptr<FeedImageManager> image_manager,
+                  std::unique_ptr<FeedNetworkingHost> networking_host);
   ~FeedHostService() override;
-  FeedNetworkingHost* GetFeedNetworkingHost();
+
+  FeedImageManager* GetImageManager();
+  FeedNetworkingHost* GetNetworkingHost();
 
  private:
+  std::unique_ptr<FeedImageManager> image_manager_;
   std::unique_ptr<FeedNetworkingHost> networking_host_;
 
   DISALLOW_COPY_AND_ASSIGN(FeedHostService);
diff --git a/components/gcm_driver/gcm_client.cc b/components/gcm_driver/gcm_client.cc
index fa9a7e44..cc9ccc1 100644
--- a/components/gcm_driver/gcm_client.cc
+++ b/components/gcm_driver/gcm_client.cc
@@ -9,34 +9,30 @@
 GCMClient::ChromeBuildInfo::ChromeBuildInfo()
     : platform(PLATFORM_UNSPECIFIED), channel(CHANNEL_UNKNOWN) {}
 
-GCMClient::ChromeBuildInfo::~ChromeBuildInfo() {
-}
+GCMClient::ChromeBuildInfo::~ChromeBuildInfo() = default;
 
 GCMClient::SendErrorDetails::SendErrorDetails() : result(UNKNOWN_ERROR) {}
 
 GCMClient::SendErrorDetails::SendErrorDetails(const SendErrorDetails& other) =
     default;
 
-GCMClient::SendErrorDetails::~SendErrorDetails() {}
+GCMClient::SendErrorDetails::~SendErrorDetails() = default;
 
 GCMClient::GCMStatistics::GCMStatistics()
     : is_recording(false),
       gcm_client_created(false),
       connection_client_created(false),
-      android_id(0),
+      android_id(0u),
+      android_secret(0u),
       send_queue_size(0),
-      resend_queue_size(0) {
-}
+      resend_queue_size(0) {}
 
 GCMClient::GCMStatistics::GCMStatistics(const GCMStatistics& other) = default;
 
-GCMClient::GCMStatistics::~GCMStatistics() {
-}
+GCMClient::GCMStatistics::~GCMStatistics() = default;
 
-GCMClient::GCMClient() {
-}
+GCMClient::GCMClient() = default;
 
-GCMClient::~GCMClient() {
-}
+GCMClient::~GCMClient() = default;
 
 }  // namespace gcm
diff --git a/components/gcm_driver/gcm_client.h b/components/gcm_driver/gcm_client.h
index 8116f5b..2926056 100644
--- a/components/gcm_driver/gcm_client.h
+++ b/components/gcm_driver/gcm_client.h
@@ -129,6 +129,7 @@
     base::Time last_checkin;
     base::Time next_checkin;
     uint64_t android_id;
+    uint64_t android_secret;
     std::vector<std::string> registered_app_ids;
     int send_queue_size;
     int resend_queue_size;
diff --git a/components/gcm_driver/gcm_client_impl.cc b/components/gcm_driver/gcm_client_impl.cc
index 38d46f4..1a7627ec 100644
--- a/components/gcm_driver/gcm_client_impl.cc
+++ b/components/gcm_driver/gcm_client_impl.cc
@@ -1292,6 +1292,9 @@
   }
   if (device_checkin_info_.android_id > 0)
     stats.android_id = device_checkin_info_.android_id;
+  if (device_checkin_info_.secret > 0)
+    stats.android_secret = device_checkin_info_.secret;
+
   recorder_.CollectActivities(&stats.recorded_activities);
 
   for (RegistrationInfoMap::const_iterator it = registrations_.begin();
diff --git a/components/gcm_driver/gcm_internals_constants.cc b/components/gcm_driver/gcm_internals_constants.cc
index b3017f8..dbbd9668 100644
--- a/components/gcm_driver/gcm_internals_constants.cc
+++ b/components/gcm_driver/gcm_internals_constants.cc
@@ -17,6 +17,7 @@
 
 // GCM internal info.
 const char kAndroidId[] = "androidId";
+const char kAndroidSecret[] = "androidSecret";
 const char kCheckinInfo[] = "checkinInfo";
 const char kConnectionClientCreated[] = "connectionClientCreated";
 const char kConnectionInfo[] = "connectionInfo";
diff --git a/components/gcm_driver/gcm_internals_constants.h b/components/gcm_driver/gcm_internals_constants.h
index 974d0e85..54623bc4 100644
--- a/components/gcm_driver/gcm_internals_constants.h
+++ b/components/gcm_driver/gcm_internals_constants.h
@@ -21,6 +21,7 @@
 // GCM internal info.
 // Must match the constants used in the resource files.
 extern const char kAndroidId[];
+extern const char kAndroidSecret[];
 extern const char kCheckinInfo[];
 extern const char kConnectionClientCreated[];
 extern const char kConnectionInfo[];
diff --git a/components/gcm_driver/gcm_internals_helper.cc b/components/gcm_driver/gcm_internals_helper.cc
index 685d6f5..0486680 100644
--- a/components/gcm_driver/gcm_internals_helper.cc
+++ b/components/gcm_driver/gcm_internals_helper.cc
@@ -133,6 +133,10 @@
       device_info->SetString(
           kAndroidId, base::StringPrintf("0x%" PRIx64, stats->android_id));
     }
+    if (stats->android_secret > 0) {
+      device_info->SetString(kAndroidSecret,
+                             base::NumberToString(stats->android_secret));
+    }
     device_info->SetInteger(kSendQueueSize, stats->send_queue_size);
     device_info->SetInteger(kResendQueueSize, stats->resend_queue_size);
     results->Set(kDeviceInfo, std::move(device_info));
diff --git a/components/gcm_driver/resources/gcm_internals.css b/components/gcm_driver/resources/gcm_internals.css
index 0acd078..82ebe76 100644
--- a/components/gcm_driver/resources/gcm_internals.css
+++ b/components/gcm_driver/resources/gcm_internals.css
@@ -32,7 +32,7 @@
   padding: 0px 4px;
 }
 
-#device-info tr :first-child {
+#device-info tr > :first-child {
   font-weight: bold;
   padding-right: 10px;
   text-align: end;
@@ -41,3 +41,7 @@
 .log-table {
   padding: 4px;
 }
+
+#android-secret-container.invisible {
+  display: none;
+}
diff --git a/components/gcm_driver/resources/gcm_internals.html b/components/gcm_driver/resources/gcm_internals.html
index 70d497c..e8bd5f7 100644
--- a/components/gcm_driver/resources/gcm_internals.html
+++ b/components/gcm_driver/resources/gcm_internals.html
@@ -37,7 +37,11 @@
         <td>
           Android Id
         </td>
-        <td id="android-id">
+        <td>
+          <span id="android-id"></span>
+          <span id="android-secret-container" class="invisible">
+            (<b>secret</b>: <span id="android-secret"></span>)
+          </span>
         </td>
       </tr>
       <tr>
diff --git a/components/gcm_driver/resources/gcm_internals.js b/components/gcm_driver/resources/gcm_internals.js
index 94244fc..400070a 100644
--- a/components/gcm_driver/resources/gcm_internals.js
+++ b/components/gcm_driver/resources/gcm_internals.js
@@ -6,6 +6,7 @@
   'use strict';
 
   var isRecording = false;
+  var keyPressState = 0;
 
   /**
    * If the info dictionary has property prop, then set the text content of
@@ -32,6 +33,7 @@
    */
   function displayDeviceInfo(info) {
     setIfExists(info, 'androidId', 'android-id');
+    setIfExists(info, 'androidSecret', 'android-secret');
     setIfExists(info, 'profileServiceCreated', 'profile-service-created');
     setIfExists(info, 'gcmEnabled', 'gcm-enabled');
     setIfExists(info, 'gcmClientCreated', 'gcm-client-created');
@@ -113,6 +115,28 @@
   }
 
   /**
+   * Allows displaying the Android Secret by typing a secret phrase.
+   *
+   * There are good reasons for displaying the Android Secret associated with
+   * the local connection info, but we also need to be careful to make sure that
+   * users don't share this value by accident. Therefore we require a secret
+   * phrase to be typed into the page for making it visible.
+   *
+   * @param {!Event} event The keypress event handler.
+   */
+  function handleKeyPress(event) {
+    var PHRASE = 'secret';
+    if (PHRASE.charCodeAt(keyPressState) === event.keyCode) {
+      if (++keyPressState < PHRASE.length)
+        return;
+
+      $('android-secret-container').classList.remove('invisible');
+    }
+
+    keyPressState = 0;
+  }
+
+  /**
    * Refresh the log html table by clearing it first. If data is not empty, then
    * it will be used to populate the table.
    * @param {string} tableId ID of the log html table.
@@ -154,8 +178,10 @@
   // Return an object with all of the exports.
   return {
     initialize: initialize,
+    handleKeyPress: handleKeyPress,
     setGcmInternalsInfo: setGcmInternalsInfo,
   };
 });
 
 document.addEventListener('DOMContentLoaded', gcmInternals.initialize);
+document.addEventListener('keypress', gcmInternals.handleKeyPress);
diff --git a/components/mirroring/browser/cast_remoting_sender_unittest.cc b/components/mirroring/browser/cast_remoting_sender_unittest.cc
index 780c3a7..4a18c55 100644
--- a/components/mirroring/browser/cast_remoting_sender_unittest.cc
+++ b/components/mirroring/browser/cast_remoting_sender_unittest.cc
@@ -124,8 +124,8 @@
     remoting_sender_->OnReceivedRtt(base::TimeDelta::FromMilliseconds(1));
 
     const MojoCreateDataPipeOptions data_pipe_options{
-        sizeof(MojoCreateDataPipeOptions),
-        MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 1, kDataPipeCapacity};
+        sizeof(MojoCreateDataPipeOptions), MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1,
+        kDataPipeCapacity};
     mojo::ScopedDataPipeConsumerHandle consumer_end;
     CHECK_EQ(MOJO_RESULT_OK,
              mojo::CreateDataPipe(&data_pipe_options, &producer_end_,
diff --git a/components/mirroring/service/BUILD.gn b/components/mirroring/service/BUILD.gn
index aa93af1..6aea231d 100644
--- a/components/mirroring/service/BUILD.gn
+++ b/components/mirroring/service/BUILD.gn
@@ -6,6 +6,7 @@
 
 source_set("interface") {
   sources = [
+    "interface.cc",
     "interface.h",
   ]
 
@@ -26,6 +27,8 @@
   sources = [
     "message_dispatcher.cc",
     "message_dispatcher.h",
+    "mirror_settings.cc",
+    "mirror_settings.h",
     "receiver_response.cc",
     "receiver_response.h",
     "rtp_stream.cc",
@@ -46,6 +49,7 @@
 
   deps = [
     ":interface",
+    "//crypto",
     "//media",
     "//media/capture/mojom:video_capture",
     "//media/cast:common",
diff --git a/components/mirroring/service/DEPS b/components/mirroring/service/DEPS
index 95734c52..1118c02 100644
--- a/components/mirroring/service/DEPS
+++ b/components/mirroring/service/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+crypto",
   "+net",
   "+services/network/public/mojom",
   "+services/network/test",
diff --git a/components/mirroring/service/interface.cc b/components/mirroring/service/interface.cc
new file mode 100644
index 0000000..6781ef7
--- /dev/null
+++ b/components/mirroring/service/interface.cc
@@ -0,0 +1,15 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/mirroring/service/interface.h"
+
+namespace mirroring {
+
+CastSinkInfo::CastSinkInfo() {}
+
+CastSinkInfo::~CastSinkInfo() {}
+
+CastSinkInfo::CastSinkInfo(const CastSinkInfo& sink_info) = default;
+
+}  // namespace mirroring
diff --git a/components/mirroring/service/interface.h b/components/mirroring/service/interface.h
index 1ce0fe7..f664da12 100644
--- a/components/mirroring/service/interface.h
+++ b/components/mirroring/service/interface.h
@@ -6,7 +6,6 @@
 #define COMPONENTS_MIRRORING_SERVICE_INTERFACE_H_
 
 #include <string>
-#include <vector>
 
 #include "base/callback.h"
 #include "base/values.h"
@@ -22,14 +21,22 @@
 
 // Errors occurred in a mirroring session.
 enum SessionError {
-  SESSION_START_ERROR,   // Error occurred while starting.
-  AUDIO_CAPTURE_ERROR,   // Error occurred in audio capturing.
-  VIDEO_CAPTURE_ERROR,   // Error occurred in video capturing.
-  CAST_STREAMING_ERROR,  // Error occurred in cast streaming.
-  CAST_TRANSPORT_ERROR,  // Error occurred in cast transport.
+  ANSWER_TIME_OUT,                // ANSWER timeout.
+  ANSWER_NOT_OK,                  // Not OK answer response.
+  ANSWER_MISMATCHED_CAST_MODE,    // ANSWER cast mode mismatched.
+  ANSWER_MISMATCHED_SSRC_LENGTH,  // ANSWER ssrc length mismatched with indexes.
+  ANSWER_SELECT_MULTIPLE_AUDIO,   // Multiple audio streams selected by ANSWER.
+  ANSWER_SELECT_MULTIPLE_VIDEO,   // Multiple video streams selected by ANSWER.
+  ANSWER_SELECT_INVALID_INDEX,    // Invalid index was selected.
+  ANSWER_NO_AUDIO_OR_VIDEO,       // ANSWER not select audio or video.
+  AUDIO_CAPTURE_ERROR,            // Error occurred in audio capturing.
+  VIDEO_CAPTURE_ERROR,            // Error occurred in video capturing.
+  RTP_STREAM_ERROR,               // Error reported by RtpStream.
+  ENCODING_ERROR,                 // Error occurred in encoding.
+  CAST_TRANSPORT_ERROR,           // Error occurred in cast transport.
 };
 
-enum SessionType {
+enum DeviceCapability {
   AUDIO_ONLY,
   VIDEO_ONLY,
   AUDIO_AND_VIDEO,
@@ -49,9 +56,20 @@
   virtual void Send(const CastMessage& message) = 0;
 };
 
-class SessionClient {
+struct CastSinkInfo {
+  CastSinkInfo();
+  ~CastSinkInfo();
+  CastSinkInfo(const CastSinkInfo& sink_info);
+
+  net::IPAddress ip_address;
+  std::string model_name;
+  std::string friendly_name;
+  DeviceCapability capability;
+};
+
+class SessionObserver {
  public:
-  virtual ~SessionClient() {}
+  virtual ~SessionObserver() {}
 
   // Called when error occurred. The session will be stopped.
   virtual void OnError(SessionError error) = 0;
@@ -61,25 +79,19 @@
 
   // Called when the session is stopped.
   virtual void DidStop() = 0;
+};
+
+class ResourceProvider {
+ public:
+  virtual ~ResourceProvider() {}
 
   virtual void GetVideoCaptureHost(
       media::mojom::VideoCaptureHostRequest request) = 0;
-  virtual void GetNetWorkContext(
+  virtual void GetNetworkContext(
       network::mojom::NetworkContextRequest request) = 0;
   // TODO(xjz): Add interface to get AudioCaptureHost.
   // TODO(xjz): Add interface for HW encoder profiles query and VEA create
   // support.
-
-  // TODO(xjz): Change this with an interface to send/receive messages to/from
-  // receiver through cast channel, and generate/parse the OFFER/ANSWER message
-  // in Mirroing service.
-  using GetAnswerCallback = base::OnceCallback<void(
-      const media::cast::FrameSenderConfig& audio_config,
-      const media::cast::FrameSenderConfig& video_config)>;
-  virtual void DoOfferAnswerExchange(
-      const std::vector<media::cast::FrameSenderConfig>& audio_configs,
-      const std::vector<media::cast::FrameSenderConfig>& video_configs,
-      GetAnswerCallback callback) = 0;
 };
 
 }  // namespace mirroring
diff --git a/components/mirroring/service/mirror_settings.cc b/components/mirroring/service/mirror_settings.cc
new file mode 100644
index 0000000..84f5cdad
--- /dev/null
+++ b/components/mirroring/service/mirror_settings.cc
@@ -0,0 +1,102 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/mirroring/service/mirror_settings.h"
+
+#include <algorithm>
+
+using media::cast::FrameSenderConfig;
+using media::cast::Codec;
+using media::cast::RtpPayloadType;
+
+namespace mirroring {
+
+namespace {
+
+// Starting end-to-end latency for animated content.
+constexpr base::TimeDelta kAnimatedPlayoutDelay =
+    base::TimeDelta::FromMilliseconds(400);
+
+// Minimum end-to-end latency. This allows cast streaming to adaptively lower
+// latency in interactive streaming scenarios.
+// TODO(miu): This was 120 before stable launch, but we got user feedback that
+// this was causing audio drop-outs. So, we need to fix the Cast Streaming
+// implementation before lowering this setting.
+constexpr base::TimeDelta kMinPlayoutDelay =
+    base::TimeDelta::FromMilliseconds(400);
+
+// Maximum end-to-end latency.
+constexpr base::TimeDelta kMaxPlayoutDelay =
+    base::TimeDelta::FromMilliseconds(800);
+
+constexpr int kAudioTimebase = 48000;
+constexpr int kVidoTimebase = 90000;
+constexpr int kAudioChannels = 2;
+constexpr int kAudioFramerate = 100;  // 100 FPS for 10ms packets.
+constexpr int kMinVideoBitrate = 300000;
+constexpr int kMaxVideoBitrate = 5000000;
+constexpr int kAudioBitrate = 0;   // 0 means automatic.
+constexpr int kMaxFrameRate = 30;  // The maximum frame rate for captures.
+constexpr int kMaxWidth = 1920;    // Maximum video width in pixels.
+constexpr int kMaxHeight = 1080;   // Maximum video height in pixels.
+constexpr int kMinWidth = 180;     // Minimum video frame width in pixels.
+constexpr int kMinHeight = 180;    // Minimum video frame height in pixels.
+
+}  // namespace
+
+MirrorSettings::MirrorSettings()
+    : min_width_(kMinWidth),
+      min_height_(kMinHeight),
+      max_width_(kMaxWidth),
+      max_height_(kMaxHeight) {}
+
+MirrorSettings::~MirrorSettings() {}
+
+// static
+FrameSenderConfig MirrorSettings::GetDefaultAudioConfig(
+    RtpPayloadType payload_type,
+    Codec codec) {
+  FrameSenderConfig config;
+  config.sender_ssrc = 1;
+  config.receiver_ssrc = 2;
+  config.min_playout_delay = kMinPlayoutDelay;
+  config.max_playout_delay = kMaxPlayoutDelay;
+  config.animated_playout_delay = kAnimatedPlayoutDelay;
+  config.rtp_payload_type = payload_type;
+  config.rtp_timebase = kAudioTimebase;
+  config.channels = kAudioChannels;
+  config.min_bitrate = config.max_bitrate = config.start_bitrate =
+      kAudioBitrate;
+  config.max_frame_rate = kAudioFramerate;  // 10 ms audio frames
+  config.codec = codec;
+  return config;
+}
+
+// static
+FrameSenderConfig MirrorSettings::GetDefaultVideoConfig(
+    RtpPayloadType payload_type,
+    Codec codec) {
+  FrameSenderConfig config;
+  config.sender_ssrc = 11;
+  config.receiver_ssrc = 12;
+  config.min_playout_delay = kMinPlayoutDelay;
+  config.max_playout_delay = kMaxPlayoutDelay;
+  config.animated_playout_delay = kAnimatedPlayoutDelay;
+  config.rtp_payload_type = payload_type;
+  config.rtp_timebase = kVidoTimebase;
+  config.channels = 1;
+  config.min_bitrate = kMinVideoBitrate;
+  config.max_bitrate = kMaxVideoBitrate;
+  config.start_bitrate = kMinVideoBitrate;
+  config.max_frame_rate = kMaxFrameRate;
+  config.codec = codec;
+  return config;
+}
+
+void MirrorSettings::SetResolutionContraints(int max_width, int max_height) {
+  max_width_ = std::max(max_width, min_width_);
+  max_height_ = std::max(max_height, min_height_);
+}
+
+}  // namespace mirroring
diff --git a/components/mirroring/service/mirror_settings.h b/components/mirroring/service/mirror_settings.h
new file mode 100644
index 0000000..a939127
--- /dev/null
+++ b/components/mirroring/service/mirror_settings.h
@@ -0,0 +1,50 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MIRRORING_SERVICE_MIRROR_SETTINGS_H_
+#define COMPONENTS_MIRRORING_SERVICE_MIRROR_SETTINGS_H_
+
+#include "base/time/time.h"
+#include "media/cast/cast_config.h"
+
+namespace mirroring {
+
+// Holds the default settings for a mirroring session. This class provides the
+// audio/video configs that this sender supports. And also provides the
+// audio/video constraints used for capturing.
+// TODO(xjz): Add the function to generate the audio/video contraints for
+// capturing.
+// TODO(xjz): Add setters to the settings that might be overriden by integration
+// tests.
+class MirrorSettings {
+ public:
+  MirrorSettings();
+  ~MirrorSettings();
+
+  // Get the audio/video config with given codec.
+  static media::cast::FrameSenderConfig GetDefaultAudioConfig(
+      media::cast::RtpPayloadType payload_type,
+      media::cast::Codec codec);
+  static media::cast::FrameSenderConfig GetDefaultVideoConfig(
+      media::cast::RtpPayloadType payload_type,
+      media::cast::Codec codec);
+
+  // Call to override the default resolution settings.
+  void SetResolutionContraints(int max_width, int max_height);
+
+  int max_width() const { return max_width_; }
+  int max_height() const { return max_height_; }
+
+ private:
+  const int min_width_;
+  const int min_height_;
+  int max_width_;
+  int max_height_;
+
+  DISALLOW_COPY_AND_ASSIGN(MirrorSettings);
+};
+
+}  // namespace mirroring
+
+#endif  // COMPONENTS_MIRRORING_SERVICE_MIRROR_SETTINGS_H_
diff --git a/components/mirroring/service/rtp_stream.cc b/components/mirroring/service/rtp_stream.cc
index 1051557..d9a95d39 100644
--- a/components/mirroring/service/rtp_stream.cc
+++ b/components/mirroring/service/rtp_stream.cc
@@ -8,7 +8,6 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/values.h"
-#include "build/build_config.h"
 #include "media/base/video_frame.h"
 #include "media/cast/cast_config.h"
 #include "media/cast/sender/audio_sender.h"
@@ -30,81 +29,6 @@
 // limit (60 * 250ms = 15 seconds), refresh frame requests will stop being made.
 constexpr int kMaxConsecutiveRefreshFrames = 60;
 
-FrameSenderConfig DefaultOpusConfig() {
-  FrameSenderConfig config;
-  config.rtp_payload_type = RtpPayloadType::AUDIO_OPUS;
-  config.sender_ssrc = 1;
-  config.receiver_ssrc = 2;
-  config.rtp_timebase = media::cast::kDefaultAudioSamplingRate;
-  config.channels = 2;
-  config.min_bitrate = config.max_bitrate = config.start_bitrate =
-      media::cast::kDefaultAudioEncoderBitrate;
-  config.max_frame_rate = 100;  // 10 ms audio frames
-  config.codec = media::cast::CODEC_AUDIO_OPUS;
-  return config;
-}
-
-FrameSenderConfig DefaultVp8Config() {
-  FrameSenderConfig config;
-  config.rtp_payload_type = RtpPayloadType::VIDEO_VP8;
-  config.sender_ssrc = 11;
-  config.receiver_ssrc = 12;
-  config.rtp_timebase = media::cast::kVideoFrequency;
-  config.channels = 1;
-  config.max_bitrate = media::cast::kDefaultMaxVideoBitrate;
-  config.min_bitrate = media::cast::kDefaultMinVideoBitrate;
-  config.max_frame_rate = media::cast::kDefaultMaxFrameRate;
-  config.codec = media::cast::CODEC_VIDEO_VP8;
-  return config;
-}
-
-FrameSenderConfig DefaultH264Config() {
-  FrameSenderConfig config;
-  config.rtp_payload_type = RtpPayloadType::VIDEO_H264;
-  config.sender_ssrc = 11;
-  config.receiver_ssrc = 12;
-  config.rtp_timebase = media::cast::kVideoFrequency;
-  config.channels = 1;
-  config.max_bitrate = media::cast::kDefaultMaxVideoBitrate;
-  config.min_bitrate = media::cast::kDefaultMinVideoBitrate;
-  config.max_frame_rate = media::cast::kDefaultMaxFrameRate;
-  config.codec = media::cast::CODEC_VIDEO_H264;
-  return config;
-}
-
-bool IsHardwareVP8EncodingSupported(RtpStreamClient* client) {
-  // Query for hardware VP8 encoder support.
-  const std::vector<media::VideoEncodeAccelerator::SupportedProfile>
-      vea_profiles = client->GetSupportedVideoEncodeAcceleratorProfiles();
-  for (const auto& vea_profile : vea_profiles) {
-    if (vea_profile.profile >= media::VP8PROFILE_MIN &&
-        vea_profile.profile <= media::VP8PROFILE_MAX) {
-      return true;
-    }
-  }
-  return false;
-}
-
-bool IsHardwareH264EncodingSupported(RtpStreamClient* client) {
-// Query for hardware H.264 encoder support.
-//
-// TODO(miu): Look into why H.264 hardware encoder on MacOS is broken.
-// http://crbug.com/596674
-// TODO(emircan): Look into HW encoder initialization issues on Win.
-// https://crbug.com/636064
-#if !defined(OS_MACOSX) && !defined(OS_WIN)
-  const std::vector<media::VideoEncodeAccelerator::SupportedProfile>
-      vea_profiles = client->GetSupportedVideoEncodeAcceleratorProfiles();
-  for (const auto& vea_profile : vea_profiles) {
-    if (vea_profile.profile >= media::H264PROFILE_MIN &&
-        vea_profile.profile <= media::H264PROFILE_MAX) {
-      return true;
-    }
-  }
-#endif  // !defined(OS_MACOSX) && !defined(OS_WIN)
-  return false;
-}
-
 }  // namespace
 
 VideoRtpStream::VideoRtpStream(
@@ -125,24 +49,6 @@
 
 VideoRtpStream::~VideoRtpStream() {}
 
-// static
-std::vector<FrameSenderConfig> VideoRtpStream::GetSupportedConfigs(
-    RtpStreamClient* client) {
-  std::vector<FrameSenderConfig> supported_configs;
-  // Prefer VP8 over H.264 for hardware encoder.
-  if (IsHardwareVP8EncodingSupported(client))
-    supported_configs.push_back(DefaultVp8Config());
-  if (IsHardwareH264EncodingSupported(client))
-    supported_configs.push_back(DefaultH264Config());
-
-  // Propose the default software VP8 encoder, if no hardware encoders are
-  // available.
-  if (supported_configs.empty())
-    supported_configs.push_back(DefaultVp8Config());
-
-  return supported_configs;
-}
-
 void VideoRtpStream::InsertVideoFrame(
     scoped_refptr<media::VideoFrame> video_frame) {
   DCHECK(client_);
@@ -205,11 +111,6 @@
 
 AudioRtpStream::~AudioRtpStream() {}
 
-// static
-std::vector<FrameSenderConfig> AudioRtpStream::GetSupportedConfigs() {
-  return {DefaultOpusConfig()};
-}
-
 void AudioRtpStream::InsertAudio(std::unique_ptr<media::AudioBus> audio_bus,
                                  base::TimeTicks capture_time) {
   audio_sender_->InsertAudio(std::move(audio_bus), capture_time);
diff --git a/components/mirroring/service/rtp_stream.h b/components/mirroring/service/rtp_stream.h
index ef5788d..9bffae1f 100644
--- a/components/mirroring/service/rtp_stream.h
+++ b/components/mirroring/service/rtp_stream.h
@@ -44,10 +44,6 @@
 
   // The following are for hardware video encoding.
 
-  // Query the supported hardware encoding profiles.
-  virtual media::VideoEncodeAccelerator::SupportedProfiles
-  GetSupportedVideoEncodeAcceleratorProfiles() = 0;
-
   virtual void CreateVideoEncodeAccelerator(
       const media::cast::ReceiveVideoEncodeAcceleratorCallback& callback) = 0;
 
@@ -71,9 +67,6 @@
                  base::WeakPtr<RtpStreamClient> client);
   ~VideoRtpStream();
 
-  static std::vector<media::cast::FrameSenderConfig> GetSupportedConfigs(
-      RtpStreamClient* client);
-
   // Called by VideoCaptureClient when a video frame is received.
   // |video_frame| is required to provide REFERENCE_TIME in the metadata.
   void InsertVideoFrame(scoped_refptr<media::VideoFrame> video_frame);
@@ -115,8 +108,6 @@
                  base::WeakPtr<RtpStreamClient> client);
   ~AudioRtpStream();
 
-  static std::vector<media::cast::FrameSenderConfig> GetSupportedConfigs();
-
   // Called by AudioCaptureClient when new audio data is available.
   void InsertAudio(std::unique_ptr<media::AudioBus> audio_bus,
                    base::TimeTicks estimated_capture_time);
diff --git a/components/mirroring/service/rtp_stream_unittest.cc b/components/mirroring/service/rtp_stream_unittest.cc
index 1a2d228..b0a0ae2 100644
--- a/components/mirroring/service/rtp_stream_unittest.cc
+++ b/components/mirroring/service/rtp_stream_unittest.cc
@@ -43,10 +43,6 @@
   void CreateVideoEncodeMemory(
       size_t size,
       const media::cast::ReceiveVideoEncodeMemoryCallback& callback) override {}
-  media::VideoEncodeAccelerator::SupportedProfiles
-  GetSupportedVideoEncodeAcceleratorProfiles() override {
-    return media::VideoEncodeAccelerator::SupportedProfiles();
-  }
 
   base::WeakPtr<RtpStreamClient> GetWeakPtr() {
     return weak_factory_.GetWeakPtr();
diff --git a/components/mirroring/service/session.cc b/components/mirroring/service/session.cc
index d81df69c..a3f101f 100644
--- a/components/mirroring/service/session.cc
+++ b/components/mirroring/service/session.cc
@@ -5,12 +5,19 @@
 #include "components/mirroring/service/session.h"
 
 #include "base/logging.h"
+#include "base/rand_util.h"
+#include "base/stl_util.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/sys_info.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
+#include "base/values.h"
+#include "build/build_config.h"
 #include "components/mirroring/service/udp_socket_client.h"
 #include "components/mirroring/service/video_capture_client.h"
+#include "crypto/random.h"
 #include "media/cast/net/cast_transport.h"
 #include "media/cast/sender/audio_sender.h"
 #include "media/cast/sender/video_sender.h"
@@ -21,6 +28,7 @@
 using media::cast::FrameSenderConfig;
 using media::cast::RtpPayloadType;
 using media::cast::CastTransportStatus;
+using media::cast::Codec;
 using media::cast::FrameEvent;
 using media::cast::PacketEvent;
 using media::cast::OperationalStatus;
@@ -39,6 +47,16 @@
 constexpr base::TimeDelta kOfferAnswerExchangeTimeout =
     base::TimeDelta::FromSeconds(15);
 
+// Used for OFFER/ANSWER message exchange. Some receivers will error out on
+// payloadType values other than the ones hard-coded here.
+constexpr int kAudioPayloadType = 127;
+constexpr int kVideoPayloadType = 96;
+
+constexpr int kAudioSsrcMin = 1;
+constexpr int kAudioSsrcMax = 5e5;
+constexpr int kVideoSsrcMin = 5e5 + 1;
+constexpr int kVideoSsrcMax = 10e5;
+
 class TransportClient final : public media::cast::CastTransport::Client {
  public:
   explicit TransportClient(Session* session) : session_(session) {}
@@ -67,142 +85,166 @@
   DISALLOW_COPY_AND_ASSIGN(TransportClient);
 };
 
+// Generates a string with cryptographically secure random bytes.
+std::string MakeRandomString(size_t length) {
+  std::string result(length, ' ');
+  DCHECK_EQ(length, result.size());
+  crypto::RandBytes(base::string_as_array(&result), length);
+  return result;
+}
+
+int NumberOfEncodeThreads() {
+  // Do not saturate CPU utilization just for encoding. On a lower-end system
+  // with only 1 or 2 cores, use only one thread for encoding. On systems with
+  // more cores, allow half of the cores to be used for encoding.
+  return std::min(8, (base::SysInfo::NumberOfProcessors() + 1) / 2);
+}
+
+// Scan profiles for hardware VP8 encoder support.
+bool IsHardwareVP8EncodingSupported(
+    const std::vector<media::VideoEncodeAccelerator::SupportedProfile>&
+        profiles) {
+  for (const auto& vea_profile : profiles) {
+    if (vea_profile.profile >= media::VP8PROFILE_MIN &&
+        vea_profile.profile <= media::VP8PROFILE_MAX) {
+      return true;
+    }
+  }
+  return false;
+}
+
+// Scan profiles for hardware H.264 encoder support.
+bool IsHardwareH264EncodingSupported(
+    const std::vector<media::VideoEncodeAccelerator::SupportedProfile>&
+        profiles) {
+// TODO(miu): Look into why H.264 hardware encoder on MacOS is broken.
+// http://crbug.com/596674
+// TODO(emircan): Look into HW encoder initialization issues on Win.
+// https://crbug.com/636064
+#if !defined(OS_MACOSX) && !defined(OS_WIN)
+  for (const auto& vea_profile : profiles) {
+    if (vea_profile.profile >= media::H264PROFILE_MIN &&
+        vea_profile.profile <= media::H264PROFILE_MAX) {
+      return true;
+    }
+  }
+#endif  // !defined(OS_MACOSX) && !defined(OS_WIN)
+  return false;
+}
+
+// Helper to add |config| to |config_list| with given |aes_key|.
+void AddSenderConfig(int32_t sender_ssrc,
+                     FrameSenderConfig config,
+                     const std::string& aes_key,
+                     const std::string& aes_iv,
+                     std::vector<FrameSenderConfig>* config_list) {
+  config.aes_key = aes_key;
+  config.aes_iv_mask = aes_iv;
+  config.sender_ssrc = sender_ssrc;
+  config_list->emplace_back(config);
+}
+
+// Generate the stream object from |config| and add it to |stream_list|.
+void AddStreamObject(int stream_index,
+                     const std::string& codec_name,
+                     const FrameSenderConfig& config,
+                     const MirrorSettings& mirror_settings,
+                     base::Value::ListStorage* stream_list) {
+  base::Value stream(base::Value::Type::DICTIONARY);
+  stream.SetKey("index", base::Value(stream_index));
+  stream.SetKey("codecName", base::Value(codec_name));
+  stream.SetKey("rtpProfile", base::Value("cast"));
+  const bool is_audio =
+      (config.rtp_payload_type <= media::cast::RtpPayloadType::AUDIO_LAST);
+  stream.SetKey("rtpPayloadType",
+                base::Value(is_audio ? kAudioPayloadType : kVideoPayloadType));
+  stream.SetKey("ssrc", base::Value(int(config.sender_ssrc)));
+  stream.SetKey(
+      "targetDelay",
+      base::Value(int(config.animated_playout_delay.InMilliseconds())));
+  stream.SetKey("aesKey", base::Value(base::HexEncode(config.aes_key.data(),
+                                                      config.aes_key.size())));
+  stream.SetKey("aesIvMask",
+                base::Value(base::HexEncode(config.aes_iv_mask.data(),
+                                            config.aes_iv_mask.size())));
+  stream.SetKey("timeBase",
+                base::Value("1/" + std::to_string(config.rtp_timebase)));
+  stream.SetKey("receiverRtcpEventLog", base::Value(true));
+  stream.SetKey("rtpExtensions", base::Value("adaptive_playout_delay"));
+  if (is_audio) {
+    // Note on "AUTO" bitrate calculation: This is based on libopus source
+    // at the time of this writing. Internally, it uses the following math:
+    //
+    //   packet_overhead_bps = 60 bits * num_packets_in_one_second
+    //   approx_encoded_signal_bps = frequency * channels
+    //   estimated_bps = packet_overhead_bps + approx_encoded_signal_bps
+    //
+    // For 100 packets/sec at 48 kHz and 2 channels, this is 102kbps.
+    const int bitrate = config.max_bitrate > 0
+                            ? config.max_bitrate
+                            : (60 * config.max_frame_rate +
+                               config.rtp_timebase * config.channels);
+    stream.SetKey("type", base::Value("audio_source"));
+    stream.SetKey("bitRate", base::Value(bitrate));
+    stream.SetKey("sampleRate", base::Value(config.rtp_timebase));
+    stream.SetKey("channels", base::Value(config.channels));
+  } else /* is video */ {
+    stream.SetKey("type", base::Value("video_source"));
+    stream.SetKey("renderMode", base::Value("video"));
+    stream.SetKey("maxFrameRate",
+                  base::Value(std::to_string(static_cast<int>(
+                                  config.max_frame_rate * 1000)) +
+                              "/1000"));
+    stream.SetKey("maxBitRate", base::Value(config.max_bitrate));
+    base::Value::ListStorage resolutions;
+    base::Value resolution(base::Value::Type::DICTIONARY);
+    resolution.SetKey("width", base::Value(mirror_settings.max_width()));
+    resolution.SetKey("height", base::Value(mirror_settings.max_height()));
+    resolutions.emplace_back(std::move(resolution));
+    stream.SetKey("resolutions", base::Value(resolutions));
+  }
+  stream_list->emplace_back(std::move(stream));
+}
+
 }  // namespace
 
-Session::Session(SessionType session_type,
-                 const net::IPEndPoint& receiver_endpoint,
-                 SessionClient* client)
-    : client_(client), weak_factory_(this) {
-  DCHECK(client_);
-
-  std::vector<FrameSenderConfig> audio_configs;
-  std::vector<FrameSenderConfig> video_configs;
-  if (session_type != SessionType::VIDEO_ONLY)
-    audio_configs = AudioRtpStream::GetSupportedConfigs();
-  if (session_type != SessionType::AUDIO_ONLY)
-    video_configs = VideoRtpStream::GetSupportedConfigs(this);
-  start_timeout_timer_.Start(
-      FROM_HERE, kOfferAnswerExchangeTimeout,
-      base::BindRepeating(&Session::OnOfferAnswerExchangeTimeout,
-                          weak_factory_.GetWeakPtr()));
-  client_->DoOfferAnswerExchange(
-      audio_configs, video_configs,
-      base::BindOnce(&Session::StartInternal, weak_factory_.GetWeakPtr(),
-                     receiver_endpoint));
+Session::Session(int32_t session_id,
+                 const CastSinkInfo& sink_info,
+                 const gfx::Size& max_resolution,
+                 SessionObserver* observer,
+                 ResourceProvider* resource_provider,
+                 CastMessageChannel* outbound_channel)
+    : session_id_(session_id),
+      sink_info_(sink_info),
+      observer_(observer),
+      resource_provider_(resource_provider),
+      message_dispatcher_(outbound_channel,
+                          base::BindRepeating(&Session::OnResponseParsingError,
+                                              base::Unretained(this))),
+      weak_factory_(this) {
+  DCHECK(resource_provider_);
+  mirror_settings_.SetResolutionContraints(max_resolution.width(),
+                                           max_resolution.height());
+  CreateAndSendOffer();
 }
 
 Session::~Session() {
   StopSession();
 }
 
-void Session::StartInternal(const net::IPEndPoint& receiver_endpoint,
-                            const FrameSenderConfig& audio_config,
-                            const FrameSenderConfig& video_config) {
-  DVLOG(1) << __func__;
-  start_timeout_timer_.Stop();
-
-  DCHECK(!video_capture_client_);
-  DCHECK(!cast_transport_);
-  DCHECK(!audio_stream_);
-  DCHECK(!video_stream_);
-  DCHECK(!cast_environment_);
-  DCHECK(client_);
-
-  if (audio_config.rtp_payload_type == RtpPayloadType::REMOTE_AUDIO ||
-      video_config.rtp_payload_type == RtpPayloadType::REMOTE_VIDEO) {
-    NOTIMPLEMENTED();  // TODO(xjz): Add support for media remoting.
-    return;
-  }
-
-  const bool has_audio =
-      (audio_config.rtp_payload_type < RtpPayloadType::AUDIO_LAST) &&
-      (audio_config.rtp_payload_type >= RtpPayloadType::FIRST);
-  const bool has_video =
-      (video_config.rtp_payload_type > RtpPayloadType::AUDIO_LAST) &&
-      (video_config.rtp_payload_type < RtpPayloadType::LAST);
-  if (!has_audio && !has_video) {
-    VLOG(1) << "Incorrect ANSWER message: No audio or Video.";
-    client_->OnError(SESSION_START_ERROR);
-    return;
-  }
-
-  audio_encode_thread_ = base::CreateSingleThreadTaskRunnerWithTraits(
-      {base::TaskPriority::USER_BLOCKING,
-       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
-      base::SingleThreadTaskRunnerThreadMode::DEDICATED);
-  video_encode_thread_ = base::CreateSingleThreadTaskRunnerWithTraits(
-      {base::TaskPriority::USER_BLOCKING,
-       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
-      base::SingleThreadTaskRunnerThreadMode::DEDICATED);
-  cast_environment_ = new media::cast::CastEnvironment(
-      base::DefaultTickClock::GetInstance(),
-      base::ThreadTaskRunnerHandle::Get(), audio_encode_thread_,
-      video_encode_thread_);
-  network::mojom::NetworkContextPtr network_context;
-  client_->GetNetWorkContext(mojo::MakeRequest(&network_context));
-  auto udp_client = std::make_unique<UdpSocketClient>(
-      receiver_endpoint, std::move(network_context),
-      base::BindOnce(&Session::ReportError, weak_factory_.GetWeakPtr(),
-                     SessionError::CAST_TRANSPORT_ERROR));
-  cast_transport_ = media::cast::CastTransport::Create(
-      cast_environment_->Clock(), kSendEventsInterval,
-      std::make_unique<TransportClient>(this), std::move(udp_client),
-      base::ThreadTaskRunnerHandle::Get());
-
-  if (has_audio) {
-    auto audio_sender = std::make_unique<media::cast::AudioSender>(
-        cast_environment_, audio_config,
-        base::BindRepeating(&Session::OnEncoderStatusChange,
-                            weak_factory_.GetWeakPtr()),
-        cast_transport_.get());
-    audio_stream_ = std::make_unique<AudioRtpStream>(
-        std::move(audio_sender), weak_factory_.GetWeakPtr());
-    // TODO(xjz): Start audio capturing.
-    NOTIMPLEMENTED();
-  }
-
-  if (has_video) {
-    auto video_sender = std::make_unique<media::cast::VideoSender>(
-        cast_environment_, video_config,
-        base::BindRepeating(&Session::OnEncoderStatusChange,
-                            weak_factory_.GetWeakPtr()),
-        base::BindRepeating(&Session::CreateVideoEncodeAccelerator,
-                            weak_factory_.GetWeakPtr()),
-        base::BindRepeating(&Session::CreateVideoEncodeMemory,
-                            weak_factory_.GetWeakPtr()),
-        cast_transport_.get(),
-        base::BindRepeating(&Session::SetTargetPlayoutDelay,
-                            weak_factory_.GetWeakPtr()));
-    video_stream_ = std::make_unique<VideoRtpStream>(
-        std::move(video_sender), weak_factory_.GetWeakPtr());
-    media::mojom::VideoCaptureHostPtr video_host;
-    client_->GetVideoCaptureHost(mojo::MakeRequest(&video_host));
-    video_capture_client_ =
-        std::make_unique<VideoCaptureClient>(std::move(video_host));
-    video_capture_client_->Start(
-        base::BindRepeating(&VideoRtpStream::InsertVideoFrame,
-                            video_stream_->AsWeakPtr()),
-        base::BindOnce(&Session::ReportError, weak_factory_.GetWeakPtr(),
-                       SessionError::VIDEO_CAPTURE_ERROR));
-  }
-
-  client_->DidStart();
-}
-
 void Session::ReportError(SessionError error) {
   DVLOG(1) << __func__ << ": error=" << error;
-  if (client_)
-    client_->OnError(error);
+  if (observer_)
+    observer_->OnError(error);
   StopSession();
 }
 
 void Session::StopSession() {
   DVLOG(1) << __func__;
-  if (!client_)
+  if (!resource_provider_)
     return;
 
   weak_factory_.InvalidateWeakPtrs();
-  start_timeout_timer_.Stop();
   audio_encode_thread_ = nullptr;
   video_encode_thread_ = nullptr;
   video_capture_client_.reset();
@@ -210,13 +252,16 @@
   video_stream_.reset();
   cast_transport_.reset();
   cast_environment_ = nullptr;
-  client_->DidStop();
-  client_ = nullptr;
+  resource_provider_ = nullptr;
+  if (observer_) {
+    observer_->DidStop();
+    observer_ = nullptr;
+  }
 }
 
 void Session::OnError(const std::string& message) {
   VLOG(1) << message;
-  ReportError(SessionError::CAST_STREAMING_ERROR);
+  ReportError(SessionError::RTP_STREAM_ERROR);
 }
 
 void Session::RequestRefreshFrame() {
@@ -239,13 +284,13 @@
     case OperationalStatus::STATUS_CODEC_INIT_FAILED:
     case OperationalStatus::STATUS_CODEC_RUNTIME_ERROR:
       DVLOG(1) << "OperationalStatus error.";
-      ReportError(SessionError::CAST_STREAMING_ERROR);
+      ReportError(SessionError::ENCODING_ERROR);
       break;
   }
 }
 
 media::VideoEncodeAccelerator::SupportedProfiles
-Session::GetSupportedVideoEncodeAcceleratorProfiles() {
+Session::GetSupportedVeaProfiles() {
   // TODO(xjz): Establish GPU channel and query for the supported profiles.
   return media::VideoEncodeAccelerator::SupportedProfiles();
 }
@@ -310,6 +355,163 @@
                                                      std::move(packet_events));
 }
 
+void Session::OnAnswer(const std::string& cast_mode,
+                       const std::vector<FrameSenderConfig>& audio_configs,
+                       const std::vector<FrameSenderConfig>& video_configs,
+                       const ReceiverResponse& response) {
+  if (!response.answer || response.type == ResponseType::UNKNOWN) {
+    VLOG(1) << "Received a null ANSWER response.";
+    ReportError(ANSWER_TIME_OUT);
+    return;
+  }
+
+  DCHECK_EQ(ResponseType::ANSWER, response.type);
+
+  if (response.result != "ok") {
+    VLOG(1) << "Received an error ANSWER response.";
+    ReportError(ANSWER_NOT_OK);
+    return;
+  }
+
+  const Answer& answer = *response.answer;
+  if (answer.cast_mode != cast_mode) {
+    VLOG(1) << "Unexpected cast mode=" << answer.cast_mode
+            << " while expected mode=" << cast_mode;
+    ReportError(ANSWER_MISMATCHED_CAST_MODE);
+    return;
+  }
+
+  if (answer.send_indexes.size() != answer.ssrcs.size()) {
+    VLOG(1) << "sendIndexes.length != ssrcs.length in ANSWER"
+            << " sendIndexes.length=" << answer.send_indexes.size()
+            << " ssrcs.length=" << answer.ssrcs.size();
+    ReportError(ANSWER_MISMATCHED_SSRC_LENGTH);
+    return;
+  }
+
+  // Select Audio/Video config from ANSWER.
+  bool has_audio = false;
+  bool has_video = false;
+  FrameSenderConfig audio_config;
+  FrameSenderConfig video_config;
+  const int video_start_idx = audio_configs.size();
+  const int video_idx_bound = video_configs.size() + video_start_idx;
+  for (size_t i = 0; i < answer.send_indexes.size(); ++i) {
+    if (answer.send_indexes[i] < 0 ||
+        answer.send_indexes[i] >= video_idx_bound) {
+      VLOG(1) << "Invalid indexes selected in ANSWER: Select index="
+              << answer.send_indexes[i] << " allowed index<" << video_idx_bound;
+      ReportError(ANSWER_SELECT_INVALID_INDEX);
+      return;
+    }
+    if (answer.send_indexes[i] < video_start_idx) {
+      // Audio
+      if (has_audio) {
+        VLOG(1) << "Receiver selected audio RTP stream twice in ANSWER";
+        ReportError(ANSWER_SELECT_MULTIPLE_AUDIO);
+        return;
+      }
+      audio_config = audio_configs[answer.send_indexes[i]];
+      audio_config.receiver_ssrc = answer.ssrcs[i];
+      has_audio = true;
+    } else {
+      // Video
+      if (has_video) {
+        VLOG(1) << "Receiver selected video RTP stream twice in ANSWER";
+        ReportError(ANSWER_SELECT_MULTIPLE_VIDEO);
+        return;
+      }
+      video_config = video_configs[answer.send_indexes[i] - video_start_idx];
+      video_config.receiver_ssrc = answer.ssrcs[i];
+      video_config.video_codec_params.number_of_encode_threads =
+          NumberOfEncodeThreads();
+      has_video = true;
+    }
+  }
+  if (!has_audio && !has_video) {
+    VLOG(1) << "Incorrect ANSWER message: No audio or Video.";
+    ReportError(ANSWER_NO_AUDIO_OR_VIDEO);
+    return;
+  }
+
+  if ((has_audio &&
+       audio_config.rtp_payload_type == RtpPayloadType::REMOTE_AUDIO) ||
+      (has_video &&
+       video_config.rtp_payload_type == RtpPayloadType::REMOTE_VIDEO)) {
+    NOTIMPLEMENTED();  // TODO(xjz): Add support for media remoting.
+    return;
+  }
+
+  // Start streaming.
+  audio_encode_thread_ = base::CreateSingleThreadTaskRunnerWithTraits(
+      {base::TaskPriority::USER_BLOCKING,
+       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+      base::SingleThreadTaskRunnerThreadMode::DEDICATED);
+  video_encode_thread_ = base::CreateSingleThreadTaskRunnerWithTraits(
+      {base::TaskPriority::USER_BLOCKING,
+       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+      base::SingleThreadTaskRunnerThreadMode::DEDICATED);
+  cast_environment_ = new media::cast::CastEnvironment(
+      base::DefaultTickClock::GetInstance(),
+      base::ThreadTaskRunnerHandle::Get(), audio_encode_thread_,
+      video_encode_thread_);
+  network::mojom::NetworkContextPtr network_context;
+  resource_provider_->GetNetworkContext(mojo::MakeRequest(&network_context));
+  auto udp_client = std::make_unique<UdpSocketClient>(
+      net::IPEndPoint(sink_info_.ip_address, answer.udp_port),
+      std::move(network_context),
+      base::BindOnce(&Session::ReportError, weak_factory_.GetWeakPtr(),
+                     SessionError::CAST_TRANSPORT_ERROR));
+  cast_transport_ = media::cast::CastTransport::Create(
+      cast_environment_->Clock(), kSendEventsInterval,
+      std::make_unique<TransportClient>(this), std::move(udp_client),
+      base::ThreadTaskRunnerHandle::Get());
+
+  if (has_audio) {
+    auto audio_sender = std::make_unique<media::cast::AudioSender>(
+        cast_environment_, audio_config,
+        base::BindRepeating(&Session::OnEncoderStatusChange,
+                            weak_factory_.GetWeakPtr()),
+        cast_transport_.get());
+    audio_stream_ = std::make_unique<AudioRtpStream>(
+        std::move(audio_sender), weak_factory_.GetWeakPtr());
+    // TODO(xjz): Start audio capturing.
+    NOTIMPLEMENTED();
+  }
+
+  if (has_video) {
+    auto video_sender = std::make_unique<media::cast::VideoSender>(
+        cast_environment_, video_config,
+        base::BindRepeating(&Session::OnEncoderStatusChange,
+                            weak_factory_.GetWeakPtr()),
+        base::BindRepeating(&Session::CreateVideoEncodeAccelerator,
+                            weak_factory_.GetWeakPtr()),
+        base::BindRepeating(&Session::CreateVideoEncodeMemory,
+                            weak_factory_.GetWeakPtr()),
+        cast_transport_.get(),
+        base::BindRepeating(&Session::SetTargetPlayoutDelay,
+                            weak_factory_.GetWeakPtr()));
+    video_stream_ = std::make_unique<VideoRtpStream>(
+        std::move(video_sender), weak_factory_.GetWeakPtr());
+    media::mojom::VideoCaptureHostPtr video_host;
+    resource_provider_->GetVideoCaptureHost(mojo::MakeRequest(&video_host));
+    video_capture_client_ =
+        std::make_unique<VideoCaptureClient>(std::move(video_host));
+    video_capture_client_->Start(
+        base::BindRepeating(&VideoRtpStream::InsertVideoFrame,
+                            video_stream_->AsWeakPtr()),
+        base::BindOnce(&Session::ReportError, weak_factory_.GetWeakPtr(),
+                       SessionError::VIDEO_CAPTURE_ERROR));
+  }
+
+  if (observer_)
+    observer_->DidStart();
+}
+
+void Session::OnResponseParsingError(const std::string& error_message) {
+  // TODO(xjz): Log the |error_message| in the mirroring logs.
+}
+
 void Session::SetTargetPlayoutDelay(base::TimeDelta playout_delay) {
   if (audio_stream_)
     audio_stream_->SetTargetPlayoutDelay(playout_delay);
@@ -317,10 +519,76 @@
     video_stream_->SetTargetPlayoutDelay(playout_delay);
 }
 
-void Session::OnOfferAnswerExchangeTimeout() {
-  VLOG(1) << "OFFER/ANSWER exchange timed out.";
-  DCHECK(client_);
-  client_->OnError(SESSION_START_ERROR);
+void Session::CreateAndSendOffer() {
+  // The random AES key and initialization vector pair used by all streams in
+  // this session.
+  const std::string aes_key = MakeRandomString(16);  // AES-128.
+  const std::string aes_iv = MakeRandomString(16);   // AES has 128-bit blocks.
+  std::vector<FrameSenderConfig> audio_configs;
+  std::vector<FrameSenderConfig> video_configs;
+
+  // Generate stream list with supported audio / video configs.
+  base::Value::ListStorage stream_list;
+  int stream_index = 0;
+  if (sink_info_.capability != DeviceCapability::VIDEO_ONLY) {
+    FrameSenderConfig config = MirrorSettings::GetDefaultAudioConfig(
+        RtpPayloadType::AUDIO_OPUS, Codec::CODEC_AUDIO_OPUS);
+    AddSenderConfig(base::RandInt(kAudioSsrcMin, kAudioSsrcMax), config,
+                    aes_key, aes_iv, &audio_configs);
+    AddStreamObject(stream_index++, "OPUS", audio_configs.back(),
+                    mirror_settings_, &stream_list);
+  }
+  if (sink_info_.capability != DeviceCapability::AUDIO_ONLY) {
+    const int32_t video_ssrc = base::RandInt(kVideoSsrcMin, kVideoSsrcMax);
+    if (IsHardwareVP8EncodingSupported(GetSupportedVeaProfiles())) {
+      FrameSenderConfig config = MirrorSettings::GetDefaultVideoConfig(
+          RtpPayloadType::VIDEO_VP8, Codec::CODEC_VIDEO_VP8);
+      config.use_external_encoder = true;
+      AddSenderConfig(video_ssrc, config, aes_key, aes_iv, &video_configs);
+      AddStreamObject(stream_index++, "VP8", video_configs.back(),
+                      mirror_settings_, &stream_list);
+    }
+    if (IsHardwareH264EncodingSupported(GetSupportedVeaProfiles())) {
+      FrameSenderConfig config = MirrorSettings::GetDefaultVideoConfig(
+          RtpPayloadType::VIDEO_H264, Codec::CODEC_VIDEO_H264);
+      config.use_external_encoder = true;
+      AddSenderConfig(video_ssrc, config, aes_key, aes_iv, &video_configs);
+      AddStreamObject(stream_index++, "H264", video_configs.back(),
+                      mirror_settings_, &stream_list);
+    }
+    if (video_configs.empty()) {
+      FrameSenderConfig config = MirrorSettings::GetDefaultVideoConfig(
+          RtpPayloadType::VIDEO_VP8, Codec::CODEC_VIDEO_VP8);
+      AddSenderConfig(video_ssrc, config, aes_key, aes_iv, &video_configs);
+      AddStreamObject(stream_index++, "VP8", video_configs.back(),
+                      mirror_settings_, &stream_list);
+    }
+  }
+  DCHECK(!audio_configs.empty() || !video_configs.empty());
+
+  // Assemble the OFFER message.
+  const std::string cast_mode = "mirroring";
+  base::Value offer(base::Value::Type::DICTIONARY);
+  offer.SetKey("castMode", base::Value(cast_mode));
+  offer.SetKey("receiverGetStatus", base::Value("true"));
+  offer.SetKey("supportedStreams", base::Value(stream_list));
+
+  const int32_t sequence_number = message_dispatcher_.GetNextSeqNumber();
+  base::Value offer_message(base::Value::Type::DICTIONARY);
+  offer_message.SetKey("type", base::Value("OFFER"));
+  offer_message.SetKey("sessionId", base::Value(session_id_));
+  offer_message.SetKey("seqNum", base::Value(sequence_number));
+  offer_message.SetKey("offer", std::move(offer));
+
+  CastMessage message_to_receiver;
+  message_to_receiver.message_namespace = kWebRtcNamespace;
+  message_to_receiver.data = std::move(offer_message);
+
+  message_dispatcher_.RequestReply(
+      message_to_receiver, ResponseType::ANSWER, sequence_number,
+      kOfferAnswerExchangeTimeout,
+      base::BindOnce(&Session::OnAnswer, base::Unretained(this), cast_mode,
+                     audio_configs, video_configs));
 }
 
 }  // namespace mirroring
diff --git a/components/mirroring/service/session.h b/components/mirroring/service/session.h
index 00cf32b7..de2b3ea 100644
--- a/components/mirroring/service/session.h
+++ b/components/mirroring/service/session.h
@@ -8,6 +8,8 @@
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
 #include "components/mirroring/service/interface.h"
+#include "components/mirroring/service/message_dispatcher.h"
+#include "components/mirroring/service/mirror_settings.h"
 #include "components/mirroring/service/rtp_stream.h"
 #include "media/cast/cast_environment.h"
 #include "media/cast/net/cast_transport_defines.h"
@@ -22,20 +24,31 @@
 
 namespace mirroring {
 
+struct ReceiverResponse;
 class VideoCaptureClient;
 
+// Controls a mirroring session, including audio/video capturing and Cast
+// Streaming. When constructed, it does OFFER/ANSWER exchange with the mirroring
+// receiver. Mirroring starts when the exchange succeeds and stops when this
+// class is destructed or error occurs. |observer| will get notified when status
+// changes. |outbound_channel| is responsible for sending messages to the
+// mirroring receiver through Cast Channel.
 class Session final : public RtpStreamClient {
  public:
-  Session(SessionType session_type,
-          const net::IPEndPoint& receiver_endpoint,
-          SessionClient* client);
+  Session(int32_t session_id,
+          const CastSinkInfo& sink_info,
+          const gfx::Size& max_resolution,
+          SessionObserver* observer,
+          ResourceProvider* resource_provider,
+          CastMessageChannel* outbound_channel);
+  // TODO(xjz): Add mojom::CastMessageChannelRequest |inbound_channel| to
+  // receive inbound messages.
+
   ~Session() override;
 
   // RtpStreamClient implemenation.
   void OnError(const std::string& message) override;
   void RequestRefreshFrame() override;
-  media::VideoEncodeAccelerator::SupportedProfiles
-  GetSupportedVideoEncodeAcceleratorProfiles() override;
   void CreateVideoEncodeAccelerator(
       const media::cast::ReceiveVideoEncodeAcceleratorCallback& callback)
       override;
@@ -49,16 +62,23 @@
       std::unique_ptr<std::vector<media::cast::FrameEvent>> frame_events,
       std::unique_ptr<std::vector<media::cast::PacketEvent>> packet_events);
 
- private:
-  // Callback when OFFER/ANSWER message exchange finishes. Starts a mirroing
-  // session.
-  void StartInternal(const net::IPEndPoint& receiver_endpoint,
-                     const media::cast::FrameSenderConfig& audio_config,
-                     const media::cast::FrameSenderConfig& video_config);
+  // Callback for ANSWER response. If the ANSWER is invalid, |observer_| will
+  // get notified with error, and session is stopped. Otherwise, capturing and
+  // streaming are started with the selected configs.
+  void OnAnswer(
+      const std::string& cast_mode,
+      const std::vector<media::cast::FrameSenderConfig>& audio_configs,
+      const std::vector<media::cast::FrameSenderConfig>& video_configs,
+      const ReceiverResponse& response);
 
+  // Called by |message_dispatcher_| when error occurs while parsing the
+  // responses.
+  void OnResponseParsingError(const std::string& error_message);
+
+ private:
   void StopSession();
 
-  // Notify |client_| that error occurred and close the session.
+  // Notify |observer_| that error occurred and close the session.
   void ReportError(SessionError error);
 
   // Callback by Audio/VideoSender to indicate encoder status change.
@@ -67,12 +87,22 @@
   // Callback by media::cast::VideoSender to set a new target playout delay.
   void SetTargetPlayoutDelay(base::TimeDelta playout_delay);
 
-  // Callback by |start_timeout_timer_|.
-  void OnOfferAnswerExchangeTimeout();
+  media::VideoEncodeAccelerator::SupportedProfiles GetSupportedVeaProfiles();
 
-  SessionClient* client_ = nullptr;
+  // Create and send OFFER message.
+  void CreateAndSendOffer();
 
-  // Create on StartInternal().
+  // Provided by Cast Media Route Provider (MRP).
+  const int32_t session_id_;
+  const CastSinkInfo sink_info_;
+
+  SessionObserver* observer_ = nullptr;
+  ResourceProvider* resource_provider_ = nullptr;
+  MirrorSettings mirror_settings_;
+
+  MessageDispatcher message_dispatcher_;
+
+  // Created after OFFER/ANSWER exchange succeeds.
   std::unique_ptr<AudioRtpStream> audio_stream_;
   std::unique_ptr<VideoRtpStream> video_stream_;
   std::unique_ptr<VideoCaptureClient> video_capture_client_;
@@ -81,9 +111,6 @@
   scoped_refptr<base::SingleThreadTaskRunner> audio_encode_thread_ = nullptr;
   scoped_refptr<base::SingleThreadTaskRunner> video_encode_thread_ = nullptr;
 
-  // Fire if the OFFER/ANSWER exchange times out.
-  base::OneShotTimer start_timeout_timer_;
-
   base::WeakPtrFactory<Session> weak_factory_;
 };
 
diff --git a/components/mirroring/service/session_unittest.cc b/components/mirroring/service/session_unittest.cc
index 09cce2e9..3d60cf5f 100644
--- a/components/mirroring/service/session_unittest.cc
+++ b/components/mirroring/service/session_unittest.cc
@@ -7,13 +7,14 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/macros.h"
-#include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "components/mirroring/service/fake_network_service.h"
 #include "components/mirroring/service/fake_video_capture_host.h"
 #include "components/mirroring/service/interface.h"
+#include "components/mirroring/service/mirror_settings.h"
+#include "components/mirroring/service/receiver_response.h"
 #include "media/cast/test/utility/default_config.h"
 #include "media/cast/test/utility/net_utility.h"
 #include "mojo/public/cpp/bindings/binding.h"
@@ -27,74 +28,126 @@
 
 namespace mirroring {
 
-class SessionTest : public SessionClient, public ::testing::Test {
+const int kSessionId = 5;
+
+class SessionTest : public ResourceProvider,
+                    public SessionObserver,
+                    public CastMessageChannel,
+                    public ::testing::Test {
  public:
-  SessionTest() : weak_factory_(this) {
+  SessionTest() : receiver_endpoint_(media::cast::test::GetFreeLocalPort()) {
     testing_clock_.Advance(base::TimeTicks::Now() - base::TimeTicks());
   }
 
   ~SessionTest() override { scoped_task_environment_.RunUntilIdle(); }
 
-  // SessionClient implemenation.
+  // SessionObserver implemenation.
   MOCK_METHOD1(OnError, void(SessionError));
   MOCK_METHOD0(DidStart, void());
   MOCK_METHOD0(DidStop, void());
-  MOCK_METHOD0(OnOfferAnswerExchange, void());
+
+  // ResourceProvider implemenation.
   MOCK_METHOD0(OnGetVideoCaptureHost, void());
   MOCK_METHOD0(OnGetNetworkContext, void());
 
+  // Called when sends OFFER message.
+  MOCK_METHOD0(OnOffer, void());
+
+  // CastMessageHandler implementation. For outbound messages.
+  void Send(const CastMessage& message) {
+    EXPECT_TRUE(message.message_namespace == kWebRtcNamespace ||
+                message.message_namespace == kRemotingNamespace);
+    std::string message_type;
+    auto* found = message.data.FindKey("type");
+    if (found && found->is_string())
+      message_type = found->GetString();
+    if (message_type == "OFFER") {
+      auto* found = message.data.FindKey("seqNum");
+      if (found && found->is_int())
+        offer_sequence_number_ = found->GetInt();
+      OnOffer();
+    }
+  }
+
   void GetVideoCaptureHost(
       media::mojom::VideoCaptureHostRequest request) override {
     video_host_ = std::make_unique<FakeVideoCaptureHost>(std::move(request));
     OnGetVideoCaptureHost();
   }
 
-  void GetNetWorkContext(
+  void GetNetworkContext(
       network::mojom::NetworkContextRequest request) override {
     network_context_ = std::make_unique<MockNetworkContext>(std::move(request));
     OnGetNetworkContext();
   }
 
-  void DoOfferAnswerExchange(
-      const std::vector<FrameSenderConfig>& audio_configs,
-      const std::vector<FrameSenderConfig>& video_configs,
-      GetAnswerCallback callback) override {
-    OnOfferAnswerExchange();
-    std::move(callback).Run(FrameSenderConfig(),
-                            media::cast::GetDefaultVideoSenderConfig());
+  void SendAnswer() {
+    FrameSenderConfig config = MirrorSettings::GetDefaultVideoConfig(
+        media::cast::RtpPayloadType::VIDEO_VP8,
+        media::cast::Codec::CODEC_VIDEO_VP8);
+    std::vector<FrameSenderConfig> video_configs;
+    video_configs.emplace_back(config);
+
+    auto answer = std::make_unique<Answer>();
+    answer->udp_port = receiver_endpoint_.port();
+    answer->send_indexes.push_back(0);
+    answer->ssrcs.push_back(32);
+    answer->cast_mode = "mirroring";
+
+    ReceiverResponse response;
+    response.result = "ok";
+    response.type = ResponseType::ANSWER;
+    response.sequence_number = offer_sequence_number_;
+    response.answer = std::move(answer);
+
+    session_->OnAnswer("mirroring", std::vector<FrameSenderConfig>(),
+                       video_configs, response);
   }
 
  protected:
+  void CreateSession() {
+    CastSinkInfo sink_info;
+    sink_info.ip_address = receiver_endpoint_.address();
+    sink_info.capability = DeviceCapability::AUDIO_AND_VIDEO;
+    // Expect to receive OFFER message when session is created.
+    base::RunLoop run_loop;
+    EXPECT_CALL(*this, OnError(_)).Times(0);
+    EXPECT_CALL(*this, OnOffer())
+        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
+    session_ = std::make_unique<Session>(
+        kSessionId, sink_info, gfx::Size(1920, 1080), this, this, this);
+    run_loop.Run();
+  }
+
   base::test::ScopedTaskEnvironment scoped_task_environment_;
+  const net::IPEndPoint receiver_endpoint_;
   base::SimpleTestTickClock testing_clock_;
 
   std::unique_ptr<Session> session_;
   std::unique_ptr<FakeVideoCaptureHost> video_host_;
   std::unique_ptr<MockNetworkContext> network_context_;
 
-  base::WeakPtrFactory<SessionTest> weak_factory_;
+  int32_t offer_sequence_number_ = -1;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(SessionTest);
 };
 
 TEST_F(SessionTest, Mirroring) {
-  // Start a mirroring session.
+  CreateSession();
+  scoped_task_environment_.RunUntilIdle();
   {
+    // Except mirroing session starts after receiving ANSWER message.
     base::RunLoop run_loop;
     EXPECT_CALL(*this, OnGetVideoCaptureHost()).Times(1);
     EXPECT_CALL(*this, OnGetNetworkContext()).Times(1);
-    EXPECT_CALL(*this, OnOfferAnswerExchange()).Times(1);
+    EXPECT_CALL(*this, OnError(_)).Times(0);
     EXPECT_CALL(*this, DidStart())
         .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
-    session_ =
-        std::make_unique<Session>(SessionType::AUDIO_AND_VIDEO,
-                                  media::cast::test::GetFreeLocalPort(), this);
+    SendAnswer();
     run_loop.Run();
   }
-
   scoped_task_environment_.RunUntilIdle();
-
   {
     base::RunLoop run_loop;
     // Expect to send out some UDP packets.
@@ -106,7 +159,6 @@
     video_host_->SendOneFrame(gfx::Size(64, 32), testing_clock_.NowTicks());
     run_loop.Run();
   }
-
   scoped_task_environment_.RunUntilIdle();
 
   // Stop the session.
@@ -121,4 +173,22 @@
   scoped_task_environment_.RunUntilIdle();
 }
 
+TEST_F(SessionTest, AnswerTimeout) {
+  CreateSession();
+  scoped_task_environment_.RunUntilIdle();
+  {
+    // Expect error.
+    base::RunLoop run_loop;
+    EXPECT_CALL(*this, OnGetVideoCaptureHost()).Times(0);
+    EXPECT_CALL(*this, OnGetNetworkContext()).Times(0);
+    EXPECT_CALL(*this, DidStop()).Times(1);
+    EXPECT_CALL(*this, OnError(ANSWER_TIME_OUT))
+        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
+    session_->OnAnswer("mirroring", std::vector<FrameSenderConfig>(),
+                       std::vector<FrameSenderConfig>(), ReceiverResponse());
+    run_loop.Run();
+  }
+  scoped_task_environment_.RunUntilIdle();
+}
+
 }  // namespace mirroring
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetch.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetch.cc
index a9a2746..0df0d1c 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetch.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetch.cc
@@ -117,7 +117,7 @@
   GetPivotsRequest pivot_request;
 
   SearchApiRequestContext* search_context = pivot_request.mutable_context();
-  search_context->mutable_localization_context()->set_spoken_language(
+  search_context->mutable_localization_context()->set_language_code(
       bcp_language);
 
   GetPivotsQuery* query = pivot_request.mutable_query();
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
index 66b9099b..0e900f83 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
@@ -402,7 +402,7 @@
   GetPivotsRequest request;
   ASSERT_TRUE(request.ParseFromString(decoded_header_value));
 
-  EXPECT_EQ(request.context().localization_context().spoken_language(), "en");
+  EXPECT_EQ(request.context().localization_context().language_code(), "en");
   EXPECT_EQ(request.query().context()[0].url(), "http://www.article.com/");
   EXPECT_TRUE(request.query().document_params().enabled());
   EXPECT_EQ(request.query().document_params().num(), 10);
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc
index a9e268f..801dc57 100644
--- a/components/omnibox/browser/search_provider.cc
+++ b/components/omnibox/browser/search_provider.cc
@@ -517,7 +517,7 @@
 void SearchProvider::UpdateMatches() {
   // On-focus inputs display no suggestions, so we do not need to persist the
   // previous top suggestions, add new suggestions, or revise suggestions to
-  // enforce constraints about inlineability in this case.  Indeed, most of
+  // enforce constraints about inlinability in this case.  Indeed, most of
   // these steps would be bad, as they'd add a suggestion of some form, thus
   // opening the dropdown (which we do not want to happen).
   if (!input_.from_omnibox_focus()) {
@@ -752,10 +752,10 @@
 }
 
 bool SearchProvider::IsQuerySuitableForSuggest(bool* query_is_private) const {
-  *query_is_private = IsQueryPotentionallyPrivate();
+  *query_is_private = IsQueryPotentiallyPrivate();
 
   // Don't run Suggest in incognito mode, if the engine doesn't support it, or
-  // if the user has disabled it.  Also don't send potentionally private data
+  // if the user has disabled it.  Also don't send potentially private data
   // to the default search provider.  (It's always okay to send explicit
   // keyword input to a keyword suggest server, if any.)
   const TemplateURL* default_url = providers_.GetDefaultProviderURL();
@@ -766,7 +766,7 @@
           (keyword_url && !keyword_url->suggestions_url().empty()));
 }
 
-bool SearchProvider::IsQueryPotentionallyPrivate() const {
+bool SearchProvider::IsQueryPotentiallyPrivate() const {
   if (input_.text().empty())
     return false;
 
@@ -1511,15 +1511,15 @@
     match.inline_autocompletion =
         match.fill_into_edit.substr(inline_autocomplete_offset);
   }
-  // An inlineable navsuggestion can only be the default match when there
+  // An inlinable navsuggestion can only be the default match when there
   // is no keyword provider active, lest it appear first and break the user
   // out of keyword mode.  We also must have received the navsuggestion before
   // the last keystroke, to prevent asynchronous inline autocompletions changes.
   // The navsuggestion can also only be default if either the inline
   // autocompletion is empty or we're not preventing inline autocompletion.
-  // Finally, if we have an inlineable navsuggestion with an inline completion
+  // Finally, if we have an inlinable navsuggestion with an inline completion
   // that we're not preventing, make sure we didn't trim any whitespace.
-  // We don't want to claim http://foo.com/bar is inlineable against the
+  // We don't want to claim http://foo.com/bar is inlinable against the
   // input "foo.com/b ".
   match.allowed_to_be_default_match =
       (prefix != nullptr) && (providers_.GetKeywordProviderURL() == nullptr) &&
diff --git a/components/omnibox/browser/search_provider.h b/components/omnibox/browser/search_provider.h
index eee033b..b2447d1 100644
--- a/components/omnibox/browser/search_provider.h
+++ b/components/omnibox/browser/search_provider.h
@@ -234,7 +234,7 @@
 
   // Returns true when the current query can be sent to at least one suggest
   // service.  This will be false for example when suggest is disabled.  In
-  // the process, calculates whether the query may contain potentionally
+  // the process, calculates whether the query may contain potentially
   // private data and stores the result in |is_query_private|; such queries
   // should not be sent to the default search engine.
   bool IsQuerySuitableForSuggest(bool* query_is_private) const;
@@ -243,7 +243,7 @@
   // information (and hence the suggest request shouldn't be sent).  In
   // particular, if the input type might be a URL, we take extra care so that
   // it isn't sent to the server.
-  bool IsQueryPotentionallyPrivate() const;
+  bool IsQueryPotentiallyPrivate() const;
 
   // Remove existing keyword results if the user is no longer in keyword mode,
   // and, if |minimal_changes| is false, revise the existing results to
diff --git a/content/browser/android/content_view_render_view.cc b/content/browser/android/content_view_render_view.cc
index 0db2d49..afaefd7c 100644
--- a/content/browser/android/content_view_render_view.cc
+++ b/content/browser/android/content_view_render_view.cc
@@ -114,6 +114,12 @@
   compositor_->SetNeedsComposite();
 }
 
+void ContentViewRenderView::SetNeedsComposite(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj) {
+  compositor_->SetNeedsComposite();
+}
+
 void ContentViewRenderView::UpdateLayerTreeHost() {
   // TODO(wkorman): Rename Layout to UpdateLayerTreeHost in all Android
   // Compositor related classes.
diff --git a/content/browser/android/content_view_render_view.h b/content/browser/android/content_view_render_view.h
index 3c1194d..97916d3a 100644
--- a/content/browser/android/content_view_render_view.h
+++ b/content/browser/android/content_view_render_view.h
@@ -48,6 +48,8 @@
   void SetOverlayVideoMode(JNIEnv* env,
                            const base::android::JavaParamRef<jobject>& obj,
                            bool enabled);
+  void SetNeedsComposite(JNIEnv* env,
+                         const base::android::JavaParamRef<jobject>& obj);
 
   // CompositorClient implementation
   void UpdateLayerTreeHost() override;
diff --git a/content/browser/devtools/devtools_agent_host_impl.cc b/content/browser/devtools/devtools_agent_host_impl.cc
index add84a7..a671484 100644
--- a/content/browser/devtools/devtools_agent_host_impl.cc
+++ b/content/browser/devtools/devtools_agent_host_impl.cc
@@ -208,16 +208,6 @@
   return InnerAttachClient(client, true /* restricted */);
 }
 
-void DevToolsAgentHostImpl::ForceAttachClient(DevToolsAgentHostClient* client) {
-  if (SessionByClient(client))
-    return;
-  scoped_refptr<DevToolsAgentHostImpl> protect(this);
-  if (!sessions_.empty())
-    ForceDetachAllSessions();
-  DCHECK(sessions_.empty());
-  InnerAttachClient(client, false /* restricted */);
-}
-
 bool DevToolsAgentHostImpl::DetachClient(DevToolsAgentHostClient* client) {
   if (!SessionByClient(client))
     return false;
diff --git a/content/browser/devtools/devtools_agent_host_impl.h b/content/browser/devtools/devtools_agent_host_impl.h
index c69bf5a..68317042 100644
--- a/content/browser/devtools/devtools_agent_host_impl.h
+++ b/content/browser/devtools/devtools_agent_host_impl.h
@@ -38,7 +38,6 @@
   // DevToolsAgentHost implementation.
   void AttachClient(DevToolsAgentHostClient* client) override;
   bool AttachRestrictedClient(DevToolsAgentHostClient* client) override;
-  void ForceAttachClient(DevToolsAgentHostClient* client) override;
   bool DetachClient(DevToolsAgentHostClient* client) override;
   bool DispatchProtocolMessage(DevToolsAgentHostClient* client,
                                const std::string& message) override;
diff --git a/content/browser/devtools/forwarding_agent_host.cc b/content/browser/devtools/forwarding_agent_host.cc
index 2b60cf23..1682f1c 100644
--- a/content/browser/devtools/forwarding_agent_host.cc
+++ b/content/browser/devtools/forwarding_agent_host.cc
@@ -55,12 +55,6 @@
   session_proxies_[client].reset(new SessionProxy(this, client));
 }
 
-void ForwardingAgentHost::ForceAttachClient(DevToolsAgentHostClient* client) {
-  while (!session_proxies_.empty())
-    session_proxies_.begin()->second->ConnectionClosed();
-  AttachClient(client);
-}
-
 bool ForwardingAgentHost::DetachClient(DevToolsAgentHostClient* client) {
   auto it = session_proxies_.find(client);
   if (it == session_proxies_.end())
diff --git a/content/browser/devtools/forwarding_agent_host.h b/content/browser/devtools/forwarding_agent_host.h
index b09b2cf..3368c91 100644
--- a/content/browser/devtools/forwarding_agent_host.h
+++ b/content/browser/devtools/forwarding_agent_host.h
@@ -28,7 +28,6 @@
 
   // DevToolsAgentHost implementation
   void AttachClient(DevToolsAgentHostClient* client) override;
-  void ForceAttachClient(DevToolsAgentHostClient* client) override;
   bool DetachClient(DevToolsAgentHostClient* client) override;
   bool DispatchProtocolMessage(DevToolsAgentHostClient* client,
                                const std::string& message) override;
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
index 0a0f777..a23fbb7 100644
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -4495,9 +4495,9 @@
   EXPECT_TRUE(NavigateToURL(shell(), url_2));
 
   // Clone the tab and load the page.
-  std::unique_ptr<WebContentsImpl> new_tab(
-      static_cast<WebContentsImpl*>(shell()->web_contents()->Clone()));
-  NavigationController& new_controller = new_tab->GetController();
+  std::unique_ptr<WebContents> new_tab = shell()->web_contents()->Clone();
+  WebContentsImpl* new_tab_impl = static_cast<WebContentsImpl*>(new_tab.get());
+  NavigationController& new_controller = new_tab_impl->GetController();
   EXPECT_TRUE(new_controller.IsInitialNavigation());
   EXPECT_TRUE(new_controller.NeedsReload());
   {
@@ -4532,9 +4532,9 @@
   EXPECT_TRUE(NavigateToURL(shell(), url_1));
 
   // Clone the tab and load the page.
-  std::unique_ptr<WebContentsImpl> new_tab(
-      static_cast<WebContentsImpl*>(shell()->web_contents()->Clone()));
-  NavigationController& new_controller = new_tab->GetController();
+  std::unique_ptr<WebContents> new_tab = shell()->web_contents()->Clone();
+  WebContentsImpl* new_tab_impl = static_cast<WebContentsImpl*>(new_tab.get());
+  NavigationController& new_controller = new_tab_impl->GetController();
   EXPECT_TRUE(new_controller.IsInitialNavigation());
   EXPECT_TRUE(new_controller.NeedsReload());
   {
@@ -4568,9 +4568,9 @@
   EXPECT_TRUE(NavigateToURL(shell(), url_2));
 
   // Clone the tab but don't load last committed page.
-  std::unique_ptr<WebContentsImpl> new_tab(
-      static_cast<WebContentsImpl*>(shell()->web_contents()->Clone()));
-  NavigationController& new_controller = new_tab->GetController();
+  std::unique_ptr<WebContents> new_tab = shell()->web_contents()->Clone();
+  WebContentsImpl* new_tab_impl = static_cast<WebContentsImpl*>(new_tab.get());
+  NavigationController& new_controller = new_tab_impl->GetController();
   EXPECT_TRUE(new_controller.IsInitialNavigation());
   EXPECT_TRUE(new_controller.NeedsReload());
 
@@ -4583,7 +4583,7 @@
 
   // Make sure the new tab isn't still loading.
   EXPECT_EQ(url_1, new_controller.GetLastCommittedEntry()->GetURL());
-  EXPECT_FALSE(new_tab->IsLoading());
+  EXPECT_FALSE(new_tab_impl->IsLoading());
 
   // Also check going back in the original tab after a renderer crash.
   NavigationController& controller = shell()->web_contents()->GetController();
@@ -6275,10 +6275,10 @@
   EXPECT_EQ(url_1, root->current_url());
 
   // Clone the tab without navigating it.
-  std::unique_ptr<WebContentsImpl> new_tab(
-      static_cast<WebContentsImpl*>(shell()->web_contents()->Clone()));
-  NavigationController& new_controller = new_tab->GetController();
-  FrameTreeNode* new_root = new_tab->GetFrameTree()->root();
+  std::unique_ptr<WebContents> new_tab = shell()->web_contents()->Clone();
+  WebContentsImpl* new_tab_impl = static_cast<WebContentsImpl*>(new_tab.get());
+  NavigationController& new_controller = new_tab_impl->GetController();
+  FrameTreeNode* new_root = new_tab_impl->GetFrameTree()->root();
   EXPECT_TRUE(new_controller.IsInitialNavigation());
   EXPECT_TRUE(new_controller.NeedsReload());
 
diff --git a/content/browser/gpu/compositor_util.cc b/content/browser/gpu/compositor_util.cc
index 5946d9f5..bad93da 100644
--- a/content/browser/gpu/compositor_util.cc
+++ b/content/browser/gpu/compositor_util.cc
@@ -5,8 +5,9 @@
 #include "content/browser/gpu/compositor_util.h"
 
 #include <stddef.h>
-#include <memory>
 
+#include <algorithm>
+#include <memory>
 #include <utility>
 
 #include "base/command_line.h"
@@ -25,7 +26,6 @@
 #include "content/browser/gpu/gpu_process_host.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
-#include "gpu/command_buffer/common/gpu_memory_buffer_support.h"
 #include "gpu/config/gpu_blacklist.h"
 #include "gpu/config/gpu_driver_bug_list.h"
 #include "gpu/config/gpu_driver_bug_workaround_type.h"
@@ -477,21 +477,4 @@
   return GetDriverBugWorkaroundsImpl(GpuFeatureInfoType::kForHardwareGpu);
 }
 
-std::vector<gfx::BufferUsageAndFormat>
-CreateBufferUsageAndFormatExceptionList() {
-  std::vector<gfx::BufferUsageAndFormat> usage_format_list;
-  for (int usage_idx = 0; usage_idx <= static_cast<int>(gfx::BufferUsage::LAST);
-       ++usage_idx) {
-    gfx::BufferUsage usage = static_cast<gfx::BufferUsage>(usage_idx);
-    for (int format_idx = 0;
-         format_idx <= static_cast<int>(gfx::BufferFormat::LAST);
-         ++format_idx) {
-      gfx::BufferFormat format = static_cast<gfx::BufferFormat>(format_idx);
-      if (gpu::GetImageNeedsPlatformSpecificTextureTarget(format, usage))
-        usage_format_list.push_back(gfx::BufferUsageAndFormat(usage, format));
-    }
-  }
-  return usage_format_list;
-}
-
 }  // namespace content
diff --git a/content/browser/gpu/compositor_util.h b/content/browser/gpu/compositor_util.h
index 2535f08a..43709ff 100644
--- a/content/browser/gpu/compositor_util.h
+++ b/content/browser/gpu/compositor_util.h
@@ -6,11 +6,11 @@
 #define CONTENT_BROWSER_GPU_COMPOSITOR_UTIL_H_
 
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "base/values.h"
 #include "content/common/content_export.h"
-#include "ui/gfx/buffer_types.h"
 
 namespace content {
 
@@ -52,11 +52,6 @@
 CONTENT_EXPORT std::unique_ptr<base::ListValue> GetProblemsForHardwareGpu();
 CONTENT_EXPORT std::vector<std::string> GetDriverBugWorkaroundsForHardwareGpu();
 
-// Populate a list of buffer usage/format for which a per platform specific
-// texture target must be used instead of GL_TEXTURE_2D.
-CONTENT_EXPORT std::vector<gfx::BufferUsageAndFormat>
-CreateBufferUsageAndFormatExceptionList();
-
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_GPU_COMPOSITOR_UTIL_H_
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc
index 4ad257f..e3b4133 100644
--- a/content/browser/gpu/gpu_data_manager_impl_private.cc
+++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -24,7 +24,6 @@
 #include "cc/base/switches.h"
 #include "components/viz/common/features.h"
 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
-#include "content/browser/gpu/compositor_util.h"
 #include "content/browser/gpu/gpu_process_host.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/gpu_data_manager_observer.h"
@@ -45,6 +44,7 @@
 #include "gpu/config/software_rendering_list_autogen.h"
 #include "gpu/ipc/common/gpu_preferences_util.h"
 #include "gpu/ipc/common/memory_stats.h"
+#include "gpu/ipc/host/gpu_memory_buffer_support.h"
 #include "gpu/ipc/host/shader_disk_cache.h"
 #include "media/media_buildflags.h"
 #include "ui/base/ui_base_switches.h"
@@ -195,7 +195,7 @@
                              CGDisplayChangeSummaryFlags flags,
                              void* gpu_data_manager) {
   if (flags == kCGDisplayBeginConfigurationFlag)
-    return; // This call contains no information about the display change
+    return;  // This call contains no information about the display change
 
   GpuDataManagerImpl* manager =
       reinterpret_cast<GpuDataManagerImpl*>(gpu_data_manager);
@@ -261,7 +261,7 @@
           gpu_info));
 }
 
-}  // namespace anonymous
+}  // anonymous namespace
 
 void GpuDataManagerImplPrivate::BlacklistWebGLForTesting() {
   // This function is for testing only, so disable histograms.
@@ -538,7 +538,6 @@
     command_line->AppendSwitch(switches::kOverrideUseSoftwareGLForTests);
   }
 #endif  // !OS_MACOSX
-
 }
 
 void GpuDataManagerImplPrivate::UpdateGpuPreferences(
@@ -560,7 +559,7 @@
       gpu::ShaderDiskCache::CacheSizeBytes();
 
   gpu_preferences->texture_target_exception_list =
-      CreateBufferUsageAndFormatExceptionList();
+      gpu::CreateBufferUsageAndFormatExceptionList();
 }
 
 void GpuDataManagerImplPrivate::DisableHardwareAcceleration() {
diff --git a/content/browser/keyboard_lock_browsertest.cc b/content/browser/keyboard_lock_browsertest.cc
index 4cd8ddb..b066a057 100644
--- a/content/browser/keyboard_lock_browsertest.cc
+++ b/content/browser/keyboard_lock_browsertest.cc
@@ -31,13 +31,6 @@
 
 namespace {
 
-// TODO(joedow): Enable tests on additional platforms as they are implemented.
-#if defined(OS_WIN) || defined(OS_MACOSX)
-#define MAYBE_RUN(test_name) test_name
-#else
-#define MAYBE_RUN(test_name) DISABLED_##test_name
-#endif
-
 constexpr char kFullscreenFrameName[] = "/fullscreen_frame.html";
 
 constexpr char kKeyboardLockMethodExistanceCheck[] =
@@ -370,42 +363,38 @@
   feature_list()->InitAndDisableFeature(features::kKeyboardLockAPI);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, MAYBE_RUN(SingleLockCall)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, SingleLockCall) {
   NavigateToTestURL();
   RequestKeyboardLock(FROM_HERE);
   // Don't explicitly call CancelKeyboardLock().
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(SingleLockCallForSomeKeys)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, SingleLockCallForSomeKeys) {
   NavigateToTestURL();
   RequestKeyboardLock(FROM_HERE, /*lock_all_keys=*/false);
   // Don't explicitly call CancelKeyboardLock().
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(SingleLockWithCancelCall)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, SingleLockWithCancelCall) {
   NavigateToTestURL();
   RequestKeyboardLock(FROM_HERE);
   CancelKeyboardLock(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(LockCalledBeforeFullscreen)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, LockCalledBeforeFullscreen) {
   NavigateToTestURL();
   RequestKeyboardLock(FROM_HERE);
   EnterFullscreen(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(LockCalledAfterFullscreen)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, LockCalledAfterFullscreen) {
   NavigateToTestURL();
   EnterFullscreen(FROM_HERE);
   RequestKeyboardLock(FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(LockAndCancelCyclingNoActivation)) {
+                       LockAndCancelCyclingNoActivation) {
   NavigateToTestURL();
 
   RequestKeyboardLock(FROM_HERE);
@@ -419,7 +408,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(LockAndCancelCyclingInFullscreen)) {
+                       LockAndCancelCyclingInFullscreen) {
   NavigateToTestURL();
 
   EnterFullscreen(FROM_HERE);
@@ -436,7 +425,7 @@
   CancelKeyboardLock(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, MAYBE_RUN(CancelInFullscreen)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, CancelInFullscreen) {
   NavigateToTestURL();
 
   RequestKeyboardLock(FROM_HERE);
@@ -445,8 +434,7 @@
   ExitFullscreen(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(EnterAndExitFullscreenCycling)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, EnterAndExitFullscreenCycling) {
   NavigateToTestURL();
 
   RequestKeyboardLock(FROM_HERE);
@@ -461,8 +449,7 @@
   ExitFullscreen(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(GainAndLoseFocusInWindowMode)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, GainAndLoseFocusInWindowMode) {
   NavigateToTestURL();
 
   RequestKeyboardLock(FROM_HERE);
@@ -473,8 +460,7 @@
   BlurContent(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(EnterFullscreenWithoutFocus)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, EnterFullscreenWithoutFocus) {
   NavigateToTestURL();
 
   RequestKeyboardLock(FROM_HERE);
@@ -488,7 +474,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(GainAndLoseFocusCyclingInFullscreen)) {
+                       GainAndLoseFocusCyclingInFullscreen) {
   NavigateToTestURL();
 
   RequestKeyboardLock(FROM_HERE);
@@ -508,13 +494,13 @@
   ExitFullscreen(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, MAYBE_RUN(CancelWithoutLock)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, CancelWithoutLock) {
   NavigateToTestURL();
   CancelKeyboardLock(FROM_HERE);
   CancelKeyboardLock(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, MAYBE_RUN(MultipleLockCalls)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, MultipleLockCalls) {
   NavigateToTestURL();
 
   RequestKeyboardLock(FROM_HERE);
@@ -522,8 +508,7 @@
   RequestKeyboardLock(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(MultipleCancelCalls)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, MultipleCancelCalls) {
   NavigateToTestURL();
 
   RequestKeyboardLock(FROM_HERE);
@@ -533,8 +518,7 @@
   CancelKeyboardLock(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(LockCallWithAllInvalidKeys)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, LockCallWithAllInvalidKeys) {
   NavigateToTestURL();
 
   bool result;
@@ -548,8 +532,7 @@
   EnterFullscreen(FROM_HERE);
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(LockCallWithSomeInvalidKeys)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, LockCallWithSomeInvalidKeys) {
   NavigateToTestURL();
 
   bool result;
@@ -564,37 +547,37 @@
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockDisabledBrowserTest,
-                       MAYBE_RUN(NoKeyboardLockWhenDisabled)) {
+                       NoKeyboardLockWhenDisabled) {
   ASSERT_TRUE(NavigateToURL(shell(), https_fullscreen_frame()));
   ASSERT_FALSE(KeyboardLockApiExists());
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(KeyboardLockNotAllowedForIFrame)) {
+                       KeyboardLockNotAllowedForIFrame) {
   // TODO(joedow): IMPLEMENT.
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(KeyboardUnlockedWhenNavigatingAway)) {
+                       KeyboardUnlockedWhenNavigatingAway) {
   // TODO(joedow): IMPLEMENT.
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(CrossOriginIFrameDoesNotReceiveInput)) {
+                       CrossOriginIFrameDoesNotReceiveInput) {
   // TODO(joedow): Added per code review feedback.
   // Steps: Main frame initiates keyboard lock and goes fullscreen.  Is input
   // delivered to cross-origin iFrame?
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(CrossOriginIFrameRequestsFullscreen)) {
+                       CrossOriginIFrameRequestsFullscreen) {
   // TODO(joedow): Added per code review feedback.
   // Steps: Main frame requests keyboard lock, cross-origin iFrame goes
   // fullscreen.  Should KeyboardLock be triggered in that case (presumably no).
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(LockRequestWhileIFrameIsFullscreen)) {
+                       LockRequestWhileIFrameIsFullscreen) {
   // TODO(joedow): Added per code review feedback.
   // Steps: 1. Load a page with a cross-site iframe: call main frame "A" and the
   //           subframe "B"
@@ -603,14 +586,14 @@
 }
 
 IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest,
-                       MAYBE_RUN(LockRequestFailsFromInnerWebContents)) {
+                       LockRequestFailsFromInnerWebContents) {
   // TODO(joedow): Added per code review feedback.
   // Steps: Try requesting KeyboardLock from with an inner WebContents context.
   // See: CreateAndAttachInnerContents() helper method in
   // https://cs.chromium.org/chromium/src/content/public/test/test_utils.h
 }
 
-IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, MAYBE_RUN(HistogramTest)) {
+IN_PROC_BROWSER_TEST_F(KeyboardLockBrowserTest, HistogramTest) {
   // TODO(joedow): Added per code review feedback.
   // Steps: Call the API methods and verify the histogram data is accurate using
   // base::HistogramTester.  Alternatively, this could be integrated with the
diff --git a/content/browser/loader/data_pipe_to_source_stream_unittest.cc b/content/browser/loader/data_pipe_to_source_stream_unittest.cc
index aaeeb65..17439b76 100644
--- a/content/browser/loader/data_pipe_to_source_stream_unittest.cc
+++ b/content/browser/loader/data_pipe_to_source_stream_unittest.cc
@@ -49,8 +49,8 @@
   void Init(base::StringPiece message) {
     message_ = message;
     const MojoCreateDataPipeOptions data_pipe_options{
-        sizeof(MojoCreateDataPipeOptions),
-        MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 1, GetParam().pipe_capacity};
+        sizeof(MojoCreateDataPipeOptions), MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1,
+        GetParam().pipe_capacity};
     mojo::ScopedDataPipeConsumerHandle consumer_end;
     CHECK_EQ(MOJO_RESULT_OK,
              mojo::CreateDataPipe(&data_pipe_options, &producer_end_,
diff --git a/content/browser/loader/mojo_async_resource_handler.cc b/content/browser/loader/mojo_async_resource_handler.cc
index d4b74d3..3e4378e 100644
--- a/content/browser/loader/mojo_async_resource_handler.cc
+++ b/content/browser/loader/mojo_async_resource_handler.cc
@@ -264,7 +264,7 @@
     first_call = true;
     MojoCreateDataPipeOptions options;
     options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
     options.element_num_bytes = 1;
     options.capacity_num_bytes = g_allocation_size;
     mojo::ScopedDataPipeProducerHandle producer;
diff --git a/content/browser/loader/source_stream_to_data_pipe_unittest.cc b/content/browser/loader/source_stream_to_data_pipe_unittest.cc
index 29e851f..b03704f 100644
--- a/content/browser/loader/source_stream_to_data_pipe_unittest.cc
+++ b/content/browser/loader/source_stream_to_data_pipe_unittest.cc
@@ -53,8 +53,8 @@
     source_ = source.get();
 
     const MojoCreateDataPipeOptions data_pipe_options{
-        sizeof(MojoCreateDataPipeOptions),
-        MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 1, GetParam().pipe_capacity};
+        sizeof(MojoCreateDataPipeOptions), MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1,
+        GetParam().pipe_capacity};
     mojo::ScopedDataPipeProducerHandle producer_end;
     CHECK_EQ(MOJO_RESULT_OK,
              mojo::CreateDataPipe(&data_pipe_options, &producer_end,
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc
index c0a0411..e09ded9 100644
--- a/content/browser/renderer_host/legacy_render_widget_host_win.cc
+++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
@@ -191,7 +191,8 @@
   // Direct Manipulation is enabled on Windows 10+. The CreateInstance function
   // returns NULL if Direct Manipulation is not available.
   direct_manipulation_helper_ =
-      ui::win::DirectManipulationHelper::CreateInstance(hwnd());
+      ui::win::DirectManipulationHelper::CreateInstance(
+          hwnd(), GetWindowEventTarget(GetParent()));
 
   // Disable pen flicks (http://crbug.com/506977)
   base::win::DisableFlicks(hwnd());
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 4ec0c58..363fe607 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2712,7 +2712,6 @@
     switches::kEnablePreciseMemoryInfo,
     switches::kEnablePrintBrowser,
     switches::kEnablePreferCompositingToLCDText,
-    switches::kEnableRasterDecoder,
     switches::kEnableRGBA4444Textures,
     switches::kEnableSkiaBenchmarking,
     switches::kEnableSlimmingPaintV175,
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 78cd421..3a9d68d 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1690,7 +1690,7 @@
   SendPageMessage(new PageMsg_FreezePage(MSG_ROUTING_NONE));
 }
 
-WebContents* WebContentsImpl::Clone() {
+std::unique_ptr<WebContents> WebContentsImpl::Clone() {
   // We use our current SiteInstance since the cloned entry will use it anyway.
   // We pass our own opener so that the cloned page can access it if it was set
   // before.
@@ -1700,10 +1700,11 @@
   RenderFrameHostImpl* opener_rfh = nullptr;
   if (opener)
     opener_rfh = opener->current_frame_host();
-  WebContentsImpl* tc = CreateWithOpener(create_params, opener_rfh);
+  std::unique_ptr<WebContentsImpl> tc =
+      base::WrapUnique(CreateWithOpener(create_params, opener_rfh));
   tc->GetController().CopyStateFrom(controller_, true);
   for (auto& observer : observers_)
-    observer.DidCloneToNewWebContents(this, tc);
+    observer.DidCloneToNewWebContents(this, tc.get());
   return tc;
 }
 
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index cedc6d0..ef7ca07 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -378,7 +378,7 @@
 
   void Stop() override;
   void FreezePage() override;
-  WebContents* Clone() override;
+  std::unique_ptr<WebContents> Clone() override;
   void ReloadFocusedFrame(bool bypass_cache) override;
   void Undo() override;
   void Redo() override;
diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc
index d9c8b6d..8c079255 100644
--- a/content/gpu/gpu_main.cc
+++ b/content/gpu/gpu_main.cc
@@ -339,7 +339,7 @@
       nullptr);
 #endif
 
-  if (command_line.HasSwitch(switches::kEnableOOPRasterization)) {
+  if (gpu_preferences.enable_oop_rasterization) {
     SkGraphics::Init();
 #if defined(OS_LINUX)
     // Set up the font IPC so that the GPU process can create typefaces.
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
index 894c9e1..a3add3c 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
@@ -37,6 +37,8 @@
     private int mWidth;
     private int mHeight;
 
+    private int mFramesUntilHideBackground;
+
     /**
      * Constructs a new ContentViewRenderView.
      * This should be called and the {@link ContentViewRenderView} should be added to the view
@@ -74,8 +76,8 @@
             @Override
             public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                 assert mNativeContentViewRenderView != 0;
-                nativeSurfaceChanged(mNativeContentViewRenderView,
-                        format, width, height, holder.getSurface());
+                nativeSurfaceChanged(
+                        mNativeContentViewRenderView, format, width, height, holder.getSurface());
                 if (mWebContents != null) {
                     nativeOnPhysicalBackingSizeChanged(
                             mNativeContentViewRenderView, mWebContents, width, height);
@@ -95,6 +97,8 @@
                 mSurfaceView.setVisibility(mSurfaceView.getVisibility());
 
                 onReadyToRender();
+
+                mFramesUntilHideBackground = 2;
             }
 
             @Override
@@ -208,21 +212,36 @@
 
     @CalledByNative
     private void didSwapFrame() {
-        if (mSurfaceView.getBackground() != null) {
-            post(new Runnable() {
-                @Override public void run() {
-                    mSurfaceView.setBackgroundResource(0);
-                }
-            });
+        // When a new surface is created, wait a couple frames to show it to
+        // prevent flashes of incomplete frames.
+        if (mFramesUntilHideBackground > 1) {
+            mFramesUntilHideBackground--;
+            // Make sure another frame is always rendered.
+            requestRender();
+        } else {
+            if (mSurfaceView.getBackground() != null) {
+                post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mSurfaceView.setBackgroundResource(0);
+                    }
+                });
+            }
         }
     }
 
+    private void requestRender() {
+        if (mNativeContentViewRenderView != 0)
+            nativeSetNeedsComposite(mNativeContentViewRenderView);
+    }
+
     private native long nativeInit(WindowAndroid rootWindow);
     private native void nativeDestroy(long nativeContentViewRenderView);
     private native void nativeSetCurrentWebContents(
             long nativeContentViewRenderView, WebContents webContents);
     private native void nativeOnPhysicalBackingSizeChanged(
             long nativeContentViewRenderView, WebContents webContents, int width, int height);
+    private native void nativeSetNeedsComposite(long nativeContentViewRenderView);
     private native void nativeSurfaceCreated(long nativeContentViewRenderView);
     private native void nativeSurfaceDestroyed(long nativeContentViewRenderView);
     private native void nativeSurfaceChanged(long nativeContentViewRenderView,
diff --git a/content/public/browser/devtools_agent_host.h b/content/public/browser/devtools_agent_host.h
index a6e78f9..0be97b3 100644
--- a/content/public/browser/devtools_agent_host.h
+++ b/content/public/browser/devtools_agent_host.h
@@ -121,10 +121,6 @@
   // Returns |true| on success.
   virtual bool AttachRestrictedClient(DevToolsAgentHostClient* client) = 0;
 
-  // Attaches |client| to this agent host to start debugging. Disconnects
-  // any existing clients.
-  virtual void ForceAttachClient(DevToolsAgentHostClient* client) = 0;
-
   // Already attached client detaches from this agent host to stop debugging it.
   // Returns true iff detach succeeded.
   virtual bool DetachClient(DevToolsAgentHostClient* client) = 0;
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
index f0c35eb..2835d80e 100644
--- a/content/public/browser/web_contents.h
+++ b/content/public/browser/web_contents.h
@@ -495,7 +495,7 @@
 
   // Creates a new WebContents with the same state as this one. The returned
   // heap-allocated pointer is owned by the caller.
-  virtual WebContents* Clone() = 0;
+  virtual std::unique_ptr<WebContents> Clone() = 0;
 
   // Reloads the focused frame.
   virtual void ReloadFocusedFrame(bool bypass_cache) = 0;
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index df0ee20..9f648a61 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -40,13 +40,14 @@
 const base::Feature kAudioServiceOutOfProcess{
     "AudioServiceOutOfProcess", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Allows swipe left/right from touchpad change browser navigation.
+// Allows swipe left/right from touchpad change browser navigation. Currently
+// only enabled by default on CrOS.
 const base::Feature kTouchpadOverscrollHistoryNavigation {
   "TouchpadOverscrollHistoryNavigation",
-#if defined(OS_WIN) || defined(OS_LINUX)
-      base::FEATURE_DISABLED_BY_DEFAULT
-#else
+#if defined(OS_CHROMEOS)
       base::FEATURE_ENABLED_BY_DEFAULT
+#else
+      base::FEATURE_DISABLED_BY_DEFAULT
 #endif
 };
 
diff --git a/content/public/test/network_service_test_helper.cc b/content/public/test/network_service_test_helper.cc
index 5b56be8a..139e40e 100644
--- a/content/public/test/network_service_test_helper.cc
+++ b/content/public/test/network_service_test_helper.cc
@@ -22,6 +22,7 @@
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/transport_security_state.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/test/spawned_test_server/spawned_test_server.h"
 #include "net/test/test_data_directory.h"
 #include "services/network/network_context.h"
 #include "services/network/public/cpp/features.h"
@@ -148,6 +149,7 @@
     base::InitAndroidTestPaths(base::android::GetIsolatedTestRoot());
 #endif
     net::EmbeddedTestServer::RegisterTestCerts();
+    net::SpawnedTestServer::RegisterTestCerts();
 
     // Also add the QUIC test certificate.
     net::TestRootCerts* root_certs = net::TestRootCerts::GetInstance();
diff --git a/content/renderer/loader/url_loader_client_impl_unittest.cc b/content/renderer/loader/url_loader_client_impl_unittest.cc
index 2411fa1..4278ceb 100644
--- a/content/renderer/loader/url_loader_client_impl_unittest.cc
+++ b/content/renderer/loader/url_loader_client_impl_unittest.cc
@@ -63,7 +63,7 @@
   static MojoCreateDataPipeOptions DataPipeOptions() {
     MojoCreateDataPipeOptions options;
     options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
     options.element_num_bytes = 1;
     options.capacity_num_bytes = 4096;
     return options;
diff --git a/content/renderer/loader/url_response_body_consumer_unittest.cc b/content/renderer/loader/url_response_body_consumer_unittest.cc
index b84e8ae..c3b6669d 100644
--- a/content/renderer/loader/url_response_body_consumer_unittest.cc
+++ b/content/renderer/loader/url_response_body_consumer_unittest.cc
@@ -144,7 +144,7 @@
   MojoCreateDataPipeOptions CreateDataPipeOptions() {
     MojoCreateDataPipeOptions options;
     options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
     options.element_num_bytes = 1;
     options.capacity_num_bytes = 1024;
     return options;
diff --git a/content/renderer/loader/web_data_consumer_handle_impl_unittest.cc b/content/renderer/loader/web_data_consumer_handle_impl_unittest.cc
index b01e4800..9251059 100644
--- a/content/renderer/loader/web_data_consumer_handle_impl_unittest.cc
+++ b/content/renderer/loader/web_data_consumer_handle_impl_unittest.cc
@@ -196,7 +196,7 @@
   void SetUp() override {
     MojoCreateDataPipeOptions options;
     options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
     options.element_num_bytes = 1;
     options.capacity_num_bytes = kDataPipeCapacity;
 
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index c2a55c28..980248d 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -375,16 +375,11 @@
   attributes.lose_context_when_out_of_memory = true;
   attributes.enable_gles2_interface = support_gles2_interface;
   attributes.enable_raster_interface = support_raster_interface;
-  attributes.enable_oop_rasterization = support_oop_rasterization;
-
-  bool enable_raster_decoder =
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableRasterDecoder);
-  // --enable-raster-decoder supports raster interface, but not
-  // gles2 interface
-  attributes.enable_raster_decoder = enable_raster_decoder &&
-                                     support_raster_interface &&
-                                     !support_gles2_interface;
+  // Using RasterDecoder for OOP-R backend, so we need support_raster_interface
+  // and !support_gles2_interface.
+  attributes.enable_oop_rasterization = support_oop_rasterization &&
+                                        support_raster_interface &&
+                                        !support_gles2_interface;
 
   const bool automatic_flushes = false;
   return base::MakeRefCounted<ui::ContextProviderCommandBuffer>(
diff --git a/content/shell/browser/shell_views.cc b/content/shell/browser/shell_views.cc
index 0bf12a5..a8af4c6 100644
--- a/content/shell/browser/shell_views.cc
+++ b/content/shell/browser/shell_views.cc
@@ -444,6 +444,9 @@
     aura::Window* parent = platform_->host()->window();
     if (!parent->Contains(content)) {
       parent->AddChild(content);
+      // Move the cursor to a fixed position before tests run to avoid getting
+      // an unpredictable result from mouse events.
+      content->MoveCursorTo(gfx::Point());
       content->Show();
     }
     content->SetBounds(gfx::Rect(content_size_));
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index 9b60472..19b8d6f33 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -261,9 +261,9 @@
   return true;
 }
 
-WebContents* TestWebContents::Clone() {
-  WebContentsImpl* contents =
-      Create(GetBrowserContext(), SiteInstance::Create(GetBrowserContext()));
+std::unique_ptr<WebContents> TestWebContents::Clone() {
+  std::unique_ptr<WebContentsImpl> contents = base::WrapUnique(
+      Create(GetBrowserContext(), SiteInstance::Create(GetBrowserContext())));
   contents->GetController().CopyStateFrom(controller_, true);
   return contents;
 }
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h
index 72eaa3a..9e2285f1f 100644
--- a/content/test/test_web_contents.h
+++ b/content/test/test_web_contents.h
@@ -117,7 +117,7 @@
 
   // Returns a clone of this TestWebContents. The returned object is also a
   // TestWebContents. The caller owns the returned object.
-  WebContents* Clone() override;
+  std::unique_ptr<WebContents> Clone() override;
 
   // Allow mocking of the RenderViewHostDelegateView.
   RenderViewHostDelegateView* GetDelegateView() override;
diff --git a/device/fido/u2f_command_constructor.cc b/device/fido/u2f_command_constructor.cc
index 5f0852d..7554bbc 100644
--- a/device/fido/u2f_command_constructor.cc
+++ b/device/fido/u2f_command_constructor.cc
@@ -44,6 +44,17 @@
       request.client_data_hash());
 }
 
+base::Optional<std::vector<uint8_t>> ConvertToU2fCheckOnlySignCommand(
+    const CtapMakeCredentialRequest& request,
+    const PublicKeyCredentialDescriptor& key_handle) {
+  if (key_handle.credential_type() != kPublicKey)
+    return base::nullopt;
+
+  return ConstructU2fSignCommand(
+      fido_parsing_utils::CreateSHA256Hash(request.rp().rp_id()),
+      request.client_data_hash(), key_handle.id(), true /* check_only */);
+}
+
 base::Optional<std::vector<uint8_t>> ConvertToU2fSignCommand(
     const CtapGetAssertionRequest& request,
     ApplicationParameterType application_parameter_type,
diff --git a/device/fido/u2f_command_constructor.h b/device/fido/u2f_command_constructor.h
index 3f1ae4e5..69161d1 100644
--- a/device/fido/u2f_command_constructor.h
+++ b/device/fido/u2f_command_constructor.h
@@ -38,6 +38,14 @@
 base::Optional<std::vector<uint8_t>> ConvertToU2fRegisterCommand(
     const CtapMakeCredentialRequest& request);
 
+// Extracts APDU encoded U2F check only sign command from
+// CtapMakeCredentialRequest. Invoked when U2F register operation includes key
+// handles in exclude list.
+COMPONENT_EXPORT(DEVICE_FIDO)
+base::Optional<std::vector<uint8_t>> ConvertToU2fCheckOnlySignCommand(
+    const CtapMakeCredentialRequest& request,
+    const PublicKeyCredentialDescriptor& key_handle);
+
 // Extracts APDU encoded U2F sign command from CtapGetAssertionRequest.
 COMPONENT_EXPORT(DEVICE_FIDO)
 base::Optional<std::vector<uint8_t>> ConvertToU2fSignCommand(
diff --git a/device/fido/u2f_command_constructor_unittest.cc b/device/fido/u2f_command_constructor_unittest.cc
index 8e6178d..18f61d27 100644
--- a/device/fido/u2f_command_constructor_unittest.cc
+++ b/device/fido/u2f_command_constructor_unittest.cc
@@ -16,6 +16,32 @@
 
 namespace device {
 
+namespace {
+
+CtapMakeCredentialRequest ConstructMakeCredentialRequest() {
+  PublicKeyCredentialRpEntity rp("acme.com");
+  rp.SetRpName("acme.com");
+
+  PublicKeyCredentialUserEntity user(
+      fido_parsing_utils::Materialize(test_data::kUserId));
+  user.SetUserName("johnpsmith@example.com")
+      .SetDisplayName("John P. Smith")
+      .SetIconUrl(GURL("https://pics.acme.com/00/p/aBjjjpqPb.png"));
+
+  return CtapMakeCredentialRequest(
+      fido_parsing_utils::Materialize(test_data::kClientDataHash),
+      std::move(rp), std::move(user),
+      PublicKeyCredentialParams(PublicKeyCredentialParams(
+          std::vector<PublicKeyCredentialParams::CredentialInfo>(1))));
+}
+
+CtapGetAssertionRequest ConstructGetAssertionRequest() {
+  return CtapGetAssertionRequest(
+      "acme.com", fido_parsing_utils::Materialize(test_data::kClientDataHash));
+}
+
+}  // namespace
+
 TEST(U2fCommandConstructorTest, TestCreateU2fRegisterCommand) {
   const auto& register_command_without_individual_attestation =
       ConstructU2fRegisterCommand(test_data::kApplicationParameter,
@@ -78,20 +104,7 @@
 }
 
 TEST(U2fCommandConstructorTest, TestConvertCtapMakeCredentialToU2fRegister) {
-  PublicKeyCredentialRpEntity rp("acme.com");
-  rp.SetRpName("acme.com");
-
-  PublicKeyCredentialUserEntity user(
-      fido_parsing_utils::Materialize(test_data::kUserId));
-  user.SetUserName("johnpsmith@example.com")
-      .SetDisplayName("John P. Smith")
-      .SetIconUrl(GURL("https://pics.acme.com/00/p/aBjjjpqPb.png"));
-
-  CtapMakeCredentialRequest make_credential_param(
-      fido_parsing_utils::Materialize(test_data::kClientDataHash),
-      std::move(rp), std::move(user),
-      PublicKeyCredentialParams({{CredentialType::kPublicKey, -7},
-                                 {CredentialType::kPublicKey, -257}}));
+  const auto make_credential_param = ConstructMakeCredentialRequest();
 
   EXPECT_TRUE(IsConvertibleToU2fRegisterCommand(make_credential_param));
 
@@ -102,6 +115,43 @@
               ::testing::ElementsAreArray(test_data::kU2fRegisterCommandApdu));
 }
 
+TEST(U2fCommandConstructorTest,
+     TestConvertCtapMakeCredentialToU2fCheckOnlySign) {
+  auto make_credential_param = ConstructMakeCredentialRequest();
+  PublicKeyCredentialDescriptor credential_descriptor(
+      kPublicKey,
+      fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle));
+  std::vector<PublicKeyCredentialDescriptor> exclude_list;
+  exclude_list.push_back(credential_descriptor);
+  make_credential_param.SetExcludeList(std::move(exclude_list));
+  EXPECT_TRUE(IsConvertibleToU2fRegisterCommand(make_credential_param));
+
+  const auto u2f_check_only_sign = ConvertToU2fCheckOnlySignCommand(
+      make_credential_param, credential_descriptor);
+
+  ASSERT_TRUE(u2f_check_only_sign);
+  EXPECT_THAT(
+      *u2f_check_only_sign,
+      ::testing::ElementsAreArray(test_data::kU2fCheckOnlySignCommandApdu));
+}
+
+TEST(U2fCommandConstructorTest,
+     TestConvertCtapMakeCredentialToU2fCheckOnlySignWithInvalidCredentialType) {
+  auto make_credential_param = ConstructMakeCredentialRequest();
+  PublicKeyCredentialDescriptor credential_descriptor(
+      "UnknownCredentialType",
+      fido_parsing_utils::Materialize(test_data::kU2fSignKeyHandle));
+  std::vector<PublicKeyCredentialDescriptor> exclude_list;
+  exclude_list.push_back(credential_descriptor);
+  make_credential_param.SetExcludeList(std::move(exclude_list));
+  EXPECT_TRUE(IsConvertibleToU2fRegisterCommand(make_credential_param));
+
+  const auto u2f_check_only_sign = ConvertToU2fCheckOnlySignCommand(
+      make_credential_param, credential_descriptor);
+
+  EXPECT_FALSE(u2f_check_only_sign);
+}
+
 TEST(U2fCommandConstructorTest, TestU2fRegisterCredentialAlgorithmRequirement) {
   PublicKeyCredentialRpEntity rp("acme.com");
   rp.SetRpName("acme.com");
@@ -121,38 +171,14 @@
 }
 
 TEST(U2fCommandConstructorTest, TestU2fRegisterUserVerificationRequirement) {
-  PublicKeyCredentialRpEntity rp("acme.com");
-  rp.SetRpName("acme.com");
-
-  PublicKeyCredentialUserEntity user(
-      fido_parsing_utils::Materialize(test_data::kUserId));
-  user.SetUserName("johnpsmith@example.com")
-      .SetDisplayName("John P. Smith")
-      .SetIconUrl(GURL("https://pics.acme.com/00/p/aBjjjpqPb.png"));
-
-  CtapMakeCredentialRequest make_credential_param(
-      fido_parsing_utils::Materialize(test_data::kClientDataHash),
-      std::move(rp), std::move(user),
-      PublicKeyCredentialParams({{CredentialType::kPublicKey, -7}}));
+  auto make_credential_param = ConstructMakeCredentialRequest();
   make_credential_param.SetUserVerificationRequired(true);
 
   EXPECT_FALSE(IsConvertibleToU2fRegisterCommand(make_credential_param));
 }
 
 TEST(U2fCommandConstructorTest, TestU2fRegisterResidentKeyRequirement) {
-  PublicKeyCredentialRpEntity rp("acme.com");
-  rp.SetRpName("acme.com");
-
-  PublicKeyCredentialUserEntity user(
-      fido_parsing_utils::Materialize(test_data::kUserId));
-  user.SetUserName("johnpsmith@example.com")
-      .SetDisplayName("John P. Smith")
-      .SetIconUrl(GURL("https://pics.acme.com/00/p/aBjjjpqPb.png"));
-
-  CtapMakeCredentialRequest make_credential_param(
-      fido_parsing_utils::Materialize(test_data::kClientDataHash),
-      std::move(rp), std::move(user),
-      PublicKeyCredentialParams({{CredentialType::kPublicKey, -7}}));
+  auto make_credential_param = ConstructMakeCredentialRequest();
   make_credential_param.SetResidentKeySupported(true);
 
   EXPECT_FALSE(IsConvertibleToU2fRegisterCommand(make_credential_param));
@@ -176,8 +202,7 @@
 }
 
 TEST(U2fCommandConstructorTest, TestConvertCtapGetAssertionToU2fSignRequest) {
-  CtapGetAssertionRequest get_assertion_req(
-      "acme.com", fido_parsing_utils::Materialize(test_data::kClientDataHash));
+  auto get_assertion_req = ConstructGetAssertionRequest();
   std::vector<PublicKeyCredentialDescriptor> allowed_list;
   allowed_list.push_back(PublicKeyCredentialDescriptor(
       kPublicKey,
@@ -195,15 +220,12 @@
 }
 
 TEST(U2fCommandConstructorTest, TestU2fSignAllowListRequirement) {
-  CtapGetAssertionRequest get_assertion_req(
-      "acme.com", fido_parsing_utils::Materialize(test_data::kClientDataHash));
-
+  auto get_assertion_req = ConstructGetAssertionRequest();
   EXPECT_FALSE(IsConvertibleToU2fSignCommand(get_assertion_req));
 }
 
 TEST(U2fCommandConstructorTest, TestU2fSignUserVerificationRequirement) {
-  CtapGetAssertionRequest get_assertion_req(
-      "acme.com", fido_parsing_utils::Materialize(test_data::kClientDataHash));
+  auto get_assertion_req = ConstructGetAssertionRequest();
   std::vector<PublicKeyCredentialDescriptor> allowed_list;
   allowed_list.push_back(PublicKeyCredentialDescriptor(
       kPublicKey,
diff --git a/extensions/browser/api/declarative_net_request/ruleset_manager.cc b/extensions/browser/api/declarative_net_request/ruleset_manager.cc
index 3090523..c40c624 100644
--- a/extensions/browser/api/declarative_net_request/ruleset_manager.cc
+++ b/extensions/browser/api/declarative_net_request/ruleset_manager.cc
@@ -295,7 +295,7 @@
   // have to do for split mode incognito extensions, pass false for
   // |crosses_incognito|.
   const bool crosses_incognito = false;
-  PermissionsData::AccessType result =
+  PermissionsData::PageAccess result =
       WebRequestPermissions::CanExtensionAccessURL(
           info_map_, ruleset.extension_id, request.url, tab_id,
           crosses_incognito,
@@ -303,7 +303,7 @@
           request.initiator);
 
   // TODO(crbug.com/809680): Handle ACCESS_WITHHELD.
-  return result == PermissionsData::ACCESS_ALLOWED;
+  return result == PermissionsData::PageAccess::kAllowed;
 }
 
 }  // namespace declarative_net_request
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_action.cc b/extensions/browser/api/declarative_webrequest/webrequest_action.cc
index 0045f14..b6957e4 100644
--- a/extensions/browser/api/declarative_webrequest/webrequest_action.cc
+++ b/extensions/browser/api/declarative_webrequest/webrequest_action.cc
@@ -508,7 +508,7 @@
   return WebRequestPermissions::CanExtensionAccessURL(
              extension_info_map, extension_id, request->url, -1,
              apply_info->crosses_incognito, permission_check,
-             request->initiator) == PermissionsData::ACCESS_ALLOWED;
+             request->initiator) == PermissionsData::PageAccess::kAllowed;
 }
 
 // static
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 50d98a0c..d275643 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -1463,7 +1463,7 @@
     }
 
     if (!request->is_web_view) {
-      PermissionsData::AccessType access =
+      PermissionsData::PageAccess access =
           WebRequestPermissions::CanExtensionAccessURL(
               extension_info_map, listener->id.extension_id, request->url,
               request->frame_data ? request->frame_data->tab_id : -1,
@@ -1471,8 +1471,8 @@
               WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL,
               request->initiator);
 
-      if (access != PermissionsData::ACCESS_ALLOWED) {
-        if (access == PermissionsData::ACCESS_WITHHELD &&
+      if (access != PermissionsData::PageAccess::kAllowed) {
+        if (access == PermissionsData::PageAccess::kWithheld &&
             web_request_event_router_delegate_) {
           web_request_event_router_delegate_->NotifyWebRequestWithheld(
               request->render_process_id, request->frame_id,
diff --git a/extensions/browser/api/web_request/web_request_permissions.cc b/extensions/browser/api/web_request/web_request_permissions.cc
index 65f1fda..025e8e6 100644
--- a/extensions/browser/api/web_request/web_request_permissions.cc
+++ b/extensions/browser/api/web_request/web_request_permissions.cc
@@ -42,7 +42,7 @@
 
 bool g_allow_all_extension_locations_in_public_session = false;
 
-PermissionsData::AccessType GetHostAccessForURL(
+PermissionsData::PageAccess GetHostAccessForURL(
     const extensions::Extension& extension,
     const GURL& url,
     int tab_id) {
@@ -50,7 +50,7 @@
   // anyway.
   if (url.SchemeIs(url::kAboutScheme) ||
       url::IsSameOriginWith(url, extension.url())) {
-    return PermissionsData::ACCESS_ALLOWED;
+    return PermissionsData::PageAccess::kAllowed;
   }
 
   return extension.permissions_data()->GetPageAccess(&extension, url, tab_id,
@@ -58,20 +58,20 @@
 }
 
 // Returns the most restricted access type out of |access1| and |access2|.
-PermissionsData::AccessType GetMinimumAccessType(
-    PermissionsData::AccessType access1,
-    PermissionsData::AccessType access2) {
-  PermissionsData::AccessType access = PermissionsData::ACCESS_DENIED;
+PermissionsData::PageAccess GetMinimumAccessType(
+    PermissionsData::PageAccess access1,
+    PermissionsData::PageAccess access2) {
+  PermissionsData::PageAccess access = PermissionsData::PageAccess::kDenied;
   switch (access1) {
-    case PermissionsData::ACCESS_DENIED:
-      access = PermissionsData::ACCESS_DENIED;
+    case PermissionsData::PageAccess::kDenied:
+      access = PermissionsData::PageAccess::kDenied;
       break;
-    case PermissionsData::ACCESS_WITHHELD:
-      access = (access2 == PermissionsData::ACCESS_DENIED
-                    ? PermissionsData::ACCESS_DENIED
-                    : PermissionsData::ACCESS_WITHHELD);
+    case PermissionsData::PageAccess::kWithheld:
+      access = (access2 == PermissionsData::PageAccess::kDenied
+                    ? PermissionsData::PageAccess::kDenied
+                    : PermissionsData::PageAccess::kWithheld);
       break;
-    case PermissionsData::ACCESS_ALLOWED:
+    case PermissionsData::PageAccess::kAllowed:
       access = access2;
       break;
   }
@@ -229,7 +229,7 @@
 }
 
 // static
-PermissionsData::AccessType WebRequestPermissions::CanExtensionAccessURL(
+PermissionsData::PageAccess WebRequestPermissions::CanExtensionAccessURL(
     const extensions::InfoMap* extension_info_map,
     const std::string& extension_id,
     const GURL& url,
@@ -239,18 +239,18 @@
     const base::Optional<url::Origin>& initiator) {
   // extension_info_map can be NULL in testing.
   if (!extension_info_map)
-    return PermissionsData::ACCESS_ALLOWED;
+    return PermissionsData::PageAccess::kAllowed;
 
   const extensions::Extension* extension =
       extension_info_map->extensions().GetByID(extension_id);
   if (!extension)
-    return PermissionsData::ACCESS_DENIED;
+    return PermissionsData::PageAccess::kDenied;
 
   // Prevent viewing / modifying requests initiated by a host protected by
   // policy.
   if (initiator &&
       extension->permissions_data()->IsRuntimeBlockedHost(initiator->GetURL()))
-    return PermissionsData::ACCESS_DENIED;
+    return PermissionsData::PageAccess::kDenied;
 
   // When we are in a Public Session, allow all URLs for webRequests initiated
   // by a regular extension (but don't allow chrome:// URLs).
@@ -263,35 +263,35 @@
     // in Public Session is that all extensions are installed by policy).
     CHECK(g_allow_all_extension_locations_in_public_session ||
           extensions::Manifest::IsPolicyLocation(extension->location()));
-    return PermissionsData::ACCESS_ALLOWED;
+    return PermissionsData::PageAccess::kAllowed;
   }
 #endif
 
   // Check if this event crosses incognito boundaries when it shouldn't.
   if (crosses_incognito && !extension_info_map->CanCrossIncognito(extension))
-    return PermissionsData::ACCESS_DENIED;
+    return PermissionsData::PageAccess::kDenied;
 
-  PermissionsData::AccessType access = PermissionsData::ACCESS_DENIED;
+  PermissionsData::PageAccess access = PermissionsData::PageAccess::kDenied;
   switch (host_permissions_check) {
     case DO_NOT_CHECK_HOST:
-      access = PermissionsData::ACCESS_ALLOWED;
+      access = PermissionsData::PageAccess::kAllowed;
       break;
     case REQUIRE_HOST_PERMISSION_FOR_URL:
       access = GetHostAccessForURL(*extension, url, tab_id);
       break;
     case REQUIRE_HOST_PERMISSION_FOR_URL_AND_INITIATOR: {
-      PermissionsData::AccessType request_access =
+      PermissionsData::PageAccess request_access =
           GetHostAccessForURL(*extension, url, tab_id);
-      PermissionsData::AccessType initiator_access =
+      PermissionsData::PageAccess initiator_access =
           initiator
               ? GetHostAccessForURL(*extension, initiator->GetURL(), tab_id)
-              : PermissionsData::ACCESS_ALLOWED;
+              : PermissionsData::PageAccess::kAllowed;
       access = GetMinimumAccessType(request_access, initiator_access);
       break;
     }
     case REQUIRE_ALL_URLS:
       if (extension->permissions_data()->HasEffectiveAccessToAllHosts())
-        access = PermissionsData::ACCESS_ALLOWED;
+        access = PermissionsData::PageAccess::kAllowed;
       // else ACCESS_DENIED
       break;
   }
@@ -306,12 +306,12 @@
     const base::Optional<url::Origin>& initiator,
     int tab_id,
     bool crosses_incognito) {
-  PermissionsData::AccessType access = PermissionsData::ACCESS_ALLOWED;
+  PermissionsData::PageAccess access = PermissionsData::PageAccess::kAllowed;
   if (initiator) {
     access = CanExtensionAccessURL(
         extension_info_map, extension_id, initiator->GetURL(), tab_id,
         crosses_incognito,
         WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL, base::nullopt);
   }
-  return access == PermissionsData::ACCESS_ALLOWED;
+  return access == PermissionsData::PageAccess::kAllowed;
 }
diff --git a/extensions/browser/api/web_request/web_request_permissions.h b/extensions/browser/api/web_request/web_request_permissions.h
index 9ee31e7..af3608f 100644
--- a/extensions/browser/api/web_request/web_request_permissions.h
+++ b/extensions/browser/api/web_request/web_request_permissions.h
@@ -50,7 +50,7 @@
 
   // |host_permission_check| controls how permissions are checked with regard to
   // |url| and |initiator| if an initiator exists.
-  static extensions::PermissionsData::AccessType CanExtensionAccessURL(
+  static extensions::PermissionsData::PageAccess CanExtensionAccessURL(
       const extensions::InfoMap* extension_info_map,
       const std::string& extension_id,
       const GURL& url,
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc
index 1da1097..fd78106 100644
--- a/extensions/common/permissions/permissions_data.cc
+++ b/extensions/common/permissions/permissions_data.cc
@@ -319,13 +319,14 @@
                                     const GURL& document_url,
                                     int tab_id,
                                     std::string* error) const {
-  AccessType result = GetPageAccess(extension, document_url, tab_id, error);
+  PageAccess result = GetPageAccess(extension, document_url, tab_id, error);
 
-  // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED.
-  return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD;
+  // TODO(rdevlin.cronin) Update callers so that they only need
+  // PageAccess::kAllowed.
+  return result == PageAccess::kAllowed || result == PageAccess::kWithheld;
 }
 
-PermissionsData::AccessType PermissionsData::GetPageAccess(
+PermissionsData::PageAccess PermissionsData::GetPageAccess(
     const Extension* extension,
     const GURL& document_url,
     int tab_id,
@@ -344,14 +345,15 @@
                                                 const GURL& document_url,
                                                 int tab_id,
                                                 std::string* error) const {
-  AccessType result =
+  PageAccess result =
       GetContentScriptAccess(extension, document_url, tab_id, error);
 
-  // TODO(rdevlin.cronin) Update callers so that they only need ACCESS_ALLOWED.
-  return result == ACCESS_ALLOWED || result == ACCESS_WITHHELD;
+  // TODO(rdevlin.cronin) Update callers so that they only need
+  // PageAccess::kAllowed.
+  return result == PageAccess::kAllowed || result == PageAccess::kWithheld;
 }
 
-PermissionsData::AccessType PermissionsData::GetContentScriptAccess(
+PermissionsData::PageAccess PermissionsData::GetContentScriptAccess(
     const Extension* extension,
     const GURL& document_url,
     int tab_id,
@@ -384,7 +386,8 @@
   // GetPageAccess() will still (correctly) return false if, for instance, the
   // URL is a file:// URL and the extension does not have file access.
   // See https://crbug.com/810220.
-  if (GetPageAccess(extension, document_url, tab_id, error) != ACCESS_ALLOWED) {
+  if (GetPageAccess(extension, document_url, tab_id, error) !=
+      PageAccess::kAllowed) {
     if (!document_url.SchemeIs(content::kChromeUIScheme))
       return false;
 
@@ -434,7 +437,7 @@
          !PolicyAllowedHostsUnsafe().MatchesURL(url);
 }
 
-PermissionsData::AccessType PermissionsData::CanRunOnPage(
+PermissionsData::PageAccess PermissionsData::CanRunOnPage(
     const Extension* extension,
     const GURL& document_url,
     int tab_id,
@@ -445,26 +448,26 @@
   runtime_lock_.AssertAcquired();
   if (g_policy_delegate && !g_policy_delegate->CanExecuteScriptOnPage(
                                extension, document_url, tab_id, error))
-    return ACCESS_DENIED;
+    return PageAccess::kDenied;
 
   if (extension->location() != Manifest::COMPONENT &&
       extension->permissions_data()->IsRuntimeBlockedHostUnsafe(document_url)) {
     if (error)
       *error = extension_misc::kPolicyBlockedScripting;
-    return ACCESS_DENIED;
+    return PageAccess::kDenied;
   }
 
   if (IsRestrictedUrl(document_url, extension, error))
-    return ACCESS_DENIED;
+    return PageAccess::kDenied;
 
   if (tab_url_patterns && tab_url_patterns->MatchesURL(document_url))
-    return ACCESS_ALLOWED;
+    return PageAccess::kAllowed;
 
   if (permitted_url_patterns.MatchesURL(document_url))
-    return ACCESS_ALLOWED;
+    return PageAccess::kAllowed;
 
   if (withheld_url_patterns.MatchesURL(document_url))
-    return ACCESS_WITHHELD;
+    return PageAccess::kWithheld;
 
   if (error) {
     if (extension->permissions_data()->active_permissions().HasAPIPermission(
@@ -476,7 +479,7 @@
     }
   }
 
-  return ACCESS_DENIED;
+  return PageAccess::kDenied;
 }
 
 }  // namespace extensions
diff --git a/extensions/common/permissions/permissions_data.h b/extensions/common/permissions/permissions_data.h
index 3967c82..898aaf3 100644
--- a/extensions/common/permissions/permissions_data.h
+++ b/extensions/common/permissions/permissions_data.h
@@ -38,12 +38,16 @@
 // permissions while another thread changes them.
 class PermissionsData {
  public:
-  // The possible types of access for a given frame.
-  enum AccessType {
-    ACCESS_DENIED,   // The extension is not allowed to access the given page.
-    ACCESS_ALLOWED,  // The extension is allowed to access the given page.
-    ACCESS_WITHHELD  // The browser must determine if the extension can access
-                     // the given page.
+  // The possible types of access for a given page.
+  // TODO(devlin): Sometimes, this is used for things beyond just a "page",
+  // such as network request interception or access to a particular frame.
+  // Should we update this?  If so, we should also update the titles of the
+  // GetPageAccess()/CanAccessPage() methods below.
+  enum class PageAccess {
+    kDenied,    // The extension is not allowed to access the given page.
+    kAllowed,   // The extension is allowed to access the given page.
+    kWithheld,  // The browser must determine if the extension can access
+                // the given page.
   };
 
   using TabPermissionsMap = std::map<int, std::unique_ptr<const PermissionSet>>;
@@ -187,7 +191,7 @@
   // Like CanAccessPage, but also takes withheld permissions into account.
   // TODO(rdevlin.cronin) We shouldn't have two functions, but not all callers
   // know how to wait for permission.
-  AccessType GetPageAccess(const Extension* extension,
+  PageAccess GetPageAccess(const Extension* extension,
                            const GURL& document_url,
                            int tab_id,
                            std::string* error) const;
@@ -206,7 +210,7 @@
   // account.
   // TODO(rdevlin.cronin) We shouldn't have two functions, but not all callers
   // know how to wait for permission.
-  AccessType GetContentScriptAccess(const Extension* extension,
+  PageAccess GetContentScriptAccess(const Extension* extension,
                                     const GURL& document_url,
                                     int tab_id,
                                     std::string* error) const;
@@ -287,7 +291,7 @@
   // checking against |permitted_url_patterns| and |tab_url_patterns| in
   // addition to blocking special sites (like the webstore or chrome:// urls).
   // Must be called with |runtime_lock_| acquired.
-  AccessType CanRunOnPage(const Extension* extension,
+  PageAccess CanRunOnPage(const Extension* extension,
                           const GURL& document_url,
                           int tab_id,
                           const URLPatternSet& permitted_url_patterns,
diff --git a/extensions/renderer/bindings/api_last_error.cc b/extensions/renderer/bindings/api_last_error.cc
index 404d1402..c347361 100644
--- a/extensions/renderer/bindings/api_last_error.cc
+++ b/extensions/renderer/bindings/api_last_error.cc
@@ -14,8 +14,9 @@
 
 namespace {
 
-const char kLastErrorProperty[] = "lastError";
-const char kScriptSuppliedValueKey[] = "script_supplied_value";
+constexpr char kLastErrorProperty[] = "lastError";
+constexpr char kScriptSuppliedValueKey[] = "script_supplied_value";
+constexpr char kUncheckedErrorPrefix[] = "Unchecked runtime.lastError: ";
 
 // The object corresponding to the lastError property, containing a single
 // property ('message') with the last error. This object is stored on the parent
@@ -169,10 +170,8 @@
     }
   }
 
-  if (report_if_unchecked && !last_error->accessed()) {
-    add_console_error_.Run(
-        context, "Unchecked runtime.lastError: " + last_error->error());
-  }
+  if (report_if_unchecked && !last_error->accessed())
+    ReportUncheckedError(context, last_error->error());
 
   // See comment in SetError().
   v8::TryCatch try_catch(isolate);
@@ -213,6 +212,11 @@
                                                   &last_error);
 }
 
+void APILastError::ReportUncheckedError(v8::Local<v8::Context> context,
+                                        const std::string& error) {
+  add_console_error_.Run(context, kUncheckedErrorPrefix + error);
+}
+
 void APILastError::SetErrorOnPrimaryParent(v8::Local<v8::Context> context,
                                            v8::Local<v8::Object> parent,
                                            const std::string& error) {
diff --git a/extensions/renderer/bindings/api_last_error.h b/extensions/renderer/bindings/api_last_error.h
index 1fb9011..3eb72df5 100644
--- a/extensions/renderer/bindings/api_last_error.h
+++ b/extensions/renderer/bindings/api_last_error.h
@@ -43,6 +43,11 @@
   // Returns true if the given context has an active error.
   bool HasError(v8::Local<v8::Context> context);
 
+  // Reports an unchecked error by logging it to the console. This is used when
+  // an error occurs, and there is no way it could be checked.
+  void ReportUncheckedError(v8::Local<v8::Context> context,
+                            const std::string& error);
+
  private:
   // Sets the lastError property on the primary parent object (in practice, this
   // is chrome.runtime.lastError);
diff --git a/extensions/renderer/bindings/api_last_error_unittest.cc b/extensions/renderer/bindings/api_last_error_unittest.cc
index 3e5cd2d..3d15cdca 100644
--- a/extensions/renderer/bindings/api_last_error_unittest.cc
+++ b/extensions/renderer/bindings/api_last_error_unittest.cc
@@ -148,6 +148,45 @@
   }
 }
 
+TEST_F(APILastErrorTest, ReportUncheckedError) {
+  v8::HandleScope handle_scope(isolate());
+  v8::Local<v8::Context> context = MainContext();
+  v8::Local<v8::Object> parent_object = v8::Object::New(isolate());
+
+  base::Optional<std::string> console_error;
+  auto log_error = [](base::Optional<std::string>* console_error,
+                      v8::Local<v8::Context> context,
+                      const std::string& error) { *console_error = error; };
+
+  ParentList parents = {{context, parent_object}};
+  APILastError last_error(base::BindRepeating(&GetParent, parents),
+                          base::BindRepeating(log_error, &console_error));
+
+  // lastError should start unset.
+  EXPECT_FALSE(last_error.HasError(context));
+  EXPECT_EQ("undefined", GetLastErrorMessage(parent_object, context));
+  EXPECT_FALSE(
+      parent_object->Has(context, gin::StringToV8(isolate(), "lastError"))
+          .ToChecked());
+
+  {
+    v8::TryCatch try_catch(isolate());
+    // Report an unchecked error. We should log the error, but not throw an
+    // exception to avoid disrupting JS execution.
+    last_error.ReportUncheckedError(context, "A last error");
+    ASSERT_TRUE(console_error);
+    EXPECT_EQ("Unchecked runtime.lastError: A last error", *console_error);
+    EXPECT_FALSE(try_catch.HasCaught());
+  }
+
+  // lastError should remain unset.
+  EXPECT_FALSE(last_error.HasError(context));
+  EXPECT_EQ("undefined", GetLastErrorMessage(parent_object, context));
+  EXPECT_FALSE(
+      parent_object->Has(context, gin::StringToV8(isolate(), "lastError"))
+          .ToChecked());
+}
+
 // Test behavior when something else sets a lastError property on the parent
 // object.
 TEST_F(APILastErrorTest, NonLastErrorObject) {
diff --git a/extensions/renderer/bindings/api_request_handler.cc b/extensions/renderer/bindings/api_request_handler.cc
index 4ad39a7..464d6bb8 100644
--- a/extensions/renderer/bindings/api_request_handler.cc
+++ b/extensions/renderer/bindings/api_request_handler.cc
@@ -18,25 +18,75 @@
 
 namespace extensions {
 
+// A helper class to adapt base::Value-style response arguments to v8 arguments
+// lazily, or simply return v8 arguments directly (depending on which style of
+// arguments were used in construction).
+class APIRequestHandler::ArgumentAdapter {
+ public:
+  explicit ArgumentAdapter(const base::ListValue* base_argumements);
+  explicit ArgumentAdapter(
+      const std::vector<v8::Local<v8::Value>>& v8_arguments);
+  ~ArgumentAdapter();
+
+  const std::vector<v8::Local<v8::Value>>& GetArguments(
+      v8::Local<v8::Context> context) const;
+
+ private:
+  const base::ListValue* base_arguments_ = nullptr;
+  mutable std::vector<v8::Local<v8::Value>> v8_arguments_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArgumentAdapter);
+};
+
+APIRequestHandler::ArgumentAdapter::ArgumentAdapter(
+    const base::ListValue* base_arguments)
+    : base_arguments_(base_arguments) {}
+APIRequestHandler::ArgumentAdapter::ArgumentAdapter(
+    const std::vector<v8::Local<v8::Value>>& v8_arguments)
+    : v8_arguments_(v8_arguments) {}
+APIRequestHandler::ArgumentAdapter::~ArgumentAdapter() = default;
+
+const std::vector<v8::Local<v8::Value>>&
+APIRequestHandler::ArgumentAdapter::GetArguments(
+    v8::Local<v8::Context> context) const {
+  v8::Isolate* isolate = context->GetIsolate();
+  DCHECK(isolate->GetCurrentContext() == context);
+
+  if (base_arguments_) {
+    DCHECK(v8_arguments_.empty())
+        << "GetArguments() should only be called once.";
+    std::unique_ptr<content::V8ValueConverter> converter =
+        content::V8ValueConverter::Create();
+    v8_arguments_.reserve(base_arguments_->GetSize());
+    for (const auto& arg : *base_arguments_)
+      v8_arguments_.push_back(converter->ToV8Value(&arg, context));
+  }
+
+  return v8_arguments_;
+}
+
 APIRequestHandler::Request::Request() {}
 APIRequestHandler::Request::~Request() = default;
 
 APIRequestHandler::PendingRequest::PendingRequest(
     v8::Isolate* isolate,
-    v8::Local<v8::Function> callback,
     v8::Local<v8::Context> context,
-    const std::vector<v8::Local<v8::Value>>& local_callback_args,
-    const std::string& method_name)
-    : isolate(isolate),
-      context(isolate, context),
-      callback(isolate, callback),
-      method_name(method_name),
-      user_gesture_token(
-          blink::WebUserGestureIndicator::CurrentUserGestureToken()) {
-  if (!local_callback_args.empty()) {
-    callback_arguments.reserve(local_callback_args.size());
-    for (const auto& arg : local_callback_args)
-      callback_arguments.push_back(v8::Global<v8::Value>(isolate, arg));
+    const std::string& method_name,
+    v8::Local<v8::Function> request_callback,
+    const base::Optional<std::vector<v8::Local<v8::Value>>>&
+        local_callback_args)
+    : isolate(isolate), context(isolate, context), method_name(method_name) {
+  if (!request_callback.IsEmpty()) {
+    callback.emplace(isolate, request_callback);
+    user_gesture_token =
+        blink::WebUserGestureIndicator::CurrentUserGestureToken();
+
+    if (local_callback_args) {
+      callback_arguments = std::vector<v8::Global<v8::Value>>();
+      callback_arguments->reserve(local_callback_args->size());
+      for (const auto& arg : *local_callback_args)
+        callback_arguments->emplace_back(isolate, arg);
+    }
   }
 }
 
@@ -75,13 +125,13 @@
   int request_id = next_request_id_++;
   request->request_id = request_id;
 
+  base::Optional<std::vector<v8::Local<v8::Value>>> callback_args;
+  v8::Isolate* isolate = context->GetIsolate();
   if (!custom_callback.IsEmpty() || !callback.IsEmpty()) {
-    v8::Isolate* isolate = context->GetIsolate();
     // In the JS bindings, custom callbacks are called with the arguments of
     // name, the full request object (see below), the original callback, and
     // the responses from the API. The responses from the API are handled by the
     // APIRequestHandler, but we need to curry in the other values.
-    std::vector<v8::Local<v8::Value>> callback_args;
     if (!custom_callback.IsEmpty()) {
       // TODO(devlin): The |request| object in the JS bindings includes
       // properties for callback, callbackSchema, args, stack, id, and
@@ -94,16 +144,16 @@
       v8::Local<v8::Value> callback_to_pass = callback;
       if (callback_to_pass.IsEmpty())
         callback_to_pass = v8::Undefined(isolate);
-      callback_args = {gin::StringToSymbol(isolate, method), request,
-                       callback_to_pass};
+      callback_args = std::vector<v8::Local<v8::Value>>{
+          gin::StringToSymbol(isolate, method), request, callback_to_pass};
       callback = custom_callback;
     }
 
     request->has_callback = true;
-    pending_requests_.insert(std::make_pair(
-        request_id,
-        PendingRequest(isolate, callback, context, callback_args, method)));
   }
+  pending_requests_.insert(std::make_pair(
+      request_id,
+      PendingRequest(isolate, context, method, callback, callback_args)));
 
   request->has_user_gesture =
       blink::WebUserGestureIndicator::IsProcessingUserGestureThreadSafe();
@@ -119,93 +169,22 @@
 void APIRequestHandler::CompleteRequest(int request_id,
                                         const base::ListValue& response_args,
                                         const std::string& error) {
-  auto iter = pending_requests_.find(request_id);
-  // The request may have been removed if the context was invalidated before a
-  // response is ready.
-  if (iter == pending_requests_.end())
-    return;
-
-  PendingRequest& pending_request = iter->second;
-
-  v8::Isolate* isolate = pending_request.isolate;
-  v8::HandleScope handle_scope(isolate);
-  v8::Local<v8::Context> context = pending_request.context.Get(isolate);
-  v8::Context::Scope context_scope(context);
-  std::unique_ptr<content::V8ValueConverter> converter =
-      content::V8ValueConverter::Create();
-  std::vector<v8::Local<v8::Value>> v8_args;
-  v8_args.reserve(response_args.GetSize());
-  for (const auto& arg : response_args)
-    v8_args.push_back(converter->ToV8Value(&arg, context));
-
-  // NOTE(devlin): This results in a double lookup of the pending request and an
-  // extra Handle/Context-Scope, but that should be pretty cheap.
-  CompleteRequest(request_id, v8_args, error);
+  CompleteRequestImpl(request_id, ArgumentAdapter(&response_args), error);
 }
 
 void APIRequestHandler::CompleteRequest(
     int request_id,
     const std::vector<v8::Local<v8::Value>>& response_args,
     const std::string& error) {
-  auto iter = pending_requests_.find(request_id);
-  // The request may have been removed if the context was invalidated before a
-  // response is ready.
-  if (iter == pending_requests_.end())
-    return;
-
-  PendingRequest pending_request = std::move(iter->second);
-  pending_requests_.erase(iter);
-
-  v8::Isolate* isolate = pending_request.isolate;
-  v8::HandleScope handle_scope(isolate);
-  v8::Local<v8::Context> context = pending_request.context.Get(isolate);
-  v8::Context::Scope context_scope(context);
-  std::vector<v8::Local<v8::Value>> args;
-  args.reserve(response_args.size() +
-               pending_request.callback_arguments.size());
-  for (const auto& arg : pending_request.callback_arguments)
-    args.push_back(arg.Get(isolate));
-  for (const auto& arg : response_args)
-    args.push_back(arg);
-
-  blink::WebScopedUserGesture user_gesture(pending_request.user_gesture_token);
-  if (!error.empty())
-    last_error_.SetError(context, error);
-
-  if (response_validator_) {
-    bool has_custom_callback = !pending_request.callback_arguments.empty();
-    response_validator_->ValidateResponse(
-        context, pending_request.method_name, args, error,
-        has_custom_callback
-            ? APIResponseValidator::CallbackType::kAPIProvided
-            : APIResponseValidator::CallbackType::kCallerProvided);
-  }
-
-  v8::TryCatch try_catch(isolate);
-  // args.size() is converted to int, but args is controlled by chrome and is
-  // never close to std::numeric_limits<int>::max.
-  JSRunner::Get(context)->RunJSFunction(pending_request.callback.Get(isolate),
-                                        context, args.size(), args.data());
-  if (try_catch.HasCaught()) {
-    v8::Local<v8::Message> v8_message = try_catch.Message();
-    base::Optional<std::string> message;
-    if (!v8_message.IsEmpty())
-      message = gin::V8ToString(v8_message->Get());
-    exception_handler_->HandleException(context, "Error handling response",
-                                        &try_catch);
-  }
-
-  if (!error.empty())
-    last_error_.ClearError(context, true);
+  CompleteRequestImpl(request_id, ArgumentAdapter(response_args), error);
 }
 
 int APIRequestHandler::AddPendingRequest(v8::Local<v8::Context> context,
                                          v8::Local<v8::Function> callback) {
   int request_id = next_request_id_++;
   pending_requests_.emplace(
-      request_id,
-      PendingRequest(context->GetIsolate(), callback, context,
-                     std::vector<v8::Local<v8::Value>>(), std::string()));
+      request_id, PendingRequest(context->GetIsolate(), context, std::string(),
+                                 callback, base::nullopt));
   return request_id;
 }
 
@@ -232,4 +211,78 @@
   return result;
 }
 
+void APIRequestHandler::CompleteRequestImpl(int request_id,
+                                            const ArgumentAdapter& arguments,
+                                            const std::string& error) {
+  auto iter = pending_requests_.find(request_id);
+  // The request may have been removed if the context was invalidated before a
+  // response is ready.
+  if (iter == pending_requests_.end())
+    return;
+
+  PendingRequest pending_request = std::move(iter->second);
+  pending_requests_.erase(iter);
+
+  v8::Isolate* isolate = pending_request.isolate;
+  v8::HandleScope handle_scope(isolate);
+  v8::Local<v8::Context> context = pending_request.context.Get(isolate);
+  v8::Context::Scope context_scope(context);
+
+  if (!pending_request.callback) {
+    // If there's no callback associated with the request, but there is an
+    // error, report the error as if it were unchecked.
+    if (!error.empty()) {
+      // TODO(devlin): Use pending_requeset.method_name here?
+      last_error_.ReportUncheckedError(context, error);
+    }
+    // No callback to trigger, so we're done!
+    return;
+  }
+
+  std::vector<v8::Local<v8::Value>> full_args;
+  const std::vector<v8::Local<v8::Value>>& response_args =
+      arguments.GetArguments(context);
+  size_t curried_argument_size =
+      pending_request.callback_arguments
+          ? pending_request.callback_arguments->size()
+          : 0u;
+  full_args.reserve(response_args.size() + curried_argument_size);
+  if (pending_request.callback_arguments) {
+    for (const auto& arg : *pending_request.callback_arguments)
+      full_args.push_back(arg.Get(isolate));
+  }
+  full_args.insert(full_args.end(), response_args.begin(), response_args.end());
+
+  blink::WebScopedUserGesture user_gesture(*pending_request.user_gesture_token);
+  if (!error.empty())
+    last_error_.SetError(context, error);
+
+  if (response_validator_) {
+    bool has_custom_callback = !!pending_request.callback_arguments;
+    response_validator_->ValidateResponse(
+        context, pending_request.method_name, response_args, error,
+        has_custom_callback
+            ? APIResponseValidator::CallbackType::kAPIProvided
+            : APIResponseValidator::CallbackType::kCallerProvided);
+  }
+
+  v8::TryCatch try_catch(isolate);
+  // args.size() is converted to int, but args is controlled by chrome and is
+  // never close to std::numeric_limits<int>::max.
+  JSRunner::Get(context)->RunJSFunction(pending_request.callback->Get(isolate),
+                                        context, full_args.size(),
+                                        full_args.data());
+  if (try_catch.HasCaught()) {
+    v8::Local<v8::Message> v8_message = try_catch.Message();
+    base::Optional<std::string> message;
+    if (!v8_message.IsEmpty())
+      message = gin::V8ToString(v8_message->Get());
+    exception_handler_->HandleException(context, "Error handling response",
+                                        &try_catch);
+  }
+
+  if (!error.empty())
+    last_error_.ClearError(context, true);
+}
+
 }  // namespace extensions
diff --git a/extensions/renderer/bindings/api_request_handler.h b/extensions/renderer/bindings/api_request_handler.h
index 7a3a311c..300d3046 100644
--- a/extensions/renderer/bindings/api_request_handler.h
+++ b/extensions/renderer/bindings/api_request_handler.h
@@ -11,6 +11,7 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "extensions/renderer/bindings/api_binding_types.h"
 #include "extensions/renderer/bindings/api_last_error.h"
 #include "third_party/blink/public/web/web_user_gesture_token.h"
@@ -97,24 +98,33 @@
   std::set<int> GetPendingRequestIdsForTesting() const;
 
  private:
+  class ArgumentAdapter;
+
   struct PendingRequest {
-    PendingRequest(v8::Isolate* isolate,
-                   v8::Local<v8::Function> callback,
-                   v8::Local<v8::Context> context,
-                   const std::vector<v8::Local<v8::Value>>& callback_args,
-                   const std::string& method_name);
+    PendingRequest(
+        v8::Isolate* isolate,
+        v8::Local<v8::Context> context,
+        const std::string& method_name,
+        v8::Local<v8::Function> callback,
+        const base::Optional<std::vector<v8::Local<v8::Value>>>& callback_args);
     ~PendingRequest();
     PendingRequest(PendingRequest&&);
     PendingRequest& operator=(PendingRequest&&);
 
     v8::Isolate* isolate;
     v8::Global<v8::Context> context;
-    v8::Global<v8::Function> callback;
-    std::vector<v8::Global<v8::Value>> callback_arguments;
     std::string method_name;
-    blink::WebUserGestureToken user_gesture_token;
+
+    // The following are only populated for requests with a callback.
+    base::Optional<v8::Global<v8::Function>> callback;
+    base::Optional<std::vector<v8::Global<v8::Value>>> callback_arguments;
+    base::Optional<blink::WebUserGestureToken> user_gesture_token;
   };
 
+  void CompleteRequestImpl(int request_id,
+                           const ArgumentAdapter& arguments,
+                           const std::string& error);
+
   // The next available request identifier.
   int next_request_id_ = 0;
 
diff --git a/extensions/renderer/bindings/api_request_handler_unittest.cc b/extensions/renderer/bindings/api_request_handler_unittest.cc
index 7595161..0ea55659a 100644
--- a/extensions/renderer/bindings/api_request_handler_unittest.cc
+++ b/extensions/renderer/bindings/api_request_handler_unittest.cc
@@ -434,6 +434,35 @@
     EXPECT_EQ("Unchecked runtime.lastError: some error", *logged_error);
     logged_error.reset();
   }
+
+  {
+    // Test a function call resulting in an error with only a custom callback,
+    // and no author-script-provided callback. The error should be logged.
+    v8::Local<v8::Function> custom_callback =
+        FunctionFromString(context, "(function() {})");
+    int request_id = request_handler.StartRequest(
+        context, kMethod, std::make_unique<base::ListValue>(),
+        v8::Local<v8::Function>(), custom_callback, binding::RequestThread::UI);
+    request_handler.CompleteRequest(request_id, base::ListValue(),
+                                    "some error");
+    ASSERT_TRUE(logged_error);
+    EXPECT_EQ("Unchecked runtime.lastError: some error", *logged_error);
+    logged_error.reset();
+  }
+
+  {
+    // Test a function call resulting in an error that does not have an
+    // associated callback callback. The error should be logged.
+    int request_id = request_handler.StartRequest(
+        context, kMethod, std::make_unique<base::ListValue>(),
+        v8::Local<v8::Function>(), v8::Local<v8::Function>(),
+        binding::RequestThread::UI);
+    request_handler.CompleteRequest(request_id, base::ListValue(),
+                                    "some error");
+    ASSERT_TRUE(logged_error);
+    EXPECT_EQ("Unchecked runtime.lastError: some error", *logged_error);
+    logged_error.reset();
+  }
 }
 
 TEST_F(APIRequestHandlerTest, AddPendingRequest) {
diff --git a/extensions/renderer/extension_injection_host.cc b/extensions/renderer/extension_injection_host.cc
index 80e9c34..1ea2e17 100644
--- a/extensions/renderer/extension_injection_host.cc
+++ b/extensions/renderer/extension_injection_host.cc
@@ -45,7 +45,7 @@
   return extension_->name();
 }
 
-PermissionsData::AccessType ExtensionInjectionHost::CanExecuteOnFrame(
+PermissionsData::PageAccess ExtensionInjectionHost::CanExecuteOnFrame(
     const GURL& document_url,
     content::RenderFrame* render_frame,
     int tab_id,
@@ -56,12 +56,12 @@
   if (top_frame_security_origin.Protocol().Utf8() == kExtensionScheme &&
       top_frame_security_origin.Host().Utf8() != extension_->id() &&
       !PermissionsData::CanExecuteScriptEverywhere(extension_))
-    return PermissionsData::ACCESS_DENIED;
+    return PermissionsData::PageAccess::kDenied;
 
   // Declarative user scripts use "page access" (from "permissions" section in
   // manifest) whereas non-declarative user scripts use custom
   // "content script access" logic.
-  PermissionsData::AccessType access = PermissionsData::ACCESS_ALLOWED;
+  PermissionsData::PageAccess access = PermissionsData::PageAccess::kAllowed;
   if (is_declarative) {
     access = extension_->permissions_data()->GetPageAccess(
         extension_,
@@ -75,12 +75,12 @@
         tab_id,
         nullptr /* ignore error */);
   }
-  if (access == PermissionsData::ACCESS_WITHHELD &&
+  if (access == PermissionsData::PageAccess::kWithheld &&
       (tab_id == -1 || render_frame->GetWebFrame()->Parent())) {
     // Note: we don't consider ACCESS_WITHHELD for child frames or for frames
     // outside of tabs because there is nowhere to surface a request.
     // TODO(devlin): We should ask for permission somehow. crbug.com/491402.
-    access = PermissionsData::ACCESS_DENIED;
+    access = PermissionsData::PageAccess::kDenied;
   }
   return access;
 }
diff --git a/extensions/renderer/extension_injection_host.h b/extensions/renderer/extension_injection_host.h
index e8db031..1ef0907 100644
--- a/extensions/renderer/extension_injection_host.h
+++ b/extensions/renderer/extension_injection_host.h
@@ -29,7 +29,7 @@
   std::string GetContentSecurityPolicy() const override;
   const GURL& url() const override;
   const std::string& name() const override;
-  PermissionsData::AccessType CanExecuteOnFrame(
+  PermissionsData::PageAccess CanExecuteOnFrame(
       const GURL& document_url,
       content::RenderFrame* render_frame,
       int tab_id,
diff --git a/extensions/renderer/injection_host.h b/extensions/renderer/injection_host.h
index 78015a4..727df8c2 100644
--- a/extensions/renderer/injection_host.h
+++ b/extensions/renderer/injection_host.h
@@ -29,7 +29,7 @@
   virtual const std::string& name() const = 0;
 
   // Returns true if the script should execute.
-  virtual extensions::PermissionsData::AccessType CanExecuteOnFrame(
+  virtual extensions::PermissionsData::PageAccess CanExecuteOnFrame(
       const GURL& document_url,
       content::RenderFrame* render_frame,
       int tab_id,
diff --git a/extensions/renderer/programmatic_script_injector.cc b/extensions/renderer/programmatic_script_injector.cc
index 1ca34514..c320c9c3 100644
--- a/extensions/renderer/programmatic_script_injector.cc
+++ b/extensions/renderer/programmatic_script_injector.cc
@@ -72,7 +72,7 @@
   return params_->run_at == run_location && !params_->is_javascript;
 }
 
-PermissionsData::AccessType ProgrammaticScriptInjector::CanExecuteOnFrame(
+PermissionsData::PageAccess ProgrammaticScriptInjector::CanExecuteOnFrame(
     const InjectionHost* injection_host,
     blink::WebLocalFrame* frame,
     int tab_id) {
@@ -89,12 +89,12 @@
   if (params_->is_web_view) {
     if (frame->Parent()) {
       // This is a subframe inside <webview>, so allow it.
-      return PermissionsData::ACCESS_ALLOWED;
+      return PermissionsData::PageAccess::kAllowed;
     }
 
     return effective_document_url == params_->webview_src
-               ? PermissionsData::ACCESS_ALLOWED
-               : PermissionsData::ACCESS_DENIED;
+               ? PermissionsData::PageAccess::kAllowed
+               : PermissionsData::PageAccess::kDenied;
   }
   DCHECK_EQ(injection_host->id().type(), HostID::EXTENSIONS);
 
diff --git a/extensions/renderer/programmatic_script_injector.h b/extensions/renderer/programmatic_script_injector.h
index 92dcced6..4820992c 100644
--- a/extensions/renderer/programmatic_script_injector.h
+++ b/extensions/renderer/programmatic_script_injector.h
@@ -41,7 +41,7 @@
   bool ShouldInjectCss(
       UserScript::RunLocation run_location,
       const std::set<std::string>& injected_stylesheets) const override;
-  PermissionsData::AccessType CanExecuteOnFrame(
+  PermissionsData::PageAccess CanExecuteOnFrame(
       const InjectionHost* injection_host,
       blink::WebLocalFrame* web_frame,
       int tab_id) override;
diff --git a/extensions/renderer/script_injection.cc b/extensions/renderer/script_injection.cc
index 6c235184..f5b4ed2 100644
--- a/extensions/renderer/script_injection.cc
+++ b/extensions/renderer/script_injection.cc
@@ -204,13 +204,13 @@
   switch (injector_->CanExecuteOnFrame(
       injection_host_.get(), web_frame,
       ExtensionFrameHelper::Get(render_frame_)->tab_id())) {
-    case PermissionsData::ACCESS_DENIED:
+    case PermissionsData::PageAccess::kDenied:
       NotifyWillNotInject(ScriptInjector::NOT_ALLOWED);
       return INJECTION_FINISHED;  // We're done.
-    case PermissionsData::ACCESS_WITHHELD:
+    case PermissionsData::PageAccess::kWithheld:
       RequestPermissionFromBrowser();
       return INJECTION_WAITING;  // Wait around for permission.
-    case PermissionsData::ACCESS_ALLOWED:
+    case PermissionsData::PageAccess::kAllowed:
       InjectionResult result =
           Inject(scripts_run_info, std::move(async_run_info));
       // If the injection is blocked, we need to set the manager so we can
diff --git a/extensions/renderer/script_injector.h b/extensions/renderer/script_injector.h
index e8ec513..f79f1407 100644
--- a/extensions/renderer/script_injector.h
+++ b/extensions/renderer/script_injector.h
@@ -66,7 +66,7 @@
       const std::set<std::string>& injected_stylesheets) const = 0;
 
   // Returns true if the script should execute on the given |frame|.
-  virtual PermissionsData::AccessType CanExecuteOnFrame(
+  virtual PermissionsData::PageAccess CanExecuteOnFrame(
       const InjectionHost* injection_host,
       blink::WebLocalFrame* web_frame,
       int tab_id) = 0;
diff --git a/extensions/renderer/user_script_injector.cc b/extensions/renderer/user_script_injector.cc
index a2dfbbf2..7b9618c 100644
--- a/extensions/renderer/user_script_injector.cc
+++ b/extensions/renderer/user_script_injector.cc
@@ -169,14 +169,14 @@
          ShouldInjectScripts(script_->css_scripts(), injected_stylesheets);
 }
 
-PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame(
+PermissionsData::PageAccess UserScriptInjector::CanExecuteOnFrame(
     const InjectionHost* injection_host,
     blink::WebLocalFrame* web_frame,
     int tab_id) {
   // There is no harm in allowing the injection when the script is gone,
   // because there is nothing to inject.
   if (!script_)
-    return PermissionsData::ACCESS_ALLOWED;
+    return PermissionsData::PageAccess::kAllowed;
 
   if (script_->consumer_instance_type() ==
           UserScript::ConsumerInstanceType::WEBVIEW) {
@@ -202,8 +202,8 @@
       map.insert(std::pair<RoutingInfoKey, bool>(key, allowed));
     }
 
-    return allowed ? PermissionsData::ACCESS_ALLOWED
-                   : PermissionsData::ACCESS_DENIED;
+    return allowed ? PermissionsData::PageAccess::kAllowed
+                   : PermissionsData::PageAccess::kDenied;
   }
 
   GURL effective_document_url = ScriptContext::GetEffectiveDocumentURL(
diff --git a/extensions/renderer/user_script_injector.h b/extensions/renderer/user_script_injector.h
index 98da891..8705d58 100644
--- a/extensions/renderer/user_script_injector.h
+++ b/extensions/renderer/user_script_injector.h
@@ -49,7 +49,7 @@
   bool ShouldInjectCss(
       UserScript::RunLocation run_location,
       const std::set<std::string>& injected_stylesheets) const override;
-  PermissionsData::AccessType CanExecuteOnFrame(
+  PermissionsData::PageAccess CanExecuteOnFrame(
       const InjectionHost* injection_host,
       blink::WebLocalFrame* web_frame,
       int tab_id) override;
diff --git a/extensions/renderer/user_script_set.cc b/extensions/renderer/user_script_set.cc
index 262f2c5..3a069fd 100644
--- a/extensions/renderer/user_script_set.cc
+++ b/extensions/renderer/user_script_set.cc
@@ -224,11 +224,8 @@
   std::unique_ptr<ScriptInjector> injector(
       new UserScriptInjector(script, this, is_declarative));
 
-  if (injector->CanExecuteOnFrame(
-          injection_host.get(),
-          web_frame,
-          tab_id) ==
-      PermissionsData::ACCESS_DENIED) {
+  if (injector->CanExecuteOnFrame(injection_host.get(), web_frame, tab_id) ==
+      PermissionsData::PageAccess::kDenied) {
     return injection;
   }
 
diff --git a/extensions/renderer/web_ui_injection_host.cc b/extensions/renderer/web_ui_injection_host.cc
index 1fd43645..4943f4d 100644
--- a/extensions/renderer/web_ui_injection_host.cc
+++ b/extensions/renderer/web_ui_injection_host.cc
@@ -24,11 +24,11 @@
   return id().id();
 }
 
-extensions::PermissionsData::AccessType WebUIInjectionHost::CanExecuteOnFrame(
+extensions::PermissionsData::PageAccess WebUIInjectionHost::CanExecuteOnFrame(
     const GURL& document_url,
     content::RenderFrame* render_frame,
     int tab_id,
     bool is_declarative) const {
   // Content scripts are allowed to inject on webviews created by WebUI.
-  return extensions::PermissionsData::AccessType::ACCESS_ALLOWED;
+  return extensions::PermissionsData::PageAccess::kAllowed;
 }
diff --git a/extensions/renderer/web_ui_injection_host.h b/extensions/renderer/web_ui_injection_host.h
index dfde94b4..3855ce7 100644
--- a/extensions/renderer/web_ui_injection_host.h
+++ b/extensions/renderer/web_ui_injection_host.h
@@ -18,7 +18,7 @@
   std::string GetContentSecurityPolicy() const override;
   const GURL& url() const override;
   const std::string& name() const override;
-  extensions::PermissionsData::AccessType CanExecuteOnFrame(
+  extensions::PermissionsData::PageAccess CanExecuteOnFrame(
       const GURL& document_url,
       content::RenderFrame* render_frame,
       int tab_id,
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 4f4a28c..2ab169a 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -253,6 +253,7 @@
     "//gpu/command_buffer/client:raster",
     "//gpu/command_buffer/common:gles2_utils",
     "//gpu/ipc:gl_in_process_context",
+    "//gpu/ipc/host",
     "//gpu/ipc/service",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/gpu/command_buffer/common/context_creation_attribs.h b/gpu/command_buffer/common/context_creation_attribs.h
index bdba42ef..dcc680be 100644
--- a/gpu/command_buffer/common/context_creation_attribs.h
+++ b/gpu/command_buffer/common/context_creation_attribs.h
@@ -57,7 +57,6 @@
   bool single_buffer = false;
   bool enable_gles2_interface = true;
   bool enable_raster_interface = false;
-  bool enable_raster_decoder = false;
   bool enable_oop_rasterization = false;
   bool enable_swap_timestamps_if_supported = false;
 
diff --git a/gpu/command_buffer/service/gpu_preferences.h b/gpu/command_buffer/service/gpu_preferences.h
index 8b82080..295e77a4 100644
--- a/gpu/command_buffer/service/gpu_preferences.h
+++ b/gpu/command_buffer/service/gpu_preferences.h
@@ -136,9 +136,6 @@
   // round intermediate values in ANGLE.
   bool emulate_shader_precision = false;
 
-  // Use a dedicated RasterDecoder instead of generic GLES2Decoder.
-  bool enable_raster_decoder = false;
-
   // ===================================
   // Settings from //ui/gl/gl_switches.h
 
@@ -169,10 +166,13 @@
   // Ignores GPU blacklist.
   bool ignore_gpu_blacklist = false;
 
+  // Enable GPU rasterization in the GPU process.
+  bool enable_oop_rasterization = false;
+
   // Please update gpu_preferences_util_unittest.cc when making additions or
   // changes to this struct.
 };
 
 }  // namespace gpu
 
-#endif // GPU_COMMAND_BUFFER_SERVICE_GPU_PREFERENCES_H_
+#endif  // GPU_COMMAND_BUFFER_SERVICE_GPU_PREFERENCES_H_
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc
index 92fb896d..8648a12b 100644
--- a/gpu/command_buffer/service/raster_decoder.cc
+++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -45,6 +45,7 @@
 #include "gpu/command_buffer/service/gl_utils.h"
 #include "gpu/command_buffer/service/gles2_cmd_copy_tex_image.h"
 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h"
+#include "gpu/command_buffer/service/image_factory.h"
 #include "gpu/command_buffer/service/image_manager.h"
 #include "gpu/command_buffer/service/indexed_buffer_binding_host.h"
 #include "gpu/command_buffer/service/logger.h"
@@ -62,6 +63,7 @@
 #include "third_party/skia/include/core/SkTypeface.h"
 #include "third_party/skia/include/gpu/GrBackendSurface.h"
 #include "third_party/skia/include/gpu/GrContext.h"
+#include "ui/gfx/buffer_format_util.h"
 #include "ui/gfx/ipc/color/gfx_param_traits.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_gl_api_implementation.h"
@@ -505,9 +507,7 @@
   void TexStorage2DImage(TextureRef* texture_ref,
                          const TextureMetadata& texture_metadata,
                          GLsizei width,
-                         GLsizei height) {
-    NOTIMPLEMENTED();
-  }
+                         GLsizei height);
   void TexStorage2D(TextureRef* texture_ref,
                     const TextureMetadata& texture_metadata,
                     GLint levels,
@@ -1024,8 +1024,11 @@
 
 Capabilities RasterDecoderImpl::GetCapabilities() {
   Capabilities caps;
-  caps.gpu_rasterization = true;
-  caps.supports_oop_raster = true;
+  caps.gpu_rasterization =
+      group_->gpu_feature_info()
+          .status_values[GPU_FEATURE_TYPE_GPU_RASTERIZATION] ==
+      kGpuFeatureStatusEnabled;
+  caps.supports_oop_raster = supports_oop_raster_;
   caps.texture_target_exception_list =
       group_->gpu_preferences().texture_target_exception_list;
   caps.texture_format_bgra8888 =
@@ -2106,6 +2109,74 @@
   group_->mailbox_manager()->ProduceTexture(mailbox, produced);
 }
 
+void RasterDecoderImpl::TexStorage2DImage(
+    TextureRef* texture_ref,
+    const TextureMetadata& texture_metadata,
+    GLsizei width,
+    GLsizei height) {
+  TRACE_EVENT2("gpu", "RasterDecoderImpl::TexStorage2DImage", "width", width,
+               "height", height);
+
+  gpu::gles2::Texture* texture = texture_ref->texture();
+  if (texture->IsImmutable()) {
+    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glTexStorage2DImage",
+                       "texture is immutable");
+    return;
+  }
+
+  gfx::BufferFormat buffer_format =
+      viz::BufferFormat(texture_metadata.format());
+  switch (buffer_format) {
+    case gfx::BufferFormat::RGBA_8888:
+    case gfx::BufferFormat::BGRA_8888:
+    case gfx::BufferFormat::RGBA_F16:
+    case gfx::BufferFormat::R_8:
+      break;
+    default:
+      LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, "glTexStorage2DImage",
+                         "Invalid buffer format");
+      return;
+  }
+  GLint untyped_format = viz::GLDataFormat(texture_metadata.format());
+
+  if (!GetContextGroup()->image_factory()) {
+    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glTexStorage2DImage",
+                       "Cannot create GL image");
+    return;
+  }
+
+  bool is_cleared = false;
+  scoped_refptr<gl::GLImage> image =
+      GetContextGroup()->image_factory()->CreateAnonymousImage(
+          gfx::Size(width, height), buffer_format, gfx::BufferUsage::SCANOUT,
+          untyped_format, &is_cleared);
+
+  ScopedTextureBinder binder(&state_, texture_manager(), texture_ref,
+                             texture_metadata.target());
+  if (!texture_manager()->ValidForTarget(texture_metadata.target(), 0, width,
+                                         height, 1)) {
+    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DImage",
+                       "dimensions out of range");
+    return;
+  }
+  if (!image || !image->BindTexImage(texture_metadata.target())) {
+    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glTexStorage2DImage",
+                       "Failed to create or bind GL Image");
+    return;
+  }
+
+  gfx::Rect cleared_rect;
+  if (is_cleared)
+    cleared_rect = gfx::Rect(width, height);
+
+  texture_manager()->SetLevelInfo(texture_ref, texture_metadata.target(), 0,
+                                  image->GetInternalFormat(), width, height, 1,
+                                  0, image->GetInternalFormat(),
+                                  GL_UNSIGNED_BYTE, cleared_rect);
+  texture_manager()->SetLevelImage(texture_ref, texture_metadata.target(), 0,
+                                   image.get(), gpu::gles2::Texture::BOUND);
+}
+
 void RasterDecoderImpl::TexStorage2D(TextureRef* texture_ref,
                                      const TextureMetadata& texture_metadata,
                                      GLint levels,
@@ -2532,6 +2603,7 @@
                                                        source_level)) {
       GLfloat transform_matrix[16];
       image->GetTextureMatrix(transform_matrix);
+
       copy_texture_chromium_->DoCopySubTextureWithTransform(
           this, source_target, source_texture->service_id(), source_level,
           source_internal_format, dest_target, dest_texture->service_id(),
diff --git a/gpu/command_buffer/service/service_utils.cc b/gpu/command_buffer/service/service_utils.cc
index 3e70650..a0591a36 100644
--- a/gpu/command_buffer/service/service_utils.cc
+++ b/gpu/command_buffer/service/service_utils.cc
@@ -146,8 +146,6 @@
       command_line->HasSwitch(switches::kGLShaderIntermOutput);
   gpu_preferences.emulate_shader_precision =
       command_line->HasSwitch(switches::kEmulateShaderPrecision);
-  gpu_preferences.enable_raster_decoder =
-      command_line->HasSwitch(switches::kEnableRasterDecoder);
   gpu_preferences.enable_gpu_service_logging =
       command_line->HasSwitch(switches::kEnableGPUServiceLogging);
   gpu_preferences.enable_gpu_service_tracing =
@@ -158,6 +156,8 @@
       command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds);
   gpu_preferences.ignore_gpu_blacklist =
       command_line->HasSwitch(switches::kIgnoreGpuBlacklist);
+  gpu_preferences.enable_oop_rasterization =
+      command_line->HasSwitch(switches::kEnableOOPRasterization);
   return gpu_preferences;
 }
 
diff --git a/gpu/config/gpu_switches.cc b/gpu/config/gpu_switches.cc
index 25fe20ad..68ba5773 100644
--- a/gpu/config/gpu_switches.cc
+++ b/gpu/config/gpu_switches.cc
@@ -23,9 +23,6 @@
 // would have been used.  Enables the chromium_raster_transport extension.
 const char kEnableOOPRasterization[] = "enable-oop-rasterization";
 
-// Use a dedicated RasterDecoder instead of generic GLES2Decoder.
-const char kEnableRasterDecoder[] = "enable-raster-decoder";
-
 // Passes encoded GpuPreferences to GPU process.
 const char kGpuPreferences[] = "gpu-preferences";
 
diff --git a/gpu/config/gpu_switches.h b/gpu/config/gpu_switches.h
index 77bdead9..b7117664 100644
--- a/gpu/config/gpu_switches.h
+++ b/gpu/config/gpu_switches.h
@@ -13,7 +13,6 @@
 GPU_EXPORT extern const char kDisableGpuRasterization[];
 GPU_EXPORT extern const char kEnableGpuRasterization[];
 GPU_EXPORT extern const char kEnableOOPRasterization[];
-GPU_EXPORT extern const char kEnableRasterDecoder[];
 GPU_EXPORT extern const char kGpuPreferences[];
 GPU_EXPORT extern const char kIgnoreGpuBlacklist[];
 GPU_EXPORT extern const char kGpuBlacklistTestGroup[];
diff --git a/gpu/ipc/BUILD.gn b/gpu/ipc/BUILD.gn
index 3abdcfd..63c018bb 100644
--- a/gpu/ipc/BUILD.gn
+++ b/gpu/ipc/BUILD.gn
@@ -36,6 +36,7 @@
     "//gpu/config",
     "//gpu/ipc/client",
     "//gpu/ipc/common:surface_handle_type",
+    "//gpu/ipc/host",
     "//gpu/ipc/service",
     "//gpu/skia_bindings:skia_bindings",
     "//ui/gfx",
diff --git a/gpu/ipc/client/raster_in_process_context_tests.cc b/gpu/ipc/client/raster_in_process_context_tests.cc
index 210557d1..982b20c 100644
--- a/gpu/ipc/client/raster_in_process_context_tests.cc
+++ b/gpu/ipc/client/raster_in_process_context_tests.cc
@@ -7,10 +7,13 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/viz/common/resources/resource_format.h"
+#include "components/viz/common/resources/resource_format_utils.h"
 #include "components/viz/test/test_gpu_memory_buffer_manager.h"
 #include "gpu/command_buffer/client/raster_implementation.h"
 #include "gpu/command_buffer/client/shared_memory_limits.h"
+#include "gpu/ipc/host/gpu_memory_buffer_support.h"
 #include "gpu/ipc/raster_in_process_context.h"
+#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/color_space.h"
 
@@ -23,23 +26,20 @@
 constexpr viz::ResourceFormat kResourceFormat = viz::RGBA_8888;
 constexpr gfx::Size kBufferSize(100, 100);
 
-class RasterInProcessCommandBufferTest : public ::testing::TestWithParam<bool> {
+class RasterInProcessCommandBufferTest : public ::testing::Test {
  public:
   std::unique_ptr<RasterInProcessContext> CreateRasterInProcessContext() {
     ContextCreationAttribs attributes;
-    attributes.enable_raster_interface = true;
     attributes.bind_generates_resource = false;
-
-    // TODO(backer): Remove this once RasterDecoder is the default
-    // implementation of RasterInterface.
-    attributes.enable_gles2_interface = !GetParam();
-    attributes.enable_raster_decoder = GetParam();
+    attributes.enable_oop_rasterization = true;
+    attributes.enable_gles2_interface = false;
+    attributes.enable_raster_interface = true;
 
     auto context = std::make_unique<RasterInProcessContext>();
     auto result = context->Initialize(
         /*service=*/nullptr, attributes, SharedMemoryLimits(),
         gpu_memory_buffer_manager_.get(),
-        /*image_factory=*/nullptr,
+        gpu_memory_buffer_factory_->AsImageFactory(),
         /*gpu_channel_manager_delegate=*/nullptr,
         base::ThreadTaskRunnerHandle::Get());
     DCHECK_EQ(result, ContextResult::kSuccess);
@@ -47,6 +47,7 @@
   }
 
   void SetUp() override {
+    gpu_memory_buffer_factory_ = GpuMemoryBufferFactory::CreateNativeType();
     gpu_memory_buffer_manager_ =
         std::make_unique<viz::TestGpuMemoryBufferManager>();
     context_ = CreateRasterInProcessContext();
@@ -56,19 +57,19 @@
   void TearDown() override {
     context_.reset();
     gpu_memory_buffer_manager_.reset();
+    gpu_memory_buffer_factory_.reset();
   }
 
  protected:
   raster::RasterInterface* ri_;  // not owned
+  std::unique_ptr<GpuMemoryBufferFactory> gpu_memory_buffer_factory_;
   std::unique_ptr<GpuMemoryBufferManager> gpu_memory_buffer_manager_;
-
- private:
   std::unique_ptr<RasterInProcessContext> context_;
 };
 
 }  // namespace
 
-TEST_P(RasterInProcessCommandBufferTest, CreateImage) {
+TEST_F(RasterInProcessCommandBufferTest, CreateImage) {
   // Calling CreateImageCHROMIUM() should allocate an image id.
   std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer1 =
       gpu_memory_buffer_manager_->CreateGpuMemoryBuffer(
@@ -95,7 +96,7 @@
   EXPECT_NE(image_id1, image_id2);
 }
 
-TEST_P(RasterInProcessCommandBufferTest, SetColorSpaceMetadata) {
+TEST_F(RasterInProcessCommandBufferTest, SetColorSpaceMetadata) {
   GLuint texture_id =
       ri_->CreateTexture(/*use_buffer=*/true, kBufferUsage, kResourceFormat);
 
@@ -115,6 +116,41 @@
   EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), ri_->GetError());
 }
 
-INSTANTIATE_TEST_CASE_P(P, RasterInProcessCommandBufferTest, ::testing::Bool());
+TEST_F(RasterInProcessCommandBufferTest, TexStorage2DImage) {
+  // Check for GPU and driver support
+  if (!context_->GetCapabilities().texture_storage_image) {
+    return;
+  }
+  std::vector<gfx::BufferUsageAndFormat> supported_formats =
+      CreateBufferUsageAndFormatExceptionList();
+  if (supported_formats.empty()) {
+    return;
+  }
+
+  // Find a supported_format with a matching resource_format.
+  bool found = false;
+  gfx::BufferUsageAndFormat supported_format = supported_formats[0];
+  viz::ResourceFormat resource_format = static_cast<viz::ResourceFormat>(0);
+  for (size_t i = 0; !found && i < supported_formats.size(); ++i) {
+    supported_format = supported_formats[i];
+    for (size_t j = 0; !found && j <= viz::RESOURCE_FORMAT_MAX; ++j) {
+      resource_format = static_cast<viz::ResourceFormat>(j);
+      if (supported_format.format == viz::BufferFormat(resource_format)) {
+        found = true;
+      }
+    }
+  }
+
+  if (!found) {
+    return;
+  }
+
+  // Create a buffer backed texture and allocate storage.
+  GLuint texture_id = ri_->CreateTexture(
+      /*use_buffer=*/true, supported_format.usage, resource_format);
+  ri_->TexStorage2D(texture_id, 1, kBufferSize.width(), kBufferSize.height());
+
+  EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), ri_->GetError());
+}
 
 }  // namespace gpu
diff --git a/gpu/ipc/common/gpu_command_buffer_traits_multi.h b/gpu/ipc/common/gpu_command_buffer_traits_multi.h
index 11f68b9..091b432 100644
--- a/gpu/ipc/common/gpu_command_buffer_traits_multi.h
+++ b/gpu/ipc/common/gpu_command_buffer_traits_multi.h
@@ -182,7 +182,6 @@
   IPC_STRUCT_TRAITS_MEMBER(color_space)
   IPC_STRUCT_TRAITS_MEMBER(enable_gles2_interface)
   IPC_STRUCT_TRAITS_MEMBER(enable_raster_interface)
-  IPC_STRUCT_TRAITS_MEMBER(enable_raster_decoder)
   IPC_STRUCT_TRAITS_MEMBER(enable_oop_rasterization)
   IPC_STRUCT_TRAITS_MEMBER(enable_swap_timestamps_if_supported)
 IPC_STRUCT_TRAITS_END()
diff --git a/gpu/ipc/common/gpu_preferences.mojom b/gpu/ipc/common/gpu_preferences.mojom
index c0cd876..094a341 100644
--- a/gpu/ipc/common/gpu_preferences.mojom
+++ b/gpu/ipc/common/gpu_preferences.mojom
@@ -51,7 +51,6 @@
   bool enable_threaded_texture_mailboxes;
   bool gl_shader_interm_output;
   bool emulate_shader_precision;
-  bool enable_raster_decoder;
   bool enable_gpu_service_logging;
   bool enable_gpu_service_tracing;
   bool use_passthrough_cmd_decoder;
@@ -60,4 +59,5 @@
 
   bool disable_gpu_driver_bug_workarounds;
   bool ignore_gpu_blacklist;
+  bool enable_oop_rasterization;
 };
diff --git a/gpu/ipc/common/gpu_preferences_struct_traits.h b/gpu/ipc/common/gpu_preferences_struct_traits.h
index cc43de1..721f756 100644
--- a/gpu/ipc/common/gpu_preferences_struct_traits.h
+++ b/gpu/ipc/common/gpu_preferences_struct_traits.h
@@ -5,6 +5,8 @@
 #ifndef GPU_IPC_COMMON_GPU_PREFERENCES_STRUCT_TRAITS_H_
 #define GPU_IPC_COMMON_GPU_PREFERENCES_STRUCT_TRAITS_H_
 
+#include <vector>
+
 #include "gpu/command_buffer/service/gpu_preferences.h"
 #include "gpu/ipc/common/gpu_preferences.mojom.h"
 #include "ui/gfx/mojo/buffer_types_struct_traits.h"
@@ -94,7 +96,6 @@
         prefs.enable_threaded_texture_mailboxes();
     out->gl_shader_interm_output = prefs.gl_shader_interm_output();
     out->emulate_shader_precision = prefs.emulate_shader_precision();
-    out->enable_raster_decoder = prefs.enable_raster_decoder();
     out->enable_gpu_service_logging = prefs.enable_gpu_service_logging();
     out->enable_gpu_service_tracing = prefs.enable_gpu_service_tracing();
     out->use_passthrough_cmd_decoder = prefs.use_passthrough_cmd_decoder();
@@ -114,6 +115,7 @@
     out->disable_gpu_driver_bug_workarounds =
         prefs.disable_gpu_driver_bug_workarounds();
     out->ignore_gpu_blacklist = prefs.ignore_gpu_blacklist();
+    out->enable_oop_rasterization = prefs.enable_oop_rasterization();
     return true;
   }
 
@@ -214,9 +216,6 @@
   static bool emulate_shader_precision(const gpu::GpuPreferences& prefs) {
     return prefs.emulate_shader_precision;
   }
-  static bool enable_raster_decoder(const gpu::GpuPreferences& prefs) {
-    return prefs.enable_raster_decoder;
-  }
   static bool enable_gpu_service_logging(const gpu::GpuPreferences& prefs) {
     return prefs.enable_gpu_service_logging;
   }
@@ -241,6 +240,9 @@
   static bool ignore_gpu_blacklist(const gpu::GpuPreferences& prefs) {
     return prefs.ignore_gpu_blacklist;
   }
+  static bool enable_oop_rasterization(const gpu::GpuPreferences& prefs) {
+    return prefs.enable_oop_rasterization;
+  }
 };
 
 }  // namespace mojo
diff --git a/gpu/ipc/common/gpu_preferences_util_unittest.cc b/gpu/ipc/common/gpu_preferences_util_unittest.cc
index 268d76b..d51a8f62 100644
--- a/gpu/ipc/common/gpu_preferences_util_unittest.cc
+++ b/gpu/ipc/common/gpu_preferences_util_unittest.cc
@@ -58,7 +58,6 @@
             right.enable_threaded_texture_mailboxes);
   EXPECT_EQ(left.gl_shader_interm_output, right.gl_shader_interm_output);
   EXPECT_EQ(left.emulate_shader_precision, right.emulate_shader_precision);
-  EXPECT_EQ(left.enable_raster_decoder, right.enable_raster_decoder);
   EXPECT_EQ(left.enable_gpu_service_logging, right.enable_gpu_service_logging);
   EXPECT_EQ(left.enable_gpu_service_tracing, right.enable_gpu_service_tracing);
   EXPECT_EQ(left.use_passthrough_cmd_decoder,
@@ -70,6 +69,7 @@
   EXPECT_EQ(left.disable_gpu_driver_bug_workarounds,
             right.disable_gpu_driver_bug_workarounds);
   EXPECT_EQ(left.ignore_gpu_blacklist, right.ignore_gpu_blacklist);
+  EXPECT_EQ(left.enable_oop_rasterization, right.enable_oop_rasterization);
 }
 
 }  // namespace
@@ -135,7 +135,6 @@
     GPU_PREFERENCES_FIELD(enable_threaded_texture_mailboxes, true)
     GPU_PREFERENCES_FIELD(gl_shader_interm_output, true)
     GPU_PREFERENCES_FIELD(emulate_shader_precision, true)
-    GPU_PREFERENCES_FIELD(enable_raster_decoder, true)
     GPU_PREFERENCES_FIELD(enable_gpu_service_logging, true)
     GPU_PREFERENCES_FIELD(enable_gpu_service_tracing, true)
     GPU_PREFERENCES_FIELD(use_passthrough_cmd_decoder, true)
@@ -143,6 +142,7 @@
                           true)
     GPU_PREFERENCES_FIELD(disable_gpu_driver_bug_workarounds, true)
     GPU_PREFERENCES_FIELD(ignore_gpu_blacklist, true)
+    GPU_PREFERENCES_FIELD(enable_oop_rasterization, true)
 
     input_prefs.texture_target_exception_list.emplace_back(
         gfx::BufferUsage::SCANOUT, gfx::BufferFormat::RGBA_8888);
diff --git a/gpu/ipc/host/gpu_memory_buffer_support.cc b/gpu/ipc/host/gpu_memory_buffer_support.cc
index 77fb17f..99775fc3 100644
--- a/gpu/ipc/host/gpu_memory_buffer_support.cc
+++ b/gpu/ipc/host/gpu_memory_buffer_support.cc
@@ -113,4 +113,21 @@
 #endif
 }
 
+std::vector<gfx::BufferUsageAndFormat>
+CreateBufferUsageAndFormatExceptionList() {
+  std::vector<gfx::BufferUsageAndFormat> usage_format_list;
+  for (int usage_idx = 0; usage_idx <= static_cast<int>(gfx::BufferUsage::LAST);
+       ++usage_idx) {
+    gfx::BufferUsage usage = static_cast<gfx::BufferUsage>(usage_idx);
+    for (int format_idx = 0;
+         format_idx <= static_cast<int>(gfx::BufferFormat::LAST);
+         ++format_idx) {
+      gfx::BufferFormat format = static_cast<gfx::BufferFormat>(format_idx);
+      if (gpu::GetImageNeedsPlatformSpecificTextureTarget(format, usage))
+        usage_format_list.push_back(gfx::BufferUsageAndFormat(usage, format));
+    }
+  }
+  return usage_format_list;
+}
+
 }  // namespace gpu
diff --git a/gpu/ipc/host/gpu_memory_buffer_support.h b/gpu/ipc/host/gpu_memory_buffer_support.h
index 5b479bca..8e177e8 100644
--- a/gpu/ipc/host/gpu_memory_buffer_support.h
+++ b/gpu/ipc/host/gpu_memory_buffer_support.h
@@ -5,6 +5,9 @@
 #ifndef GPU_IPC_HOST_GPU_MEMORY_BUFFER_SUPPORT_H_
 #define GPU_IPC_HOST_GPU_MEMORY_BUFFER_SUPPORT_H_
 
+#include <utility>
+#include <vector>
+
 #include "base/containers/hash_tables.h"
 #include "base/hash.h"
 #include "ui/gfx/buffer_types.h"
@@ -45,6 +48,11 @@
 bool GetImageNeedsPlatformSpecificTextureTarget(gfx::BufferFormat format,
                                                 gfx::BufferUsage usage);
 
+// Populate a list of buffer usage/format for which a per platform specific
+// texture target must be used instead of GL_TEXTURE_2D.
+std::vector<gfx::BufferUsageAndFormat>
+CreateBufferUsageAndFormatExceptionList();
+
 }  // namespace gpu
 
 #endif  // GPU_IPC_HOST_GPU_MEMORY_BUFFER_SUPPORT_H_
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc
index 6b46939..0268a30 100644
--- a/gpu/ipc/in_process_command_buffer.cc
+++ b/gpu/ipc/in_process_command_buffer.cc
@@ -49,7 +49,9 @@
 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
 #include "gpu/config/gpu_crash_keys.h"
 #include "gpu/config/gpu_feature_info.h"
+#include "gpu/config/gpu_switches.h"
 #include "gpu/ipc/gpu_in_process_thread_service.h"
+#include "gpu/ipc/host/gpu_memory_buffer_support.h"
 #include "gpu/ipc/service/gpu_channel_manager_delegate.h"
 #include "gpu/ipc/service/image_transport_surface.h"
 #include "ui/gfx/geometry/size.h"
@@ -105,9 +107,12 @@
       DCHECK(base::CommandLine::InitializedForCurrentProcess());
       const base::CommandLine* command_line =
           base::CommandLine::ForCurrentProcess();
+      GpuPreferences gpu_preferences = gles2::ParseGpuPreferences(command_line);
+      gpu_preferences.texture_target_exception_list =
+          CreateBufferUsageAndFormatExceptionList();
       gpu_thread_service_ = base::MakeRefCounted<GpuInProcessThreadService>(
           task_runner(), sync_point_manager_.get(), nullptr, nullptr,
-          gpu_feature_info_, gles2::ParseGpuPreferences(command_line));
+          gpu_feature_info_, gpu_preferences);
     }
     return gpu_thread_service_;
   }
@@ -323,7 +328,7 @@
         service_->shader_translator_cache(),
         service_->framebuffer_completeness_cache(), feature_info,
         params.attribs.bind_generates_resource, service_->image_manager(),
-        nullptr /* image_factory */, nullptr /* progress_reporter */,
+        params.image_factory, nullptr /* progress_reporter */,
         service_->gpu_feature_info(), service_->discardable_manager());
   }
 
@@ -346,7 +351,11 @@
   command_buffer_ = std::make_unique<CommandBufferService>(
       this, transfer_buffer_manager_.get());
 
-  if (params.attribs.enable_raster_decoder &&
+  // Check gpu_preferences() as well as attribs.enable_oop_rasterization to
+  // prevent compromised renderer from unilaterally enabling RasterDecoder until
+  // we have fuzzed it (https://crbug.com/829469).
+  if (service_->gpu_preferences().enable_oop_rasterization &&
+      params.attribs.enable_oop_rasterization &&
       params.attribs.enable_raster_interface &&
       !params.attribs.enable_gles2_interface) {
     decoder_.reset(raster::RasterDecoder::Create(this, command_buffer_.get(),
diff --git a/gpu/ipc/raster_in_process_context.cc b/gpu/ipc/raster_in_process_context.cc
index ed4d78f..85041416 100644
--- a/gpu/ipc/raster_in_process_context.cc
+++ b/gpu/ipc/raster_in_process_context.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/command_line.h"
 #include "base/logging.h"
 #include "gpu/command_buffer/client/gles2_cmd_helper.h"
 #include "gpu/command_buffer/client/raster_cmd_helper.h"
@@ -17,6 +18,7 @@
 #include "gpu/command_buffer/common/constants.h"
 #include "gpu/command_buffer/common/context_creation_attribs.h"
 #include "gpu/config/gpu_feature_info.h"
+#include "gpu/config/gpu_switches.h"
 #include "gpu/ipc/common/surface_handle.h"
 #include "gpu/skia_bindings/gles2_implementation_with_grcontext_support.h"
 
@@ -57,6 +59,16 @@
     return ContextResult::kFatalFailure;
   }
 
+  // TODO(backer): Remove this. Currently used to set
+  // |chromium_raster_transport| features flag (https://crbug.com/786591) and
+  // enable_oop_rasterization in GpuPreferences (https://crbug.com/829469).
+  if (attribs.enable_oop_rasterization &&
+      !base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableOOPRasterization)) {
+    base::CommandLine::ForCurrentProcess()->AppendSwitch(
+        switches::kEnableOOPRasterization);
+  }
+
   command_buffer_ = std::make_unique<InProcessCommandBuffer>(service);
   auto result = command_buffer_->Initialize(
       nullptr /* surface */, true /* is_offscreen */, kNullSurfaceHandle,
@@ -94,7 +106,11 @@
         gles2_implementation_->command_buffer(), GetCapabilities());
     helper_ = std::move(gles2_helper);
   } else {
-    DCHECK(attribs.enable_raster_decoder);
+    // TODO(https://crbug.com/829469): Remove check once we fuzz RasterDecoder.
+    // enable_oop_rasterization is currently necessary to create RasterDecoder
+    // in InProcessCommandBuffer.
+    DCHECK(attribs.enable_oop_rasterization);
+
     // Create the RasterCmdHelper, which writes the command buffer protocol.
     auto raster_helper =
         std::make_unique<raster::RasterCmdHelper>(command_buffer_.get());
diff --git a/gpu/ipc/service/gpu_channel.cc b/gpu/ipc/service/gpu_channel.cc
index c7044e2..fcf39fb 100644
--- a/gpu/ipc/service/gpu_channel.cc
+++ b/gpu/ipc/service/gpu_channel.cc
@@ -613,10 +613,12 @@
   }
 
   std::unique_ptr<CommandBufferStub> stub;
-  // Check gpu_preferences() as well as attribs.enable_raster_decoder to prevent
-  // compromised renderer from unilaterally enabling RasterDecoder.
-  if (gpu_channel_manager_->gpu_preferences().enable_raster_decoder &&
-      init_params.attribs.enable_raster_decoder &&
+
+  // Check gpu_preferences() as well as attribs.enable_oop_rasterization to
+  // preventcompromised renderer from unilaterally enabling RasterDecoder until
+  // we have fuzzed it (https://crbug.com/829469).
+  if (gpu_channel_manager_->gpu_preferences().enable_oop_rasterization &&
+      init_params.attribs.enable_oop_rasterization &&
       init_params.attribs.enable_raster_interface &&
       !init_params.attribs.enable_gles2_interface) {
     stub = std::make_unique<RasterCommandBufferStub>(
diff --git a/headless/lib/browser/headless_browser_impl.cc b/headless/lib/browser/headless_browser_impl.cc
index f1c26d6..68a04dc 100644
--- a/headless/lib/browser/headless_browser_impl.cc
+++ b/headless/lib/browser/headless_browser_impl.cc
@@ -260,16 +260,9 @@
   return agent_host_ ? this : nullptr;
 }
 
-bool HeadlessBrowserImpl::AttachClient(HeadlessDevToolsClient* client) {
+void HeadlessBrowserImpl::AttachClient(HeadlessDevToolsClient* client) {
   DCHECK(agent_host_);
-  return HeadlessDevToolsClientImpl::From(client)->AttachToHost(
-      agent_host_.get());
-}
-
-void HeadlessBrowserImpl::ForceAttachClient(HeadlessDevToolsClient* client) {
-  DCHECK(agent_host_);
-  HeadlessDevToolsClientImpl::From(client)->ForceAttachToHost(
-      agent_host_.get());
+  HeadlessDevToolsClientImpl::From(client)->AttachToHost(agent_host_.get());
 }
 
 void HeadlessBrowserImpl::DetachClient(HeadlessDevToolsClient* client) {
diff --git a/headless/lib/browser/headless_browser_impl.h b/headless/lib/browser/headless_browser_impl.h
index c1fc116..78251ca 100644
--- a/headless/lib/browser/headless_browser_impl.h
+++ b/headless/lib/browser/headless_browser_impl.h
@@ -63,8 +63,7 @@
   HeadlessDevToolsTarget* GetDevToolsTarget() override;
 
   // HeadlessDevToolsTarget implementation:
-  bool AttachClient(HeadlessDevToolsClient* client) override;
-  void ForceAttachClient(HeadlessDevToolsClient* client) override;
+  void AttachClient(HeadlessDevToolsClient* client) override;
   void DetachClient(HeadlessDevToolsClient* client) override;
   bool IsAttached() override;
 
diff --git a/headless/lib/browser/headless_devtools_client_impl.cc b/headless/lib/browser/headless_devtools_client_impl.cc
index 9248d1f..66ff3f3 100644
--- a/headless/lib/browser/headless_devtools_client_impl.cc
+++ b/headless/lib/browser/headless_devtools_client_impl.cc
@@ -74,21 +74,11 @@
 
 HeadlessDevToolsClientImpl::~HeadlessDevToolsClientImpl() = default;
 
-bool HeadlessDevToolsClientImpl::AttachToHost(
+void HeadlessDevToolsClientImpl::AttachToHost(
     content::DevToolsAgentHost* agent_host) {
   DCHECK(!agent_host_);
-  if (agent_host->IsAttached())
-    return false;
   agent_host->AttachClient(this);
   agent_host_ = agent_host;
-  return true;
-}
-
-void HeadlessDevToolsClientImpl::ForceAttachToHost(
-    content::DevToolsAgentHost* agent_host) {
-  DCHECK(!agent_host_);
-  agent_host_ = agent_host;
-  agent_host_->ForceAttachClient(this);
 }
 
 void HeadlessDevToolsClientImpl::DetachFromHost(
diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc
index 09fd7e47c..c447659 100644
--- a/headless/lib/browser/headless_web_contents_impl.cc
+++ b/headless/lib/browser/headless_web_contents_impl.cc
@@ -514,15 +514,8 @@
   return web_contents()->GetMainFrame()->IsRenderFrameLive() ? this : nullptr;
 }
 
-bool HeadlessWebContentsImpl::AttachClient(HeadlessDevToolsClient* client) {
-  return HeadlessDevToolsClientImpl::From(client)->AttachToHost(
-      agent_host_.get());
-}
-
-void HeadlessWebContentsImpl::ForceAttachClient(
-    HeadlessDevToolsClient* client) {
-  HeadlessDevToolsClientImpl::From(client)->ForceAttachToHost(
-      agent_host_.get());
+void HeadlessWebContentsImpl::AttachClient(HeadlessDevToolsClient* client) {
+  HeadlessDevToolsClientImpl::From(client)->AttachToHost(agent_host_.get());
 }
 
 void HeadlessWebContentsImpl::DetachClient(HeadlessDevToolsClient* client) {
diff --git a/headless/lib/browser/headless_web_contents_impl.h b/headless/lib/browser/headless_web_contents_impl.h
index 7d61b5bd..19ea985c 100644
--- a/headless/lib/browser/headless_web_contents_impl.h
+++ b/headless/lib/browser/headless_web_contents_impl.h
@@ -71,8 +71,7 @@
   std::string GetMainFrameDevToolsId() const override;
 
   // HeadlessDevToolsTarget implementation:
-  bool AttachClient(HeadlessDevToolsClient* client) override;
-  void ForceAttachClient(HeadlessDevToolsClient* client) override;
+  void AttachClient(HeadlessDevToolsClient* client) override;
   void DetachClient(HeadlessDevToolsClient* client) override;
   bool IsAttached() override;
 
diff --git a/headless/lib/headless_devtools_client_browsertest.cc b/headless/lib/headless_devtools_client_browsertest.cc
index 4f5f3b3d..9cd9553 100644
--- a/headless/lib/headless_devtools_client_browsertest.cc
+++ b/headless/lib/headless_devtools_client_browsertest.cc
@@ -945,13 +945,11 @@
     HeadlessDevToolsTarget* devtools_target =
         web_contents_->GetDevToolsTarget();
 
-    // Try attaching: there's already a client attached.
-    EXPECT_FALSE(devtools_target->AttachClient(other_devtools_client_.get()));
     EXPECT_TRUE(devtools_target->IsAttached());
     // Detach the existing client, attach the other client.
     devtools_target->DetachClient(devtools_client_.get());
     EXPECT_FALSE(devtools_target->IsAttached());
-    EXPECT_TRUE(devtools_target->AttachClient(other_devtools_client_.get()));
+    devtools_target->AttachClient(other_devtools_client_.get());
     EXPECT_TRUE(devtools_target->IsAttached());
 
     // Now, let's make sure this devtools client works.
@@ -968,9 +966,10 @@
     HeadlessDevToolsTarget* devtools_target =
         web_contents_->GetDevToolsTarget();
 
-    // Try attach, then force-attach the original client.
-    EXPECT_FALSE(devtools_target->AttachClient(devtools_client_.get()));
-    devtools_target->ForceAttachClient(devtools_client_.get());
+    EXPECT_TRUE(devtools_target->IsAttached());
+    devtools_target->DetachClient(other_devtools_client_.get());
+    EXPECT_FALSE(devtools_target->IsAttached());
+    devtools_target->AttachClient(devtools_client_.get());
     EXPECT_TRUE(devtools_target->IsAttached());
 
     devtools_client_->GetRuntime()->Evaluate(
diff --git a/headless/public/headless_devtools_target.h b/headless/public/headless_devtools_target.h
index e8047f3..ce94aef8 100644
--- a/headless/public/headless_devtools_target.h
+++ b/headless/public/headless_devtools_target.h
@@ -20,16 +20,9 @@
   // Attach or detach a client to this target. A client must be attached in
   // order to send commands or receive notifications from the target.
   //
-  // A single client may be attached to at most one target at a time. If
-  // the target already has a client attached, AttachClient will return false.
-  // ForceAttachClient will detach any existing connection before attaching
-  // |client|.
-  // Note that currently also only one client may be attached to a single target
-  // at a time.
-  //
+  // A single client may be attached to at most one target at a time.
   // |client| must outlive this target.
-  virtual bool AttachClient(HeadlessDevToolsClient* client) = 0;
-  virtual void ForceAttachClient(HeadlessDevToolsClient* client) = 0;
+  virtual void AttachClient(HeadlessDevToolsClient* client) = 0;
   virtual void DetachClient(HeadlessDevToolsClient* client) = 0;
 
   // Returns true if a devtools client is attached.
diff --git a/headless/public/internal/headless_devtools_client_impl.h b/headless/public/internal/headless_devtools_client_impl.h
index b5108550..ade16fb7 100644
--- a/headless/public/internal/headless_devtools_client_impl.h
+++ b/headless/public/internal/headless_devtools_client_impl.h
@@ -124,8 +124,7 @@
       const char* method,
       base::RepeatingCallback<void(const base::Value&)> callback) override;
 
-  bool AttachToHost(content::DevToolsAgentHost* agent_host);
-  void ForceAttachToHost(content::DevToolsAgentHost* agent_host);
+  void AttachToHost(content::DevToolsAgentHost* agent_host);
   void DetachFromHost(content::DevToolsAgentHost* agent_host);
 
   void SetTaskRunnerForTests(
diff --git a/headless/public/util/compositor_controller_unittest.cc b/headless/public/util/compositor_controller_unittest.cc
index 4307f59..e4b2bb4 100644
--- a/headless/public/util/compositor_controller_unittest.cc
+++ b/headless/public/util/compositor_controller_unittest.cc
@@ -53,7 +53,6 @@
     client_.SetTaskRunnerForTests(task_runner_);
     mock_host_ = base::MakeRefCounted<MockDevToolsAgentHost>();
 
-    EXPECT_CALL(*mock_host_, IsAttached()).WillOnce(Return(false));
     EXPECT_CALL(*mock_host_, AttachClient(&client_));
     client_.AttachToHost(mock_host_.get());
     virtual_time_controller_ =
diff --git a/headless/public/util/testing/mock_devtools_agent_host.h b/headless/public/util/testing/mock_devtools_agent_host.h
index 3ce76f2..e30fce7a 100644
--- a/headless/public/util/testing/mock_devtools_agent_host.h
+++ b/headless/public/util/testing/mock_devtools_agent_host.h
@@ -19,8 +19,6 @@
   MOCK_METHOD1(AttachClient, void(content::DevToolsAgentHostClient* client));
   MOCK_METHOD1(AttachRestrictedClient,
                bool(content::DevToolsAgentHostClient* client));
-  MOCK_METHOD1(ForceAttachClient,
-               void(content::DevToolsAgentHostClient* client));
   MOCK_METHOD1(DetachClient, bool(content::DevToolsAgentHostClient* client));
   MOCK_METHOD2(DispatchProtocolMessage,
                bool(content::DevToolsAgentHostClient* client,
diff --git a/headless/public/util/virtual_time_controller_test.cc b/headless/public/util/virtual_time_controller_test.cc
index 6f4eac7..0ac4301 100644
--- a/headless/public/util/virtual_time_controller_test.cc
+++ b/headless/public/util/virtual_time_controller_test.cc
@@ -30,7 +30,6 @@
     client_.SetTaskRunnerForTests(task_runner_);
     mock_host_ = base::MakeRefCounted<MockDevToolsAgentHost>();
 
-    EXPECT_CALL(*mock_host_, IsAttached()).WillOnce(Return(false));
     EXPECT_CALL(*mock_host_, AttachClient(&client_));
     client_.AttachToHost(mock_host_.get());
     controller_ = std::make_unique<VirtualTimeController>(&client_, 0);
diff --git a/infra/config/global/luci-milo-dev.cfg b/infra/config/global/luci-milo-dev.cfg
index ec2539c..5f64bd5 100644
--- a/infra/config/global/luci-milo-dev.cfg
+++ b/infra/config/global/luci-milo-dev.cfg
@@ -2913,6 +2913,14 @@
     category: "android"
   }
   builders: {
+    name: "buildbot/chromium.perf.fyi/android-pixel2-perf"
+    category: "android"
+  }
+  builders: {
+    name: "buildbot/chromium.perf.fyi/android-pixel2_webview-perf"
+    category: "android"
+  }
+  builders: {
     name: "buildbot/chromium.perf.fyi/Mojo Linux Perf"
     category: "linux"
   }
@@ -2925,10 +2933,6 @@
     category: "linux"
   }
   builders: {
-    name: "buildbot/chromium.perf.fyi/Mac 10.12 Laptop Low End"
-    category: "mac"
-  }
-  builders: {
     name: "buildbot/chromium.perf.fyi/Mac 10.13 Laptop High End"
     category: "mac"
   }
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg
index 289b898..775f1ab 100644
--- a/infra/config/global/luci-milo.cfg
+++ b/infra/config/global/luci-milo.cfg
@@ -3328,6 +3328,14 @@
     category: "android"
   }
   builders: {
+    name: "buildbot/chromium.perf.fyi/android-pixel2-perf"
+    category: "android"
+  }
+  builders: {
+    name: "buildbot/chromium.perf.fyi/android-pixel2_webview-perf"
+    category: "android"
+  }
+  builders: {
     name: "buildbot/chromium.perf.fyi/Mojo Linux Perf"
     category: "linux"
   }
@@ -3340,10 +3348,6 @@
     category: "linux"
   }
   builders: {
-    name: "buildbot/chromium.perf.fyi/Mac 10.12 Laptop Low End"
-    category: "mac"
-  }
-  builders: {
     name: "buildbot/chromium.perf.fyi/Mac 10.13 Laptop High End"
     category: "mac"
   }
diff --git a/ios/build/bots/chromium.fyi/ios-webview.json b/ios/build/bots/chromium.fyi/ios-webview.json
index d060d4e..32c14d1 100644
--- a/ios/build/bots/chromium.fyi/ios-webview.json
+++ b/ios/build/bots/chromium.fyi/ios-webview.json
@@ -1,11 +1,10 @@
 {
   "comments": [
-    "Run web_view tests for 64-bit iOS 9.0 simulators on FYI ios-webview."
+    "Run web_view tests for 64-bit iOS 10.0 simulators on FYI ios-webview."
   ],
   "xcode build version": "9C40b",
   "gn_args": [
     "goma_dir=\"$(goma_dir)\"",
-    "ios_deployment_target=\"9.0\"",
     "is_component_build=false",
     "is_debug=true",
     "symbol_level=1",
@@ -13,54 +12,109 @@
     "target_os=\"ios\"",
     "use_goma=true"
   ],
-  "configuration": "Debug",
-  "sdk": "iphonesimulator11.0",
   "tests": [
     {
       "app": "ios_web_view_unittests",
       "device type": "iPhone 5s",
-      "os": "9.3"
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "comments": [
+        "Xcode 8.0 requires Mac-10.11.5+ and we still have 10.10 bots"
+      ],
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     },
     {
       "app": "ios_web_view_inttests",
       "device type": "iPhone 5s",
-      "os": "9.3"
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     },
     {
       "app": "ios_components_unittests",
       "device type": "iPhone 5s",
-      "os": "9.3"
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     },
     {
       "app": "components_unittests",
       "device type": "iPhone 5s",
-      "os": "9.3"
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     },
     {
       "app": "net_unittests",
       "device type": "iPhone 5s",
-      "os": "9.3"
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     },
     {
       "app": "ios_net_unittests",
       "device type": "iPhone 5s",
-      "os": "9.3"
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     },
     {
       "app": "ios_web_unittests",
       "device type": "iPhone 5s",
-      "os": "9.3"
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     },
     {
       "app": "ios_web_inttests",
       "device type": "iPhone 5s",
-      "os": "9.3"
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     },
     {
       "app": "ios_web_shell_egtests",
+      "xctest": true,
       "device type": "iPhone 5s",
-      "os": "9.3",
-      "xctest": true
+      "os": "10.0",
+      "xcode build version": "8A218a",
+      "dimensions": [
+        { "os": "Mac-10.11.6", "pool": "Chrome" },
+        { "os": "Mac-10.12", "pool": "Chrome" },
+        { "os": "Mac-10.13", "pool": "Chrome" }
+      ]
     }
   ]
 }
diff --git a/ios/chrome/browser/ui/history/history_table_view_controller.h b/ios/chrome/browser/ui/history/history_table_view_controller.h
index a9211e7..8fa4ebb9 100644
--- a/ios/chrome/browser/ui/history/history_table_view_controller.h
+++ b/ios/chrome/browser/ui/history/history_table_view_controller.h
@@ -29,6 +29,13 @@
 // Delegate for this HistoryTableView.
 @property(nonatomic, weak) id<HistoryLocalCommands> localDispatcher;
 
+// Initializers.
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
+                           appBarStyle:
+                               (ChromeTableViewControllerStyle)appBarStyle
+    NS_UNAVAILABLE;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_HISTORY_HISTORY_TABLE_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/history/history_table_view_controller.mm b/ios/chrome/browser/ui/history/history_table_view_controller.mm
index 615c924..d687ea3 100644
--- a/ios/chrome/browser/ui/history/history_table_view_controller.mm
+++ b/ios/chrome/browser/ui/history/history_table_view_controller.mm
@@ -110,6 +110,11 @@
 
 #pragma mark - ViewController Lifecycle.
 
+- (instancetype)init {
+  return [super initWithTableViewStyle:UITableViewStylePlain
+                           appBarStyle:ChromeTableViewControllerStyleNoAppBar];
+}
+
 - (void)viewDidLoad {
   [super viewDidLoad];
   [self loadModel];
@@ -474,6 +479,8 @@
 #pragma mark - UIScrollViewDelegate
 
 - (void)scrollViewDidScroll:(UIScrollView*)scrollView {
+  [super scrollViewDidScroll:scrollView];
+
   if (self.hasFinishedLoading)
     return;
 
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
index bafc8c7..8ba254c 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
@@ -161,8 +161,7 @@
   self.requestStartTime = [NSDate timeIntervalSinceReferenceDate];
 
   PopupMenuTableViewController* tableViewController =
-      [[PopupMenuTableViewController alloc]
-          initWithStyle:UITableViewStyleGrouped];
+      [[PopupMenuTableViewController alloc] init];
   tableViewController.dispatcher =
       static_cast<id<ApplicationCommands, BrowserCommands>>(self.dispatcher);
   tableViewController.baseViewController = self.baseViewController;
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.h b/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.h
index 304279a8..7b641b7 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.h
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.h
@@ -27,6 +27,13 @@
 // result of an interaction with the popup.
 @property(nonatomic, weak) UIViewController* baseViewController;
 
+// Initializers.
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
+                           appBarStyle:
+                               (ChromeTableViewControllerStyle)appBarStyle
+    NS_UNAVAILABLE;
+
 // Sets the |items| to be displayed by this Table View. Removes all the
 // currently presented items.
 - (void)setPopupMenuItems:
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.mm
index 681f851..9c86081 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller.mm
@@ -33,6 +33,11 @@
 @synthesize commandHandler = _commandHandler;
 @synthesize dispatcher = _dispatcher;
 
+- (instancetype)init {
+  return [super initWithTableViewStyle:UITableViewStyleGrouped
+                           appBarStyle:ChromeTableViewControllerStyleNoAppBar];
+}
+
 #pragma mark - UIViewController
 
 - (void)viewDidLoad {
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h
index fafceb3..3aa9274 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.h
@@ -34,6 +34,13 @@
 @property(nonatomic, weak) id<RecentTabsHandsetViewControllerCommand>
     handsetCommandHandler;
 
+// Initializers.
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
+                           appBarStyle:
+                               (ChromeTableViewControllerStyle)appBarStyle
+    NS_UNAVAILABLE;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_RECENT_TABS_RECENT_TABS_TABLE_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
index 29c6d60..3599ef54 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -119,7 +119,8 @@
 #pragma mark - Public Interface
 
 - (instancetype)init {
-  self = [super initWithStyle:UITableViewStylePlain];
+  self = [super initWithTableViewStyle:UITableViewStylePlain
+                           appBarStyle:ChromeTableViewControllerStyleNoAppBar];
   if (self) {
     _sessionState = SessionsSyncUserState::USER_SIGNED_OUT;
     _syncedSessions.reset(new synced_sessions::SyncedSessions());
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.h b/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.h
index b6de32c..93c446a6 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.h
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.h
@@ -11,6 +11,13 @@
 // cookies, caches, passwords, and autofill).
 @interface ClearBrowsingDataTableViewController : ChromeTableViewController
 
+// Initializers.
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
+                           appBarStyle:
+                               (ChromeTableViewControllerStyle)appBarStyle
+    NS_UNAVAILABLE;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_HISTORY_CLEAR_BROWSING_DATA_TABLE_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.mm
index b60d194..6ec1dad 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.mm
@@ -15,6 +15,11 @@
 
 #pragma mark - ViewController Lifecycle.
 
+- (instancetype)init {
+  return [super initWithTableViewStyle:UITableViewStylePlain
+                           appBarStyle:ChromeTableViewControllerStyleNoAppBar];
+}
+
 - (void)viewDidLoad {
   // TableView configuration
   self.tableView.estimatedRowHeight = 56;
diff --git a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.h b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.h
index ad156e60..a727a92 100644
--- a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.h
+++ b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.h
@@ -15,39 +15,6 @@
 // AppBar.
 @interface SettingsRootTableViewController
     : ChromeTableViewController<AppBarPresenting>
-
-- (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER;
-- (instancetype)initWithNibName:(NSString*)name
-                         bundle:(NSBundle*)bundle NS_UNAVAILABLE;
-- (instancetype)initWithCoder:(NSCoder*)decoder NS_UNAVAILABLE;
-
-#pragma mark UIScrollViewDelegate
-
-// Updates the MDCFlexibleHeader with changes to the table view scroll
-// state. Must be called by subclasses if they override this method in order to
-// maintain this functionality.
-- (void)scrollViewDidScroll:(UIScrollView*)scrollView NS_REQUIRES_SUPER;
-
-// Updates the MDCFlexibleHeader with changes to the table view scroll
-// state. Must be called by subclasses if they override this method in order to
-// maintain this functionality.
-- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView
-                  willDecelerate:(BOOL)decelerate NS_REQUIRES_SUPER;
-
-// Updates the MDCFlexibleHeader with changes to the table view scroll
-// state. Must be called by subclasses if they override this method in order to
-// maintain this functionality.
-- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
-    NS_REQUIRES_SUPER;
-
-// Updates the MDCFlexibleHeader with changes to the table view scroll
-// state. Must be called by subclasses if they override this method in order to
-// maintain this functionality.
-- (void)scrollViewWillEndDragging:(UIScrollView*)scrollView
-                     withVelocity:(CGPoint)velocity
-              targetContentOffset:(inout CGPoint*)targetContentOffset
-    NS_REQUIRES_SUPER;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_SETTINGS_SETTINGS_ROOT_TABLE_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
index 81bbb557..cdbcc13 100644
--- a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
@@ -13,37 +13,7 @@
 #error "This file requires ARC support."
 #endif
 
-@interface SettingsRootTableViewController ()
-
-// The AppBar for this view controller.
-@property(nonatomic, readwrite, strong) MDCAppBar* appBar;
-
-@end
-
 @implementation SettingsRootTableViewController
-@synthesize appBar = _appBar;
-
-- (instancetype)initWithStyle:(UITableViewStyle)style {
-  if ((self = [super initWithStyle:style])) {
-    // Configure the AppBar.
-    _appBar = [[MDCAppBar alloc] init];
-    [self addChildViewController:_appBar.headerViewController];
-  }
-  return self;
-}
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-
-  // Configure the app bar.  This cannot be in a shared base class because
-  // UITableViewControllers normally do not use MDC styling, but this one does
-  // in order to match the other Settings screens.
-  ConfigureAppBarWithCardStyle(self.appBar);
-  self.appBar.headerViewController.headerView.trackingScrollView =
-      self.tableView;
-  // Add the AppBar's views after all other views have been registered.
-  [self.appBar addSubviewsToParent];
-}
 
 - (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
@@ -56,51 +26,4 @@
   self.navigationItem.rightBarButtonItem = doneButton;
 }
 
-- (UIViewController*)childViewControllerForStatusBarHidden {
-  return self.appBar.headerViewController;
-}
-
-- (UIViewController*)childViewControllerForStatusBarStyle {
-  return self.appBar.headerViewController;
-}
-
-#pragma mark UIScrollViewDelegate
-
-- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
-  MDCFlexibleHeaderView* headerView =
-      self.appBar.headerViewController.headerView;
-  if (scrollView == headerView.trackingScrollView) {
-    [headerView trackingScrollViewDidScroll];
-  }
-}
-
-- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView {
-  MDCFlexibleHeaderView* headerView =
-      self.appBar.headerViewController.headerView;
-  if (scrollView == headerView.trackingScrollView) {
-    [headerView trackingScrollViewDidEndDecelerating];
-  }
-}
-
-- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView
-                  willDecelerate:(BOOL)decelerate {
-  MDCFlexibleHeaderView* headerView =
-      self.appBar.headerViewController.headerView;
-  if (scrollView == headerView.trackingScrollView) {
-    [headerView trackingScrollViewDidEndDraggingWillDecelerate:decelerate];
-  }
-}
-
-- (void)scrollViewWillEndDragging:(UIScrollView*)scrollView
-                     withVelocity:(CGPoint)velocity
-              targetContentOffset:(inout CGPoint*)targetContentOffset {
-  MDCFlexibleHeaderView* headerView =
-      self.appBar.headerViewController.headerView;
-  if (scrollView == headerView.trackingScrollView) {
-    [headerView
-        trackingScrollViewWillEndDraggingWithVelocity:velocity
-                                  targetContentOffset:targetContentOffset];
-  }
-}
-
 @end
diff --git a/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.h b/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.h
index e65254a..db0ff1e7 100644
--- a/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.h
+++ b/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.h
@@ -15,8 +15,10 @@
 @interface TableCellCatalogViewController : SettingsRootTableViewController
 
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
+- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
+                           appBarStyle:
+                               (ChromeTableViewControllerStyle)appBarStyle
+    NS_UNAVAILABLE;
 
 @end
 
diff --git a/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.mm b/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.mm
index 3e8755b..c35eebf 100644
--- a/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.mm
@@ -33,7 +33,9 @@
 @implementation TableCellCatalogViewController
 
 - (instancetype)init {
-  if ((self = [super initWithStyle:UITableViewStyleGrouped])) {
+  if ((self = [super
+           initWithTableViewStyle:UITableViewStyleGrouped
+                      appBarStyle:ChromeTableViewControllerStyleWithAppBar])) {
   }
   return self;
 }
diff --git a/ios/chrome/browser/ui/table_view/BUILD.gn b/ios/chrome/browser/ui/table_view/BUILD.gn
index 19afaa3..7ab4b348 100644
--- a/ios/chrome/browser/ui/table_view/BUILD.gn
+++ b/ios/chrome/browser/ui/table_view/BUILD.gn
@@ -18,6 +18,8 @@
     ":styler",
     "//base",
     "//ios/chrome/browser/ui/list_model",
+    "//ios/chrome/browser/ui/material_components",
+    "//ios/third_party/material_components_ios",
   ]
   public_deps = [
     "//ios/chrome/browser/ui/table_view/cells",
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.h b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.h
index 3a74b0ac..98e16dff 100644
--- a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.h
+++ b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.h
@@ -7,13 +7,19 @@
 
 #import <UIKit/UIKit.h>
 
+#import "ios/chrome/browser/ui/material_components/app_bar_presenting.h"
 #import "ios/chrome/browser/ui/table_view/table_view_model.h"
 
 @class ChromeTableViewStyler;
 @class TableViewItem;
 
+typedef NS_ENUM(NSInteger, ChromeTableViewControllerStyle) {
+  ChromeTableViewControllerStyleNoAppBar,
+  ChromeTableViewControllerStyleWithAppBar,
+};
+
 // Chrome-specific TableViewController.
-@interface ChromeTableViewController : UITableViewController
+@interface ChromeTableViewController : UITableViewController<AppBarPresenting>
 
 // The model of this controller.
 @property(nonatomic, readonly, strong)
@@ -25,10 +31,15 @@
 @property(nonatomic, readonly, strong) ChromeTableViewStyler* styler;
 
 // Initializers.
-- (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
+                           appBarStyle:
+                               (ChromeTableViewControllerStyle)appBarStyle
+    NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
 - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
 - (instancetype)initWithNibName:(NSString*)nibNameOrNil
                          bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE;
+- (instancetype)init NS_UNAVAILABLE;
 
 // Initializes the collection view model. Must be called by subclasses if they
 // override this method in order to get a clean tableViewModel.
@@ -38,6 +49,33 @@
 // |configureCell:| on each cell.
 - (void)reconfigureCellsForItems:(NSArray*)items;
 
+#pragma mark UIScrollViewDelegate
+
+// Updates the MDCFlexibleHeader with changes to the table view scroll
+// state. Must be called by subclasses if they override this method in order to
+// maintain this functionality.
+- (void)scrollViewDidScroll:(UIScrollView*)scrollView NS_REQUIRES_SUPER;
+
+// Updates the MDCFlexibleHeader with changes to the table view scroll
+// state. Must be called by subclasses if they override this method in order to
+// maintain this functionality.
+- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView
+                  willDecelerate:(BOOL)decelerate NS_REQUIRES_SUPER;
+
+// Updates the MDCFlexibleHeader with changes to the table view scroll
+// state. Must be called by subclasses if they override this method in order to
+// maintain this functionality.
+- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
+    NS_REQUIRES_SUPER;
+
+// Updates the MDCFlexibleHeader with changes to the table view scroll
+// state. Must be called by subclasses if they override this method in order to
+// maintain this functionality.
+- (void)scrollViewWillEndDragging:(UIScrollView*)scrollView
+                     withVelocity:(CGPoint)velocity
+              targetContentOffset:(inout CGPoint*)targetContentOffset
+    NS_REQUIRES_SUPER;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_TABLE_VIEW_CHROME_TABLE_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm
index 865c81d..40406f2 100644
--- a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm
+++ b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm
@@ -4,28 +4,43 @@
 
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
 
+#import "ios/chrome/browser/ui/material_components/utils.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_header_footer_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/table_view/table_view_model.h"
+#import "ios/third_party/material_components_ios/src/components/AppBar/src/MaterialAppBar.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
 @implementation ChromeTableViewController
+@synthesize appBar = _appBar;
 @synthesize styler = _styler;
 @synthesize tableViewModel = _tableViewModel;
 
 #pragma mark - Public Interface
 
-- (instancetype)initWithStyle:(UITableViewStyle)style {
+- (instancetype)initWithTableViewStyle:(UITableViewStyle)style
+                           appBarStyle:
+                               (ChromeTableViewControllerStyle)appBarStyle {
   if ((self = [super initWithStyle:style])) {
     _styler = [[ChromeTableViewStyler alloc] init];
+
+    if (appBarStyle == ChromeTableViewControllerStyleWithAppBar) {
+      _appBar = [[MDCAppBar alloc] init];
+      [self addChildViewController:_appBar.headerViewController];
+    }
   }
   return self;
 }
 
+- (instancetype)init {
+  return [self initWithTableViewStyle:UITableViewStylePlain
+                          appBarStyle:ChromeTableViewControllerStyleNoAppBar];
+}
+
 - (void)loadModel {
   _tableViewModel = [[TableViewModel alloc] init];
 }
@@ -46,9 +61,19 @@
 
 - (void)viewDidLoad {
   [super viewDidLoad];
+
   [self.tableView setBackgroundColor:self.styler.tableViewBackgroundColor];
   [self.tableView setSeparatorColor:[UIColor lightGrayColor]];
   [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 56, 0, 0)];
+
+  // Configure the app bar if needed.
+  if (_appBar) {
+    ConfigureAppBarWithCardStyle(self.appBar);
+    self.appBar.headerViewController.headerView.trackingScrollView =
+        self.tableView;
+    // Add the AppBar's views after all other views have been registered.
+    [self.appBar addSubviewsToParent];
+  }
 }
 
 #pragma mark - UITableViewDataSource
@@ -111,4 +136,51 @@
   return view;
 }
 
+#pragma mark - MDCAppBar support
+
+- (UIViewController*)childViewControllerForStatusBarHidden {
+  return self.appBar.headerViewController;
+}
+
+- (UIViewController*)childViewControllerForStatusBarStyle {
+  return self.appBar.headerViewController;
+}
+
+- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
+  MDCFlexibleHeaderView* headerView =
+      self.appBar.headerViewController.headerView;
+  if (scrollView == headerView.trackingScrollView) {
+    [headerView trackingScrollViewDidScroll];
+  }
+}
+
+- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView {
+  MDCFlexibleHeaderView* headerView =
+      self.appBar.headerViewController.headerView;
+  if (scrollView == headerView.trackingScrollView) {
+    [headerView trackingScrollViewDidEndDecelerating];
+  }
+}
+
+- (void)scrollViewDidEndDragging:(UIScrollView*)scrollView
+                  willDecelerate:(BOOL)decelerate {
+  MDCFlexibleHeaderView* headerView =
+      self.appBar.headerViewController.headerView;
+  if (scrollView == headerView.trackingScrollView) {
+    [headerView trackingScrollViewDidEndDraggingWillDecelerate:decelerate];
+  }
+}
+
+- (void)scrollViewWillEndDragging:(UIScrollView*)scrollView
+                     withVelocity:(CGPoint)velocity
+              targetContentOffset:(inout CGPoint*)targetContentOffset {
+  MDCFlexibleHeaderView* headerView =
+      self.appBar.headerViewController.headerView;
+  if (scrollView == headerView.trackingScrollView) {
+    [headerView
+        trackingScrollViewWillEndDraggingWithVelocity:velocity
+                                  targetContentOffset:targetContentOffset];
+  }
+}
+
 @end
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_controller_unittest.mm b/ios/chrome/browser/ui/table_view/chrome_table_view_controller_unittest.mm
index 5ba961b..6a5c571 100644
--- a/ios/chrome/browser/ui/table_view/chrome_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/table_view/chrome_table_view_controller_unittest.mm
@@ -64,8 +64,9 @@
 using ChromeTableViewControllerTest = PlatformTest;
 
 TEST_F(ChromeTableViewControllerTest, CellForItemAtIndexPath) {
-  ChromeTableViewController* controller =
-      [[ChromeTableViewController alloc] initWithStyle:UITableViewStylePlain];
+  ChromeTableViewController* controller = [[ChromeTableViewController alloc]
+      initWithTableViewStyle:UITableViewStylePlain
+                 appBarStyle:ChromeTableViewControllerStyleNoAppBar];
   [controller loadModel];
 
   [[controller tableViewModel] addSectionWithIdentifier:SectionIdentifierFoo];
@@ -81,8 +82,9 @@
 }
 
 TEST_F(ChromeTableViewControllerTest, HeaderForItemAtSection) {
-  ChromeTableViewController* controller =
-      [[ChromeTableViewController alloc] initWithStyle:UITableViewStylePlain];
+  ChromeTableViewController* controller = [[ChromeTableViewController alloc]
+      initWithTableViewStyle:UITableViewStylePlain
+                 appBarStyle:ChromeTableViewControllerStyleNoAppBar];
   [controller loadModel];
 
   [[controller tableViewModel] addSectionWithIdentifier:SectionIdentifierFoo];
@@ -97,8 +99,9 @@
 }
 
 TEST_F(ChromeTableViewControllerTest, FooterForItemAtSection) {
-  ChromeTableViewController* controller =
-      [[ChromeTableViewController alloc] initWithStyle:UITableViewStylePlain];
+  ChromeTableViewController* controller = [[ChromeTableViewController alloc]
+      initWithTableViewStyle:UITableViewStylePlain
+                 appBarStyle:ChromeTableViewControllerStyleNoAppBar];
   [controller loadModel];
 
   [[controller tableViewModel] addSectionWithIdentifier:SectionIdentifierFoo];
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn
index 06e628a..773bbd9 100644
--- a/ios/third_party/material_components_ios/BUILD.gn
+++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -287,6 +287,11 @@
     "src/components/schemes/Color/src/MDCSemanticColorScheme.h",
     "src/components/schemes/Color/src/MDCSemanticColorScheme.m",
     "src/components/schemes/Color/src/MaterialColorScheme.h",
+    "src/components/schemes/Typography/src/MDCLegacyFontScheme.h",
+    "src/components/schemes/Typography/src/MDCLegacyFontScheme.m",
+    "src/components/schemes/Typography/src/MDCTypographyScheme.h",
+    "src/components/schemes/Typography/src/MDCTypographyScheme.m",
+    "src/components/schemes/Typography/src/MaterialTypographyScheme.h",
   ]
   include_dirs = [
     "src/components/ActivityIndicator/src",
diff --git a/media/mojo/clients/mojo_decryptor_unittest.cc b/media/mojo/clients/mojo_decryptor_unittest.cc
index 38f6ab3..634c9898 100644
--- a/media/mojo/clients/mojo_decryptor_unittest.cc
+++ b/media/mojo/clients/mojo_decryptor_unittest.cc
@@ -45,7 +45,8 @@
     decryptor_.reset(new StrictMock<MockDecryptor>());
 
     mojom::DecryptorPtr remote_decryptor;
-    mojo_decryptor_service_.reset(new MojoDecryptorService(decryptor_.get()));
+    mojo_decryptor_service_.reset(
+        new MojoDecryptorService(decryptor_.get(), nullptr));
     binding_ = std::make_unique<mojo::Binding<mojom::Decryptor>>(
         mojo_decryptor_service_.get(), MakeRequest(&remote_decryptor));
     binding_->set_connection_error_handler(base::BindOnce(
diff --git a/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc
index c38b6e8..31bb3e7 100644
--- a/media/mojo/services/mojo_cdm_service.cc
+++ b/media/mojo/services/mojo_cdm_service.cc
@@ -169,7 +169,10 @@
   mojom::DecryptorPtr decryptor_ptr;
   CdmContext* const cdm_context = cdm_->GetCdmContext();
   if (cdm_context && cdm_context->GetDecryptor()) {
-    decryptor_.reset(new MojoDecryptorService(cdm_context->GetDecryptor()));
+    // Both |cdm_| and |decryptor_| are owned by |this|, so we don't need to
+    // pass in a CdmContextRef.
+    decryptor_.reset(
+        new MojoDecryptorService(cdm_context->GetDecryptor(), nullptr));
     decryptor_binding_ = std::make_unique<mojo::Binding<mojom::Decryptor>>(
         decryptor_.get(), MakeRequest(&decryptor_ptr));
     decryptor_binding_->set_connection_error_handler(base::BindOnce(
diff --git a/media/mojo/services/mojo_decryptor_service.cc b/media/mojo/services/mojo_decryptor_service.cc
index 5cc3335..c6cf6ee 100644
--- a/media/mojo/services/mojo_decryptor_service.cc
+++ b/media/mojo/services/mojo_decryptor_service.cc
@@ -45,10 +45,16 @@
 
 }  // namespace
 
-MojoDecryptorService::MojoDecryptorService(media::Decryptor* decryptor)
-    : decryptor_(decryptor), weak_factory_(this) {
+MojoDecryptorService::MojoDecryptorService(
+    media::Decryptor* decryptor,
+    std::unique_ptr<CdmContextRef> cdm_context_ref)
+    : decryptor_(decryptor),
+      cdm_context_ref_(std::move(cdm_context_ref)),
+      weak_factory_(this) {
   DVLOG(1) << __func__;
   DCHECK(decryptor_);
+  // |cdm_context_ref_| could be null, in which case the owner of |this| will
+  // make sure |decryptor_| is always valid.
   weak_this_ = weak_factory_.GetWeakPtr();
 }
 
diff --git a/media/mojo/services/mojo_decryptor_service.h b/media/mojo/services/mojo_decryptor_service.h
index 5d37637..c9d25fc 100644
--- a/media/mojo/services/mojo_decryptor_service.h
+++ b/media/mojo/services/mojo_decryptor_service.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "media/base/cdm_context.h"
 #include "media/base/decryptor.h"
 #include "media/mojo/interfaces/decryptor.mojom.h"
 #include "media/mojo/services/media_mojo_export.h"
@@ -30,8 +31,11 @@
   using StreamType = media::Decryptor::StreamType;
   using Status = media::Decryptor::Status;
 
-  // Caller must ensure that |decryptor| outlives |this|.
-  explicit MojoDecryptorService(media::Decryptor* decryptor);
+  // If |cdm_context_ref| is null, caller must ensure that |decryptor| outlives
+  // |this|. Otherwise, |decryptor| is guaranteed to be valid as long as
+  // |cdm_context_ref| is held.
+  MojoDecryptorService(media::Decryptor* decryptor,
+                       std::unique_ptr<CdmContextRef> cdm_context_ref);
 
   ~MojoDecryptorService() final;
 
@@ -97,6 +101,7 @@
   std::unique_ptr<MojoDecoderBufferWriter> decrypted_buffer_writer_;
 
   media::Decryptor* decryptor_;
+  std::unique_ptr<CdmContextRef> cdm_context_ref_;
 
   base::WeakPtr<MojoDecryptorService> weak_this_;
   base::WeakPtrFactory<MojoDecryptorService> weak_factory_;
diff --git a/media/remoting/demuxer_stream_adapter_unittest.cc b/media/remoting/demuxer_stream_adapter_unittest.cc
index 198345a6..5a158bf 100644
--- a/media/remoting/demuxer_stream_adapter_unittest.cc
+++ b/media/remoting/demuxer_stream_adapter_unittest.cc
@@ -117,8 +117,8 @@
     constexpr size_t kDataPipeCapacity = 256;
     demuxer_stream_.reset(new FakeDemuxerStream(true));  // audio.
     const MojoCreateDataPipeOptions data_pipe_options{
-        sizeof(MojoCreateDataPipeOptions),
-        MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 1, kDataPipeCapacity};
+        sizeof(MojoCreateDataPipeOptions), MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1,
+        kDataPipeCapacity};
     mojom::RemotingDataStreamSenderPtr stream_sender;
     mojo::ScopedDataPipeProducerHandle producer_end;
     mojo::ScopedDataPipeConsumerHandle consumer_end;
diff --git a/mojo/android/system/core_impl.cc b/mojo/android/system/core_impl.cc
index acf9179..33f0576a 100644
--- a/mojo/android/system/core_impl.cc
+++ b/mojo/android/system/core_impl.cc
@@ -80,7 +80,7 @@
     DCHECK_EQ(options->struct_size, buffer_size);
   }
   MojoHandle handle;
-  MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle);
+  MojoResult result = MojoCreateSharedBuffer(num_bytes, options, &handle);
   return Java_CoreImpl_newResultAndInteger(env, result, handle);
 }
 
@@ -187,8 +187,11 @@
     DCHECK(buffer_start);
     DCHECK(elements_capacity <= env->GetDirectBufferCapacity(elements));
   }
+  MojoReadDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoResult result =
-      MojoReadData(mojo_handle, buffer_start, &buffer_size, flags);
+      MojoReadData(mojo_handle, &options, buffer_start, &buffer_size);
   return Java_CoreImpl_newResultAndInteger(
       env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0);
 }
@@ -201,8 +204,12 @@
     jint flags) {
   void const* buffer = 0;
   uint32_t buffer_size = num_bytes;
+
+  MojoBeginReadDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoResult result =
-      MojoBeginReadData(mojo_handle, &buffer, &buffer_size, flags);
+      MojoBeginReadData(mojo_handle, &options, &buffer, &buffer_size);
   if (result == MOJO_RESULT_OK) {
     ScopedJavaLocalRef<jobject> byte_buffer(
         env, env->NewDirectByteBuffer(const_cast<void*>(buffer), buffer_size));
@@ -216,7 +223,7 @@
                                      const JavaParamRef<jobject>& jcaller,
                                      jint mojo_handle,
                                      jint num_bytes_read) {
-  return MojoEndReadData(mojo_handle, num_bytes_read);
+  return MojoEndReadData(mojo_handle, num_bytes_read, nullptr);
 }
 
 static ScopedJavaLocalRef<jobject> JNI_CoreImpl_WriteData(
@@ -230,8 +237,12 @@
   DCHECK(buffer_start);
   DCHECK(limit <= env->GetDirectBufferCapacity(elements));
   uint32_t buffer_size = limit;
+
+  MojoWriteDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoResult result =
-      MojoWriteData(mojo_handle, buffer_start, &buffer_size, flags);
+      MojoWriteData(mojo_handle, buffer_start, &buffer_size, &options);
   return Java_CoreImpl_newResultAndInteger(
       env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0);
 }
@@ -244,8 +255,11 @@
     jint flags) {
   void* buffer = 0;
   uint32_t buffer_size = num_bytes;
+  MojoBeginWriteDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoResult result =
-      MojoBeginWriteData(mojo_handle, &buffer, &buffer_size, flags);
+      MojoBeginWriteData(mojo_handle, &options, &buffer, &buffer_size);
   if (result == MOJO_RESULT_OK) {
     ScopedJavaLocalRef<jobject> byte_buffer(
         env, env->NewDirectByteBuffer(buffer, buffer_size));
@@ -259,7 +273,7 @@
                                       const JavaParamRef<jobject>& jcaller,
                                       jint mojo_handle,
                                       jint num_bytes_written) {
-  return MojoEndWriteData(mojo_handle, num_bytes_written);
+  return MojoEndWriteData(mojo_handle, num_bytes_written, nullptr);
 }
 
 static ScopedJavaLocalRef<jobject> JNI_CoreImpl_Duplicate(
@@ -290,8 +304,11 @@
     jlong num_bytes,
     jint flags) {
   void* buffer = 0;
+  MojoMapBufferOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoResult result =
-      MojoMapBuffer(mojo_handle, offset, num_bytes, &buffer, flags);
+      MojoMapBuffer(mojo_handle, offset, num_bytes, &options, &buffer);
   if (result == MOJO_RESULT_OK) {
     ScopedJavaLocalRef<jobject> byte_buffer(
         env, env->NewDirectByteBuffer(buffer, num_bytes));
diff --git a/mojo/edk/embedder/embedder_unittest.cc b/mojo/edk/embedder/embedder_unittest.cc
index 376a39c8..d68221b 100644
--- a/mojo/edk/embedder/embedder_unittest.cc
+++ b/mojo/edk/embedder/embedder_unittest.cc
@@ -313,14 +313,14 @@
 
     // 2. Map |sb1| and write something into it.
     char* buffer = nullptr;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoMapBuffer(sb1, 0, 123, reinterpret_cast<void**>(&buffer), 0));
+    ASSERT_EQ(MOJO_RESULT_OK, MojoMapBuffer(sb1, 0, 123, nullptr,
+                                            reinterpret_cast<void**>(&buffer)));
     ASSERT_TRUE(buffer);
     memcpy(buffer, kHelloWorld, sizeof(kHelloWorld));
 
     // 3. Duplicate |sb1| into |sb2| and pass to |server_mp|.
     MojoHandle sb2 = MOJO_HANDLE_INVALID;
-    EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(sb1, 0, &sb2));
+    EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(sb1, nullptr, &sb2));
     EXPECT_NE(MOJO_HANDLE_INVALID, sb2);
     WriteMessageWithHandles(server_mp, "hello", &sb2, 1);
 
@@ -350,8 +350,8 @@
 
   // 2. Map |sb1|.
   char* buffer = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(sb1, 0, 123, reinterpret_cast<void**>(&buffer), 0));
+  ASSERT_EQ(MOJO_RESULT_OK, MojoMapBuffer(sb1, 0, 123, nullptr,
+                                          reinterpret_cast<void**>(&buffer)));
   ASSERT_TRUE(buffer);
 
   // 3. Ensure |buffer| contains the values we expect.
diff --git a/mojo/edk/embedder/entrypoints.cc b/mojo/edk/embedder/entrypoints.cc
index 557878a..0ee26787 100644
--- a/mojo/edk/embedder/entrypoints.cc
+++ b/mojo/edk/embedder/entrypoints.cc
@@ -38,36 +38,31 @@
   return g_core->QueryHandleSignalsState(handle, signals_state);
 }
 
-MojoResult MojoCreateTrapImpl(MojoTrapEventHandler handler,
-                              const MojoCreateTrapOptions* options,
-                              MojoHandle* trap_handle) {
-  return g_core->CreateTrap(handler, options, trap_handle);
+MojoResult MojoCreateMessagePipeImpl(
+    const MojoCreateMessagePipeOptions* options,
+    MojoHandle* message_pipe_handle0,
+    MojoHandle* message_pipe_handle1) {
+  return g_core->CreateMessagePipe(options, message_pipe_handle0,
+                                   message_pipe_handle1);
 }
 
-MojoResult MojoArmTrapImpl(MojoHandle trap_handle,
-                           const MojoArmTrapOptions* options,
-                           uint32_t* num_ready_triggers,
-                           uintptr_t* ready_triggers,
-                           MojoResult* ready_results,
-                           MojoHandleSignalsState* ready_signals_states) {
-  return g_core->ArmTrap(trap_handle, options, num_ready_triggers,
-                         ready_triggers, ready_results, ready_signals_states);
+MojoResult MojoWriteMessageImpl(MojoHandle message_pipe_handle,
+                                MojoMessageHandle message,
+                                const MojoWriteMessageOptions* options) {
+  return g_core->WriteMessage(message_pipe_handle, message, options);
 }
 
-MojoResult MojoAddTriggerImpl(MojoHandle trap_handle,
-                              MojoHandle handle,
-                              MojoHandleSignals signals,
-                              MojoTriggerCondition condition,
-                              uintptr_t context,
-                              const MojoAddTriggerOptions* options) {
-  return g_core->AddTrigger(trap_handle, handle, signals, condition, context,
-                            options);
+MojoResult MojoReadMessageImpl(MojoHandle message_pipe_handle,
+                               const MojoReadMessageOptions* options,
+                               MojoMessageHandle* message) {
+  return g_core->ReadMessage(message_pipe_handle, options, message);
 }
 
-MojoResult MojoRemoveTriggerImpl(MojoHandle trap_handle,
-                                 uintptr_t context,
-                                 const MojoRemoveTriggerOptions* options) {
-  return g_core->RemoveTrigger(trap_handle, context, options);
+MojoResult MojoFuseMessagePipesImpl(
+    MojoHandle handle0,
+    MojoHandle handle1,
+    const MojoFuseMessagePipesOptions* options) {
+  return g_core->FuseMessagePipes(handle0, handle1, options);
 }
 
 MojoResult MojoCreateMessageImpl(const MojoCreateMessageOptions* options,
@@ -75,16 +70,16 @@
   return g_core->CreateMessage(options, message);
 }
 
+MojoResult MojoDestroyMessageImpl(MojoMessageHandle message) {
+  return g_core->DestroyMessage(message);
+}
+
 MojoResult MojoSerializeMessageImpl(
     MojoMessageHandle message,
     const MojoSerializeMessageOptions* options) {
   return g_core->SerializeMessage(message, options);
 }
 
-MojoResult MojoDestroyMessageImpl(MojoMessageHandle message) {
-  return g_core->DestroyMessage(message);
-}
-
 MojoResult MojoAppendMessageDataImpl(
     MojoMessageHandle message,
     uint32_t additional_payload_size,
@@ -124,28 +119,12 @@
   return g_core->GetMessageContext(message, options, context);
 }
 
-MojoResult MojoCreateMessagePipeImpl(
-    const MojoCreateMessagePipeOptions* options,
-    MojoHandle* message_pipe_handle0,
-    MojoHandle* message_pipe_handle1) {
-  return g_core->CreateMessagePipe(options, message_pipe_handle0,
-                                   message_pipe_handle1);
-}
-
-MojoResult MojoWriteMessageImpl(MojoHandle message_pipe_handle,
-                                MojoMessageHandle message,
-                                MojoWriteMessageFlags flags) {
-  return g_core->WriteMessage(message_pipe_handle, message, flags);
-}
-
-MojoResult MojoReadMessageImpl(MojoHandle message_pipe_handle,
-                               MojoMessageHandle* message,
-                               MojoReadMessageFlags flags) {
-  return g_core->ReadMessage(message_pipe_handle, message, flags);
-}
-
-MojoResult MojoFuseMessagePipesImpl(MojoHandle handle0, MojoHandle handle1) {
-  return g_core->FuseMessagePipes(handle0, handle1);
+MojoResult MojoNotifyBadMessageImpl(
+    MojoMessageHandle message,
+    const char* error,
+    size_t error_num_bytes,
+    const MojoNotifyBadMessageOptions* options) {
+  return g_core->NotifyBadMessage(message, error, error_num_bytes, options);
 }
 
 MojoResult MojoCreateDataPipeImpl(const MojoCreateDataPipeOptions* options,
@@ -158,50 +137,54 @@
 MojoResult MojoWriteDataImpl(MojoHandle data_pipe_producer_handle,
                              const void* elements,
                              uint32_t* num_elements,
-                             MojoWriteDataFlags flags) {
+                             const MojoWriteDataOptions* options) {
   return g_core->WriteData(data_pipe_producer_handle, elements, num_elements,
-                           flags);
+                           options);
 }
 
 MojoResult MojoBeginWriteDataImpl(MojoHandle data_pipe_producer_handle,
+                                  const MojoBeginWriteDataOptions* options,
                                   void** buffer,
-                                  uint32_t* buffer_num_elements,
-                                  MojoWriteDataFlags flags) {
-  return g_core->BeginWriteData(data_pipe_producer_handle, buffer,
-                                buffer_num_elements, flags);
+                                  uint32_t* buffer_num_elements) {
+  return g_core->BeginWriteData(data_pipe_producer_handle, options, buffer,
+                                buffer_num_elements);
 }
 
 MojoResult MojoEndWriteDataImpl(MojoHandle data_pipe_producer_handle,
-                                uint32_t num_elements_written) {
-  return g_core->EndWriteData(data_pipe_producer_handle, num_elements_written);
+                                uint32_t num_elements_written,
+                                const MojoEndWriteDataOptions* options) {
+  return g_core->EndWriteData(data_pipe_producer_handle, num_elements_written,
+                              options);
 }
 
 MojoResult MojoReadDataImpl(MojoHandle data_pipe_consumer_handle,
+                            const MojoReadDataOptions* options,
                             void* elements,
-                            uint32_t* num_elements,
-                            MojoReadDataFlags flags) {
-  return g_core->ReadData(data_pipe_consumer_handle, elements, num_elements,
-                          flags);
+                            uint32_t* num_elements) {
+  return g_core->ReadData(data_pipe_consumer_handle, options, elements,
+                          num_elements);
 }
 
 MojoResult MojoBeginReadDataImpl(MojoHandle data_pipe_consumer_handle,
+                                 const MojoBeginReadDataOptions* options,
                                  const void** buffer,
-                                 uint32_t* buffer_num_elements,
-                                 MojoReadDataFlags flags) {
-  return g_core->BeginReadData(data_pipe_consumer_handle, buffer,
-                               buffer_num_elements, flags);
+                                 uint32_t* buffer_num_elements) {
+  return g_core->BeginReadData(data_pipe_consumer_handle, options, buffer,
+                               buffer_num_elements);
 }
 
 MojoResult MojoEndReadDataImpl(MojoHandle data_pipe_consumer_handle,
-                               uint32_t num_elements_read) {
-  return g_core->EndReadData(data_pipe_consumer_handle, num_elements_read);
+                               uint32_t num_elements_read,
+                               const MojoEndReadDataOptions* options) {
+  return g_core->EndReadData(data_pipe_consumer_handle, num_elements_read,
+                             options);
 }
 
 MojoResult MojoCreateSharedBufferImpl(
-    const MojoCreateSharedBufferOptions* options,
     uint64_t num_bytes,
+    const MojoCreateSharedBufferOptions* options,
     MojoHandle* shared_buffer_handle) {
-  return g_core->CreateSharedBuffer(options, num_bytes, shared_buffer_handle);
+  return g_core->CreateSharedBuffer(num_bytes, options, shared_buffer_handle);
 }
 
 MojoResult MojoDuplicateBufferHandleImpl(
@@ -215,9 +198,9 @@
 MojoResult MojoMapBufferImpl(MojoHandle buffer_handle,
                              uint64_t offset,
                              uint64_t num_bytes,
-                             void** buffer,
-                             MojoMapBufferFlags flags) {
-  return g_core->MapBuffer(buffer_handle, offset, num_bytes, buffer, flags);
+                             const MojoMapBufferOptions* options,
+                             void** buffer) {
+  return g_core->MapBuffer(buffer_handle, offset, num_bytes, options, buffer);
 }
 
 MojoResult MojoUnmapBufferImpl(void* buffer) {
@@ -225,11 +208,43 @@
 }
 
 MojoResult MojoGetBufferInfoImpl(MojoHandle buffer_handle,
-                                 const MojoSharedBufferOptions* options,
+                                 const MojoGetBufferInfoOptions* options,
                                  MojoSharedBufferInfo* info) {
   return g_core->GetBufferInfo(buffer_handle, options, info);
 }
 
+MojoResult MojoCreateTrapImpl(MojoTrapEventHandler handler,
+                              const MojoCreateTrapOptions* options,
+                              MojoHandle* trap_handle) {
+  return g_core->CreateTrap(handler, options, trap_handle);
+}
+
+MojoResult MojoAddTriggerImpl(MojoHandle trap_handle,
+                              MojoHandle handle,
+                              MojoHandleSignals signals,
+                              MojoTriggerCondition condition,
+                              uintptr_t context,
+                              const MojoAddTriggerOptions* options) {
+  return g_core->AddTrigger(trap_handle, handle, signals, condition, context,
+                            options);
+}
+
+MojoResult MojoRemoveTriggerImpl(MojoHandle trap_handle,
+                                 uintptr_t context,
+                                 const MojoRemoveTriggerOptions* options) {
+  return g_core->RemoveTrigger(trap_handle, context, options);
+}
+
+MojoResult MojoArmTrapImpl(MojoHandle trap_handle,
+                           const MojoArmTrapOptions* options,
+                           uint32_t* num_ready_triggers,
+                           uintptr_t* ready_triggers,
+                           MojoResult* ready_results,
+                           MojoHandleSignalsState* ready_signals_states) {
+  return g_core->ArmTrap(trap_handle, options, num_ready_triggers,
+                         ready_triggers, ready_results, ready_signals_states);
+}
+
 MojoResult MojoWrapPlatformHandleImpl(const MojoPlatformHandle* platform_handle,
                                       MojoHandle* mojo_handle) {
   return g_core->WrapPlatformHandle(platform_handle, mojo_handle);
@@ -260,12 +275,6 @@
                                                   num_bytes, guid, flags);
 }
 
-MojoResult MojoNotifyBadMessageImpl(MojoMessageHandle message,
-                                    const char* error,
-                                    size_t error_num_bytes) {
-  return g_core->NotifyBadMessage(message, error, error_num_bytes);
-}
-
 }  // extern "C"
 
 MojoSystemThunks g_thunks = {sizeof(MojoSystemThunks),
@@ -276,6 +285,15 @@
                              MojoCreateMessagePipeImpl,
                              MojoWriteMessageImpl,
                              MojoReadMessageImpl,
+                             MojoFuseMessagePipesImpl,
+                             MojoCreateMessageImpl,
+                             MojoDestroyMessageImpl,
+                             MojoSerializeMessageImpl,
+                             MojoAppendMessageDataImpl,
+                             MojoGetMessageDataImpl,
+                             MojoSetMessageContextImpl,
+                             MojoGetMessageContextImpl,
+                             MojoNotifyBadMessageImpl,
                              MojoCreateDataPipeImpl,
                              MojoWriteDataImpl,
                              MojoBeginWriteDataImpl,
@@ -292,19 +310,10 @@
                              MojoAddTriggerImpl,
                              MojoRemoveTriggerImpl,
                              MojoArmTrapImpl,
-                             MojoFuseMessagePipesImpl,
-                             MojoCreateMessageImpl,
-                             MojoDestroyMessageImpl,
-                             MojoSerializeMessageImpl,
-                             MojoAppendMessageDataImpl,
-                             MojoGetMessageDataImpl,
-                             MojoSetMessageContextImpl,
-                             MojoGetMessageContextImpl,
                              MojoWrapPlatformHandleImpl,
                              MojoUnwrapPlatformHandleImpl,
                              MojoWrapPlatformSharedBufferHandleImpl,
-                             MojoUnwrapPlatformSharedBufferHandleImpl,
-                             MojoNotifyBadMessageImpl};
+                             MojoUnwrapPlatformSharedBufferHandleImpl};
 
 }  // namespace
 
diff --git a/mojo/edk/mojo_core_unittest.cc b/mojo/edk/mojo_core_unittest.cc
index ddd24d23..8428e098 100644
--- a/mojo/edk/mojo_core_unittest.cc
+++ b/mojo/edk/mojo_core_unittest.cc
@@ -18,16 +18,14 @@
   EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessage(nullptr, &m));
   EXPECT_EQ(MOJO_RESULT_OK,
             MojoSetMessageContext(m, 42, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(a, m, MOJO_WRITE_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(a, m, nullptr));
   m = MOJO_MESSAGE_HANDLE_INVALID;
 
   MojoHandleSignalsState state;
   EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
   EXPECT_TRUE(state.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE);
 
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(b, &m, MOJO_READ_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(b, nullptr, &m));
 
   uintptr_t context = 0;
   EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageContext(m, nullptr, &context));
diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc
index 00f5db21..259dd72 100644
--- a/mojo/edk/system/core.cc
+++ b/mojo/edk/system/core.cc
@@ -6,6 +6,7 @@
 
 #include <string.h>
 
+#include <algorithm>
 #include <utility>
 
 #include "base/bind.h"
@@ -606,7 +607,7 @@
 
 MojoResult Core::WriteMessage(MojoHandle message_pipe_handle,
                               MojoMessageHandle message_handle,
-                              MojoWriteMessageFlags flags) {
+                              const MojoWriteMessageOptions* options) {
   RequestContext request_context;
   if (!message_handle)
     return MOJO_RESULT_INVALID_ARGUMENT;
@@ -618,12 +619,12 @@
   auto dispatcher = GetDispatcher(message_pipe_handle);
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
-  return dispatcher->WriteMessage(std::move(message_event), flags);
+  return dispatcher->WriteMessage(std::move(message_event));
 }
 
 MojoResult Core::ReadMessage(MojoHandle message_pipe_handle,
-                             MojoMessageHandle* message_handle,
-                             MojoReadMessageFlags flags) {
+                             const MojoReadMessageOptions* options,
+                             MojoMessageHandle* message_handle) {
   RequestContext request_context;
   auto dispatcher = GetDispatcher(message_pipe_handle);
   if (!dispatcher || !message_handle)
@@ -639,7 +640,9 @@
   return MOJO_RESULT_OK;
 }
 
-MojoResult Core::FuseMessagePipes(MojoHandle handle0, MojoHandle handle1) {
+MojoResult Core::FuseMessagePipes(MojoHandle handle0,
+                                  MojoHandle handle1,
+                                  const MojoFuseMessagePipesOptions* options) {
   RequestContext request_context;
   scoped_refptr<Dispatcher> dispatcher0;
   scoped_refptr<Dispatcher> dispatcher1;
@@ -678,7 +681,8 @@
 
 MojoResult Core::NotifyBadMessage(MojoMessageHandle message_handle,
                                   const char* error,
-                                  size_t error_num_bytes) {
+                                  size_t error_num_bytes,
+                                  const MojoNotifyBadMessageOptions* options) {
   if (!message_handle)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
@@ -785,80 +789,131 @@
 MojoResult Core::WriteData(MojoHandle data_pipe_producer_handle,
                            const void* elements,
                            uint32_t* num_bytes,
-                           MojoWriteDataFlags flags) {
+                           const MojoWriteDataOptions* options) {
   RequestContext request_context;
   scoped_refptr<Dispatcher> dispatcher(
       GetDispatcher(data_pipe_producer_handle));
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  return dispatcher->WriteData(elements, num_bytes, flags);
+  MojoWriteDataOptions validated_options;
+  if (options) {
+    if (options->struct_size < sizeof(*options))
+      return MOJO_RESULT_INVALID_ARGUMENT;
+
+    constexpr MojoWriteDataFlags kSupportedFlags =
+        MOJO_WRITE_DATA_FLAG_NONE | MOJO_WRITE_DATA_FLAG_ALL_OR_NONE;
+    if (options->flags & ~kSupportedFlags)
+      return MOJO_RESULT_UNIMPLEMENTED;
+    validated_options.flags = options->flags;
+  } else {
+    validated_options.flags = MOJO_WRITE_DATA_FLAG_NONE;
+  }
+  return dispatcher->WriteData(elements, num_bytes, validated_options);
 }
 
 MojoResult Core::BeginWriteData(MojoHandle data_pipe_producer_handle,
+                                const MojoBeginWriteDataOptions* options,
                                 void** buffer,
-                                uint32_t* buffer_num_bytes,
-                                MojoWriteDataFlags flags) {
+                                uint32_t* buffer_num_bytes) {
   RequestContext request_context;
   scoped_refptr<Dispatcher> dispatcher(
       GetDispatcher(data_pipe_producer_handle));
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->BeginWriteData(buffer, buffer_num_bytes, flags);
+  if (options) {
+    if (options->struct_size < sizeof(*options))
+      return MOJO_RESULT_INVALID_ARGUMENT;
+    if (options->flags != MOJO_BEGIN_WRITE_DATA_FLAG_NONE)
+      return MOJO_RESULT_UNIMPLEMENTED;
+  }
+  return dispatcher->BeginWriteData(buffer, buffer_num_bytes);
 }
 
 MojoResult Core::EndWriteData(MojoHandle data_pipe_producer_handle,
-                              uint32_t num_bytes_written) {
+                              uint32_t num_bytes_written,
+                              const MojoEndWriteDataOptions* options) {
   RequestContext request_context;
   scoped_refptr<Dispatcher> dispatcher(
       GetDispatcher(data_pipe_producer_handle));
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
-
+  if (options) {
+    if (options->struct_size < sizeof(*options))
+      return MOJO_RESULT_INVALID_ARGUMENT;
+    if (options->flags != MOJO_END_WRITE_DATA_FLAG_NONE)
+      return MOJO_RESULT_UNIMPLEMENTED;
+  }
   return dispatcher->EndWriteData(num_bytes_written);
 }
 
 MojoResult Core::ReadData(MojoHandle data_pipe_consumer_handle,
+                          const MojoReadDataOptions* options,
                           void* elements,
-                          uint32_t* num_bytes,
-                          MojoReadDataFlags flags) {
+                          uint32_t* num_bytes) {
   RequestContext request_context;
   scoped_refptr<Dispatcher> dispatcher(
       GetDispatcher(data_pipe_consumer_handle));
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  return dispatcher->ReadData(elements, num_bytes, flags);
+  MojoReadDataOptions validated_options;
+  if (options) {
+    if (options->struct_size < sizeof(*options))
+      return MOJO_RESULT_INVALID_ARGUMENT;
+
+    constexpr MojoReadDataFlags kSupportedFlags =
+        MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_ALL_OR_NONE |
+        MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_QUERY |
+        MOJO_READ_DATA_FLAG_PEEK;
+    if (options->flags & ~kSupportedFlags)
+      return MOJO_RESULT_UNIMPLEMENTED;
+    validated_options.flags = options->flags;
+  } else {
+    validated_options.flags = MOJO_WRITE_DATA_FLAG_NONE;
+  }
+  return dispatcher->ReadData(validated_options, elements, num_bytes);
 }
 
 MojoResult Core::BeginReadData(MojoHandle data_pipe_consumer_handle,
+                               const MojoBeginReadDataOptions* options,
                                const void** buffer,
-                               uint32_t* buffer_num_bytes,
-                               MojoReadDataFlags flags) {
+                               uint32_t* buffer_num_bytes) {
   RequestContext request_context;
   scoped_refptr<Dispatcher> dispatcher(
       GetDispatcher(data_pipe_consumer_handle));
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  return dispatcher->BeginReadData(buffer, buffer_num_bytes, flags);
+  if (options) {
+    if (options->struct_size < sizeof(*options))
+      return MOJO_RESULT_INVALID_ARGUMENT;
+    if (options->flags != MOJO_BEGIN_READ_DATA_FLAG_NONE)
+      return MOJO_RESULT_UNIMPLEMENTED;
+  }
+  return dispatcher->BeginReadData(buffer, buffer_num_bytes);
 }
 
 MojoResult Core::EndReadData(MojoHandle data_pipe_consumer_handle,
-                             uint32_t num_bytes_read) {
+                             uint32_t num_bytes_read,
+                             const MojoEndReadDataOptions* options) {
   RequestContext request_context;
   scoped_refptr<Dispatcher> dispatcher(
       GetDispatcher(data_pipe_consumer_handle));
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
-
+  if (options) {
+    if (options->struct_size < sizeof(*options))
+      return MOJO_RESULT_INVALID_ARGUMENT;
+    if (options->flags != MOJO_END_READ_DATA_FLAG_NONE)
+      return MOJO_RESULT_UNIMPLEMENTED;
+  }
   return dispatcher->EndReadData(num_bytes_read);
 }
 
 MojoResult Core::CreateSharedBuffer(
-    const MojoCreateSharedBufferOptions* options,
     uint64_t num_bytes,
+    const MojoCreateSharedBufferOptions* options,
     MojoHandle* shared_buffer_handle) {
   RequestContext request_context;
   MojoCreateSharedBufferOptions validated_options = {};
@@ -914,14 +969,20 @@
 MojoResult Core::MapBuffer(MojoHandle buffer_handle,
                            uint64_t offset,
                            uint64_t num_bytes,
-                           void** buffer,
-                           MojoMapBufferFlags flags) {
+                           const MojoMapBufferOptions* options,
+                           void** buffer) {
   scoped_refptr<Dispatcher> dispatcher(GetDispatcher(buffer_handle));
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
+  if (options) {
+    if (options->struct_size < sizeof(*options))
+      return MOJO_RESULT_INVALID_ARGUMENT;
+    if (options->flags != MOJO_MAP_BUFFER_FLAG_NONE)
+      return MOJO_RESULT_UNIMPLEMENTED;
+  }
 
   std::unique_ptr<PlatformSharedMemoryMapping> mapping;
-  MojoResult result = dispatcher->MapBuffer(offset, num_bytes, flags, &mapping);
+  MojoResult result = dispatcher->MapBuffer(offset, num_bytes, &mapping);
   if (result != MOJO_RESULT_OK)
     return result;
 
@@ -956,11 +1017,15 @@
 }
 
 MojoResult Core::GetBufferInfo(MojoHandle buffer_handle,
-                               const MojoSharedBufferOptions* options,
+                               const MojoGetBufferInfoOptions* options,
                                MojoSharedBufferInfo* info) {
-  if (options && options->struct_size != sizeof(MojoSharedBufferOptions))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (!info || info->struct_size != sizeof(MojoSharedBufferInfo))
+  if (options) {
+    if (options->struct_size < sizeof(*options))
+      return MOJO_RESULT_INVALID_ARGUMENT;
+    if (options->flags != MOJO_GET_BUFFER_INFO_FLAG_NONE)
+      return MOJO_RESULT_UNIMPLEMENTED;
+  }
+  if (!info || info->struct_size < sizeof(MojoSharedBufferInfo))
     return MOJO_RESULT_INVALID_ARGUMENT;
 
   scoped_refptr<Dispatcher> dispatcher(GetDispatcher(buffer_handle));
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h
index ea214e94..3268aee 100644
--- a/mojo/edk/system/core.h
+++ b/mojo/edk/system/core.h
@@ -219,14 +219,17 @@
                                MojoHandle* message_pipe_handle1);
   MojoResult WriteMessage(MojoHandle message_pipe_handle,
                           MojoMessageHandle message_handle,
-                          MojoWriteMessageFlags flags);
+                          const MojoWriteMessageOptions* options);
   MojoResult ReadMessage(MojoHandle message_pipe_handle,
-                         MojoMessageHandle* message_handle,
-                         MojoReadMessageFlags flags);
-  MojoResult FuseMessagePipes(MojoHandle handle0, MojoHandle handle1);
+                         const MojoReadMessageOptions* options,
+                         MojoMessageHandle* message_handle);
+  MojoResult FuseMessagePipes(MojoHandle handle0,
+                              MojoHandle handle1,
+                              const MojoFuseMessagePipesOptions* options);
   MojoResult NotifyBadMessage(MojoMessageHandle message_handle,
                               const char* error,
-                              size_t error_num_bytes);
+                              size_t error_num_bytes,
+                              const MojoNotifyBadMessageOptions* options);
 
   // These methods correspond to the API functions defined in
   // "mojo/public/c/system/data_pipe.h":
@@ -236,28 +239,30 @@
   MojoResult WriteData(MojoHandle data_pipe_producer_handle,
                        const void* elements,
                        uint32_t* num_bytes,
-                       MojoWriteDataFlags flags);
+                       const MojoWriteDataOptions* options);
   MojoResult BeginWriteData(MojoHandle data_pipe_producer_handle,
+                            const MojoBeginWriteDataOptions* options,
                             void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags);
+                            uint32_t* buffer_num_bytes);
   MojoResult EndWriteData(MojoHandle data_pipe_producer_handle,
-                          uint32_t num_bytes_written);
+                          uint32_t num_bytes_written,
+                          const MojoEndWriteDataOptions* options);
   MojoResult ReadData(MojoHandle data_pipe_consumer_handle,
+                      const MojoReadDataOptions* options,
                       void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags);
+                      uint32_t* num_bytes);
   MojoResult BeginReadData(MojoHandle data_pipe_consumer_handle,
+                           const MojoBeginReadDataOptions* options,
                            const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags);
+                           uint32_t* buffer_num_bytes);
   MojoResult EndReadData(MojoHandle data_pipe_consumer_handle,
-                         uint32_t num_bytes_read);
+                         uint32_t num_bytes_read,
+                         const MojoEndReadDataOptions* options);
 
   // These methods correspond to the API functions defined in
   // "mojo/public/c/system/buffer.h":
-  MojoResult CreateSharedBuffer(const MojoCreateSharedBufferOptions* options,
-                                uint64_t num_bytes,
+  MojoResult CreateSharedBuffer(uint64_t num_bytes,
+                                const MojoCreateSharedBufferOptions* options,
                                 MojoHandle* shared_buffer_handle);
   MojoResult DuplicateBufferHandle(
       MojoHandle buffer_handle,
@@ -266,11 +271,11 @@
   MojoResult MapBuffer(MojoHandle buffer_handle,
                        uint64_t offset,
                        uint64_t num_bytes,
-                       void** buffer,
-                       MojoMapBufferFlags flags);
+                       const MojoMapBufferOptions* options,
+                       void** buffer);
   MojoResult UnmapBuffer(void* buffer);
   MojoResult GetBufferInfo(MojoHandle buffer_handle,
-                           const MojoSharedBufferOptions* options,
+                           const MojoGetBufferInfoOptions* options,
                            MojoSharedBufferInfo* info);
 
   // These methods correspond to the API functions defined in
diff --git a/mojo/edk/system/core_test_base.cc b/mojo/edk/system/core_test_base.cc
index ff7b7c3a..a025a9b 100644
--- a/mojo/edk/system/core_test_base.cc
+++ b/mojo/edk/system/core_test_base.cc
@@ -41,8 +41,7 @@
   }
 
   MojoResult WriteMessage(
-      std::unique_ptr<ports::UserMessageEvent> message_event,
-      MojoWriteMessageFlags /*flags*/) override {
+      std::unique_ptr<ports::UserMessageEvent> message_event) override {
     info_->IncrementWriteMessageCallCount();
     return MOJO_RESULT_OK;
   }
@@ -55,14 +54,13 @@
 
   MojoResult WriteData(const void* elements,
                        uint32_t* num_bytes,
-                       MojoWriteDataFlags flags) override {
+                       const MojoWriteDataOptions& options) override {
     info_->IncrementWriteDataCallCount();
     return MOJO_RESULT_UNIMPLEMENTED;
   }
 
   MojoResult BeginWriteData(void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags) override {
+                            uint32_t* buffer_num_bytes) override {
     info_->IncrementBeginWriteDataCallCount();
     return MOJO_RESULT_UNIMPLEMENTED;
   }
@@ -72,16 +70,15 @@
     return MOJO_RESULT_UNIMPLEMENTED;
   }
 
-  MojoResult ReadData(void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags) override {
+  MojoResult ReadData(const MojoReadDataOptions& options,
+                      void* elements,
+                      uint32_t* num_bytes) override {
     info_->IncrementReadDataCallCount();
     return MOJO_RESULT_UNIMPLEMENTED;
   }
 
   MojoResult BeginReadData(const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags) override {
+                           uint32_t* buffer_num_bytes) override {
     info_->IncrementBeginReadDataCallCount();
     return MOJO_RESULT_UNIMPLEMENTED;
   }
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc
index 7fe7ba0..a35208b 100644
--- a/mojo/edk/system/core_unittest.cc
+++ b/mojo/edk/system/core_unittest.cc
@@ -51,46 +51,41 @@
   ASSERT_EQ(0u, info.GetWriteMessageCallCount());
   MojoMessageHandle message;
   ASSERT_EQ(MOJO_RESULT_OK, core()->CreateMessage(nullptr, &message));
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h, message, MOJO_WRITE_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->WriteMessage(h, message, nullptr));
   ASSERT_EQ(1u, info.GetWriteMessageCallCount());
 
   ASSERT_EQ(0u, info.GetReadMessageCallCount());
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(h, &message, MOJO_READ_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadMessage(h, nullptr, &message));
   ASSERT_EQ(1u, info.GetReadMessageCallCount());
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(h, &message, MOJO_READ_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadMessage(h, nullptr, &message));
   ASSERT_EQ(2u, info.GetReadMessageCallCount());
 
   ASSERT_EQ(0u, info.GetWriteDataCallCount());
   ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->WriteData(h, nullptr, nullptr, MOJO_WRITE_DATA_FLAG_NONE));
+            core()->WriteData(h, nullptr, nullptr, nullptr));
   ASSERT_EQ(1u, info.GetWriteDataCallCount());
 
   ASSERT_EQ(0u, info.GetBeginWriteDataCallCount());
-  ASSERT_EQ(
-      MOJO_RESULT_UNIMPLEMENTED,
-      core()->BeginWriteData(h, nullptr, nullptr, MOJO_WRITE_DATA_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
+            core()->BeginWriteData(h, nullptr, nullptr, nullptr));
   ASSERT_EQ(1u, info.GetBeginWriteDataCallCount());
 
   ASSERT_EQ(0u, info.GetEndWriteDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndWriteData(h, 0));
+  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndWriteData(h, 0, nullptr));
   ASSERT_EQ(1u, info.GetEndWriteDataCallCount());
 
   ASSERT_EQ(0u, info.GetReadDataCallCount());
   ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->ReadData(h, nullptr, nullptr, MOJO_READ_DATA_FLAG_NONE));
+            core()->ReadData(h, nullptr, nullptr, nullptr));
   ASSERT_EQ(1u, info.GetReadDataCallCount());
 
   ASSERT_EQ(0u, info.GetBeginReadDataCallCount());
-  ASSERT_EQ(
-      MOJO_RESULT_UNIMPLEMENTED,
-      core()->BeginReadData(h, nullptr, nullptr, MOJO_READ_DATA_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
+            core()->BeginReadData(h, nullptr, nullptr, nullptr));
   ASSERT_EQ(1u, info.GetBeginReadDataCallCount());
 
   ASSERT_EQ(0u, info.GetEndReadDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0));
+  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0, nullptr));
   ASSERT_EQ(1u, info.GetEndReadDataCallCount());
 
   ASSERT_EQ(0u, info.GetDtorCallCount());
@@ -122,23 +117,20 @@
   // |WriteMessageNew()|:
   // Only check arguments checked by |Core|, namely |handle|, |handles|, and
   // |num_handles|.
-  {
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->WriteMessage(MOJO_HANDLE_INVALID, 0,
-                                   MOJO_WRITE_MESSAGE_FLAG_NONE));
-  }
+  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
+            core()->WriteMessage(MOJO_HANDLE_INVALID, 0, nullptr));
 
   // |ReadMessageNew()|:
   // Only check arguments checked by |Core|, namely |handle|, |handles|, and
   // |num_handles|.
   {
     ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->ReadMessage(MOJO_HANDLE_INVALID, nullptr,
-                                  MOJO_READ_MESSAGE_FLAG_NONE));
+              core()->ReadMessage(MOJO_HANDLE_INVALID, nullptr, nullptr));
+
     MockHandleInfo info;
     MojoHandle h = CreateMockHandle(&info);
     ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->ReadMessage(h, nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
+              core()->ReadMessage(h, nullptr, nullptr));
     // Checked by |Core|, shouldn't go through to the dispatcher.
     ASSERT_EQ(0u, info.GetReadMessageCallCount());
     ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
@@ -168,7 +160,7 @@
   // Try to read anyway.
   MojoMessageHandle message;
   ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            core()->ReadMessage(h[0], &message, MOJO_READ_MESSAGE_FLAG_NONE));
+            core()->ReadMessage(h[0], nullptr, &message));
 
   // Write to |h[1]|.
   const uintptr_t kTestMessageContext = 123;
@@ -176,16 +168,14 @@
   ASSERT_EQ(MOJO_RESULT_OK,
             core()->SetMessageContext(message, kTestMessageContext, nullptr,
                                       nullptr, nullptr));
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h[1], message, MOJO_WRITE_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->WriteMessage(h[1], message, nullptr));
 
   // Wait for |h[0]| to become readable.
   EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h[0]),
                                        MOJO_HANDLE_SIGNAL_READABLE, &hss[0]));
 
   // Read from |h[0]|.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(h[0], &message, MOJO_READ_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadMessage(h[0], nullptr, &message));
   uintptr_t context;
   ASSERT_EQ(MOJO_RESULT_OK,
             core()->GetMessageContext(message, nullptr, &context));
@@ -205,8 +195,7 @@
   ASSERT_EQ(MOJO_RESULT_OK,
             core()->SetMessageContext(message, kTestMessageContext, nullptr,
                                       nullptr, nullptr));
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h[0], message, MOJO_WRITE_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->WriteMessage(h[0], message, nullptr));
 
   // Close |h[0]|.
   ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
@@ -229,8 +218,7 @@
             hss[1].satisfiable_signals);
 
   // Discard a message from |h[1]|.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(h[1], &message, MOJO_READ_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadMessage(h[1], nullptr, &message));
   ASSERT_EQ(MOJO_RESULT_OK, core()->DestroyMessage(message));
 
   // |h[1]| is no longer readable (and will never be).
@@ -245,7 +233,7 @@
             core()->SetMessageContext(message, kTestMessageContext, nullptr,
                                       nullptr, nullptr));
   ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            core()->WriteMessage(h[1], message, MOJO_WRITE_MESSAGE_FLAG_NONE));
+            core()->WriteMessage(h[1], message, nullptr));
 
   ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
 }
@@ -264,8 +252,8 @@
   ASSERT_EQ(MOJO_RESULT_OK,
             core()->SetMessageContext(message, kTestMessageContext, nullptr,
                                       nullptr, nullptr));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->WriteMessage(h_passing[0], message,
-                                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK,
+            core()->WriteMessage(h_passing[0], message, nullptr));
   hss = kEmptyMojoHandleSignalsState;
   EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
                                        MOJO_HANDLE_SIGNAL_READABLE, &hss));
@@ -273,8 +261,8 @@
             hss.satisfied_signals);
   ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
   MojoMessageHandle message_handle;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadMessage(h_passing[1], &message_handle,
-                                                MOJO_READ_MESSAGE_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK,
+            core()->ReadMessage(h_passing[1], nullptr, &message_handle));
   uintptr_t context;
   ASSERT_EQ(MOJO_RESULT_OK,
             core()->GetMessageContext(message_handle, nullptr, &context));
@@ -317,8 +305,8 @@
   // Write.
   signed char elements[2] = {'A', 'B'};
   uint32_t num_bytes = 2u;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->WriteData(ph, elements, &num_bytes,
-                                              MOJO_WRITE_DATA_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK,
+            core()->WriteData(ph, elements, &num_bytes, nullptr));
   ASSERT_EQ(2u, num_bytes);
 
   // Wait for the data to arrive to the consumer.
@@ -339,9 +327,11 @@
   elements[0] = -1;
   elements[1] = -1;
   num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, elements, &num_bytes,
-                                             MOJO_READ_DATA_FLAG_NONE |
-                                                 MOJO_READ_DATA_FLAG_PEEK));
+  MojoReadDataOptions read_options;
+  read_options.struct_size = sizeof(read_options);
+  read_options.flags = MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_PEEK;
+  ASSERT_EQ(MOJO_RESULT_OK,
+            core()->ReadData(ch, &read_options, elements, &num_bytes));
   ASSERT_EQ('A', elements[0]);
   ASSERT_EQ(-1, elements[1]);
 
@@ -349,30 +339,31 @@
   elements[0] = -1;
   elements[1] = -1;
   num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, elements, &num_bytes,
-                                             MOJO_READ_DATA_FLAG_NONE));
+  read_options.flags = MOJO_READ_DATA_FLAG_NONE;
+  ASSERT_EQ(MOJO_RESULT_OK,
+            core()->ReadData(ch, &read_options, elements, &num_bytes));
   ASSERT_EQ('A', elements[0]);
   ASSERT_EQ(-1, elements[1]);
 
   // Two-phase write.
   void* write_ptr = nullptr;
   num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->BeginWriteData(ph, &write_ptr, &num_bytes,
-                                                   MOJO_WRITE_DATA_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK,
+            core()->BeginWriteData(ph, nullptr, &write_ptr, &num_bytes));
   // We count on the default options providing a decent buffer size.
   ASSERT_GE(num_bytes, 3u);
 
   // Trying to do a normal write during a two-phase write should fail.
   elements[0] = 'X';
   num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_BUSY, core()->WriteData(ph, elements, &num_bytes,
-                                                MOJO_WRITE_DATA_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_BUSY,
+            core()->WriteData(ph, elements, &num_bytes, nullptr));
 
   // Actually write the data, and complete it now.
   static_cast<char*>(write_ptr)[0] = 'C';
   static_cast<char*>(write_ptr)[1] = 'D';
   static_cast<char*>(write_ptr)[2] = 'E';
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u, nullptr));
 
   // Wait for the data to arrive to the consumer.
   ASSERT_EQ(MOJO_RESULT_OK,
@@ -380,73 +371,61 @@
 
   // Query how much data we have.
   num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, nullptr, &num_bytes,
-                                             MOJO_READ_DATA_FLAG_QUERY));
+  read_options.flags = MOJO_READ_DATA_FLAG_QUERY;
+  ASSERT_EQ(MOJO_RESULT_OK,
+            core()->ReadData(ch, &read_options, nullptr, &num_bytes));
   ASSERT_GE(num_bytes, 1u);
 
   // Try to query with peek. Should fail.
   num_bytes = 0;
-  ASSERT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      core()->ReadData(ch, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK));
+  read_options.flags = MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK;
+  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
+            core()->ReadData(ch, &read_options, nullptr, &num_bytes));
   ASSERT_EQ(0u, num_bytes);
 
   // Try to discard ten characters, in all-or-none mode. Should fail.
   num_bytes = 10;
+  read_options.flags =
+      MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE;
   ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            core()->ReadData(
-                ch, nullptr, &num_bytes,
-                MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
+            core()->ReadData(ch, &read_options, nullptr, &num_bytes));
 
   // Try to discard two characters, in peek mode. Should fail.
   num_bytes = 2;
-  ASSERT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      core()->ReadData(ch, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK));
+  read_options.flags = MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK;
+  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
+            core()->ReadData(ch, &read_options, nullptr, &num_bytes));
 
   // Discard a character.
   num_bytes = 1;
+  read_options.flags =
+      MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE;
   ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(
-                ch, nullptr, &num_bytes,
-                MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
+            core()->ReadData(ch, &read_options, nullptr, &num_bytes));
 
   // Ensure the 3 bytes were read.
   ASSERT_EQ(MOJO_RESULT_OK,
             mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
 
-  // Try a two-phase read of the remaining three bytes with peek. Should fail.
+  // Read the remaining three characters, in two-phase mode.
   const void* read_ptr = nullptr;
   num_bytes = 3;
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_PEEK));
-
-  // Try a two-phase read of the remaining two bytes with all-or-none. Should
-  // fail.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // Read the remaining three characters, in two-phase mode.
-  num_bytes = 3;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                                  MOJO_READ_DATA_FLAG_NONE));
+  ASSERT_EQ(MOJO_RESULT_OK,
+            core()->BeginReadData(ch, nullptr, &read_ptr, &num_bytes));
   // Note: Count on still being able to do the contiguous read here.
   ASSERT_EQ(3u, num_bytes);
 
   // Discarding right now should fail.
   num_bytes = 1;
-  ASSERT_EQ(MOJO_RESULT_BUSY, core()->ReadData(ch, nullptr, &num_bytes,
-                                               MOJO_READ_DATA_FLAG_DISCARD));
+  read_options.flags = MOJO_READ_DATA_FLAG_DISCARD;
+  ASSERT_EQ(MOJO_RESULT_BUSY,
+            core()->ReadData(ch, &read_options, nullptr, &num_bytes));
 
   // Actually check our data and end the two-phase read.
   ASSERT_EQ('C', static_cast<const char*>(read_ptr)[0]);
   ASSERT_EQ('D', static_cast<const char*>(read_ptr)[1]);
   ASSERT_EQ('E', static_cast<const char*>(read_ptr)[2]);
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 3u));
+  ASSERT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 3u, nullptr));
 
   // Consumer should now be no longer readable.
   hss = kFullMojoHandleSignalsState;
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.cc b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
index f64cbe5..0622c9d 100644
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.cc
+++ b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
@@ -96,9 +96,10 @@
   return CloseNoLock();
 }
 
-MojoResult DataPipeConsumerDispatcher::ReadData(void* elements,
-                                                uint32_t* num_bytes,
-                                                MojoReadDataFlags flags) {
+MojoResult DataPipeConsumerDispatcher::ReadData(
+    const MojoReadDataOptions& options,
+    void* elements,
+    uint32_t* num_bytes) {
   base::AutoLock lock(lock_);
 
   if (!shared_ring_buffer_.IsValid() || in_transit_)
@@ -110,11 +111,11 @@
   const bool had_new_data = new_data_available_;
   new_data_available_ = false;
 
-  if ((flags & MOJO_READ_DATA_FLAG_QUERY)) {
-    if ((flags & MOJO_READ_DATA_FLAG_PEEK) ||
-        (flags & MOJO_READ_DATA_FLAG_DISCARD))
+  if ((options.flags & MOJO_READ_DATA_FLAG_QUERY)) {
+    if ((options.flags & MOJO_READ_DATA_FLAG_PEEK) ||
+        (options.flags & MOJO_READ_DATA_FLAG_DISCARD))
       return MOJO_RESULT_INVALID_ARGUMENT;
-    DCHECK(!(flags & MOJO_READ_DATA_FLAG_DISCARD));  // Handled above.
+    DCHECK(!(options.flags & MOJO_READ_DATA_FLAG_DISCARD));  // Handled above.
     DVLOG_IF(2, elements) << "Query mode: ignoring non-null |elements|";
     *num_bytes = static_cast<uint32_t>(bytes_available_);
 
@@ -124,9 +125,9 @@
   }
 
   bool discard = false;
-  if ((flags & MOJO_READ_DATA_FLAG_DISCARD)) {
+  if ((options.flags & MOJO_READ_DATA_FLAG_DISCARD)) {
     // These flags are mutally exclusive.
-    if (flags & MOJO_READ_DATA_FLAG_PEEK)
+    if (options.flags & MOJO_READ_DATA_FLAG_PEEK)
       return MOJO_RESULT_INVALID_ARGUMENT;
     DVLOG_IF(2, elements) << "Discard mode: ignoring non-null |elements|";
     discard = true;
@@ -136,7 +137,7 @@
   if (max_num_bytes_to_read % options_.element_num_bytes != 0)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  bool all_or_none = flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE;
+  bool all_or_none = options.flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE;
   uint32_t min_num_bytes_to_read = all_or_none ? max_num_bytes_to_read : 0;
 
   if (min_num_bytes_to_read > bytes_available_) {
@@ -173,7 +174,7 @@
   }
   *num_bytes = bytes_to_read;
 
-  bool peek = !!(flags & MOJO_READ_DATA_FLAG_PEEK);
+  bool peek = !!(options.flags & MOJO_READ_DATA_FLAG_PEEK);
   if (discard || !peek) {
     read_offset_ = (read_offset_ + bytes_to_read) % options_.capacity_num_bytes;
     bytes_available_ -= bytes_to_read;
@@ -189,9 +190,9 @@
   return MOJO_RESULT_OK;
 }
 
-MojoResult DataPipeConsumerDispatcher::BeginReadData(const void** buffer,
-                                                     uint32_t* buffer_num_bytes,
-                                                     MojoReadDataFlags flags) {
+MojoResult DataPipeConsumerDispatcher::BeginReadData(
+    const void** buffer,
+    uint32_t* buffer_num_bytes) {
   base::AutoLock lock(lock_);
   if (!shared_ring_buffer_.IsValid() || in_transit_)
     return MOJO_RESULT_INVALID_ARGUMENT;
@@ -199,13 +200,6 @@
   if (in_two_phase_read_)
     return MOJO_RESULT_BUSY;
 
-  // These flags may not be used in two-phase mode.
-  if ((flags & MOJO_READ_DATA_FLAG_DISCARD) ||
-      (flags & MOJO_READ_DATA_FLAG_QUERY) ||
-      (flags & MOJO_READ_DATA_FLAG_PEEK) ||
-      (flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
   const bool had_new_data = new_data_available_;
   new_data_available_ = false;
 
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.h b/mojo/edk/system/data_pipe_consumer_dispatcher.h
index 4c8d70cd..7d653b2 100644
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.h
+++ b/mojo/edk/system/data_pipe_consumer_dispatcher.h
@@ -42,12 +42,11 @@
   // Dispatcher:
   Type GetType() const override;
   MojoResult Close() override;
-  MojoResult ReadData(void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags) override;
+  MojoResult ReadData(const MojoReadDataOptions& validated_options,
+                      void* elements,
+                      uint32_t* num_bytes) override;
   MojoResult BeginReadData(const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags) override;
+                           uint32_t* buffer_num_bytes) override;
   MojoResult EndReadData(uint32_t num_bytes_read) override;
   HandleSignalsState GetHandleSignalsState() const override;
   MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.cc b/mojo/edk/system/data_pipe_producer_dispatcher.cc
index b9d8ae4e..0e73274 100644
--- a/mojo/edk/system/data_pipe_producer_dispatcher.cc
+++ b/mojo/edk/system/data_pipe_producer_dispatcher.cc
@@ -95,9 +95,10 @@
   return CloseNoLock();
 }
 
-MojoResult DataPipeProducerDispatcher::WriteData(const void* elements,
-                                                 uint32_t* num_bytes,
-                                                 MojoWriteDataFlags flags) {
+MojoResult DataPipeProducerDispatcher::WriteData(
+    const void* elements,
+    uint32_t* num_bytes,
+    const MojoWriteDataOptions& options) {
   base::AutoLock lock(lock_);
   if (!shared_ring_buffer_.IsValid() || in_transit_)
     return MOJO_RESULT_INVALID_ARGUMENT;
@@ -113,7 +114,7 @@
   if (*num_bytes == 0)
     return MOJO_RESULT_OK;  // Nothing to do.
 
-  if ((flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE) &&
+  if ((options.flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE) &&
       (*num_bytes > available_capacity_)) {
     // Don't return "should wait" since you can't wait for a specified amount of
     // data.
@@ -159,16 +160,11 @@
 
 MojoResult DataPipeProducerDispatcher::BeginWriteData(
     void** buffer,
-    uint32_t* buffer_num_bytes,
-    MojoWriteDataFlags flags) {
+    uint32_t* buffer_num_bytes) {
   base::AutoLock lock(lock_);
   if (!shared_ring_buffer_.IsValid() || in_transit_)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  // These flags may not be used in two-phase mode.
-  if (flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
   if (in_two_phase_write_)
     return MOJO_RESULT_BUSY;
   if (peer_closed_)
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.h b/mojo/edk/system/data_pipe_producer_dispatcher.h
index 6349772a..a7d220a9 100644
--- a/mojo/edk/system/data_pipe_producer_dispatcher.h
+++ b/mojo/edk/system/data_pipe_producer_dispatcher.h
@@ -44,10 +44,8 @@
   MojoResult Close() override;
   MojoResult WriteData(const void* elements,
                        uint32_t* num_bytes,
-                       MojoReadDataFlags flags) override;
-  MojoResult BeginWriteData(void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags) override;
+                       const MojoWriteDataOptions& options) override;
+  MojoResult BeginWriteData(void** buffer, uint32_t* buffer_num_bytes) override;
   MojoResult EndWriteData(uint32_t num_bytes_written) override;
   HandleSignalsState GetHandleSignalsState() const override;
   MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
diff --git a/mojo/edk/system/data_pipe_unittest.cc b/mojo/edk/system/data_pipe_unittest.cc
index a8a65f85..dbee3ed 100644
--- a/mojo/edk/system/data_pipe_unittest.cc
+++ b/mojo/edk/system/data_pipe_unittest.cc
@@ -80,9 +80,11 @@
   MojoResult WriteData(const void* elements,
                        uint32_t* num_bytes,
                        bool all_or_none = false) {
-    return MojoWriteData(producer_, elements, num_bytes,
-                         all_or_none ? MOJO_WRITE_DATA_FLAG_ALL_OR_NONE
-                                     : MOJO_WRITE_DATA_FLAG_NONE);
+    MojoWriteDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = all_or_none ? MOJO_WRITE_DATA_FLAG_ALL_OR_NONE
+                                : MOJO_WRITE_DATA_FLAG_NONE;
+    return MojoWriteData(producer_, elements, num_bytes, &options);
   }
 
   MojoResult ReadData(void* elements,
@@ -94,41 +96,44 @@
       flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
     if (peek)
       flags |= MOJO_READ_DATA_FLAG_PEEK;
-    return MojoReadData(consumer_, elements, num_bytes, flags);
+
+    MojoReadDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = flags;
+    return MojoReadData(consumer_, &options, elements, num_bytes);
   }
 
   MojoResult QueryData(uint32_t* num_bytes) {
-    return MojoReadData(consumer_, nullptr, num_bytes,
-                        MOJO_READ_DATA_FLAG_QUERY);
+    MojoReadDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = MOJO_READ_DATA_FLAG_QUERY;
+    return MojoReadData(consumer_, &options, nullptr, num_bytes);
   }
 
   MojoResult DiscardData(uint32_t* num_bytes, bool all_or_none = false) {
     MojoReadDataFlags flags = MOJO_READ_DATA_FLAG_DISCARD;
     if (all_or_none)
       flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-    return MojoReadData(consumer_, nullptr, num_bytes, flags);
+    MojoReadDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = flags;
+    return MojoReadData(consumer_, &options, nullptr, num_bytes);
   }
 
   MojoResult BeginReadData(const void** elements, uint32_t* num_bytes) {
-    return MojoBeginReadData(consumer_, elements, num_bytes,
-                             MOJO_READ_DATA_FLAG_NONE);
+    return MojoBeginReadData(consumer_, nullptr, elements, num_bytes);
   }
 
   MojoResult EndReadData(uint32_t num_bytes_read) {
-    return MojoEndReadData(consumer_, num_bytes_read);
+    return MojoEndReadData(consumer_, num_bytes_read, nullptr);
   }
 
-  MojoResult BeginWriteData(void** elements,
-                            uint32_t* num_bytes,
-                            bool all_or_none = false) {
-    MojoReadDataFlags flags = MOJO_WRITE_DATA_FLAG_NONE;
-    if (all_or_none)
-      flags |= MOJO_WRITE_DATA_FLAG_ALL_OR_NONE;
-    return MojoBeginWriteData(producer_, elements, num_bytes, flags);
+  MojoResult BeginWriteData(void** elements, uint32_t* num_bytes) {
+    return MojoBeginWriteData(producer_, nullptr, elements, num_bytes);
   }
 
   MojoResult EndWriteData(uint32_t num_bytes_written) {
-    return MojoEndWriteData(producer_, num_bytes_written);
+    return MojoEndWriteData(producer_, num_bytes_written, nullptr);
   }
 
   MojoResult CloseProducer() {
@@ -151,10 +156,10 @@
 
 TEST_F(DataPipeTest, Basic) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      1000 * sizeof(int32_t)                   // |capacity_num_bytes|.
   };
 
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
@@ -191,20 +196,20 @@
       // Default options.
       {},
       // Trivial element size, non-default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       1,                                        // |element_num_bytes|.
-       1000},                                    // |capacity_num_bytes|.
+      {kSizeOfOptions,                   // |struct_size|.
+       MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+       1,                                // |element_num_bytes|.
+       1000},                            // |capacity_num_bytes|.
       // Nontrivial element size, non-default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       4,                                        // |element_num_bytes|.
-       4000},                                    // |capacity_num_bytes|.
+      {kSizeOfOptions,                   // |struct_size|.
+       MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+       4,                                // |element_num_bytes|.
+       4000},                            // |capacity_num_bytes|.
       // Nontrivial element size, default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       100,                                      // |element_num_bytes|.
-       0}                                        // |capacity_num_bytes|.
+      {kSizeOfOptions,                   // |struct_size|.
+       MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+       100,                              // |element_num_bytes|.
+       0}                                // |capacity_num_bytes|.
   };
   for (size_t i = 0; i < arraysize(test_options); i++) {
     MojoHandle producer_handle, consumer_handle;
@@ -218,10 +223,10 @@
 
 TEST_F(DataPipeTest, SimpleReadWrite) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      1000 * sizeof(int32_t)                   // |capacity_num_bytes|.
   };
 
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
@@ -337,10 +342,10 @@
   // the API.
 
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      2 * sizeof(int32_t)                      // |capacity_num_bytes|.
   };
   Create(&options);
   MojoHandleSignalsState hss;
@@ -427,10 +432,10 @@
 
 TEST_F(DataPipeTest, PeerClosedProducerWaiting) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      2 * sizeof(int32_t)                      // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -448,10 +453,10 @@
 
 TEST_F(DataPipeTest, PeerClosedConsumerWaiting) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      2 * sizeof(int32_t)                      // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -469,10 +474,10 @@
 
 TEST_F(DataPipeTest, BasicConsumerWaiting) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      1000 * sizeof(int32_t)                   // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -604,13 +609,13 @@
 }
 
 TEST_F(DataPipeTest, ConsumerNewDataReadable) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
+  const MojoCreateDataPipeOptions create_options = {
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      1000 * sizeof(int32_t)                   // |capacity_num_bytes|.
   };
-  EXPECT_EQ(MOJO_RESULT_OK, Create(&options));
+  EXPECT_EQ(MOJO_RESULT_OK, Create(&create_options));
 
   int32_t elements[2] = {123, 456};
   uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
@@ -625,9 +630,12 @@
   // Now try to read a minimum of 6 elements.
   int32_t read_elements[6];
   uint32_t num_read_bytes = sizeof(read_elements);
-  EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            MojoReadData(consumer_, read_elements, &num_read_bytes,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
+  MojoReadDataOptions read_options;
+  read_options.struct_size = sizeof(read_options);
+  read_options.flags = MOJO_READ_DATA_FLAG_ALL_OR_NONE;
+  EXPECT_EQ(
+      MOJO_RESULT_OUT_OF_RANGE,
+      MojoReadData(consumer_, &read_options, read_elements, &num_read_bytes));
 
   // The consumer should still appear to be readable but not with new data.
   EXPECT_TRUE(GetSignalsState(consumer_).satisfied_signals &
@@ -644,9 +652,8 @@
             WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE));
 
   // Try again to read a minimum of 6 elements. Should succeed this time.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadData(consumer_, read_elements, &num_read_bytes,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(consumer_, &read_options,
+                                         read_elements, &num_read_bytes));
 
   // And now the consumer is unreadable.
   EXPECT_FALSE(GetSignalsState(consumer_).satisfied_signals &
@@ -659,10 +666,10 @@
 // consumer waiter.
 TEST_F(DataPipeTest, ConsumerWaitingTwoPhase) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      1000 * sizeof(int32_t)                   // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -672,7 +679,7 @@
   void* buffer = nullptr;
   // Request room for three (but we'll only write two).
   uint32_t num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&buffer, &num_bytes, false));
+  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&buffer, &num_bytes));
   EXPECT_TRUE(buffer);
   EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0])));
   elements = static_cast<int32_t*>(buffer);
@@ -736,10 +743,10 @@
 // Tests that data pipes aren't writable/readable during two-phase writes/reads.
 TEST_F(DataPipeTest, BasicTwoPhaseWaiting) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      1000 * sizeof(int32_t)                   // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -856,10 +863,10 @@
 
 TEST_F(DataPipeTest, AllOrNone) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      10 * sizeof(int32_t)                      // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      10 * sizeof(int32_t)                     // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -1026,10 +1033,10 @@
     test_data[i] = static_cast<unsigned char>(i);
 
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      100u                                      // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1u,                               // |element_num_bytes|.
+      100u                              // |capacity_num_bytes|.
   };
 
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
@@ -1060,8 +1067,7 @@
   // checks an implementation detail; this behavior is not guaranteed.)
   void* write_buffer_ptr = nullptr;
   num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginWriteData(&write_buffer_ptr, &num_bytes, false));
+  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_buffer_ptr, &num_bytes));
   EXPECT_TRUE(write_buffer_ptr);
   ASSERT_EQ(80u, num_bytes);
   ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(0));
@@ -1114,10 +1120,10 @@
   const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
 
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1u,                               // |element_num_bytes|.
+      1000u                             // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
 
@@ -1134,8 +1140,7 @@
   // Start two-phase write.
   void* write_buffer_ptr = nullptr;
   num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginWriteData(&write_buffer_ptr, &num_bytes, false));
+  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_buffer_ptr, &num_bytes));
   EXPECT_TRUE(write_buffer_ptr);
   EXPECT_GT(num_bytes, 0u);
 
@@ -1179,10 +1184,10 @@
   const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
 
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1u,                               // |element_num_bytes|.
+      1000u                             // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -1252,10 +1257,10 @@
   const uint32_t kTestDataSize = 15u;
 
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1u,                               // |element_num_bytes|.
+      1000u                             // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
 
@@ -1274,10 +1279,10 @@
   const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
 
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1u,                               // |element_num_bytes|.
+      1000u                             // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -1338,10 +1343,10 @@
   const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
 
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1u,                               // |element_num_bytes|.
+      1000u                             // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -1396,10 +1401,10 @@
 // arguments.
 TEST_F(DataPipeTest, TwoPhaseMoreInvalidArguments) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      10 * sizeof(int32_t)                      // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      10 * sizeof(int32_t)                     // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -1522,10 +1527,10 @@
   const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
 
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1u,                               // |element_num_bytes|.
+      1000u                             // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
   MojoHandleSignalsState hss;
@@ -1598,10 +1603,10 @@
 // peer.
 TEST_F(DataPipeTest, ConsumerWithClosedProducerSent) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
+      kSizeOfOptions,                          // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,         // |flags|.
+      static_cast<uint32_t>(sizeof(int32_t)),  // |element_num_bytes|.
+      1000 * sizeof(int32_t)                   // |capacity_num_bytes|.
   };
 
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
@@ -1659,8 +1664,8 @@
   for (size_t i = 0; i < kMaxPoll; i++) {
     // Write as much data as we can.
     uint32_t write_bytes = num_bytes;
-    MojoResult result = MojoWriteData(producer, elements, &write_bytes,
-                                      MOJO_WRITE_DATA_FLAG_NONE);
+    MojoResult result =
+        MojoWriteData(producer, elements, &write_bytes, nullptr);
     if (result == MOJO_RESULT_OK) {
       num_bytes -= write_bytes;
       elements = static_cast<const uint8_t*>(elements) + write_bytes;
@@ -1690,8 +1695,7 @@
   for (size_t i = 0; i < kMaxPoll; i++) {
     // Read as much data as we can.
     uint32_t read_bytes = num_bytes;
-    MojoResult result =
-        MojoReadData(consumer, elements, &read_bytes, MOJO_READ_DATA_FLAG_NONE);
+    MojoResult result = MojoReadData(consumer, nullptr, elements, &read_bytes);
     if (result == MOJO_RESULT_OK) {
       num_bytes -= read_bytes;
       elements = static_cast<uint8_t*>(elements) + read_bytes;
@@ -1699,8 +1703,10 @@
         if (expect_empty) {
           // Expect no more data.
           test::Sleep(test::TinyDeadline());
-          MojoReadData(consumer, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_QUERY);
+          MojoReadDataOptions options;
+          options.struct_size = sizeof(options);
+          options.flags = MOJO_READ_DATA_FLAG_QUERY;
+          MojoReadData(consumer, &options, nullptr, &num_bytes);
           EXPECT_EQ(0u, num_bytes);
         }
         return true;
@@ -1727,10 +1733,10 @@
   const uint32_t kTestDataSize =
       static_cast<uint32_t>(sizeof(kMultiprocessTestData));
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1,                                        // |element_num_bytes|.
-      kMultiprocessCapacity                     // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1,                                // |element_num_bytes|.
+      kMultiprocessCapacity             // |capacity_num_bytes|.
   };
   ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
 
@@ -1848,8 +1854,8 @@
 
   // Write some data to the producer and close it.
   uint32_t num_bytes = static_cast<uint32_t>(message.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(p, message.data(), &num_bytes,
-                                          MOJO_WRITE_DATA_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK,
+            MojoWriteData(p, message.data(), &num_bytes, nullptr));
   EXPECT_EQ(num_bytes, static_cast<uint32_t>(message.size()));
 
   // Close the producer before quitting.
@@ -1869,8 +1875,7 @@
   // Drain the consumer and expect to find the given message.
   uint32_t num_bytes = static_cast<uint32_t>(expected_message.size());
   std::vector<char> bytes(expected_message.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(c, bytes.data(), &num_bytes,
-                                         MOJO_READ_DATA_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(c, nullptr, bytes.data(), &num_bytes));
   EXPECT_EQ(num_bytes, static_cast<uint32_t>(bytes.size()));
 
   std::string message(bytes.data(), bytes.size());
@@ -1902,10 +1907,10 @@
 
 DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndWrite, DataPipeTest, h) {
   const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1,                                        // |element_num_bytes|.
-      kMultiprocessCapacity                     // |capacity_num_bytes|.
+      kSizeOfOptions,                   // |struct_size|.
+      MOJO_CREATE_DATA_PIPE_FLAG_NONE,  // |flags|.
+      1,                                // |element_num_bytes|.
+      kMultiprocessCapacity             // |capacity_num_bytes|.
   };
 
   MojoHandle p, c;
@@ -1916,8 +1921,8 @@
 
   // Write some data to the producer and close it.
   uint32_t num_bytes = static_cast<uint32_t>(kMessage.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(p, kMessage.data(), &num_bytes,
-                                          MOJO_WRITE_DATA_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK,
+            MojoWriteData(p, kMessage.data(), &num_bytes, nullptr));
   EXPECT_EQ(num_bytes, static_cast<uint32_t>(kMessage.size()));
   EXPECT_EQ(MOJO_RESULT_OK, MojoClose(p));
 
@@ -1936,8 +1941,8 @@
     // Drain the consumer and expect to find the given message.
     uint32_t num_bytes = static_cast<uint32_t>(expected_message.size());
     std::vector<char> bytes(expected_message.size());
-    EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(c, bytes.data(), &num_bytes,
-                                           MOJO_READ_DATA_FLAG_NONE));
+    EXPECT_EQ(MOJO_RESULT_OK,
+              MojoReadData(c, nullptr, bytes.data(), &num_bytes));
     EXPECT_EQ(num_bytes, static_cast<uint32_t>(bytes.size()));
 
     std::string message(bytes.data(), bytes.size());
@@ -1998,8 +2003,7 @@
   MojoResult result;
   do {
     uint32_t num_bytes = 0;
-    result = MojoWriteData(producers[2], nullptr, &num_bytes,
-                           MOJO_WRITE_DATA_FLAG_NONE);
+    result = MojoWriteData(producers[2], nullptr, &num_bytes, nullptr);
   } while (result == MOJO_RESULT_OK);
   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
 
@@ -2007,8 +2011,7 @@
   do {
     char byte;
     uint32_t num_bytes = 1;
-    result =
-        MojoReadData(consumers[2], &byte, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
+    result = MojoReadData(consumers[2], nullptr, &byte, &num_bytes);
   } while (result == MOJO_RESULT_SHOULD_WAIT);
   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
 
diff --git a/mojo/edk/system/dispatcher.cc b/mojo/edk/system/dispatcher.cc
index 305203b..8fc423c 100644
--- a/mojo/edk/system/dispatcher.cc
+++ b/mojo/edk/system/dispatcher.cc
@@ -42,8 +42,7 @@
 }
 
 MojoResult Dispatcher::WriteMessage(
-    std::unique_ptr<ports::UserMessageEvent> message,
-    MojoWriteMessageFlags flags) {
+    std::unique_ptr<ports::UserMessageEvent> message) {
   return MOJO_RESULT_INVALID_ARGUMENT;
 }
 
@@ -61,7 +60,6 @@
 MojoResult Dispatcher::MapBuffer(
     uint64_t offset,
     uint64_t num_bytes,
-    MojoMapBufferFlags flags,
     std::unique_ptr<PlatformSharedMemoryMapping>* mapping) {
   return MOJO_RESULT_INVALID_ARGUMENT;
 }
@@ -70,15 +68,14 @@
   return MOJO_RESULT_INVALID_ARGUMENT;
 }
 
-MojoResult Dispatcher::ReadData(void* elements,
-                                uint32_t* num_bytes,
-                                MojoReadDataFlags flags) {
+MojoResult Dispatcher::ReadData(const MojoReadDataOptions& options,
+                                void* elements,
+                                uint32_t* num_bytes) {
   return MOJO_RESULT_INVALID_ARGUMENT;
 }
 
 MojoResult Dispatcher::BeginReadData(const void** buffer,
-                                     uint32_t* buffer_num_bytes,
-                                     MojoReadDataFlags flags) {
+                                     uint32_t* buffer_num_bytes) {
   return MOJO_RESULT_INVALID_ARGUMENT;
 }
 
@@ -88,13 +85,12 @@
 
 MojoResult Dispatcher::WriteData(const void* elements,
                                  uint32_t* num_bytes,
-                                 MojoWriteDataFlags flags) {
+                                 const MojoWriteDataOptions& options) {
   return MOJO_RESULT_INVALID_ARGUMENT;
 }
 
 MojoResult Dispatcher::BeginWriteData(void** buffer,
-                                      uint32_t* buffer_num_bytes,
-                                      MojoWriteDataFlags flags) {
+                                      uint32_t* buffer_num_bytes) {
   return MOJO_RESULT_INVALID_ARGUMENT;
 }
 
diff --git a/mojo/edk/system/dispatcher.h b/mojo/edk/system/dispatcher.h
index 8198aac..1ac9788 100644
--- a/mojo/edk/system/dispatcher.h
+++ b/mojo/edk/system/dispatcher.h
@@ -85,8 +85,7 @@
   ///////////// Message pipe API /////////////
 
   virtual MojoResult WriteMessage(
-      std::unique_ptr<ports::UserMessageEvent> message,
-      MojoWriteMessageFlags flags);
+      std::unique_ptr<ports::UserMessageEvent> message);
 
   virtual MojoResult ReadMessage(
       std::unique_ptr<ports::UserMessageEvent>* message);
@@ -103,20 +102,18 @@
   virtual MojoResult MapBuffer(
       uint64_t offset,
       uint64_t num_bytes,
-      MojoMapBufferFlags flags,
       std::unique_ptr<PlatformSharedMemoryMapping>* mapping);
 
   virtual MojoResult GetBufferInfo(MojoSharedBufferInfo* info);
 
   ///////////// Data pipe consumer API /////////////
 
-  virtual MojoResult ReadData(void* elements,
-                              uint32_t* num_bytes,
-                              MojoReadDataFlags flags);
+  virtual MojoResult ReadData(const MojoReadDataOptions& options,
+                              void* elements,
+                              uint32_t* num_bytes);
 
   virtual MojoResult BeginReadData(const void** buffer,
-                                   uint32_t* buffer_num_bytes,
-                                   MojoReadDataFlags flags);
+                                   uint32_t* buffer_num_bytes);
 
   virtual MojoResult EndReadData(uint32_t num_bytes_read);
 
@@ -124,11 +121,9 @@
 
   virtual MojoResult WriteData(const void* elements,
                                uint32_t* num_bytes,
-                               MojoWriteDataFlags flags);
+                               const MojoWriteDataOptions& options);
 
-  virtual MojoResult BeginWriteData(void** buffer,
-                                    uint32_t* buffer_num_bytes,
-                                    MojoWriteDataFlags flags);
+  virtual MojoResult BeginWriteData(void** buffer, uint32_t* buffer_num_bytes);
 
   virtual MojoResult EndWriteData(uint32_t num_bytes_written);
 
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc
index a095ab4..e04ff28 100644
--- a/mojo/edk/system/message_pipe_dispatcher.cc
+++ b/mojo/edk/system/message_pipe_dispatcher.cc
@@ -136,8 +136,7 @@
 }
 
 MojoResult MessagePipeDispatcher::WriteMessage(
-    std::unique_ptr<ports::UserMessageEvent> message,
-    MojoWriteMessageFlags flags) {
+    std::unique_ptr<ports::UserMessageEvent> message) {
   if (port_closed_ || in_transit_)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
diff --git a/mojo/edk/system/message_pipe_dispatcher.h b/mojo/edk/system/message_pipe_dispatcher.h
index 141e845..d657c04 100644
--- a/mojo/edk/system/message_pipe_dispatcher.h
+++ b/mojo/edk/system/message_pipe_dispatcher.h
@@ -47,8 +47,8 @@
   // Dispatcher:
   Type GetType() const override;
   MojoResult Close() override;
-  MojoResult WriteMessage(std::unique_ptr<ports::UserMessageEvent> message,
-                          MojoWriteMessageFlags flags) override;
+  MojoResult WriteMessage(
+      std::unique_ptr<ports::UserMessageEvent> message) override;
   MojoResult ReadMessage(
       std::unique_ptr<ports::UserMessageEvent>* message) override;
   HandleSignalsState GetHandleSignalsState() const override;
diff --git a/mojo/edk/system/message_pipe_unittest.cc b/mojo/edk/system/message_pipe_unittest.cc
index 6ec0bfb0..2c15409 100644
--- a/mojo/edk/system/message_pipe_unittest.cc
+++ b/mojo/edk/system/message_pipe_unittest.cc
@@ -54,8 +54,8 @@
                          uint32_t* num_bytes,
                          bool may_discard = false) {
     MojoMessageHandle message_handle;
-    MojoResult rv = MojoReadMessage(message_pipe_handle, &message_handle,
-                                    MOJO_READ_MESSAGE_FLAG_NONE);
+    MojoResult rv =
+        MojoReadMessage(message_pipe_handle, nullptr, &message_handle);
     if (rv != MOJO_RESULT_OK)
       return rv;
 
@@ -376,7 +376,7 @@
 TEST_F(MessagePipeTest, SharedBufferHandlePingPong) {
   MojoHandle buffers[kPingPongHandlesPerIteration];
   for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i)
-    EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 1, &buffers[i]));
+    EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(1, nullptr, &buffers[i]));
 
   RunTestClient("HandlePingPong", [&](MojoHandle h) {
     for (size_t i = 0; i < kPingPongIterations; i++) {
@@ -398,7 +398,7 @@
   CreateMessagePipe(&a, &b);
   CreateMessagePipe(&c, &d);
 
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c, nullptr));
 
   // Handles b and c should be closed.
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
@@ -429,7 +429,7 @@
   WriteMessage(a, kTestMessage1);
   WriteMessage(d, kTestMessage2);
 
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c, nullptr));
 
   // Handles b and c should be closed.
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
@@ -450,7 +450,8 @@
   CreateMessagePipe(&c, &d);
 
   WriteMessage(b, "shouldn't have done that!");
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, MojoFuseMessagePipes(b, c));
+  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
+            MojoFuseMessagePipes(b, c, nullptr));
 
   // Handles b and c should be closed.
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
@@ -466,7 +467,8 @@
   MojoHandle a, b;
   CreateMessagePipe(&a, &b);
 
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, MojoFuseMessagePipes(a, b));
+  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
+            MojoFuseMessagePipes(a, b, nullptr));
 
   // Handles a and b should be closed.
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(a));
@@ -481,7 +483,7 @@
   EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
 
   // Can't fuse an invalid handle.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoFuseMessagePipes(b, c));
+  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoFuseMessagePipes(b, c, nullptr));
 
   // Handle c should be closed.
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
@@ -490,7 +492,7 @@
   MojoHandle e, f;
   CreateDataPipe(&e, &f, 16);
 
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoFuseMessagePipes(e, d));
+  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoFuseMessagePipes(e, d, nullptr));
 
   // Handles d and e should be closed.
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(d));
@@ -508,7 +510,7 @@
   CreateMessagePipe(&c, &d);
 
   EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c, nullptr));
 
   // Handles b and c should be closed.
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
@@ -530,7 +532,7 @@
   WriteMessage(a, kTestMessage);
   EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
 
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c, nullptr));
 
   // Handles b and c should be closed.
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
diff --git a/mojo/edk/system/message_unittest.cc b/mojo/edk/system/message_unittest.cc
index 8a3df87..9f722e64 100644
--- a/mojo/edk/system/message_unittest.cc
+++ b/mojo/edk/system/message_unittest.cc
@@ -193,15 +193,14 @@
 
   MojoHandle a, b;
   CreateMessagePipe(&a, &b);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(
-                a, TestMessageBase::MakeMessageHandle(std::move(message)),
-                MOJO_WRITE_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(
+      MOJO_RESULT_OK,
+      MojoWriteMessage(
+          a, TestMessageBase::MakeMessageHandle(std::move(message)), nullptr));
   EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
 
   MojoMessageHandle read_message_handle;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(b, &read_message_handle,
-                                            MOJO_READ_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(b, nullptr, &read_message_handle));
   message = TestMessageBase::UnwrapMessageHandle<NeverSerializedMessage>(
       &read_message_handle);
   EXPECT_EQ(original_message, message.get());
@@ -240,7 +239,7 @@
   RunTestClient("ReceiveMessageNoHandles", [&](MojoHandle h) {
     auto message = std::make_unique<SimpleMessage>(kTestMessageWithContext1);
     MojoWriteMessage(h, TestMessageBase::MakeMessageHandle(std::move(message)),
-                     MOJO_WRITE_MESSAGE_FLAG_NONE);
+                     nullptr);
   });
 }
 
@@ -264,7 +263,7 @@
 
     memcpy(buffer, kTestMessageWithContext1,
            sizeof(kTestMessageWithContext1) - 1);
-    MojoWriteMessage(h, message, MOJO_WRITE_MESSAGE_FLAG_NONE);
+    MojoWriteMessage(h, message, nullptr);
   });
 }
 
@@ -282,7 +281,7 @@
     mojo::MessagePipe pipe;
     message->AddMessagePipe(std::move(pipe.handle0));
     MojoWriteMessage(h, TestMessageBase::MakeMessageHandle(std::move(message)),
-                     MOJO_WRITE_MESSAGE_FLAG_NONE);
+                     nullptr);
     EXPECT_EQ(kTestMessageWithContext2,
               MojoTestBase::ReadMessage(pipe.handle1.get().value()));
   });
@@ -308,7 +307,7 @@
     message->AddMessagePipe(std::move(pipes[2].handle0));
     message->AddMessagePipe(std::move(pipes[3].handle0));
     MojoWriteMessage(h, TestMessageBase::MakeMessageHandle(std::move(message)),
-                     MOJO_WRITE_MESSAGE_FLAG_NONE);
+                     nullptr);
     EXPECT_EQ(kTestMessageWithContext1,
               MojoTestBase::ReadMessage(pipes[0].handle1.get().value()));
     EXPECT_EQ(kTestMessageWithContext2,
@@ -337,15 +336,14 @@
 
   MojoHandle a, b;
   CreateMessagePipe(&a, &b);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(
-                a, TestMessageBase::MakeMessageHandle(std::move(message)),
-                MOJO_WRITE_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(
+      MOJO_RESULT_OK,
+      MojoWriteMessage(
+          a, TestMessageBase::MakeMessageHandle(std::move(message)), nullptr));
   EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
 
   MojoMessageHandle read_message_handle;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(b, &read_message_handle,
-                                            MOJO_READ_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(b, nullptr, &read_message_handle));
   message =
       TestMessageBase::UnwrapMessageHandle<SimpleMessage>(&read_message_handle);
   EXPECT_EQ(original_message, message.get());
@@ -373,10 +371,10 @@
   message->AddMessagePipe(std::move(pipe.handle0));
   MojoHandle a, b;
   CreateMessagePipe(&a, &b);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(
-                a, TestMessageBase::MakeMessageHandle(std::move(message)),
-                MOJO_WRITE_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(
+      MOJO_RESULT_OK,
+      MojoWriteMessage(
+          a, TestMessageBase::MakeMessageHandle(std::move(message)), nullptr));
   MojoClose(a);
   MojoClose(b);
 
@@ -441,15 +439,14 @@
 
   MojoHandle a, b;
   CreateMessagePipe(&a, &b);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(
-                a, TestMessageBase::MakeMessageHandle(std::move(message)),
-                MOJO_WRITE_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(
+      MOJO_RESULT_OK,
+      MojoWriteMessage(
+          a, TestMessageBase::MakeMessageHandle(std::move(message)), nullptr));
   EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
 
   MojoMessageHandle message_handle;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(b, &message_handle, MOJO_READ_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(b, nullptr, &message_handle));
   EXPECT_FALSE(message_was_destroyed);
 
   // Not a serialized message, so we can't get serialized contents.
@@ -475,8 +472,7 @@
   EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
 
   MojoMessageHandle message_handle;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(b, &message_handle, MOJO_READ_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(b, nullptr, &message_handle));
   uintptr_t context;
   EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
             MojoGetMessageContext(message_handle, nullptr, &context));
@@ -569,13 +565,11 @@
   // message object from a pipe.
   MessagePipe pipe;
   EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(pipe.handle0->value(), message_handle,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
+            MojoWriteMessage(pipe.handle0->value(), message_handle, nullptr));
   EXPECT_EQ(MOJO_RESULT_OK,
             WaitForSignals(pipe.handle1->value(), MOJO_HANDLE_SIGNAL_READABLE));
   EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(pipe.handle1->value(), &message_handle,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
+            MojoReadMessage(pipe.handle1->value(), nullptr, &message_handle));
   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
             MojoSerializeMessage(message_handle, nullptr));
 
@@ -854,8 +848,7 @@
     // Send the message out of process to exercise the regression path where
     // internally cached, stale payload pointers may be dereferenced and written
     // into.
-    EXPECT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, message, MOJO_WRITE_MESSAGE_FLAG_NONE));
+    EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h, message, nullptr));
   });
 }
 
@@ -904,8 +897,7 @@
     // Send the message out of process to exercise the regression path where
     // internally cached, stale payload pointers may be dereferenced and written
     // into.
-    EXPECT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, message, MOJO_WRITE_MESSAGE_FLAG_NONE));
+    EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h, message, nullptr));
   });
 }
 
diff --git a/mojo/edk/system/multiprocess_message_pipe_unittest.cc b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
index 4835d569..162f29a5d 100644
--- a/mojo/edk/system/multiprocess_message_pipe_unittest.cc
+++ b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
@@ -284,9 +284,7 @@
 
   // Make a mapping.
   void* buffer;
-  CHECK_EQ(MojoMapBuffer(handles[0], 0, 100, &buffer,
-                         MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE),
-           MOJO_RESULT_OK);
+  CHECK_EQ(MojoMapBuffer(handles[0], 0, 100, nullptr, &buffer), MOJO_RESULT_OK);
 
   // Write some stuff to the shared buffer.
   static const char kHello[] = "hello";
@@ -333,11 +331,11 @@
     // Make a shared buffer.
     MojoCreateSharedBufferOptions options;
     options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_SHARED_BUFFER_FLAG_NONE;
 
     MojoHandle shared_buffer;
     ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateSharedBuffer(&options, 100, &shared_buffer));
+              MojoCreateSharedBuffer(100, &options, &shared_buffer));
     MojoSharedBufferInfo buffer_info;
     buffer_info.struct_size = sizeof(buffer_info);
     ASSERT_EQ(MOJO_RESULT_OK,
@@ -381,8 +379,7 @@
     // buffer.
     static const char kHello[] = "hello";
     void* buffer;
-    CHECK_EQ(MojoMapBuffer(shared_buffer, 0, 100, &buffer,
-                           MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE),
+    CHECK_EQ(MojoMapBuffer(shared_buffer, 0, 100, nullptr, &buffer),
              MOJO_RESULT_OK);
     ASSERT_EQ(0, memcmp(buffer, kHello, sizeof(kHello)));
 
@@ -561,7 +558,7 @@
   RunTestClient("CheckMessagePipe", [&](MojoHandle h) {
     MojoCreateSharedBufferOptions options;
     options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_SHARED_BUFFER_FLAG_NONE;
 
     MojoHandle mp1, mp2;
     ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &mp1, &mp2));
@@ -679,7 +676,7 @@
   RunTestClient("DataPipeConsumer", [&](MojoHandle h) {
     MojoCreateSharedBufferOptions options;
     options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_SHARED_BUFFER_FLAG_NONE;
 
     MojoHandle mp1, mp2;
     ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &mp2, &mp1));
@@ -1374,20 +1371,18 @@
       // Read a message from the pipe we sent to child1 and flag it as bad.
       ASSERT_EQ(MOJO_RESULT_OK, WaitForSignals(a, MOJO_HANDLE_SIGNAL_READABLE));
       MojoMessageHandle message;
-      ASSERT_EQ(MOJO_RESULT_OK,
-                ::MojoReadMessage(a, &message, MOJO_READ_MESSAGE_FLAG_NONE));
+      ASSERT_EQ(MOJO_RESULT_OK, ::MojoReadMessage(a, nullptr, &message));
       EXPECT_EQ(MOJO_RESULT_OK,
                 MojoNotifyBadMessage(message, kFirstErrorMessage.data(),
-                                     kFirstErrorMessage.size()));
+                                     kFirstErrorMessage.size(), nullptr));
       EXPECT_EQ(MOJO_RESULT_OK, MojoDestroyMessage(message));
 
       // Read a message from the pipe we sent to child2 and flag it as bad.
       ASSERT_EQ(MOJO_RESULT_OK, WaitForSignals(c, MOJO_HANDLE_SIGNAL_READABLE));
-      ASSERT_EQ(MOJO_RESULT_OK,
-                ::MojoReadMessage(c, &message, MOJO_READ_MESSAGE_FLAG_NONE));
+      ASSERT_EQ(MOJO_RESULT_OK, ::MojoReadMessage(c, nullptr, &message));
       EXPECT_EQ(MOJO_RESULT_OK,
                 MojoNotifyBadMessage(message, kSecondErrorMessage.data(),
-                                     kSecondErrorMessage.size()));
+                                     kSecondErrorMessage.size(), nullptr));
       EXPECT_EQ(MOJO_RESULT_OK, MojoDestroyMessage(message));
 
       WriteMessage(child2, "bye");
diff --git a/mojo/edk/system/shared_buffer_dispatcher.cc b/mojo/edk/system/shared_buffer_dispatcher.cc
index 1e5fb4c6..48871665 100644
--- a/mojo/edk/system/shared_buffer_dispatcher.cc
+++ b/mojo/edk/system/shared_buffer_dispatcher.cc
@@ -48,14 +48,14 @@
 const MojoCreateSharedBufferOptions
     SharedBufferDispatcher::kDefaultCreateOptions = {
         static_cast<uint32_t>(sizeof(MojoCreateSharedBufferOptions)),
-        MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
+        MOJO_CREATE_SHARED_BUFFER_FLAG_NONE};
 
 // static
 MojoResult SharedBufferDispatcher::ValidateCreateOptions(
     const MojoCreateSharedBufferOptions* in_options,
     MojoCreateSharedBufferOptions* out_options) {
-  const MojoCreateSharedBufferOptionsFlags kKnownFlags =
-      MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
+  const MojoCreateSharedBufferFlags kKnownFlags =
+      MOJO_CREATE_SHARED_BUFFER_FLAG_NONE;
 
   *out_options = kDefaultCreateOptions;
   if (!in_options)
@@ -200,8 +200,7 @@
   if (in_transit_)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  if ((validated_options.flags &
-       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY)) {
+  if ((validated_options.flags & MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY)) {
     // If a read-only duplicate is requested and this handle is not already
     // read-only, we need to make it read-only before duplicating. If it's
     // unsafe it can't be made read-only, and we must fail instead.
@@ -249,7 +248,6 @@
 MojoResult SharedBufferDispatcher::MapBuffer(
     uint64_t offset,
     uint64_t num_bytes,
-    MojoMapBufferFlags flags,
     std::unique_ptr<PlatformSharedMemoryMapping>* mapping) {
   if (offset > static_cast<uint64_t>(std::numeric_limits<size_t>::max()))
     return MOJO_RESULT_INVALID_ARGUMENT;
@@ -279,6 +277,7 @@
     return MOJO_RESULT_INVALID_ARGUMENT;
 
   base::AutoLock lock(lock_);
+  info->struct_size = sizeof(*info);
   info->size = region_.GetSize();
   return MOJO_RESULT_OK;
 }
@@ -354,11 +353,11 @@
 MojoResult SharedBufferDispatcher::ValidateDuplicateOptions(
     const MojoDuplicateBufferHandleOptions* in_options,
     MojoDuplicateBufferHandleOptions* out_options) {
-  const MojoDuplicateBufferHandleOptionsFlags kKnownFlags =
-      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
+  const MojoDuplicateBufferHandleFlags kKnownFlags =
+      MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY;
   static const MojoDuplicateBufferHandleOptions kDefaultOptions = {
       static_cast<uint32_t>(sizeof(MojoDuplicateBufferHandleOptions)),
-      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
+      MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_NONE};
 
   *out_options = kDefaultOptions;
   if (!in_options)
diff --git a/mojo/edk/system/shared_buffer_dispatcher.h b/mojo/edk/system/shared_buffer_dispatcher.h
index 1f2347c..0492f42 100644
--- a/mojo/edk/system/shared_buffer_dispatcher.h
+++ b/mojo/edk/system/shared_buffer_dispatcher.h
@@ -81,7 +81,6 @@
   MojoResult MapBuffer(
       uint64_t offset,
       uint64_t num_bytes,
-      MojoMapBufferFlags flags,
       std::unique_ptr<PlatformSharedMemoryMapping>* mapping) override;
   MojoResult GetBufferInfo(MojoSharedBufferInfo* info) override;
   void StartSerialize(uint32_t* num_bytes,
diff --git a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc b/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
index 5db89d3..768c7aa 100644
--- a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
+++ b/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
@@ -64,10 +64,10 @@
   }
 
   // Different flags.
-  MojoCreateSharedBufferOptionsFlags flags_values[] = {
-      MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
+  MojoCreateSharedBufferFlags flags_values[] = {
+      MOJO_CREATE_SHARED_BUFFER_FLAG_NONE};
   for (size_t i = 0; i < arraysize(flags_values); i++) {
-    const MojoCreateSharedBufferOptionsFlags flags = flags_values[i];
+    const MojoCreateSharedBufferFlags flags = flags_values[i];
 
     // Different capacities (size 1).
     for (uint32_t capacity = 1; capacity <= 100 * 1000 * 1000; capacity *= 10) {
@@ -90,8 +90,8 @@
   // Invalid |struct_size|.
   {
     MojoCreateSharedBufferOptions options = {
-        1,                                           // |struct_size|.
-        MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE  // |flags|.
+        1,                                   // |struct_size|.
+        MOJO_CREATE_SHARED_BUFFER_FLAG_NONE  // |flags|.
     };
     MojoCreateSharedBufferOptions unused;
     EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
@@ -122,8 +122,7 @@
 
   // Make a couple of mappings.
   std::unique_ptr<PlatformSharedMemoryMapping> mapping1;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping1));
+  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(0, 100, &mapping1));
   ASSERT_TRUE(mapping1);
   ASSERT_TRUE(mapping1->GetBase());
   EXPECT_EQ(100u, mapping1->GetLength());
@@ -131,8 +130,7 @@
   static_cast<char*>(mapping1->GetBase())[50] = 'x';
 
   std::unique_ptr<PlatformSharedMemoryMapping> mapping2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                50, 50, MOJO_MAP_BUFFER_FLAG_NONE, &mapping2));
+  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(50, 50, &mapping2));
   ASSERT_TRUE(mapping2);
   ASSERT_TRUE(mapping2->GetBase());
   EXPECT_EQ(50u, mapping2->GetLength());
@@ -161,8 +159,7 @@
 
   // Make a couple of mappings.
   std::unique_ptr<PlatformSharedMemoryMapping> mapping1;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping1));
+  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(0, 100, &mapping1));
   ASSERT_TRUE(mapping1);
   ASSERT_TRUE(mapping1->GetBase());
   EXPECT_EQ(100u, mapping1->GetLength());
@@ -170,8 +167,7 @@
   static_cast<char*>(mapping1->GetBase())[50] = 'x';
 
   std::unique_ptr<PlatformSharedMemoryMapping> mapping2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                50, 50, MOJO_MAP_BUFFER_FLAG_NONE, &mapping2));
+  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(50, 50, &mapping2));
   ASSERT_TRUE(mapping2);
   ASSERT_TRUE(mapping2->GetBase());
   EXPECT_EQ(50u, mapping2->GetLength());
@@ -193,8 +189,7 @@
 
   // Map and write something.
   std::unique_ptr<PlatformSharedMemoryMapping> mapping;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
+  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->MapBuffer(0, 100, &mapping));
   static_cast<char*>(mapping->GetBase())[0] = 'x';
   mapping.reset();
 
@@ -208,8 +203,7 @@
   EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
 
   // Map |dispatcher2| and read something.
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
+  EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->MapBuffer(0, 100, &mapping));
   EXPECT_EQ('x', static_cast<char*>(mapping->GetBase())[0]);
 
   EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close());
@@ -228,7 +222,7 @@
 
   MojoDuplicateBufferHandleOptions kReadOnlyOptions = {
       sizeof(MojoCreateSharedBufferOptions),
-      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY};
+      MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY};
 
   // NOTE: We forbid handles from being duplicated read-only after they've been
   // duplicated non-read-only; conversely we also forbid handles from being
@@ -243,7 +237,7 @@
   {
     std::unique_ptr<PlatformSharedMemoryMapping> mapping;
     EXPECT_EQ(MOJO_RESULT_OK,
-              writable_duped_dispatcher1->MapBuffer(0, 100, 0, &mapping));
+              writable_duped_dispatcher1->MapBuffer(0, 100, &mapping));
   }
   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
             dispatcher1->DuplicateBufferHandle(&kReadOnlyOptions,
@@ -261,7 +255,7 @@
   {
     std::unique_ptr<PlatformSharedMemoryMapping> mapping;
     EXPECT_EQ(MOJO_RESULT_OK,
-              read_only_duped_dispatcher2->MapBuffer(0, 100, 0, &mapping));
+              read_only_duped_dispatcher2->MapBuffer(0, 100, &mapping));
   }
   EXPECT_EQ(
       MOJO_RESULT_FAILED_PRECONDITION,
@@ -283,7 +277,7 @@
   // Invalid |struct_size|.
   {
     MojoDuplicateBufferHandleOptions options = {
-        1u, MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
+        1u, MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_NONE};
     scoped_refptr<Dispatcher> dispatcher2;
     EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
               dispatcher1->DuplicateBufferHandle(&options, &dispatcher2));
@@ -331,17 +325,15 @@
 
   std::unique_ptr<PlatformSharedMemoryMapping> mapping;
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            dispatcher->MapBuffer(0, info.size + 1, MOJO_MAP_BUFFER_FLAG_NONE,
-                                  &mapping));
-  EXPECT_FALSE(mapping);
-
-  EXPECT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      dispatcher->MapBuffer(1, info.size, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
+            dispatcher->MapBuffer(0, info.size + 1, &mapping));
   EXPECT_FALSE(mapping);
 
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            dispatcher->MapBuffer(0, 0, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
+            dispatcher->MapBuffer(1, info.size, &mapping));
+  EXPECT_FALSE(mapping);
+
+  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
+            dispatcher->MapBuffer(0, 0, &mapping));
   EXPECT_FALSE(mapping);
 
   EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
diff --git a/mojo/edk/system/signals_unittest.cc b/mojo/edk/system/signals_unittest.cc
index becba29..34f2105 100644
--- a/mojo/edk/system/signals_unittest.cc
+++ b/mojo/edk/system/signals_unittest.cc
@@ -159,7 +159,7 @@
     // And so should |c| after we fuse |d| to |a|.
     MojoHandle c, d;
     CreateMessagePipe(&c, &d);
-    EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(d, a));
+    EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(d, a, nullptr));
     EXPECT_EQ(MOJO_RESULT_OK,
               WaitForSignals(c, MOJO_HANDLE_SIGNAL_PEER_REMOTE,
                              MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED));
diff --git a/mojo/edk/system/trap_unittest.cc b/mojo/edk/system/trap_unittest.cc
index 3081a22..011f988 100644
--- a/mojo/edk/system/trap_unittest.cc
+++ b/mojo/edk/system/trap_unittest.cc
@@ -448,9 +448,11 @@
   // NEW_DATA_READABLE signal.
   char large_buffer[512];
   uint32_t large_read_size = 512;
+  MojoReadDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = MOJO_READ_DATA_FLAG_ALL_OR_NONE;
   EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            MojoReadData(consumer, large_buffer, &large_read_size,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
+            MojoReadData(consumer, &options, large_buffer, &large_read_size));
 
   // Attempt to arm again. Should succeed.
   EXPECT_EQ(MOJO_RESULT_OK,
@@ -1746,10 +1748,8 @@
   if (event->result == MOJO_RESULT_OK) {
     MojoHandle handle = static_cast<MojoHandle>(event->trigger_context);
     MojoMessageHandle message;
-    while (MojoReadMessage(handle, &message, MOJO_READ_MESSAGE_FLAG_NONE) ==
-           MOJO_RESULT_OK) {
+    while (MojoReadMessage(handle, nullptr, &message) == MOJO_RESULT_OK)
       MojoDestroyMessage(message);
-    }
   }
 
   constexpr size_t kNumRandomThingsToDoOnNotify = 5;
@@ -1780,7 +1780,7 @@
       ASSERT_EQ(MOJO_RESULT_OK,
                 MojoSetMessageContext(message, 1, nullptr, nullptr, nullptr));
       MojoWriteMessage(RandomHandle(watched_handles, num_watched_handles),
-                       message, MOJO_WRITE_MESSAGE_FLAG_NONE);
+                       message, nullptr);
       break;
     }
     case 5:
diff --git a/mojo/edk/test/mojo_test_base.cc b/mojo/edk/test/mojo_test_base.cc
index a5aa68f0..1f32d1ea 100644
--- a/mojo/edk/test/mojo_test_base.cc
+++ b/mojo/edk/test/mojo_test_base.cc
@@ -206,7 +206,7 @@
 // static
 MojoHandle MojoTestBase::CreateBuffer(uint64_t size) {
   MojoHandle h;
-  EXPECT_EQ(MojoCreateSharedBuffer(nullptr, size, &h), MOJO_RESULT_OK);
+  EXPECT_EQ(MojoCreateSharedBuffer(size, nullptr, &h), MOJO_RESULT_OK);
   return h;
 }
 
@@ -215,9 +215,9 @@
   MojoHandle new_handle;
   MojoDuplicateBufferHandleOptions options = {
       sizeof(MojoDuplicateBufferHandleOptions),
-      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
+      MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_NONE};
   if (read_only)
-    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
+    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY;
   EXPECT_EQ(MOJO_RESULT_OK,
             MojoDuplicateBufferHandle(h, &options, &new_handle));
   return new_handle;
@@ -228,9 +228,8 @@
                                  size_t offset,
                                  const base::StringPiece& s) {
   char* data;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h, offset, s.size(), reinterpret_cast<void**>(&data),
-                          MOJO_MAP_BUFFER_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoMapBuffer(h, offset, s.size(), nullptr,
+                                          reinterpret_cast<void**>(&data)));
   memcpy(data, s.data(), s.size());
   EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(static_cast<void*>(data)));
 }
@@ -240,9 +239,8 @@
                                         size_t offset,
                                         const base::StringPiece& s) {
   char* data;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h, offset, s.size(), reinterpret_cast<void**>(&data),
-                          MOJO_MAP_BUFFER_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoMapBuffer(h, offset, s.size(), nullptr,
+                                          reinterpret_cast<void**>(&data)));
   EXPECT_EQ(s, base::StringPiece(data, s.size()));
   EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(static_cast<void*>(data)));
 }
@@ -253,7 +251,7 @@
                                   size_t capacity) {
   MojoCreateDataPipeOptions options;
   options.struct_size = static_cast<uint32_t>(sizeof(options));
-  options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
   options.element_num_bytes = 1;
   options.capacity_num_bytes = static_cast<uint32_t>(capacity);
 
@@ -267,8 +265,10 @@
   CHECK_EQ(WaitForSignals(producer, MOJO_HANDLE_SIGNAL_WRITABLE),
            MOJO_RESULT_OK);
   uint32_t num_bytes = static_cast<uint32_t>(data.size());
-  CHECK_EQ(MojoWriteData(producer, data.data(), &num_bytes,
-                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE),
+  MojoWriteDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = MOJO_WRITE_DATA_FLAG_ALL_OR_NONE;
+  CHECK_EQ(MojoWriteData(producer, data.data(), &num_bytes, &options),
            MOJO_RESULT_OK);
   CHECK_EQ(num_bytes, static_cast<uint32_t>(data.size()));
 }
@@ -279,8 +279,10 @@
            MOJO_RESULT_OK);
   std::vector<char> buffer(size);
   uint32_t num_bytes = static_cast<uint32_t>(size);
-  CHECK_EQ(MojoReadData(consumer, buffer.data(), &num_bytes,
-                        MOJO_WRITE_DATA_FLAG_ALL_OR_NONE),
+  MojoReadDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = MOJO_READ_DATA_FLAG_ALL_OR_NONE;
+  CHECK_EQ(MojoReadData(consumer, &options, buffer.data(), &num_bytes),
            MOJO_RESULT_OK);
   CHECK_EQ(num_bytes, static_cast<uint32_t>(size));
 
diff --git a/mojo/public/c/system/README.md b/mojo/public/c/system/README.md
index 5c5adbb..6195288 100644
--- a/mojo/public/c/system/README.md
+++ b/mojo/public/c/system/README.md
@@ -209,7 +209,7 @@
 ### Writing Messages
 
 ``` c
-result = MojoWriteMessage(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE);
+result = MojoWriteMessage(a, message, nullptr);
 ```
 
 `MojoWriteMessage` is a *non-blocking* call: it always returns
@@ -237,7 +237,7 @@
 
 ``` c
 MojoMessageHandle message;
-MojoResult result = MojoReadMessage(b, &message, MOJO_READ_MESSAGE_FLAG_NONE);
+MojoResult result = MojoReadMessage(b, nullptr, &message);
 ```
 
 and extract its data:
@@ -257,7 +257,7 @@
 
 ``` c
 MojoMessageHandle message;
-MojoResult result = MojoReadMessage(b, &message, MOJO_READ_MESSAGE_FLAG_NONE);
+MojoResult result = MojoReadMessage(b, nullptr, &message);
 ```
 
 We'll get a `result` of `MOJO_RESULT_SHOULD_WAIT`, indicating that the pipe is
@@ -302,12 +302,12 @@
 options.flags = MOJO_APPEND_MESSAGE_DATA_FLAG_COMMIT_SIZE;
 MojoAppendMessageData(message, &options, 2, &c, 1, &buffer, &buffer_size);
 memcpy(buffer, "hi", 2);
-MojoWriteMessage(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE);
+MojoWriteMessage(a, message, nullptr);
 
 // Some time later...
 MojoHandle e;
 uint32_t num_handles = 1;
-MojoReadMessage(b, &message, MOJO_READ_MESSAGE_FLAG_NONE);
+MojoReadMessage(b, nullptr, &message);
 MojoGetMessageData(message, nullptr, &buffer, &buffer_size, &e, &num_handles);
 ```
 
@@ -378,7 +378,7 @@
 ``` c
 uint32_t num_bytes = 12;
 MojoResult result = MojoWriteData(producer, "datadatadata", &num_bytes,
-                                  MOJO_WRITE_DATA_FLAG_NONE);
+                                  nullptr);
 ```
 
 The above snippet will attempt to write 12 bytes into the data pipe, which
@@ -393,8 +393,7 @@
 ``` c
 char buffer[64];
 uint32_t num_bytes = 64;
-MojoResult result = MojoReadData(consumer, buffer, &num_bytes,
-                                 MOJO_READ_DATA_FLAG_NONE);
+MojoResult result = MojoReadData(consumer, nullptr, buffer, &num_bytes);
 ```
 
 This will attempt to read up to 64 bytes, returning the actual number of bytes
@@ -417,8 +416,7 @@
 ``` c
 void* buffer;
 uint32_t num_bytes = 1024;
-MojoResult result = MojoBeginWriteData(producer, &buffer, &num_bytes,
-                                       MOJO_WRITE_DATA_FLAG_NONE);
+MojoResult result = MojoBeginWriteData(producer, nullptr, &buffer, &num_bytes);
 ```
 
 This requests write access to a region of up to 1024 bytes of the data pipe's
@@ -430,7 +428,7 @@
 
 ``` c
 memcpy(buffer, "hello", 6);
-MojoResult result = MojoEndWriteData(producer, 6);
+MojoResult result = MojoEndWriteData(producer, 6, nullptr);
 ```
 
 Two-phase reads look similar:
@@ -438,19 +436,18 @@
 ``` c
 void* buffer;
 uint32_t num_bytes = 1024;
-MojoResult result = MojoBeginReadData(consumer, &buffer, &num_bytes,
-                                      MOJO_READ_DATA_FLAG_NONE);
+MojoResult result = MojoBeginReadData(consumer, nullptr, &buffer, &num_bytes);
 // result should be MOJO_RESULT_OK, since there is some data available.
 
 printf("Pipe says: %s", (const char*)buffer);  // Should say "hello".
 
-result = MojoEndReadData(consumer, 1);  // Say we only consumed one byte.
+// Say we only consumed one byte.
+result = MojoEndReadData(consumer, 1, nullptr);
 
 num_bytes = 1024;
-result = MojoBeginReadData(consumer, &buffer, &num_bytes,
-                           MOJO_READ_DATA_FLAG_NONE);
+result = MojoBeginReadData(consumer, nullptr, &buffer, &num_bytes);
 printf("Pipe says: %s", (const char*)buffer);  // Should say "ello".
-result = MojoEndReadData(consumer, 5);
+result = MojoEndReadData(consumer, 5, nullptr);
 ```
 
 ## Shared Buffers
@@ -469,7 +466,7 @@
 ``` c
 // Allocate a shared buffer of 4 kB.
 MojoHandle buffer;
-MojoResult result = MojoCreateSharedBuffer(NULL, 4096, &buffer);
+MojoResult result = MojoCreateSharedBuffer(4096, NULL, &buffer);
 ```
 
 You can also duplicate an existing shared buffer handle:
@@ -491,8 +488,7 @@
 
 ``` c
 void* data;
-MojoResult result = MojoMapBuffer(buffer, 0, 64, &data,
-                                  MOJO_MAP_BUFFER_FLAG_NONE);
+MojoResult result = MojoMapBuffer(buffer, 0, 64, nullptr, &data);
 
 *(int*)data = 42;
 result = MojoUnmapBuffer(data);
@@ -510,14 +506,13 @@
 MojoHandle read_only_buffer;
 MojoDuplicateBufferHandleOptions options;
 options.struct_size = sizeof(options);
-options.flags = MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
+options.flags = MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY;
 MojoResult result = MojoDuplicateBufferHandle(buffer, &options,
                                               &read_only_buffer);
 
 // Attempt to map and write to the buffer using the read-only handle:
 void* data;
-result = MojoMapBuffer(read_only_buffer, 0, 64, &data,
-                       MOJO_MAP_BUFFER_FLAG_NONE);
+result = MojoMapBuffer(read_only_buffer, 0, 64, nullptr, &data);
 *(int*)data = 42;  // CRASH
 ```
 
@@ -760,7 +755,9 @@
 Now we can write to `b` to make `a` readable:
 
 ``` c
-MojoWriteMessage(b, NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_NONE);
+MojoMessageHandle m;
+MojoCreateMessage(nullptr, &m);
+MojoWriteMessage(b, m, nullptr);
 ```
 
 Eventually -- and in practice possibly before `MojoWriteMessage` even
diff --git a/mojo/public/c/system/buffer.h b/mojo/public/c/system/buffer.h
index 0e086fc..2cc5427 100644
--- a/mojo/public/c/system/buffer.h
+++ b/mojo/public/c/system/buffer.h
@@ -15,53 +15,45 @@
 #include "mojo/public/c/system/system_export.h"
 #include "mojo/public/c/system/types.h"
 
-// |MojoCreateSharedBufferOptions|: Used to specify creation parameters for a
-// shared buffer to |MojoCreateSharedBuffer()|.
-//
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoCreateSharedBufferOptions| struct. (Used to allow for future
-//       extensions.)
-//
-//   |MojoCreateSharedBufferOptionsFlags flags|: Reserved for future use.
-//       |MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE|: No flags; default mode.
+// Flags passed to |MojoCreateSharedBuffer()| via
+// |MojoCreateSharedBufferOptions|. See values defined below.
+typedef uint32_t MojoCreateSharedBufferFlags;
 
-typedef uint32_t MojoCreateSharedBufferOptionsFlags;
+// No flags. Default behavior.
+#define MOJO_CREATE_SHARED_BUFFER_FLAG_NONE ((uint32_t)0)
 
-#ifdef __cplusplus
-const MojoCreateSharedBufferOptionsFlags
-    MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE = 0;
-#else
-#define MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE \
-  ((MojoCreateSharedBufferOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
+// Options passed to |MojoCreateSharedBuffer()|.
 struct MOJO_ALIGNAS(8) MojoCreateSharedBufferOptions {
-  uint32_t struct_size;
-  MojoCreateSharedBufferOptionsFlags flags;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoCreateSharedBufferOptions) == 8,
-                   "MojoCreateSharedBufferOptions has wrong size");
-
-// Flags passed to |MojoGetBufferInfo()| via |MojoSharedBufferOptions|.
-typedef uint32_t MojoSharedBufferOptionsFlags;
-
-#ifdef __cplusplus
-const MojoSharedBufferOptionsFlags MOJO_SHARED_BUFFER_OPTIONS_FLAG_NONE = 0;
-#else
-#define MOJO_SHARED_BUFFER_OPTIONS_FLAG_NONE ((MojoSharedBufferOptionsFlags)0)
-#endif
-
-struct MOJO_ALIGNAS(8) MojoSharedBufferOptions {
   // The size of this structure, used for versioning.
   uint32_t struct_size;
 
-  // See |MojoSharedBufferOptionsFlags|.
-  MojoSharedBufferOptionsFlags flags;
+  // See |MojoCreateSharedBufferFlags|.
+  MojoCreateSharedBufferFlags flags;
 };
-MOJO_STATIC_ASSERT(sizeof(MojoSharedBufferOptions) == 8,
+MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
+MOJO_STATIC_ASSERT(sizeof(MojoCreateSharedBufferOptions) == 8,
+                   "MojoCreateSharedBufferOptions has wrong size");
+
+// Flags passed to |MojoGetBufferInfo()| via |MojoGetBufferInfoOptions|. See
+// values defined below.
+typedef uint32_t MojoGetBufferInfoFlags;
+
+// No flags. Default behavior.
+#define MOJO_GET_BUFFER_INFO_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoGetBufferInfo()|.
+struct MOJO_ALIGNAS(8) MojoGetBufferInfoOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoGetBufferInfoFlags|.
+  MojoGetBufferInfoFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoGetBufferInfoOptions) == 8,
                    "MojoSharedBufferOptions has wrong size");
 
+// Structure used to receive information about a shared buffer via
+// |MojoGetBufferInfo()|.
 struct MOJO_ALIGNAS(8) MojoSharedBufferInfo {
   // The size of this structure, used for versioning.
   uint32_t struct_size;
@@ -72,63 +64,59 @@
 MOJO_STATIC_ASSERT(sizeof(MojoSharedBufferInfo) == 16,
                    "MojoSharedBufferInfo has wrong size");
 
-// |MojoDuplicateBufferHandleOptions|: Used to specify parameters in duplicating
-// access to a shared buffer to |MojoDuplicateBufferHandle()|.
-//
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoDuplicateBufferHandleOptions| struct. (Used to allow for future
-//       extensions.)
-//
-//   |MojoDuplicateBufferHandleOptionsFlags flags|: Flags to control the
-//       behavior of |MojoDuplicateBufferHandle()|. May be some combination of
-//       the following:
-//
-//       |MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE|: No flags; default
-//           mode.
-//       |MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY|: The duplicate
-//           shared buffer can only be mapped read-only. A read-only duplicate
-//           may only be created before any handles to the buffer are passed
-//           over a message pipe.
+// Flags passed to |MojoDuplicateBufferHandle()| via
+// |MojoDuplicateBufferHandleOptions|. See values defined below.
+typedef uint32_t MojoDuplicateBufferHandleFlags;
 
-typedef uint32_t MojoDuplicateBufferHandleOptionsFlags;
+// No options. Default behavior. Note that if a shared buffer handle is ever
+// duplicated without |MOJO_DUPLICATE_BUFFER_HANDLE_READ_ONLY| (see below),
+// neither it nor any of its duplicates can ever be duplicated *with*
+// |MOJO_DUPLICATE_BUFFER_HANDLE_READ_ONLY| in the future. That is, once a
+// writable handle has been duplicated as another writable handle, it is no
+// longer possible to create read-only handles to the underlying buffer object.
+#define MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_NONE ((uint32_t)0)
 
-#ifdef __cplusplus
-const MojoDuplicateBufferHandleOptionsFlags
-    MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE = 0;
-const MojoDuplicateBufferHandleOptionsFlags
-    MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY = 1 << 0;
-#else
-#define MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE \
-  ((MojoDuplicateBufferHandleOptionsFlags)0)
-#define MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY \
-  ((MojoDuplicateBufferHandleOptionsFlags)1 << 0)
-#endif
+// Duplicates the handle as read-only. If successful, the resulting new handle
+// will always map to a read-only memory region. Successful use of this flag
+// also imposes the limitation that the handle or any of its subsequent
+// duplicates may never be duplicated *without* this flag in the future. That
+// is, once a read-only handle is produced for a buffer object, all future
+// handles to that object must also be read-only.
+#define MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY ((uint32_t)1 << 0)
 
+// Options passed to |MojoDuplicateBufferHandle()|.
 struct MojoDuplicateBufferHandleOptions {
+  // The size of this structure, used for versioning.
   uint32_t struct_size;
-  MojoDuplicateBufferHandleOptionsFlags flags;
+
+  // See |MojoDuplicateBufferHandleFlags|.
+  MojoDuplicateBufferHandleFlags flags;
 };
 MOJO_STATIC_ASSERT(sizeof(MojoDuplicateBufferHandleOptions) == 8,
                    "MojoDuplicateBufferHandleOptions has wrong size");
 
-// |MojoMapBufferFlags|: Used to specify different modes to |MojoMapBuffer()|.
-//   |MOJO_MAP_BUFFER_FLAG_NONE| - No flags; default mode.
-
+// Flags passed to |MojoMapBuffer()| via |MojoMapBufferOptions|. See values
+// defined below.
 typedef uint32_t MojoMapBufferFlags;
 
-#ifdef __cplusplus
-const MojoMapBufferFlags MOJO_MAP_BUFFER_FLAG_NONE = 0;
-#else
-#define MOJO_MAP_BUFFER_FLAG_NONE ((MojoMapBufferFlags)0)
-#endif
+// No flags. Default behavior.
+#define MOJO_MAP_BUFFER_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoMapBuffer()|.
+struct MojoMapBufferOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoMapBufferFlags|.
+  MojoMapBufferFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoMapBufferOptions) == 8,
+                   "MojoMapBufferOptions has wrong size");
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-// Note: See the comment in functions.h about the meaning of the "optional"
-// label for pointer parameters.
-
 // Creates a buffer of size |num_bytes| bytes that can be shared between
 // processes. The returned handle may be duplicated any number of times by
 // |MojoDuplicateBufferHandle()|.
@@ -148,10 +136,10 @@
 //       been reached (e.g., if the requested size was too large, or if the
 //       maximum number of handles was exceeded).
 //   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateSharedBuffer(
-    const struct MojoCreateSharedBufferOptions* options,  // Optional.
-    uint64_t num_bytes,                                   // In.
-    MojoHandle* shared_buffer_handle);                    // Out.
+MOJO_SYSTEM_EXPORT MojoResult
+MojoCreateSharedBuffer(uint64_t num_bytes,
+                       const struct MojoCreateSharedBufferOptions* options,
+                       MojoHandle* shared_buffer_handle);
 
 // Duplicates the handle |buffer_handle| as a new shared buffer handle. On
 // success this returns the new handle in |*new_buffer_handle|. A shared buffer
@@ -161,20 +149,31 @@
 // |options| may be set to null to duplicate the buffer handle with the default
 // options.
 //
+// Access rights to mapped memory from the duplicated handle may be controlled
+// by flags in |*options|, with some limitations. See notes on
+// |MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_NONE| and
+// |MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY| regarding restrictions on
+// duplication with respect to these flags.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
 //       |buffer_handle| is not a valid buffer handle or |*options| is invalid).
 //   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
+//   |MOJO_RESULT_FAILED_PRECONDITION| if
+//       |MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY| was set but the handle
+//       was already previously duplicated without that flag; or if
+//       |MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY| was not set but the
+//       handle was already previously duplicated with that flag.
 MOJO_SYSTEM_EXPORT MojoResult MojoDuplicateBufferHandle(
     MojoHandle buffer_handle,
-    const struct MojoDuplicateBufferHandleOptions* options,  // Optional.
-    MojoHandle* new_buffer_handle);                          // Out.
+    const struct MojoDuplicateBufferHandleOptions* options,
+    MojoHandle* new_buffer_handle);
 
 // Maps the part (at offset |offset| of length |num_bytes|) of the buffer given
-// by |buffer_handle| into memory, with options specified by |flags|. |offset +
-// num_bytes| must be less than or equal to the size of the buffer. On success,
-// |*buffer| points to memory with the requested part of the buffer. On
+// by |buffer_handle| into memory, with options specified by |options|.
+// |offset+num_bytes| must be less than or equal to the size of the buffer. On
+// success, |*buffer| points to memory with the requested part of the buffer. On
 // failure |*buffer| it is not modified.
 //
 // A single buffer handle may have multiple active mappings. The permissions
@@ -185,18 +184,21 @@
 // A mapped buffer must eventually be unmapped by calling |MojoUnmapBuffer()|
 // with the value of |*buffer| returned by this function.
 //
+// |options| may be null to map the buffer with default behavior.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |buffer_handle| is not a valid buffer handle or the range specified by
-//       |offset| and |num_bytes| is not valid).
+//       |buffer_handle| is not a valid buffer handle, the range specified by
+//       |offset| and |num_bytes| is not valid, or |*options| is invalid).
 //   |MOJO_RESULT_RESOURCE_EXHAUSTED| if the mapping operation itself failed
 //       (e.g., due to not having appropriate address space available).
-MOJO_SYSTEM_EXPORT MojoResult MojoMapBuffer(MojoHandle buffer_handle,
-                                            uint64_t offset,
-                                            uint64_t num_bytes,
-                                            void** buffer,  // Out.
-                                            MojoMapBufferFlags flags);
+MOJO_SYSTEM_EXPORT MojoResult
+MojoMapBuffer(MojoHandle buffer_handle,
+              uint64_t offset,
+              uint64_t num_bytes,
+              const struct MojoMapBufferOptions* options,
+              void** buffer);
 
 // Unmaps a buffer pointer that was mapped by |MojoMapBuffer()|. |buffer| must
 // have been the result of |MojoMapBuffer()| (not some other pointer inside
@@ -208,22 +210,26 @@
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if |buffer| is invalid (e.g., is not the
 //       result of |MojoMapBuffer()| or has already been unmapped).
-MOJO_SYSTEM_EXPORT MojoResult MojoUnmapBuffer(void* buffer);  // In.
+MOJO_SYSTEM_EXPORT MojoResult MojoUnmapBuffer(void* buffer);
 
-// Retrieve information about |buffer_handle| into |info|. |options| is optional
-// and reserved for future use.
+// Retrieve information about |buffer_handle| into |info|.
+//
+// Callers must initialize |info->struct_size| to |sizeof(MojoSharedBufferInfo)|
+// before calling this function.
+//
+// |options| may be null for default options.
 //
 // Returns:
 //   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |buffer_handle| is invalid or if |info|
-//       is NULL.
+//   |MOJO_RESULT_INVALID_ARGUMENT| if |buffer_handle| is invalid, |info| is
+//       null, or |*options| is invalid.
 //
 // On success, |info->size| will be set to the size of the buffer. On failure it
 // is not modified.
 MOJO_SYSTEM_EXPORT MojoResult
 MojoGetBufferInfo(MojoHandle buffer_handle,
-                  const struct MojoSharedBufferOptions* options,  // Optional.
-                  struct MojoSharedBufferInfo* info);             // Out.
+                  const struct MojoGetBufferInfoOptions* options,
+                  struct MojoSharedBufferInfo* info);
 
 #ifdef __cplusplus
 }  // extern "C"
diff --git a/mojo/public/c/system/data_pipe.h b/mojo/public/c/system/data_pipe.h
index 62adbea1..3702cdb6 100644
--- a/mojo/public/c/system/data_pipe.h
+++ b/mojo/public/c/system/data_pipe.h
@@ -15,103 +15,173 @@
 #include "mojo/public/c/system/system_export.h"
 #include "mojo/public/c/system/types.h"
 
-// |MojoCreateDataPipeOptions|: Used to specify creation parameters for a data
-// pipe to |MojoCreateDataPipe()|.
-//
-//   |uint32_t struct_size|: Set to the size of the |MojoCreateDataPipeOptions|
-//       struct. (Used to allow for future extensions.)
-//
-//   |MojoCreateDataPipeOptionsFlags flags|: Used to specify different modes of
-//       operation. May be some combination of the following values:
-//
-//       |MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE|: No flags; default mode.
-//
-//   |uint32_t element_num_bytes|: The size of an element, in bytes. All
-//       transactions and buffers will consist of an integral number of
-//       elements. Must be nonzero.
-//
-//   |uint32_t capacity_num_bytes|: The capacity of the data pipe, in number of
-//       bytes; must be a multiple of |element_num_bytes|. The data pipe will
-//       always be able to queue AT LEAST this much data. Set to zero to opt for
-//       a system-dependent automatically-calculated capacity (which will always
-//       be at least one element).
+// Flags passed to |MojoCreateDataPipe()| via |MojoCreateDataPipeOptions|. See
+// values defined below.
+typedef uint32_t MojoCreateDataPipeFlags;
 
-typedef uint32_t MojoCreateDataPipeOptionsFlags;
+// No flags. Default behavior.
+#define MOJO_CREATE_DATA_PIPE_FLAG_NONE ((uint32_t)0)
 
-#ifdef __cplusplus
-const MojoCreateDataPipeOptionsFlags MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE =
-    0;
-#else
-#define MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE \
-  ((MojoCreateDataPipeOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
+// Options passed to |MojoCreateDataPipe()|.
 struct MOJO_ALIGNAS(8) MojoCreateDataPipeOptions {
-  MOJO_ALIGNAS(4) uint32_t struct_size;
-  MOJO_ALIGNAS(4) MojoCreateDataPipeOptionsFlags flags;
-  MOJO_ALIGNAS(4) uint32_t element_num_bytes;
-  MOJO_ALIGNAS(4) uint32_t capacity_num_bytes;
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoCreateDataPipeFlags|.
+  MojoCreateDataPipeFlags flags;
+
+  // The size of an element in bytes. All transactions and buffer sizes must
+  // consist of an integral number of elements. Must be non-zero.
+  uint32_t element_num_bytes;
+
+  // The capacity of the data pipe in bytes. Must be a multiple of
+  // |element_num_bytes|. If successfully created, the pipe will always be able
+  // to queue at least this much data. If zero, the pipe buffer will be of a
+  // system-dependent capacity of at least one element in size.
+  uint32_t capacity_num_bytes;
 };
+MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
 MOJO_STATIC_ASSERT(sizeof(MojoCreateDataPipeOptions) == 16,
                    "MojoCreateDataPipeOptions has wrong size");
 
-// |MojoWriteDataFlags|: Used to specify different modes to |MojoWriteData()|
-// and |MojoBeginWriteData()|. May be some combination of the following values:
-//
-//   |MOJO_WRITE_DATA_FLAG_NONE| - No flags; default mode.
-//   |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| - Write either all the elements
-//      requested or none of them.
-
+// Flags passed to |MojoWriteData()| via |MojoWriteDataOptions|. See values
+// defined below.
 typedef uint32_t MojoWriteDataFlags;
 
-#ifdef __cplusplus
-const MojoWriteDataFlags MOJO_WRITE_DATA_FLAG_NONE = 0;
-const MojoWriteDataFlags MOJO_WRITE_DATA_FLAG_ALL_OR_NONE = 1 << 0;
-#else
-#define MOJO_WRITE_DATA_FLAG_NONE ((MojoWriteDataFlags)0)
-#define MOJO_WRITE_DATA_FLAG_ALL_OR_NONE ((MojoWriteDataFlags)1 << 0)
-#endif
+// No flags. Default behavior.
+#define MOJO_WRITE_DATA_FLAG_NONE ((uint32_t)0)
 
-// |MojoReadDataFlags|: Used to specify different modes to |MojoReadData()| and
-// |MojoBeginReadData()|. May be some combination of the following values:
-//
-//   |MOJO_READ_DATA_FLAG_NONE| - No flags; default mode.
-//   |MOJO_READ_DATA_FLAG_ALL_OR_NONE| - Read (or discard) either the requested
-//        number of elements or none. For use with |MojoReadData()| only.
-//   |MOJO_READ_DATA_FLAG_DISCARD| - Discard (up to) the requested number of
-//        elements. For use with |MojoReadData()| only.
-//   |MOJO_READ_DATA_FLAG_QUERY| - Query the number of elements available to
-//       read. For use with |MojoReadData()| only. Mutually exclusive with
-//       |MOJO_READ_DATA_FLAG_DISCARD|, and |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
-//       is ignored if this flag is set.
-//   |MOJO_READ_DATA_FLAG_PEEK| - Read elements without removing them. For use
-//       with |MojoReadData()| only. Mutually exclusive with
-//       |MOJO_READ_DATA_FLAG_DISCARD| and |MOJO_READ_DATA_FLAG_QUERY|.
+// Requires that all provided data must fit into the pipe's available capacity
+// in order for the write to succeed. Otherwise the write fails and no data is
+// written into the pipe.
+#define MOJO_WRITE_DATA_FLAG_ALL_OR_NONE ((uint32_t)1 << 0)
 
+// Options passed to |MojoWriteData()|.
+struct MOJO_ALIGNAS(8) MojoWriteDataOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoWriteDataFlags|.
+  MojoWriteDataFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoWriteDataOptions) == 8,
+                   "MojoWriteDataOptions has wrong size");
+
+// Flags passed to |MojoBeginWriteData()| via |MojoBeginWriteDataOptions|. See
+// values defined below.
+typedef uint32_t MojoBeginWriteDataFlags;
+
+// No flags. Default behavior.
+#define MOJO_BEGIN_WRITE_DATA_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoBeginWriteData()|.
+struct MOJO_ALIGNAS(8) MojoBeginWriteDataOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoBeginWriteDataFlags|.
+  MojoBeginWriteDataFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoBeginWriteDataOptions) == 8,
+                   "MojoBeginWriteDataOptions has wrong size");
+
+// Flags passed to |MojoEndWriteData()| via |MojoEndWriteDataOptions|. See
+// values defined below.
+typedef uint32_t MojoEndWriteDataFlags;
+
+// No flags. Default behavior.
+#define MOJO_END_WRITE_DATA_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoEndWriteData()|.
+struct MOJO_ALIGNAS(8) MojoEndWriteDataOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoEndWriteDataFlags|.
+  MojoEndWriteDataFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoEndWriteDataOptions) == 8,
+                   "MojoEndWriteDataOptions has wrong size");
+
+// Flags passed to |MojoReadData()| via |MojoReadDataOptions|.
 typedef uint32_t MojoReadDataFlags;
 
-#ifdef __cplusplus
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_NONE = 0;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_ALL_OR_NONE = 1 << 0;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_DISCARD = 1 << 1;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_QUERY = 1 << 2;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_PEEK = 1 << 3;
-#else
-#define MOJO_READ_DATA_FLAG_NONE ((MojoReadDataFlags)0)
-#define MOJO_READ_DATA_FLAG_ALL_OR_NONE ((MojoReadDataFlags)1 << 0)
-#define MOJO_READ_DATA_FLAG_DISCARD ((MojoReadDataFlags)1 << 1)
-#define MOJO_READ_DATA_FLAG_QUERY ((MojoReadDataFlags)1 << 2)
-#define MOJO_READ_DATA_FLAG_PEEK ((MojoReadDataFlags)1 << 3)
-#endif
+// No flags. Default behavior.
+#define MOJO_READ_DATA_FLAG_NONE ((uint32_t)0)
+
+// Requires that all request bytes can be read from the data pipe in order for
+// the read to succeed. If that many bytes are not available for reading, the
+// read will fail and no bytes will be read. Ignored of
+// |MOJO_READ_DATA_FLAG_QUERY| is also set.
+#define MOJO_READ_DATA_FLAG_ALL_OR_NONE ((uint32_t)1 << 0)
+
+// Discards the data read rather than copying it into the caller's provided
+// buffer. May not be combined with |MOJO_READ_DATA_FLAG_PEEK| or
+// |MOJO_READ_DATA_FLAG_QUERY|.
+#define MOJO_READ_DATA_FLAG_DISCARD ((uint32_t)1 << 1)
+
+// Queries the number of bytes available for reading without actually reading
+// the data. May not be combined with |MOJO_READ_DATA_FLAG_DISCARD| or
+// |MOJO_READ_DATA_FLAG_PEEK|. |MOJO_READ_DATA_FLAG_ALL_OR_NONE| is ignored if
+// this is set.
+#define MOJO_READ_DATA_FLAG_QUERY ((uint32_t)1 << 2)
+
+// Reads data from the pipe and copies it to the caller's provided buffer
+// without actually removing the data from the pipe. May not be combined with
+// |MOJO_READ_DATA_FLAG_DISCARD| or |MOJO_READ_DATA_FLAG_QUERY|.
+#define MOJO_READ_DATA_FLAG_PEEK ((uint32_t)1 << 3)
+
+// Options passed to |MojoReadData()|.
+struct MOJO_ALIGNAS(8) MojoReadDataOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoReadDataFlags|.
+  MojoReadDataFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoReadDataOptions) == 8,
+                   "MojoReadDataOptions has wrong size");
+
+// Flags passed to |MojoBeginReadData()| via |MojoBeginReadDataOptions|. See
+// values defined below.
+typedef uint32_t MojoBeginReadDataFlags;
+
+// No flags. Default behavior.
+#define MOJO_BEGIN_READ_DATA_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoBeginReadData()|.
+struct MOJO_ALIGNAS(8) MojoBeginReadDataOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoBeginReadDataFlags|.
+  MojoBeginReadDataFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoBeginReadDataOptions) == 8,
+                   "MojoBeginReadDataOptions has wrong size");
+
+// Flags passed to |MojoEndReadData()| via |MojoEndReadDataOptions|. See
+// values defined below.
+typedef uint32_t MojoEndReadDataFlags;
+
+// No flags. Default behavior.
+#define MOJO_END_READ_DATA_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoEndReadData()|.
+struct MOJO_ALIGNAS(8) MojoEndReadDataOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoEndReadDataFlags|.
+  MojoEndReadDataFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoEndReadDataOptions) == 8,
+                   "MojoEndReadDataOptions has wrong size");
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-// Note: See the comment in functions.h about the meaning of the "optional"
-// label for pointer parameters.
-
 // Creates a data pipe, which is a unidirectional communication channel for
 // unframed data. Data must be read and written in multiples of discrete
 // discrete elements of size given in |options|.
@@ -136,21 +206,22 @@
 //       been reached (e.g., if the requested capacity was too large, or if the
 //       maximum number of handles was exceeded).
 //   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateDataPipe(
-    const struct MojoCreateDataPipeOptions* options,  // Optional.
-    MojoHandle* data_pipe_producer_handle,            // Out.
-    MojoHandle* data_pipe_consumer_handle);           // Out.
+MOJO_SYSTEM_EXPORT MojoResult
+MojoCreateDataPipe(const struct MojoCreateDataPipeOptions* options,
+                   MojoHandle* data_pipe_producer_handle,
+                   MojoHandle* data_pipe_consumer_handle);
 
 // Writes the data pipe producer given by |data_pipe_producer_handle|.
 //
 // |elements| points to data of size |*num_bytes|; |*num_bytes| must be a
-// multiple of the data pipe's element size. If
-// |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| is set in |flags|, either all the data
-// is written (if enough write capacity is available) or none is.
+// multiple of the data pipe's element size.
 //
 // On success |*num_bytes| is set to the amount of data that was actually
 // written. On failure it is unmodified.
 //
+// |options| may be null for default options. See |MojoWriteDataOptions| for
+// the effect of various options on the behavior of this function.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
@@ -159,20 +230,20 @@
 //       size.)
 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer handle has been
 //       closed.
-//   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has
+//   |MOJO_RESULT_OUT_OF_RANGE| if |options->flags| has
 //       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set and the required amount of data
 //       (specified by |*num_bytes|) could not be written.
 //   |MOJO_RESULT_BUSY| if there is a two-phase write ongoing with
 //       |data_pipe_producer_handle| (i.e., |MojoBeginWriteData()| has been
 //       called, but not yet the matching |MojoEndWriteData()|).
 //   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be written (and the
-//       consumer is still open) and |flags| does *not* have
+//       consumer is still open) and |options->flags| does *not* have
 //       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set.
 MOJO_SYSTEM_EXPORT MojoResult
-    MojoWriteData(MojoHandle data_pipe_producer_handle,
-                  const void* elements,
-                  uint32_t* num_bytes,  // In/out.
-                  MojoWriteDataFlags flags);
+MojoWriteData(MojoHandle data_pipe_producer_handle,
+              const void* elements,
+              uint32_t* num_bytes,
+              const struct MojoWriteDataOptions* options);
 
 // Begins a two-phase write to the data pipe producer given by
 // |data_pipe_producer_handle|. On success |*buffer| will be a pointer to which
@@ -188,11 +259,13 @@
 // write operation. |MojoEndWriteData()| need not be called when
 // |MojoBeginWriteData()| fails.
 //
+// |options| may be null for default options.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
 //       |data_pipe_producer_handle| is not a handle to a data pipe producer or
-//       flags has |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set.
+//       |*options| is invalid.
 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer handle has been
 //       closed.
 //   |MOJO_RESULT_BUSY| if there is already a two-phase write ongoing with
@@ -201,10 +274,10 @@
 //   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be written (and the
 //       consumer is still open).
 MOJO_SYSTEM_EXPORT MojoResult
-    MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
-                       void** buffer,               // Out.
-                       uint32_t* buffer_num_bytes,  // In/out.
-                       MojoWriteDataFlags flags);
+MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
+                   const struct MojoBeginWriteDataOptions* options,
+                   void** buffer,
+                   uint32_t* buffer_num_bytes);
 
 // Ends a two-phase write that was previously initiated by
 // |MojoBeginWriteData()| for the same |data_pipe_producer_handle|.
@@ -218,6 +291,8 @@
 // writable again if there's space available) but no data written to |*buffer|
 // is "put into" the data pipe.
 //
+// |options| may be null for default options.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
@@ -228,13 +303,14 @@
 //       two-phase write (e.g., |MojoBeginWriteData()| was not called or
 //       |MojoEndWriteData()| has already been called).
 MOJO_SYSTEM_EXPORT MojoResult
-    MojoEndWriteData(MojoHandle data_pipe_producer_handle,
-                     uint32_t num_bytes_written);
+MojoEndWriteData(MojoHandle data_pipe_producer_handle,
+                 uint32_t num_bytes_written,
+                 const struct MojoEndWriteDataOptions* options);
 
 // Reads data from the data pipe consumer given by |data_pipe_consumer_handle|.
 // May also be used to discard data or query the amount of data available.
 //
-// If |flags| has neither |MOJO_READ_DATA_FLAG_DISCARD| nor
+// If |options->flags| has neither |MOJO_READ_DATA_FLAG_DISCARD| nor
 // |MOJO_READ_DATA_FLAG_QUERY| set, this tries to read up to |*num_bytes| (which
 // must be a multiple of the data pipe's element size) bytes of data to
 // |elements| and set |*num_bytes| to the amount actually read. If flags has
@@ -257,28 +333,32 @@
 // |MOJO_READ_DATA_FLAG_ALL_OR_NONE| is ignored, as are |elements| and the input
 // value of |*num_bytes|.
 //
+// |options| may be null for default options.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success (see above for a description of the different
 //       operations).
 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
 //       |data_pipe_consumer_handle| is invalid, the combination of flags in
-//       |flags| is invalid, etc.).
+//       |options->flags| is invalid, or |*options| itself is invalid).
 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer handle has been
 //       closed and data (or the required amount of data) was not available to
 //       be read or discarded.
-//   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
-//       set and the required amount of data is not available to be read or
-//       discarded (and the producer is still open).
+//   |MOJO_RESULT_OUT_OF_RANGE| if |options->flags| has
+//       |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set and the required amount of data
+//       is not available to be read or discarded and the producer is still
+//       open.
 //   |MOJO_RESULT_BUSY| if there is a two-phase read ongoing with
 //       |data_pipe_consumer_handle| (i.e., |MojoBeginReadData()| has been
 //       called, but not yet the matching |MojoEndReadData()|).
 //   |MOJO_RESULT_SHOULD_WAIT| if there is no data to be read or discarded (and
-//       the producer is still open) and |flags| does *not* have
+//       the producer is still open) and |options->flags| does *not* have
 //       |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set.
-MOJO_SYSTEM_EXPORT MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
-                                           void* elements,       // Out.
-                                           uint32_t* num_bytes,  // In/out.
-                                           MojoReadDataFlags flags);
+MOJO_SYSTEM_EXPORT MojoResult
+MojoReadData(MojoHandle data_pipe_consumer_handle,
+             const struct MojoReadDataOptions* options,
+             void* elements,
+             uint32_t* num_bytes);
 
 // Begins a two-phase read from the data pipe consumer given by
 // |data_pipe_consumer_handle|. On success, |*buffer| will be a pointer from
@@ -292,15 +372,13 @@
 // must be called to indicate the number of bytes read and to complete the
 // two-phase read operation.
 //
-// |flags| must not have |MOJO_READ_DATA_FLAG_DISCARD|,
-// |MOJO_READ_DATA_FLAG_QUERY|, |MOJO_READ_DATA_FLAG_PEEK|, or
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set.
+// |options| may be null for default options.
 //
 // Returns:
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
 //       |data_pipe_consumer_handle| is not a handle to a data pipe consumer,
-//       or |flags| has invalid flags set.)
+//       or |*options| is invalid.)
 //   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer handle has been
 //       closed.
 //   |MOJO_RESULT_BUSY| if there is already a two-phase read ongoing with
@@ -310,9 +388,9 @@
 //       producer is still open).
 MOJO_SYSTEM_EXPORT MojoResult
 MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
-                  const void** buffer,         // Out.
-                  uint32_t* buffer_num_bytes,  // Out.
-                  MojoReadDataFlags flags);
+                  const struct MojoBeginReadDataOptions* options,
+                  const void** buffer,
+                  uint32_t* buffer_num_bytes);
 
 // Ends a two-phase read from the data pipe consumer given by
 // |data_pipe_consumer_handle| that was begun by a call to |MojoBeginReadData()|
@@ -324,6 +402,8 @@
 // On failure, the two-phase read (if any) is ended (so the handle may become
 // readable again) but no data is "removed" from the data pipe.
 //
+// |options| may be null for default options.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
@@ -334,8 +414,9 @@
 //       two-phase read (e.g., |MojoBeginReadData()| was not called or
 //       |MojoEndReadData()| has already been called).
 MOJO_SYSTEM_EXPORT MojoResult
-    MojoEndReadData(MojoHandle data_pipe_consumer_handle,
-                    uint32_t num_bytes_read);
+MojoEndReadData(MojoHandle data_pipe_consumer_handle,
+                uint32_t num_bytes_read,
+                const struct MojoEndReadDataOptions* options);
 
 #ifdef __cplusplus
 }  // extern "C"
diff --git a/mojo/public/c/system/functions.h b/mojo/public/c/system/functions.h
index a860e8d5..f59ee57 100644
--- a/mojo/public/c/system/functions.h
+++ b/mojo/public/c/system/functions.h
@@ -19,13 +19,6 @@
 extern "C" {
 #endif
 
-// Note: Pointer parameters that are labelled "optional" may be null (at least
-// under some circumstances). Non-const pointer parameters are also labeled
-// "in", "out", or "in/out", to indicate how they are used. (Note that how/if
-// such a parameter is used may depend on other parameters or the requested
-// operation's success/failure. E.g., a separate |flags| parameter may control
-// whether a given "in/out" parameter is used for input, output, or both.)
-
 // Initializes Mojo in the calling application.
 //
 // With the exception of EDK embedders, applications using Mojo APIs must call
diff --git a/mojo/public/c/system/message_pipe.h b/mojo/public/c/system/message_pipe.h
index c97e71c..d92e7b4 100644
--- a/mojo/public/c/system/message_pipe.h
+++ b/mojo/public/c/system/message_pipe.h
@@ -15,75 +15,89 @@
 #include "mojo/public/c/system/system_export.h"
 #include "mojo/public/c/system/types.h"
 
-// |MojoMessageHandle|: Used to refer to message objects.
-
+// Used to refer to message objects created by |MojoCreateMessage()|.
 typedef uintptr_t MojoMessageHandle;
 
-#ifdef __cplusplus
-const MojoMessageHandle MOJO_MESSAGE_HANDLE_INVALID = 0;
-#else
 #define MOJO_MESSAGE_HANDLE_INVALID ((MojoMessageHandle)0)
-#endif
 
-// |MojoCreateMessagePipeOptions|: Used to specify creation parameters for a
-// message pipe to |MojoCreateMessagePipe()|.
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoCreateMessagePipeOptions| struct. (Used to allow for future
-//       extensions.)
-//   |MojoCreateMessagePipeOptionsFlags flags|: Used to specify different modes
-//       of operation.
-//       |MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE|: No flags; default mode.
+// Flags passed to |MojoCreateMessagePipe()| via |MojoCreateMessagePipeOptions|.
+// See values defined below.
+typedef uint32_t MojoCreateMessagePipeFlags;
 
-typedef uint32_t MojoCreateMessagePipeOptionsFlags;
+// No flags. Default behavior.
+#define MOJO_CREATE_MESSAGE_PIPE_FLAG_NONE ((uint32_t)0)
 
-#ifdef __cplusplus
-const MojoCreateMessagePipeOptionsFlags
-    MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE = 0;
-#else
-#define MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE \
-  ((MojoCreateMessagePipeOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
+// Options passed to |MojoCreateMessagePipe()|.
 struct MOJO_ALIGNAS(8) MojoCreateMessagePipeOptions {
+  // The size of this structure, used for versioning.
   uint32_t struct_size;
-  MojoCreateMessagePipeOptionsFlags flags;
+
+  // See |MojoCreateMessagePipeFlags|.
+  MojoCreateMessagePipeFlags flags;
 };
+MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
 MOJO_STATIC_ASSERT(sizeof(MojoCreateMessagePipeOptions) == 8,
                    "MojoCreateMessagePipeOptions has wrong size");
 
-// |MojoWriteMessageFlags|: Used to specify different modes to
-// |MojoWriteMessage()|.
-//   |MOJO_WRITE_MESSAGE_FLAG_NONE| - No flags; default mode.
-
+// Flags passed to |MojoWriteMessage()| via |MojoWriteMessageOptions|. See
+// values defined below.
 typedef uint32_t MojoWriteMessageFlags;
 
-#ifdef __cplusplus
-const MojoWriteMessageFlags MOJO_WRITE_MESSAGE_FLAG_NONE = 0;
-#else
-#define MOJO_WRITE_MESSAGE_FLAG_NONE ((MojoWriteMessageFlags)0)
-#endif
+// No flags. Default behavior.
+#define MOJO_WRITE_MESSAGE_FLAG_NONE ((uint32_t)0)
 
-// |MojoReadMessageFlags|: Used to specify different modes to
-// |MojoReadMessage()|.
-//   |MOJO_READ_MESSAGE_FLAG_NONE| - No flags; default mode.
+// Options passed to |MojoWriteMessage()|.
+struct MOJO_ALIGNAS(8) MojoWriteMessageOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
 
+  // See |MojoWriteMessageFlags|.
+  MojoWriteMessageFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoWriteMessageOptions) == 8,
+                   "MojoWriteMessageOptions has wrong size");
+
+// Flags passed to |MojoReadMessage()| via |MojoReadMessageOptions|. See values
+// defined below.
 typedef uint32_t MojoReadMessageFlags;
 
-#ifdef __cplusplus
-const MojoReadMessageFlags MOJO_READ_MESSAGE_FLAG_NONE = 0;
-#else
-#define MOJO_READ_MESSAGE_FLAG_NONE ((MojoReadMessageFlags)0)
-#endif
+// No flags. Default behavior.
+#define MOJO_READ_MESSAGE_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoReadMessage()|.
+struct MOJO_ALIGNAS(8) MojoReadMessageOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoReadMessageFlags|.
+  MojoReadMessageFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoReadMessageOptions) == 8,
+                   "MojoReadMessageOptions has wrong size");
+
+// Flags passed to |MojoFuseMessagePipes()| via |MojoFuseMessagePipeOptions|.
+// See values defined below.
+typedef uint32_t MojoFuseMessagePipesFlags;
+
+// No flags. Default behavior.
+#define MOJO_FUSE_MESSAGE_PIPES_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoFuseMessagePipes()|.
+struct MOJO_ALIGNAS(8) MojoFuseMessagePipesOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoFuseMessagePipesFlags|.
+  MojoFuseMessagePipesFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoFuseMessagePipesOptions) == 8,
+                   "MojoFuseMessagePipesOptions has wrong size");
 
 // Flags passed to |MojoCreateMessage()| via |MojoCreateMessageOptions|.
 typedef uint32_t MojoCreateMessageFlags;
 
-#ifdef __cplusplus
-const MojoCreateMessageFlags MOJO_CREATE_MESSAGE__FLAG_NONE = 0;
-#else
-#define MOJO_CREATE_MESSAGE_FLAG_NONE ((MojoCreateMessageFlags)0)
-#endif
+// No flags. Default behavior.
+#define MOJO_CREATE_MESSAGE_FLAG_NONE ((uint32_t)0)
 
 // Options passed to |MojoCreateMessage()|.
 struct MOJO_ALIGNAS(8) MojoCreateMessageOptions {
@@ -93,15 +107,14 @@
   // See |MojoCreateMessageFlags|.
   MojoCreateMessageFlags flags;
 };
+MOJO_STATIC_ASSERT(sizeof(MojoCreateMessageOptions) == 8,
+                   "MojoCreateMessageOptions has wrong size");
 
 // Flags passed to |MojoSerializeMessage()| via |MojoSerializeMessageOptions|.
 typedef uint32_t MojoSerializeMessageFlags;
 
-#ifdef __cplusplus
-const MojoSerializeMessageFlags MOJO_SERIALIZE_MESSAGE_FLAG_NONE = 0;
-#else
-#define MOJO_SERIALIZE_MESSAGE_FLAG_NONE ((MojoSerializeMessageFlags)0)
-#endif
+// No flags. Default behavior.
+#define MOJO_SERIALIZE_MESSAGE_FLAG_NONE ((uint32_t)0)
 
 // Options passed to |MojoSerializeMessage()|.
 struct MOJO_ALIGNAS(8) MojoSerializeMessageOptions {
@@ -111,18 +124,19 @@
   // See |MojoSerializeMessageFlags|.
   MojoSerializeMessageFlags flags;
 };
+MOJO_STATIC_ASSERT(sizeof(MojoSerializeMessageOptions) == 8,
+                   "MojoSerializeMessageOptions has wrong size");
 
 // Flags passed to |MojoAppendMessageData()| via |MojoAppendMessageDataOptions|.
 typedef uint32_t MojoAppendMessageDataFlags;
 
-#ifdef __cplusplus
-const MojoAppendMessageDataFlags MOJO_APPEND_MESSAGE_DATA_FLAG_NONE = 0;
-const MojoAppendMessageDataFlags MOJO_APPEND_MESSAGE_DATA_FLAG_COMMIT_SIZE = 1;
-#else
-#define MOJO_APPEND_MESSAGE_DATA_FLAG_NONE ((MojoAppendMessageDataFlags)0)
+// No flags. Default behavior.
+#define MOJO_APPEND_MESSAGE_DATA_FLAG_NONE ((uint32_t)0)
+
+// If set, this comments the resulting (post-append) message size as the final
+// size of the message payload, in terms of both bytes and attached handles.
 #define MOJO_APPEND_MESSAGE_DATA_FLAG_COMMIT_SIZE \
   ((MojoAppendMessageDataFlags)1)
-#endif
 
 // Options passed to |MojoAppendMessageData()|.
 struct MOJO_ALIGNAS(8) MojoAppendMessageDataOptions {
@@ -132,17 +146,18 @@
   // See |MojoAppendMessageDataFlags|.
   MojoAppendMessageDataFlags flags;
 };
+MOJO_STATIC_ASSERT(sizeof(MojoAppendMessageDataOptions) == 8,
+                   "MojoAppendMessageDataOptions has wrong size");
 
 // Flags passed to |MojoGetMessageData()| via |MojoGetMessageDataOptions|.
 typedef uint32_t MojoGetMessageDataFlags;
 
-#ifdef __cplusplus
-const MojoGetMessageDataFlags MOJO_GET_MESSAGE_DATA_FLAG_NONE = 0;
-const MojoGetMessageDataFlags MOJO_GET_MESSAGE_DATA_FLAG_IGNORE_HANDLES = 1;
-#else
-#define MOJO_GET_MESSAGE_DATA_FLAG_NONE ((MojoGetMessageDataFlags)0)
-#define MOJO_GET_MESSAGE_DATA_FLAG_IGNORE_HANDLES ((MojoGetMessageDataFlags)1);
-#endif
+// No flags. Default behavior.
+#define MOJO_GET_MESSAGE_DATA_FLAG_NONE ((uint32_t)0)
+
+// Ignores attached handles when retrieving message data. This leaves any
+// attached handles intact and owned by the message object.
+#define MOJO_GET_MESSAGE_DATA_FLAG_IGNORE_HANDLES ((uint32_t)1)
 
 // Options passed to |MojoGetMessageData()|.
 struct MOJO_ALIGNAS(8) MojoGetMessageDataOptions {
@@ -152,15 +167,14 @@
   // See |MojoGetMessageDataFlags|.
   MojoGetMessageDataFlags flags;
 };
+MOJO_STATIC_ASSERT(sizeof(MojoGetMessageDataOptions) == 8,
+                   "MojoGetMessageDataOptions has wrong size");
 
 // Flags passed to |MojoSetMessageContext()| via |MojoSetMessageContextOptions|.
 typedef uint32_t MojoSetMessageContextFlags;
 
-#ifdef __cplusplus
-const MojoSetMessageContextFlags MOJO_SET_MESSAGE_CONTEXT_FLAG_NONE = 0;
-#else
-#define MOJO_SET_MESSAGE_CONTEXT_FLAG_NONE ((MojoSetMessageContextFlags)0)
-#endif
+// No flags. Default behavior.
+#define MOJO_SET_MESSAGE_CONTEXT_FLAG_NONE ((uint32_t)0)
 
 // Options passed to |MojoSetMessageContext()|.
 struct MOJO_ALIGNAS(8) MojoSetMessageContextOptions {
@@ -170,15 +184,14 @@
   // See |MojoSetMessageContextFlags|.
   MojoSetMessageContextFlags flags;
 };
+MOJO_STATIC_ASSERT(sizeof(MojoSetMessageContextOptions) == 8,
+                   "MojoSetMessageContextOptions has wrong size");
 
 // Flags passed to |MojoGetMessageContext()| via |MojoGetMessageContextOptions|.
 typedef uint32_t MojoGetMessageContextFlags;
 
-#ifdef __cplusplus
-const MojoGetMessageContextFlags MOJO_GET_MESSAGE_CONTEXT_FLAG_NONE = 0;
-#else
-#define MOJO_GET_MESSAGE_CONTEXT_FLAG_NONE ((MojoGetMessageContextFlags)0)
-#endif
+// No flags. Default behavior.
+#define MOJO_GET_MESSAGE_CONTEXT_FLAG_NONE ((uint32_t)0)
 
 // Options passed to |MojoGetMessageContext()|.
 struct MOJO_ALIGNAS(8) MojoGetMessageContextOptions {
@@ -188,6 +201,25 @@
   // See |MojoGetMessageContextFlags|.
   MojoGetMessageContextFlags flags;
 };
+MOJO_STATIC_ASSERT(sizeof(MojoGetMessageContextOptions) == 8,
+                   "MojoGetMessageContextOptions has wrong size");
+
+// Flags passed to |MojoNotifyBadMessage()| via |MojoNotifyBadMessageOptions|.
+typedef uint32_t MojoNotifyBadMessageFlags;
+
+// No flags. Default behavior.
+#define MOJO_NOTIFY_BAD_MESSAGE_FLAG_NONE ((uint32_t)0)
+
+// Options passed to |MojoNotifyBadMessage()|.
+struct MOJO_ALIGNAS(8) MojoNotifyBadMessageOptions {
+  // The size of this structure, used for versioning.
+  uint32_t struct_size;
+
+  // See |MojoNotifyBadMessageFlags|.
+  MojoNotifyBadMessageFlags flags;
+};
+MOJO_STATIC_ASSERT(sizeof(MojoNotifyBadMessageOptions) == 8,
+                   "MojoNotifyBadMessageOptions has wrong size");
 
 #ifdef __cplusplus
 extern "C" {
@@ -239,6 +271,8 @@
 // Note that regardless of success or failure, |message| is destroyed by this
 // call and therefore invalidated.
 //
+// |options| may be null.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success (i.e., the message was enqueued).
 //   |MOJO_RESULT_INVALID_ARGUMENT| if |message_pipe_handle| or |message| is
@@ -249,9 +283,10 @@
 //       endpoint has been closed (in which case the message would be dropped).
 //   |MOJO_RESULT_NOT_FOUND| if |message| has neither a context nor serialized
 //       buffer attached and therefore has nothing to be written.
-MOJO_SYSTEM_EXPORT MojoResult MojoWriteMessage(MojoHandle message_pipe_handle,
-                                               MojoMessageHandle message,
-                                               MojoWriteMessageFlags flags);
+MOJO_SYSTEM_EXPORT MojoResult
+MojoWriteMessage(MojoHandle message_pipe_handle,
+                 MojoMessageHandle message,
+                 const struct MojoWriteMessageOptions* options);
 
 // Reads the next message from a message pipe and returns a message as an opaque
 // message handle. The returned message must eventually be destroyed using
@@ -261,7 +296,7 @@
 // Unserialized messages, context may be accessed using
 // |MojoGetMessageContext()|.
 //
-// |message| must be non-null.
+// |options| may be null. |message| must be non-null.
 //
 // Returns:
 //   |MOJO_RESULT_OK| on success (i.e., a message was actually read).
@@ -269,9 +304,10 @@
 //   |MOJO_RESULT_FAILED_PRECONDITION| if the other endpoint has been closed
 //       and there are no more messages to read.
 //   |MOJO_RESULT_SHOULD_WAIT| if no message was available to be read.
-MOJO_SYSTEM_EXPORT MojoResult MojoReadMessage(MojoHandle message_pipe_handle,
-                                              MojoMessageHandle* message,
-                                              MojoReadMessageFlags flags);
+MOJO_SYSTEM_EXPORT MojoResult
+MojoReadMessage(MojoHandle message_pipe_handle,
+                const struct MojoReadMessageOptions* options,
+                MojoMessageHandle* message);
 
 // Fuses two message pipe endpoints together. Given two pipes:
 //
@@ -288,6 +324,8 @@
 // NOTE: A handle may only be fused if it is an open message pipe handle which
 // has not been written to.
 //
+// |options| may be null.
+//
 // Returns:
 //   |MOJO_RESULT_OK| on success.
 //   |MOJO_RESULT_FAILED_PRECONDITION| if both handles were valid message pipe
@@ -295,7 +333,9 @@
 //   |MOJO_INVALID_ARGUMENT| if either handle is not a fusable message pipe
 //       handle.
 MOJO_SYSTEM_EXPORT MojoResult
-    MojoFuseMessagePipes(MojoHandle handle0, MojoHandle handle1);
+MojoFuseMessagePipes(MojoHandle handle0,
+                     MojoHandle handle1,
+                     const struct MojoFuseMessagePipesOptions* options);
 
 // Creates a new message object which may be sent over a message pipe via
 // |MojoWriteMessage()|. Returns a handle to the new message object in
@@ -543,13 +583,16 @@
 //     notified of this error.
 // |error_num_bytes|: The length of |error| in bytes.
 //
+// |options| may be null.
+//
 // Returns:
 //   |MOJO_RESULT_OK| if successful.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if |message| is not a valid message.
 MOJO_SYSTEM_EXPORT MojoResult
 MojoNotifyBadMessage(MojoMessageHandle message,
                      const char* error,
-                     size_t error_num_bytes);
+                     size_t error_num_bytes,
+                     const struct MojoNotifyBadMessageOptions* options);
 
 #ifdef __cplusplus
 }  // extern "C"
diff --git a/mojo/public/c/system/tests/core_api_unittest.cc b/mojo/public/c/system/tests/core_api_unittest.cc
index 38a69235a..737cf48a 100644
--- a/mojo/public/c/system/tests/core_api_unittest.cc
+++ b/mojo/public/c/system/tests/core_api_unittest.cc
@@ -44,35 +44,32 @@
   // Message pipe:
   h0 = MOJO_HANDLE_INVALID;
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWriteMessage(h0, MOJO_MESSAGE_HANDLE_INVALID,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
+            MojoWriteMessage(h0, MOJO_MESSAGE_HANDLE_INVALID, nullptr));
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoReadMessage(h0, nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
+            MojoReadMessage(h0, nullptr, nullptr));
 
   // Data pipe:
   buffer_size = static_cast<uint32_t>(sizeof(buffer));
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWriteData(h0, buffer, &buffer_size, MOJO_WRITE_DATA_FLAG_NONE));
+            MojoWriteData(h0, buffer, &buffer_size, nullptr));
   write_pointer = nullptr;
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoBeginWriteData(h0, &write_pointer, &buffer_size,
-                               MOJO_WRITE_DATA_FLAG_NONE));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndWriteData(h0, 1));
+            MojoBeginWriteData(h0, nullptr, &write_pointer, &buffer_size));
+  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndWriteData(h0, 1, nullptr));
   buffer_size = static_cast<uint32_t>(sizeof(buffer));
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoReadData(h0, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
+            MojoReadData(h0, nullptr, buffer, &buffer_size));
   read_pointer = nullptr;
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoBeginReadData(h0, &read_pointer, &buffer_size,
-                              MOJO_READ_DATA_FLAG_NONE));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndReadData(h0, 1));
+            MojoBeginReadData(h0, nullptr, &read_pointer, &buffer_size));
+  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndReadData(h0, 1, nullptr));
 
   // Shared buffer:
   h1 = MOJO_HANDLE_INVALID;
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
             MojoDuplicateBufferHandle(h0, nullptr, &h1));
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoMapBuffer(h0, 0, 1, &write_pointer, MOJO_MAP_BUFFER_FLAG_NONE));
+            MojoMapBuffer(h0, 0, 1, nullptr, &write_pointer));
 }
 
 TEST(CoreAPITest, BasicMessagePipe) {
@@ -93,16 +90,14 @@
 
   // Try to read.
   MojoMessageHandle message;
-  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoReadMessage(h0, &message, MOJO_READ_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, MojoReadMessage(h0, nullptr, &message));
 
   // Write to |h1|.
   const uintptr_t kTestMessageContext = 1234;
   EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessage(nullptr, &message));
   EXPECT_EQ(MOJO_RESULT_OK, MojoSetMessageContext(message, kTestMessageContext,
                                                   nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(h1, message, MOJO_WRITE_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, message, nullptr));
 
   // |h0| should be readable.
   size_t result_index = 1;
@@ -117,8 +112,7 @@
   EXPECT_EQ(kSignalAll, states[0].satisfiable_signals);
 
   // Read from |h0|.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(h0, &message, MOJO_READ_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(h0, nullptr, &message));
   uintptr_t context;
   EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageContext(message, nullptr, &context));
   EXPECT_EQ(MOJO_RESULT_OK,
@@ -183,20 +177,18 @@
   // Try to read from |hc|.
   buffer_size = static_cast<uint32_t>(sizeof(buffer));
   EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
+            MojoReadData(hc, nullptr, buffer, &buffer_size));
 
   // Try to begin a two-phase read from |hc|.
   read_pointer = nullptr;
   EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoBeginReadData(hc, &read_pointer, &buffer_size,
-                              MOJO_READ_DATA_FLAG_NONE));
+            MojoBeginReadData(hc, nullptr, &read_pointer, &buffer_size));
 
   // Write to |hp|.
   static const char kHello[] = "hello ";
   // Don't include terminating null.
   buffer_size = static_cast<uint32_t>(strlen(kHello));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, kHello, &buffer_size,
-                                          MOJO_WRITE_MESSAGE_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, kHello, &buffer_size, nullptr));
 
   // |hc| should be(come) readable.
   size_t result_index = 1;
@@ -214,20 +206,20 @@
             states[0].satisfiable_signals);
 
   // Do a two-phase write to |hp|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoBeginWriteData(hp, &write_pointer, &buffer_size,
-                                               MOJO_WRITE_DATA_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK,
+            MojoBeginWriteData(hp, nullptr, &write_pointer, &buffer_size));
   static const char kWorld[] = "world";
   ASSERT_GE(buffer_size, sizeof(kWorld));
   // Include the terminating null.
   memcpy(write_pointer, kWorld, sizeof(kWorld));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld))));
+  EXPECT_EQ(
+      MOJO_RESULT_OK,
+      MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld)), nullptr));
 
   // Read one character from |hc|.
   memset(buffer, 0, sizeof(buffer));
   buffer_size = 1;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(hc, nullptr, buffer, &buffer_size));
 
   // Close |hp|.
   EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp));
@@ -243,11 +235,11 @@
 
   // Do a two-phase read from |hc|.
   read_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoBeginReadData(hc, &read_pointer, &buffer_size,
-                                              MOJO_READ_DATA_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK,
+            MojoBeginReadData(hc, nullptr, &read_pointer, &buffer_size));
   ASSERT_LE(buffer_size, sizeof(buffer) - 1);
   memcpy(&buffer[1], read_pointer, buffer_size);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size, nullptr));
   EXPECT_STREQ("hello world", buffer);
 
   // |hc| should no longer be readable.
@@ -271,7 +263,7 @@
             MojoGetBufferInfo(h0, nullptr, &buffer_info));
 
   // Create a shared buffer (|h0|).
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 100, &h0));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(100, nullptr, &h0));
   EXPECT_NE(h0, MOJO_HANDLE_INVALID);
 
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
@@ -281,8 +273,7 @@
 
   // Map everything.
   void* pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h0, 0, 100, &pointer, MOJO_MAP_BUFFER_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoMapBuffer(h0, 0, 100, nullptr, &pointer));
   ASSERT_TRUE(pointer);
   static_cast<char*>(pointer)[50] = 'x';
 
@@ -302,8 +293,7 @@
 
   // Map half of |h1|.
   pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h1, 50, 50, &pointer, MOJO_MAP_BUFFER_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoMapBuffer(h1, 50, 50, nullptr, &pointer));
   ASSERT_TRUE(pointer);
 
   // It should have what we wrote.
diff --git a/mojo/public/c/system/tests/core_perftest.cc b/mojo/public/c/system/tests/core_perftest.cc
index 80508bc0..947c32b7 100644
--- a/mojo/public/c/system/tests/core_perftest.cc
+++ b/mojo/public/c/system/tests/core_perftest.cc
@@ -146,8 +146,7 @@
   static void MessagePipe_EmptyRead(void* closure) {
     CorePerftest* self = static_cast<CorePerftest*>(closure);
     MojoMessageHandle message;
-    MojoResult result =
-        MojoReadMessage(self->h0_, &message, MOJO_READ_MESSAGE_FLAG_NONE);
+    MojoResult result = MojoReadMessage(self->h0_, nullptr, &message);
     ALLOW_UNUSED_LOCAL(result);
     assert(result == MOJO_RESULT_SHOULD_WAIT);
   }
diff --git a/mojo/public/c/system/tests/core_unittest_pure_c.c b/mojo/public/c/system/tests/core_unittest_pure_c.c
index 0a81f18b..48b3c1a3 100644
--- a/mojo/public/c/system/tests/core_unittest_pure_c.c
+++ b/mojo/public/c/system/tests/core_unittest_pure_c.c
@@ -59,11 +59,9 @@
   EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessage(NULL, &message));
   EXPECT_EQ(MOJO_RESULT_OK,
             MojoSetMessageContext(message, 42, NULL, NULL, NULL));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(handle0, message, MOJO_WRITE_DATA_FLAG_NONE));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(handle0, message, NULL));
+  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(handle1, NULL, &message));
 
-  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(handle1, &message,
-                                             MOJO_READ_MESSAGE_FLAG_NONE));
   uintptr_t context;
   EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageContext(message, NULL, &context));
   EXPECT_EQ(MOJO_RESULT_OK,
diff --git a/mojo/public/c/system/thunks.cc b/mojo/public/c/system/thunks.cc
index 1d5d622..6aced5e 100644
--- a/mojo/public/c/system/thunks.cc
+++ b/mojo/public/c/system/thunks.cc
@@ -122,15 +122,20 @@
 
 MojoResult MojoWriteMessage(MojoHandle message_pipe_handle,
                             MojoMessageHandle message_handle,
-                            MojoWriteMessageFlags flags) {
-  return g_thunks.WriteMessage(message_pipe_handle, message_handle, flags);
+                            const MojoWriteMessageOptions* options) {
+  return g_thunks.WriteMessage(message_pipe_handle, message_handle, options);
 }
 
 MojoResult MojoReadMessage(MojoHandle message_pipe_handle,
-                           MojoMessageHandle* message_handle,
-                           MojoReadMessageFlags flags) {
-  assert(g_thunks.ReadMessage);
-  return g_thunks.ReadMessage(message_pipe_handle, message_handle, flags);
+                           const MojoReadMessageOptions* options,
+                           MojoMessageHandle* message_handle) {
+  return g_thunks.ReadMessage(message_pipe_handle, options, message_handle);
+}
+
+MojoResult MojoFuseMessagePipes(MojoHandle handle0,
+                                MojoHandle handle1,
+                                const MojoFuseMessagePipesOptions* options) {
+  return g_thunks.FuseMessagePipes(handle0, handle1, options);
 }
 
 MojoResult MojoCreateDataPipe(const MojoCreateDataPipeOptions* options,
@@ -143,55 +148,58 @@
 MojoResult MojoWriteData(MojoHandle data_pipe_producer_handle,
                          const void* elements,
                          uint32_t* num_elements,
-                         MojoWriteDataFlags flags) {
+                         const MojoWriteDataOptions* options) {
   return g_thunks.WriteData(data_pipe_producer_handle, elements, num_elements,
-                            flags);
+                            options);
 }
 
 MojoResult MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
+                              const MojoBeginWriteDataOptions* options,
                               void** buffer,
-                              uint32_t* buffer_num_elements,
-                              MojoWriteDataFlags flags) {
-  return g_thunks.BeginWriteData(data_pipe_producer_handle, buffer,
-                                 buffer_num_elements, flags);
+                              uint32_t* buffer_num_elements) {
+  return g_thunks.BeginWriteData(data_pipe_producer_handle, options, buffer,
+                                 buffer_num_elements);
 }
 
 MojoResult MojoEndWriteData(MojoHandle data_pipe_producer_handle,
-                            uint32_t num_elements_written) {
-  return g_thunks.EndWriteData(data_pipe_producer_handle, num_elements_written);
+                            uint32_t num_elements_written,
+                            const MojoEndWriteDataOptions* options) {
+  return g_thunks.EndWriteData(data_pipe_producer_handle, num_elements_written,
+                               options);
 }
 
 MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
+                        const MojoReadDataOptions* options,
                         void* elements,
-                        uint32_t* num_elements,
-                        MojoReadDataFlags flags) {
-  return g_thunks.ReadData(data_pipe_consumer_handle, elements, num_elements,
-                           flags);
+                        uint32_t* num_elements) {
+  return g_thunks.ReadData(data_pipe_consumer_handle, options, elements,
+                           num_elements);
 }
 
 MojoResult MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
+                             const MojoBeginReadDataOptions* options,
                              const void** buffer,
-                             uint32_t* buffer_num_elements,
-                             MojoReadDataFlags flags) {
-  return g_thunks.BeginReadData(data_pipe_consumer_handle, buffer,
-                                buffer_num_elements, flags);
+                             uint32_t* buffer_num_elements) {
+  return g_thunks.BeginReadData(data_pipe_consumer_handle, options, buffer,
+                                buffer_num_elements);
 }
 
 MojoResult MojoEndReadData(MojoHandle data_pipe_consumer_handle,
-                           uint32_t num_elements_read) {
-  return g_thunks.EndReadData(data_pipe_consumer_handle, num_elements_read);
+                           uint32_t num_elements_read,
+                           const MojoEndReadDataOptions* options) {
+  return g_thunks.EndReadData(data_pipe_consumer_handle, num_elements_read,
+                              options);
 }
 
-MojoResult MojoCreateSharedBuffer(
-    const struct MojoCreateSharedBufferOptions* options,
-    uint64_t num_bytes,
-    MojoHandle* shared_buffer_handle) {
-  return g_thunks.CreateSharedBuffer(options, num_bytes, shared_buffer_handle);
+MojoResult MojoCreateSharedBuffer(uint64_t num_bytes,
+                                  const MojoCreateSharedBufferOptions* options,
+                                  MojoHandle* shared_buffer_handle) {
+  return g_thunks.CreateSharedBuffer(num_bytes, options, shared_buffer_handle);
 }
 
 MojoResult MojoDuplicateBufferHandle(
     MojoHandle buffer_handle,
-    const struct MojoDuplicateBufferHandleOptions* options,
+    const MojoDuplicateBufferHandleOptions* options,
     MojoHandle* new_buffer_handle) {
   return g_thunks.DuplicateBufferHandle(buffer_handle, options,
                                         new_buffer_handle);
@@ -200,9 +208,9 @@
 MojoResult MojoMapBuffer(MojoHandle buffer_handle,
                          uint64_t offset,
                          uint64_t num_bytes,
-                         void** buffer,
-                         MojoMapBufferFlags flags) {
-  return g_thunks.MapBuffer(buffer_handle, offset, num_bytes, buffer, flags);
+                         const MojoMapBufferOptions* options,
+                         void** buffer) {
+  return g_thunks.MapBuffer(buffer_handle, offset, num_bytes, options, buffer);
 }
 
 MojoResult MojoUnmapBuffer(void* buffer) {
@@ -210,9 +218,8 @@
 }
 
 MojoResult MojoGetBufferInfo(MojoHandle buffer_handle,
-                             const struct MojoSharedBufferOptions* options,
-                             struct MojoSharedBufferInfo* info) {
-  assert(g_thunks.GetBufferInfo);
+                             const MojoGetBufferInfoOptions* options,
+                             MojoSharedBufferInfo* info) {
   return g_thunks.GetBufferInfo(buffer_handle, options, info);
 }
 
@@ -248,10 +255,6 @@
                           ready_triggers, ready_results, ready_signals_states);
 }
 
-MojoResult MojoFuseMessagePipes(MojoHandle handle0, MojoHandle handle1) {
-  return g_thunks.FuseMessagePipes(handle0, handle1);
-}
-
 MojoResult MojoCreateMessage(const MojoCreateMessageOptions* options,
                              MojoMessageHandle* message) {
   return g_thunks.CreateMessage(options, message);
@@ -302,6 +305,13 @@
   return g_thunks.GetMessageContext(message, options, context);
 }
 
+MojoResult MojoNotifyBadMessage(MojoMessageHandle message,
+                                const char* error,
+                                size_t error_num_bytes,
+                                const MojoNotifyBadMessageOptions* options) {
+  return g_thunks.NotifyBadMessage(message, error, error_num_bytes, options);
+}
+
 MojoResult MojoWrapPlatformHandle(
     const struct MojoPlatformHandle* platform_handle,
     MojoHandle* mojo_handle) {
@@ -334,12 +344,6 @@
                                                    num_bytes, guid, flags);
 }
 
-MojoResult MojoNotifyBadMessage(MojoMessageHandle message,
-                                const char* error,
-                                size_t error_num_bytes) {
-  return g_thunks.NotifyBadMessage(message, error, error_num_bytes);
-}
-
 }  // extern "C"
 
 void MojoEmbedderSetSystemThunks(const MojoSystemThunks* thunks) {
diff --git a/mojo/public/c/system/thunks.h b/mojo/public/c/system/thunks.h
index e6bc57f..33da50e 100644
--- a/mojo/public/c/system/thunks.h
+++ b/mojo/public/c/system/thunks.h
@@ -20,81 +20,34 @@
 #pragma pack(push, 8)
 struct MojoSystemThunks {
   size_t size;  // Should be set to sizeof(MojoSystemThunks).
+
   MojoResult (*Initialize)(const struct MojoInitializeOptions* options);
+
   MojoTimeTicks (*GetTimeTicksNow)();
+
+  // Generic handle API.
   MojoResult (*Close)(MojoHandle handle);
   MojoResult (*QueryHandleSignalsState)(
       MojoHandle handle,
       struct MojoHandleSignalsState* signals_state);
+
+  // Message pipe API.
   MojoResult (*CreateMessagePipe)(
       const struct MojoCreateMessagePipeOptions* options,
       MojoHandle* message_pipe_handle0,
       MojoHandle* message_pipe_handle1);
   MojoResult (*WriteMessage)(MojoHandle message_pipe_handle,
                              MojoMessageHandle message_handle,
-                             MojoWriteMessageFlags flags);
+                             const struct MojoWriteMessageOptions* options);
   MojoResult (*ReadMessage)(MojoHandle message_pipe_handle,
-                            MojoMessageHandle* message_handle,
-                            MojoReadMessageFlags flags);
-  MojoResult (*CreateDataPipe)(const struct MojoCreateDataPipeOptions* options,
-                               MojoHandle* data_pipe_producer_handle,
-                               MojoHandle* data_pipe_consumer_handle);
-  MojoResult (*WriteData)(MojoHandle data_pipe_producer_handle,
-                          const void* elements,
-                          uint32_t* num_elements,
-                          MojoWriteDataFlags flags);
-  MojoResult (*BeginWriteData)(MojoHandle data_pipe_producer_handle,
-                               void** buffer,
-                               uint32_t* buffer_num_elements,
-                               MojoWriteDataFlags flags);
-  MojoResult (*EndWriteData)(MojoHandle data_pipe_producer_handle,
-                             uint32_t num_elements_written);
-  MojoResult (*ReadData)(MojoHandle data_pipe_consumer_handle,
-                         void* elements,
-                         uint32_t* num_elements,
-                         MojoReadDataFlags flags);
-  MojoResult (*BeginReadData)(MojoHandle data_pipe_consumer_handle,
-                              const void** buffer,
-                              uint32_t* buffer_num_elements,
-                              MojoReadDataFlags flags);
-  MojoResult (*EndReadData)(MojoHandle data_pipe_consumer_handle,
-                            uint32_t num_elements_read);
-  MojoResult (*CreateSharedBuffer)(
-      const struct MojoCreateSharedBufferOptions* options,
-      uint64_t num_bytes,
-      MojoHandle* shared_buffer_handle);
-  MojoResult (*DuplicateBufferHandle)(
-      MojoHandle buffer_handle,
-      const struct MojoDuplicateBufferHandleOptions* options,
-      MojoHandle* new_buffer_handle);
-  MojoResult (*MapBuffer)(MojoHandle buffer_handle,
-                          uint64_t offset,
-                          uint64_t num_bytes,
-                          void** buffer,
-                          MojoMapBufferFlags flags);
-  MojoResult (*UnmapBuffer)(void* buffer);
-  MojoResult (*GetBufferInfo)(MojoHandle buffer_handle,
-                              const struct MojoSharedBufferOptions* options,
-                              struct MojoSharedBufferInfo* info);
-  MojoResult (*CreateTrap)(MojoTrapEventHandler handler,
-                           const struct MojoCreateTrapOptions* options,
-                           MojoHandle* trap_handle);
-  MojoResult (*AddTrigger)(MojoHandle trap_handle,
-                           MojoHandle handle,
-                           MojoHandleSignals signals,
-                           MojoTriggerCondition condition,
-                           uintptr_t context,
-                           const struct MojoAddTriggerOptions* options);
-  MojoResult (*RemoveTrigger)(MojoHandle trap_handle,
-                              uintptr_t context,
-                              const struct MojoRemoveTriggerOptions* options);
-  MojoResult (*ArmTrap)(MojoHandle trap_handle,
-                        const struct MojoArmTrapOptions* options,
-                        uint32_t* num_ready_triggers,
-                        uintptr_t* ready_triggers,
-                        MojoResult* ready_results,
-                        MojoHandleSignalsState* ready_signals_states);
-  MojoResult (*FuseMessagePipes)(MojoHandle handle0, MojoHandle handle1);
+                            const struct MojoReadMessageOptions* options,
+                            MojoMessageHandle* message_handle);
+  MojoResult (*FuseMessagePipes)(
+      MojoHandle handle0,
+      MojoHandle handle1,
+      const struct MojoFuseMessagePipesOptions* options);
+
+  // Message object API.
   MojoResult (*CreateMessage)(const struct MojoCreateMessageOptions* options,
                               MojoMessageHandle* message);
   MojoResult (*DestroyMessage)(MojoMessageHandle message);
@@ -125,6 +78,79 @@
       MojoMessageHandle message,
       const struct MojoGetMessageContextOptions* options,
       uintptr_t* context);
+  MojoResult (*NotifyBadMessage)(
+      MojoMessageHandle message,
+      const char* error,
+      size_t error_num_bytes,
+      const struct MojoNotifyBadMessageOptions* options);
+
+  // Data pipe API.
+  MojoResult (*CreateDataPipe)(const struct MojoCreateDataPipeOptions* options,
+                               MojoHandle* data_pipe_producer_handle,
+                               MojoHandle* data_pipe_consumer_handle);
+  MojoResult (*WriteData)(MojoHandle data_pipe_producer_handle,
+                          const void* elements,
+                          uint32_t* num_elements,
+                          const struct MojoWriteDataOptions* options);
+  MojoResult (*BeginWriteData)(MojoHandle data_pipe_producer_handle,
+                               const struct MojoBeginWriteDataOptions* options,
+                               void** buffer,
+                               uint32_t* buffer_num_elements);
+  MojoResult (*EndWriteData)(MojoHandle data_pipe_producer_handle,
+                             uint32_t num_elements_written,
+                             const struct MojoEndWriteDataOptions* options);
+  MojoResult (*ReadData)(MojoHandle data_pipe_consumer_handle,
+                         const struct MojoReadDataOptions* options,
+                         void* elements,
+                         uint32_t* num_elements);
+  MojoResult (*BeginReadData)(MojoHandle data_pipe_consumer_handle,
+                              const struct MojoBeginReadDataOptions* options,
+                              const void** buffer,
+                              uint32_t* buffer_num_elements);
+  MojoResult (*EndReadData)(MojoHandle data_pipe_consumer_handle,
+                            uint32_t num_elements_read,
+                            const struct MojoEndReadDataOptions* options);
+
+  // Shared buffer API.
+  MojoResult (*CreateSharedBuffer)(
+      uint64_t num_bytes,
+      const struct MojoCreateSharedBufferOptions* options,
+      MojoHandle* shared_buffer_handle);
+  MojoResult (*DuplicateBufferHandle)(
+      MojoHandle buffer_handle,
+      const struct MojoDuplicateBufferHandleOptions* options,
+      MojoHandle* new_buffer_handle);
+  MojoResult (*MapBuffer)(MojoHandle buffer_handle,
+                          uint64_t offset,
+                          uint64_t num_bytes,
+                          const struct MojoMapBufferOptions* options,
+                          void** buffer);
+  MojoResult (*UnmapBuffer)(void* buffer);
+  MojoResult (*GetBufferInfo)(MojoHandle buffer_handle,
+                              const struct MojoGetBufferInfoOptions* options,
+                              struct MojoSharedBufferInfo* info);
+
+  // Traps API.
+  MojoResult (*CreateTrap)(MojoTrapEventHandler handler,
+                           const struct MojoCreateTrapOptions* options,
+                           MojoHandle* trap_handle);
+  MojoResult (*AddTrigger)(MojoHandle trap_handle,
+                           MojoHandle handle,
+                           MojoHandleSignals signals,
+                           MojoTriggerCondition condition,
+                           uintptr_t context,
+                           const struct MojoAddTriggerOptions* options);
+  MojoResult (*RemoveTrigger)(MojoHandle trap_handle,
+                              uintptr_t context,
+                              const struct MojoRemoveTriggerOptions* options);
+  MojoResult (*ArmTrap)(MojoHandle trap_handle,
+                        const struct MojoArmTrapOptions* options,
+                        uint32_t* num_ready_triggers,
+                        uintptr_t* ready_triggers,
+                        MojoResult* ready_results,
+                        MojoHandleSignalsState* ready_signals_states);
+
+  // Platform handle API.
   MojoResult (*WrapPlatformHandle)(
       const struct MojoPlatformHandle* platform_handle,
       MojoHandle* mojo_handle);
@@ -143,9 +169,6 @@
       size_t* num_bytes,
       struct MojoSharedBufferGuid* guid,
       MojoPlatformSharedBufferHandleFlags* flags);
-  MojoResult (*NotifyBadMessage)(MojoMessageHandle message,
-                                 const char* error,
-                                 size_t error_num_bytes);
 };
 #pragma pack(pop)
 
diff --git a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
index ff26f17..509b0fe 100644
--- a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
@@ -260,8 +260,7 @@
   ScopedDataPipeProducerHandle producer_handle;
   ScopedDataPipeConsumerHandle consumer_handle;
   MojoCreateDataPipeOptions options = {sizeof(MojoCreateDataPipeOptions),
-                                       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
-                                       1,
+                                       MOJO_CREATE_DATA_PIPE_FLAG_NONE, 1,
                                        1024};
   ASSERT_EQ(MOJO_RESULT_OK,
             CreateDataPipe(&options, &producer_handle, &consumer_handle));
diff --git a/mojo/public/cpp/bindings/tests/sample_service_unittest.cc b/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
index 6083ad7..9762a8b 100644
--- a/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
@@ -57,7 +57,7 @@
   for (size_t i = 0; i < input_streams.size(); ++i) {
     MojoCreateDataPipeOptions options;
     options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
     options.element_num_bytes = 1;
     options.capacity_num_bytes = 1024;
     mojo::ScopedDataPipeProducerHandle producer;
diff --git a/mojo/public/cpp/system/buffer.cc b/mojo/public/cpp/system/buffer.cc
index 13f20263..81f6abfa 100644
--- a/mojo/public/cpp/system/buffer.cc
+++ b/mojo/public/cpp/system/buffer.cc
@@ -8,10 +8,10 @@
 
 // static
 ScopedSharedBufferHandle SharedBufferHandle::Create(uint64_t num_bytes) {
-  MojoCreateSharedBufferOptions options = {
-      sizeof(options), MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
+  MojoCreateSharedBufferOptions options = {sizeof(options),
+                                           MOJO_CREATE_SHARED_BUFFER_FLAG_NONE};
   SharedBufferHandle handle;
-  MojoCreateSharedBuffer(&options, num_bytes, handle.mutable_value());
+  MojoCreateSharedBuffer(num_bytes, &options, handle.mutable_value());
   return MakeScopedHandle(handle);
 }
 
@@ -22,9 +22,9 @@
     return result;
 
   MojoDuplicateBufferHandleOptions options = {
-      sizeof(options), MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
+      sizeof(options), MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_NONE};
   if (access_mode == AccessMode::READ_ONLY)
-    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
+    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY;
   SharedBufferHandle result_handle;
   MojoDuplicateBufferHandle(value(), &options, result_handle.mutable_value());
   result.reset(result_handle);
@@ -39,7 +39,7 @@
     uint64_t size,
     uint64_t offset) const {
   void* buffer = nullptr;
-  MojoMapBuffer(value(), offset, size, &buffer, MOJO_MAP_BUFFER_FLAG_NONE);
+  MojoMapBuffer(value(), offset, size, nullptr, &buffer);
   return ScopedSharedBufferMapping(buffer);
 }
 
diff --git a/mojo/public/cpp/system/data_pipe.h b/mojo/public/cpp/system/data_pipe.h
index 453ebfb8..30c7546 100644
--- a/mojo/public/cpp/system/data_pipe.h
+++ b/mojo/public/cpp/system/data_pipe.h
@@ -32,21 +32,27 @@
   MojoResult WriteData(const void* elements,
                        uint32_t* num_bytes,
                        MojoWriteDataFlags flags) const {
-    return MojoWriteData(value(), elements, num_bytes, flags);
+    MojoWriteDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = flags;
+    return MojoWriteData(value(), elements, num_bytes, &options);
   }
 
   // Begins a two-phase write to a data pipe. See |MojoBeginWriteData()| for
   // complete documentation.
   MojoResult BeginWriteData(void** buffer,
                             uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags) const {
-    return MojoBeginWriteData(value(), buffer, buffer_num_bytes, flags);
+                            MojoBeginWriteDataFlags flags) const {
+    MojoBeginWriteDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = flags;
+    return MojoBeginWriteData(value(), &options, buffer, buffer_num_bytes);
   }
 
   // Completes a two-phase write to a data pipe. See |MojoEndWriteData()| for
   // complete documentation.
   MojoResult EndWriteData(uint32_t num_bytes_written) const {
-    return MojoEndWriteData(value(), num_bytes_written);
+    return MojoEndWriteData(value(), num_bytes_written, nullptr);
   }
 
   // Copying and assignment allowed.
@@ -71,21 +77,27 @@
   MojoResult ReadData(void* elements,
                       uint32_t* num_bytes,
                       MojoReadDataFlags flags) const {
-    return MojoReadData(value(), elements, num_bytes, flags);
+    MojoReadDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = flags;
+    return MojoReadData(value(), &options, elements, num_bytes);
   }
 
   // Begins a two-phase read from a data pipe. See |MojoBeginReadData()| for
   // complete documentation.
   MojoResult BeginReadData(const void** buffer,
                            uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags) const {
-    return MojoBeginReadData(value(), buffer, buffer_num_bytes, flags);
+                           MojoBeginReadDataFlags flags) const {
+    MojoBeginReadDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = flags;
+    return MojoBeginReadData(value(), &options, buffer, buffer_num_bytes);
   }
 
   // Completes a two-phase read from a data pipe. See |MojoEndReadData()| for
   // complete documentation.
   MojoResult EndReadData(uint32_t num_bytes_read) const {
-    return MojoEndReadData(value(), num_bytes_read);
+    return MojoEndReadData(value(), num_bytes_read, nullptr);
   }
 
   // Copying and assignment allowed.
@@ -144,7 +156,7 @@
 inline DataPipe::DataPipe(uint32_t capacity_num_bytes) {
   MojoCreateDataPipeOptions options;
   options.struct_size = sizeof(MojoCreateDataPipeOptions);
-  options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
   options.element_num_bytes = 1;
   options.capacity_num_bytes = capacity_num_bytes;
   mojo::DataPipe data_pipe(options);
diff --git a/mojo/public/cpp/system/message.h b/mojo/public/cpp/system/message.h
index ebe0f31..3234eaeb 100644
--- a/mojo/public/cpp/system/message.h
+++ b/mojo/public/cpp/system/message.h
@@ -90,7 +90,8 @@
 inline MojoResult NotifyBadMessage(MessageHandle message,
                                    const base::StringPiece& error) {
   DCHECK(message.is_valid());
-  return MojoNotifyBadMessage(message.value(), error.data(), error.size());
+  return MojoNotifyBadMessage(message.value(), error.data(), error.size(),
+                              nullptr);
 }
 
 }  // namespace mojo
diff --git a/mojo/public/cpp/system/message_pipe.cc b/mojo/public/cpp/system/message_pipe.cc
index 0d1adb5..4059b6e 100644
--- a/mojo/public/cpp/system/message_pipe.cc
+++ b/mojo/public/cpp/system/message_pipe.cc
@@ -18,15 +18,15 @@
   MojoResult rv = CreateMessage(&message_handle);
   DCHECK_EQ(MOJO_RESULT_OK, rv);
 
-  MojoAppendMessageDataOptions options;
-  options.struct_size = sizeof(options);
-  options.flags = MOJO_APPEND_MESSAGE_DATA_FLAG_COMMIT_SIZE;
+  MojoAppendMessageDataOptions append_options;
+  append_options.struct_size = sizeof(append_options);
+  append_options.flags = MOJO_APPEND_MESSAGE_DATA_FLAG_COMMIT_SIZE;
   void* buffer;
   uint32_t buffer_size;
   rv = MojoAppendMessageData(message_handle->value(),
                              base::checked_cast<uint32_t>(num_bytes), handles,
                              base::checked_cast<uint32_t>(num_handles),
-                             &options, &buffer, &buffer_size);
+                             &append_options, &buffer, &buffer_size);
   if (rv != MOJO_RESULT_OK)
     return MOJO_RESULT_ABORTED;
 
@@ -34,8 +34,11 @@
   DCHECK_GE(buffer_size, base::checked_cast<uint32_t>(num_bytes));
   memcpy(buffer, bytes, num_bytes);
 
+  MojoWriteMessageOptions write_options;
+  write_options.struct_size = sizeof(write_options);
+  write_options.flags = flags;
   return MojoWriteMessage(message_pipe.value(),
-                          message_handle.release().value(), flags);
+                          message_handle.release().value(), &write_options);
 }
 
 MojoResult ReadMessageRaw(MessagePipeHandle message_pipe,
diff --git a/mojo/public/cpp/system/message_pipe.h b/mojo/public/cpp/system/message_pipe.h
index ae0e2c7..3803a20 100644
--- a/mojo/public/cpp/system/message_pipe.h
+++ b/mojo/public/cpp/system/message_pipe.h
@@ -91,8 +91,11 @@
 inline MojoResult WriteMessageNew(MessagePipeHandle message_pipe,
                                   ScopedMessageHandle message,
                                   MojoWriteMessageFlags flags) {
+  MojoWriteMessageOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   return MojoWriteMessage(message_pipe.value(), message.release().value(),
-                          flags);
+                          &options);
 }
 
 // Reads from a message pipe. See |MojoReadMessage()| for complete
@@ -100,8 +103,11 @@
 inline MojoResult ReadMessageNew(MessagePipeHandle message_pipe,
                                  ScopedMessageHandle* message,
                                  MojoReadMessageFlags flags) {
+  MojoReadMessageOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoMessageHandle raw_message;
-  MojoResult rv = MojoReadMessage(message_pipe.value(), &raw_message, flags);
+  MojoResult rv = MojoReadMessage(message_pipe.value(), &options, &raw_message);
   if (rv != MOJO_RESULT_OK)
     return rv;
 
@@ -114,7 +120,7 @@
 inline MojoResult FuseMessagePipes(ScopedMessagePipeHandle message_pipe0,
                                    ScopedMessagePipeHandle message_pipe1) {
   return MojoFuseMessagePipes(message_pipe0.release().value(),
-                              message_pipe1.release().value());
+                              message_pipe1.release().value(), nullptr);
 }
 
 // A wrapper class that automatically creates a message pipe and owns both
diff --git a/mojo/public/cpp/test_support/lib/test_utils.cc b/mojo/public/cpp/test_support/lib/test_utils.cc
index d33bb954..c876f42 100644
--- a/mojo/public/cpp/test_support/lib/test_utils.cc
+++ b/mojo/public/cpp/test_support/lib/test_utils.cc
@@ -46,8 +46,7 @@
 
 bool DiscardMessage(const MessagePipeHandle& handle) {
   MojoMessageHandle message;
-  int rv =
-      MojoReadMessage(handle.value(), &message, MOJO_READ_MESSAGE_FLAG_NONE);
+  int rv = MojoReadMessage(handle.value(), nullptr, &message);
   if (rv != MOJO_RESULT_OK)
     return false;
   MojoDestroyMessage(message);
diff --git a/net/reporting/reporting_cache.cc b/net/reporting/reporting_cache.cc
index 0df7956..3a85b4b 100644
--- a/net/reporting/reporting_cache.cc
+++ b/net/reporting/reporting_cache.cc
@@ -335,14 +335,11 @@
         std::vector<base::Value> endpoint_list;
         for (const ReportingClient* client : clients) {
           base::Value endpoint_dict(base::Value::Type::DICTIONARY);
-          // Reporting defines the group as a whole to have an expiration time
-          // and subdomains flag, not the individual endpoints within the group.
+          // Reporting defines the group as a whole to have an expiration time,
+          // not the individual endpoints within the group.
           group_dict.SetKey(
               "expires",
               base::Value(NetLog::TickCountToString(client->expires)));
-          group_dict.SetKey("includeSubdomains",
-                            base::Value(client->subdomains ==
-                                        ReportingClient::Subdomains::INCLUDE));
           endpoint_dict.SetKey("url", base::Value(client->endpoint.spec()));
           endpoint_dict.SetKey("priority", base::Value(client->priority));
           endpoint_dict.SetKey("weight", base::Value(client->weight));
diff --git a/net/reporting/reporting_cache_unittest.cc b/net/reporting/reporting_cache_unittest.cc
index a2fbb9e..fbd6e92 100644
--- a/net/reporting/reporting_cache_unittest.cc
+++ b/net/reporting/reporting_cache_unittest.cc
@@ -409,7 +409,7 @@
   const base::TimeTicks expires =
       base::TimeTicks() + base::TimeDelta::FromDays(7);
   SetClient(kOrigin1_, kEndpoint1_, false, kGroup1_, expires);
-  SetClient(kOrigin2_, kEndpoint2_, true, kGroup1_, expires);
+  SetClient(kOrigin2_, kEndpoint2_, false, kGroup1_, expires);
 
   // Add some reports so that we can test the upload counts.
   const ReportingReport* report1a = AddAndReturnReport(
@@ -433,7 +433,6 @@
             {
               "name": "group1",
               "expires": "604800000",
-              "includeSubdomains": false,
               "endpoints": [
                 {"url": "https://endpoint1/", "priority": 0, "weight": 1,
                  "successful": {"uploads": 1, "reports": 2},
@@ -448,7 +447,6 @@
             {
               "name": "group1",
               "expires": "604800000",
-              "includeSubdomains": true,
               "endpoints": [
                 {"url": "https://endpoint2/", "priority": 0, "weight": 1,
                  "successful": {"uploads": 0, "reports": 0},
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
index fb7a0f0..b25fa0db 100644
--- a/net/socket/ssl_client_socket_impl.cc
+++ b/net/socket/ssl_client_socket_impl.cc
@@ -914,11 +914,9 @@
   SSL_set_mode(ssl_.get(), mode.set_mask);
   SSL_clear_mode(ssl_.get(), mode.clear_mask);
 
-  // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
-  // (note that SHA256 and SHA384 only select legacy CBC ciphers).
-  // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining
-  // CBC-mode ECDSA ciphers.
-  std::string command("ALL:!SHA256:!SHA384:!aPSK:!ECDSA+SHA1");
+  // Use BoringSSL defaults, but disable HMAC-SHA1 ciphers in ECDSA. These are
+  // the remaining CBC-mode ECDSA ciphers.
+  std::string command("ALL::!aPSK:!ECDSA+SHA1");
 
   if (ssl_config_.require_ecdhe)
     command.append(":!kRSA");
diff --git a/net/socket/ssl_server_socket_impl.cc b/net/socket/ssl_server_socket_impl.cc
index 5568b86..b00dfc4 100644
--- a/net/socket/ssl_server_socket_impl.cc
+++ b/net/socket/ssl_server_socket_impl.cc
@@ -885,7 +885,7 @@
   // disabled by default. Note that !SHA256 and !SHA384 only remove HMAC-SHA256
   // and HMAC-SHA384 cipher suites, not GCM cipher suites with SHA256 or SHA384
   // as the handshake hash.
-  std::string command("DEFAULT:!SHA256:!SHA384:!AESGCM+AES256:!aPSK");
+  std::string command("DEFAULT:!AESGCM+AES256:!aPSK");
 
   // SSLPrivateKey only supports ECDHE-based ciphers because it lacks decrypt.
   if (ssl_server_config_.require_ecdhe || (!key_ && private_key_))
diff --git a/net/test/spawned_test_server/base_test_server.cc b/net/test/spawned_test_server/base_test_server.cc
index 8bea8d2204..b0c7dd5a 100644
--- a/net/test/spawned_test_server/base_test_server.cc
+++ b/net/test/spawned_test_server/base_test_server.cc
@@ -25,6 +25,7 @@
 #include "net/cert/x509_certificate.h"
 #include "net/dns/host_resolver.h"
 #include "net/log/net_log_with_source.h"
+#include "net/test/test_data_directory.h"
 #include "url/gurl.h"
 
 namespace net {
@@ -179,6 +180,12 @@
   }
 }
 
+bool RegisterRootCertsInternal(const base::FilePath& file_path) {
+  TestRootCerts* root_certs = TestRootCerts::GetInstance();
+  return root_certs->AddFromFile(file_path.AppendASCII("ocsp-test-root.pem")) &&
+         root_certs->AddFromFile(file_path.AppendASCII("root_ca_cert.pem"));
+}
+
 }  // namespace
 
 BaseTestServer::SSLOptions::SSLOptions() = default;
@@ -435,6 +442,11 @@
   return true;
 }
 
+void BaseTestServer::RegisterTestCerts() {
+  bool added_root_certs = RegisterRootCertsInternal(GetTestCertsDirectory());
+  DCHECK(added_root_certs);
+}
+
 bool BaseTestServer::LoadTestRootCert() const {
   TestRootCerts* root_certs = TestRootCerts::GetInstance();
   if (!root_certs)
@@ -445,17 +457,7 @@
   if (!GetLocalCertificatesDir(certificates_dir_, &root_certificate_path))
     return false;
 
-  if (ssl_options_.server_certificate == SSLOptions::CERT_AUTO ||
-      ssl_options_.server_certificate ==
-          SSLOptions::CERT_AUTO_WITH_INTERMEDIATE ||
-      ssl_options_.server_certificate ==
-          SSLOptions::CERT_AUTO_AIA_INTERMEDIATE) {
-    return root_certs->AddFromFile(
-        root_certificate_path.AppendASCII("ocsp-test-root.pem"));
-  } else {
-    return root_certs->AddFromFile(
-        root_certificate_path.AppendASCII("root_ca_cert.pem"));
-  }
+  return RegisterRootCertsInternal(root_certificate_path);
 }
 
 scoped_refptr<X509Certificate> BaseTestServer::GetCertificate() const {
diff --git a/net/test/spawned_test_server/base_test_server.h b/net/test/spawned_test_server/base_test_server.h
index d629bb0..56b6a7bd 100644
--- a/net/test/spawned_test_server/base_test_server.h
+++ b/net/test/spawned_test_server/base_test_server.h
@@ -419,6 +419,9 @@
     redirect_connect_to_localhost_ = redirect_connect_to_localhost;
   }
 
+  // Registers the test server's certs for the current process.
+  static void RegisterTestCerts();
+
   // Marks the root certificate of an HTTPS test server as trusted for
   // the duration of tests.
   bool LoadTestRootCert() const WARN_UNUSED_RESULT;
diff --git a/pdf/BUILD.gn b/pdf/BUILD.gn
index 0781b5b3..48b3f0214 100644
--- a/pdf/BUILD.gn
+++ b/pdf/BUILD.gn
@@ -82,6 +82,10 @@
         "pdfium/pdfium_assert_matching_enums.cc",
         "pdfium/pdfium_engine.cc",
         "pdfium/pdfium_engine.h",
+        "pdfium/pdfium_engine_exports.cc",
+        "pdfium/pdfium_engine_exports.h",
+        "pdfium/pdfium_form_filler.cc",
+        "pdfium/pdfium_form_filler.h",
         "pdfium/pdfium_mem_buffer_file_read.cc",
         "pdfium/pdfium_mem_buffer_file_read.h",
         "pdfium/pdfium_mem_buffer_file_write.cc",
diff --git a/pdf/pdf_engine.h b/pdf/pdf_engine.h
index 47c0845e..b999c95 100644
--- a/pdf/pdf_engine.h
+++ b/pdf/pdf_engine.h
@@ -449,6 +449,7 @@
 
   PDFEngineExports() {}
   virtual ~PDFEngineExports() {}
+
   static PDFEngineExports* Get();
 
 #if defined(OS_WIN)
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 6a25cd0..5a8d3247 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -16,7 +16,6 @@
 #include "base/auto_reset.h"
 #include "base/i18n/encoding_detection.h"
 #include "base/i18n/icu_string_conversions.h"
-#include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/numerics/safe_conversions.h"
@@ -630,10 +629,6 @@
   return 1;
 }
 
-std::string WideStringToString(FPDF_WIDESTRING wide_string) {
-  return base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(wide_string));
-}
-
 // Returns true if the given |area| and |form_type| combination from
 // PDFiumEngine::GetCharIndex() indicates it is a form text area.
 bool IsFormTextArea(PDFiumPage::Area area, int form_type) {
@@ -803,7 +798,8 @@
       called_do_document_action_(false),
       render_grayscale_(false),
       render_annots_(true),
-      edit_mode_(false) {
+      edit_mode_(false),
+      form_filler_(this) {
   find_factory_.Initialize(this);
   password_factory_.Initialize(this);
 
@@ -819,56 +815,6 @@
   download_hints_.AddSegment = &AddSegment;
   download_hints_.engine = this;
 
-  // Initialize FPDF_FORMFILLINFO member variables.  Deriving from this struct
-  // allows the static callbacks to be able to cast the FPDF_FORMFILLINFO in
-  // callbacks to ourself instead of maintaining a map of them to
-  // PDFiumEngine.
-  FPDF_FORMFILLINFO::version = 1;
-  FPDF_FORMFILLINFO::m_pJsPlatform = this;
-  FPDF_FORMFILLINFO::Release = nullptr;
-  FPDF_FORMFILLINFO::FFI_Invalidate = Form_Invalidate;
-  FPDF_FORMFILLINFO::FFI_OutputSelectedRect = Form_OutputSelectedRect;
-  FPDF_FORMFILLINFO::FFI_SetCursor = Form_SetCursor;
-  FPDF_FORMFILLINFO::FFI_SetTimer = Form_SetTimer;
-  FPDF_FORMFILLINFO::FFI_KillTimer = Form_KillTimer;
-  FPDF_FORMFILLINFO::FFI_GetLocalTime = Form_GetLocalTime;
-  FPDF_FORMFILLINFO::FFI_OnChange = Form_OnChange;
-  FPDF_FORMFILLINFO::FFI_GetPage = Form_GetPage;
-  FPDF_FORMFILLINFO::FFI_GetCurrentPage = Form_GetCurrentPage;
-  FPDF_FORMFILLINFO::FFI_GetRotation = Form_GetRotation;
-  FPDF_FORMFILLINFO::FFI_ExecuteNamedAction = Form_ExecuteNamedAction;
-  FPDF_FORMFILLINFO::FFI_SetTextFieldFocus = Form_SetTextFieldFocus;
-  FPDF_FORMFILLINFO::FFI_DoURIAction = Form_DoURIAction;
-  FPDF_FORMFILLINFO::FFI_DoGoToAction = Form_DoGoToAction;
-#if defined(PDF_ENABLE_XFA)
-  FPDF_FORMFILLINFO::version = 2;
-  FPDF_FORMFILLINFO::FFI_EmailTo = Form_EmailTo;
-  FPDF_FORMFILLINFO::FFI_DisplayCaret = Form_DisplayCaret;
-  FPDF_FORMFILLINFO::FFI_SetCurrentPage = Form_SetCurrentPage;
-  FPDF_FORMFILLINFO::FFI_GetCurrentPageIndex = Form_GetCurrentPageIndex;
-  FPDF_FORMFILLINFO::FFI_GetPageViewRect = Form_GetPageViewRect;
-  FPDF_FORMFILLINFO::FFI_GetPlatform = Form_GetPlatform;
-  FPDF_FORMFILLINFO::FFI_PageEvent = nullptr;
-  FPDF_FORMFILLINFO::FFI_PopupMenu = Form_PopupMenu;
-  FPDF_FORMFILLINFO::FFI_PostRequestURL = Form_PostRequestURL;
-  FPDF_FORMFILLINFO::FFI_PutRequestURL = Form_PutRequestURL;
-  FPDF_FORMFILLINFO::FFI_UploadTo = Form_UploadTo;
-  FPDF_FORMFILLINFO::FFI_DownloadFromURL = Form_DownloadFromURL;
-  FPDF_FORMFILLINFO::FFI_OpenFile = Form_OpenFile;
-  FPDF_FORMFILLINFO::FFI_GotoURL = Form_GotoURL;
-  FPDF_FORMFILLINFO::FFI_GetLanguage = Form_GetLanguage;
-#endif  // defined(PDF_ENABLE_XFA)
-  IPDF_JSPLATFORM::version = 3;
-  IPDF_JSPLATFORM::app_alert = Form_Alert;
-  IPDF_JSPLATFORM::app_beep = Form_Beep;
-  IPDF_JSPLATFORM::app_response = Form_Response;
-  IPDF_JSPLATFORM::Doc_getFilePath = Form_GetFilePath;
-  IPDF_JSPLATFORM::Doc_mail = Form_Mail;
-  IPDF_JSPLATFORM::Doc_print = Form_Print;
-  IPDF_JSPLATFORM::Doc_submitForm = Form_SubmitForm;
-  IPDF_JSPLATFORM::Doc_gotoPage = Form_GotoPage;
-  IPDF_JSPLATFORM::Field_browse = nullptr;
-
   IFSDK_PAUSE::version = 1;
   IFSDK_PAUSE::user = nullptr;
   IFSDK_PAUSE::NeedToPauseNow = Pause_NeedToPauseNow;
@@ -899,210 +845,6 @@
   g_create_document_loader_for_testing = function;
 }
 
-#if defined(PDF_ENABLE_XFA)
-
-void PDFiumEngine::Form_EmailTo(FPDF_FORMFILLINFO* param,
-                                FPDF_FILEHANDLER* file_handler,
-                                FPDF_WIDESTRING to,
-                                FPDF_WIDESTRING subject,
-                                FPDF_WIDESTRING cc,
-                                FPDF_WIDESTRING bcc,
-                                FPDF_WIDESTRING message) {
-  std::string to_str = WideStringToString(to);
-  std::string subject_str = WideStringToString(subject);
-  std::string cc_str = WideStringToString(cc);
-  std::string bcc_str = WideStringToString(bcc);
-  std::string message_str = WideStringToString(message);
-
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->client_->Email(to_str, cc_str, bcc_str, subject_str, message_str);
-}
-
-void PDFiumEngine::Form_DisplayCaret(FPDF_FORMFILLINFO* param,
-                                     FPDF_PAGE page,
-                                     FPDF_BOOL visible,
-                                     double left,
-                                     double top,
-                                     double right,
-                                     double bottom) {}
-
-void PDFiumEngine::Form_SetCurrentPage(FPDF_FORMFILLINFO* param,
-                                       FPDF_DOCUMENT document,
-                                       int page) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  pp::Rect page_view_rect = engine->GetPageContentsRect(page);
-  engine->ScrolledToYPosition(page_view_rect.height());
-  pp::Point pos(1, page_view_rect.height());
-  engine->SetScrollPosition(pos);
-}
-
-int PDFiumEngine::Form_GetCurrentPageIndex(FPDF_FORMFILLINFO* param,
-                                           FPDF_DOCUMENT document) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  return engine->GetMostVisiblePage();
-}
-
-void PDFiumEngine::Form_GetPageViewRect(FPDF_FORMFILLINFO* param,
-                                        FPDF_PAGE page,
-                                        double* left,
-                                        double* top,
-                                        double* right,
-                                        double* bottom) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  int page_index = engine->GetVisiblePageIndex(page);
-  if (!engine->PageIndexInBounds(page_index)) {
-    *left = 0;
-    *right = 0;
-    *top = 0;
-    *bottom = 0;
-    return;
-  }
-
-  pp::Rect page_view_rect = engine->GetPageContentsRect(page_index);
-
-  float toolbar_height_in_screen_coords =
-      engine->GetToolbarHeightInScreenCoords();
-
-  float page_width = FPDF_GetPageWidth(page);
-  float page_height = FPDF_GetPageHeight(page);
-
-  // To convert from a screen scale to a page scale, we multiply by
-  // (page_height / page_view_rect.height()) and
-  // (page_width / page_view_rect.width()),
-  // The base point of the page in screen coords is (page_view_rect.x(),
-  // page_view_rect.y()).
-  // Therefore, to convert an x position from screen to page
-  // coords, we use (page_width * (x - base_x) / page_view_rect.width()).
-  // For y positions, (page_height * (y - base_y) / page_view_rect.height()).
-
-  // The top-most y position that can be relied to be visible on the screen is
-  // the bottom of the toolbar, which is y = toolbar_height_in_screen_coords.
-  float screen_top_in_page_coords =
-      page_height * (toolbar_height_in_screen_coords - page_view_rect.y()) /
-      page_view_rect.height();
-  // The bottom-most y position that is visible on the screen is the bottom of
-  // the plugin area, which is y = engine->plugin_size_.height().
-  float screen_bottom_in_page_coords =
-      page_height * (engine->plugin_size_.height() - page_view_rect.y()) /
-      page_view_rect.height();
-  // The left-most x position that is visible on the screen is the left of the
-  // plugin area, which is x = 0.
-  float screen_left_in_page_coords =
-      page_width * (0 - page_view_rect.x()) / page_view_rect.width();
-  // The right-most x position that is visible on the screen is the right of the
-  // plugin area, which is x = engine->plugin_size_.width().
-  float screen_right_in_page_coords =
-      page_width * (engine->plugin_size_.width() - page_view_rect.x()) /
-      page_view_rect.width();
-
-  // Return the edge of the screen or of the page, since we're restricted to
-  // both.
-  *left = std::max(screen_left_in_page_coords, 0.0f);
-  *right = std::min(screen_right_in_page_coords, page_width);
-  *top = std::max(screen_top_in_page_coords, 0.0f);
-  *bottom = std::min(screen_bottom_in_page_coords, page_height);
-}
-
-int PDFiumEngine::Form_GetPlatform(FPDF_FORMFILLINFO* param,
-                                   void* platform,
-                                   int length) {
-  int platform_flag = -1;
-
-#if defined(WIN32)
-  platform_flag = 0;
-#elif defined(__linux__)
-  platform_flag = 1;
-#else
-  platform_flag = 2;
-#endif
-
-  std::string javascript =
-      "alert(\"Platform:" + base::NumberToString(platform_flag) + "\")";
-
-  return platform_flag;
-}
-
-FPDF_BOOL PDFiumEngine::Form_PopupMenu(FPDF_FORMFILLINFO* param,
-                                       FPDF_PAGE page,
-                                       FPDF_WIDGET widget,
-                                       int menu_flag,
-                                       float x,
-                                       float y) {
-  return false;
-}
-
-FPDF_BOOL PDFiumEngine::Form_PostRequestURL(FPDF_FORMFILLINFO* param,
-                                            FPDF_WIDESTRING url,
-                                            FPDF_WIDESTRING data,
-                                            FPDF_WIDESTRING content_type,
-                                            FPDF_WIDESTRING encode,
-                                            FPDF_WIDESTRING header,
-                                            FPDF_BSTR* response) {
-  std::string url_str = WideStringToString(url);
-  std::string data_str = WideStringToString(data);
-  std::string content_type_str = WideStringToString(content_type);
-  std::string encode_str = WideStringToString(encode);
-  std::string header_str = WideStringToString(header);
-
-  std::string javascript = "alert(\"Post:" + url_str + "," + data_str + "," +
-                           content_type_str + "," + encode_str + "," +
-                           header_str + "\")";
-  return true;
-}
-
-FPDF_BOOL PDFiumEngine::Form_PutRequestURL(FPDF_FORMFILLINFO* param,
-                                           FPDF_WIDESTRING url,
-                                           FPDF_WIDESTRING data,
-                                           FPDF_WIDESTRING encode) {
-  std::string url_str = WideStringToString(url);
-  std::string data_str = WideStringToString(data);
-  std::string encode_str = WideStringToString(encode);
-
-  std::string javascript =
-      "alert(\"Put:" + url_str + "," + data_str + "," + encode_str + "\")";
-
-  return true;
-}
-
-void PDFiumEngine::Form_UploadTo(FPDF_FORMFILLINFO* param,
-                                 FPDF_FILEHANDLER* file_handle,
-                                 int file_flag,
-                                 FPDF_WIDESTRING to) {
-  std::string to_str = WideStringToString(to);
-  // TODO: needs the full implementation of form uploading
-}
-
-FPDF_LPFILEHANDLER PDFiumEngine::Form_DownloadFromURL(FPDF_FORMFILLINFO* param,
-                                                      FPDF_WIDESTRING url) {
-  // NOTE: Think hard about the security implications before allowing
-  // a PDF file to perform this action.
-  return nullptr;
-}
-
-FPDF_FILEHANDLER* PDFiumEngine::Form_OpenFile(FPDF_FORMFILLINFO* param,
-                                              int file_flag,
-                                              FPDF_WIDESTRING url,
-                                              const char* mode) {
-  // NOTE: Think hard about the security implications before allowing
-  // a PDF file to perform this action.
-  return nullptr;
-}
-
-void PDFiumEngine::Form_GotoURL(FPDF_FORMFILLINFO* param,
-                                FPDF_DOCUMENT document,
-                                FPDF_WIDESTRING url) {
-  std::string url_str = WideStringToString(url);
-  // TODO: needs to implement GOTO URL action
-}
-
-int PDFiumEngine::Form_GetLanguage(FPDF_FORMFILLINFO* param,
-                                   void* language,
-                                   int length) {
-  return 0;
-}
-
-#endif  // defined(PDF_ENABLE_XFA)
-
 int PDFiumEngine::GetBlock(void* param,
                            unsigned long position,
                            unsigned char* buffer,
@@ -3407,8 +3149,7 @@
   DCHECK(doc_);
   form_status_ = FPDFAvail_IsFormAvail(fpdf_availability_, &download_hints_);
   if (form_status_ != PDF_FORM_NOTAVAIL || doc_loader_->IsDocumentComplete()) {
-    form_ = FPDFDOC_InitFormFillEnvironment(
-        doc_, static_cast<FPDF_FORMFILLINFO*>(this));
+    form_ = FPDFDOC_InitFormFillEnvironment(doc_, &form_filler_);
 #if defined(PDF_ENABLE_XFA)
     FPDF_LoadXFA(doc_);
 #endif
@@ -4298,300 +4039,6 @@
   return client_->GetToolbarHeightInScreenCoords();
 }
 
-void PDFiumEngine::Form_Invalidate(FPDF_FORMFILLINFO* param,
-                                   FPDF_PAGE page,
-                                   double left,
-                                   double top,
-                                   double right,
-                                   double bottom) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  int page_index = engine->GetVisiblePageIndex(page);
-  if (page_index == -1) {
-    // This can sometime happen when the page is closed because it went off
-    // screen, and PDFium invalidates the control as it's being deleted.
-    return;
-  }
-
-  pp::Rect rect = engine->pages_[page_index]->PageToScreen(
-      engine->GetVisibleRect().point(), engine->current_zoom_, left, top, right,
-      bottom, engine->current_rotation_);
-  engine->client_->Invalidate(rect);
-}
-
-void PDFiumEngine::Form_OutputSelectedRect(FPDF_FORMFILLINFO* param,
-                                           FPDF_PAGE page,
-                                           double left,
-                                           double top,
-                                           double right,
-                                           double bottom) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  int page_index = engine->GetVisiblePageIndex(page);
-  if (page_index == -1) {
-    NOTREACHED();
-    return;
-  }
-  pp::Rect rect = engine->pages_[page_index]->PageToScreen(
-      engine->GetVisibleRect().point(), engine->current_zoom_, left, top, right,
-      bottom, engine->current_rotation_);
-  if (rect.IsEmpty())
-    return;
-
-  engine->form_highlights_.push_back(rect);
-}
-
-void PDFiumEngine::Form_SetCursor(FPDF_FORMFILLINFO* param, int cursor_type) {
-  // We don't need this since it's not enough to change the cursor in all
-  // scenarios.  Instead, we check which form field we're under in OnMouseMove.
-}
-
-int PDFiumEngine::Form_SetTimer(FPDF_FORMFILLINFO* param,
-                                int elapse,
-                                TimerCallback timer_func) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  base::TimeDelta elapse_time = base::TimeDelta::FromMilliseconds(elapse);
-  engine->formfill_timers_.emplace(
-      std::piecewise_construct,
-      std::forward_as_tuple(++engine->next_formfill_timer_id_),
-      std::forward_as_tuple(elapse_time, timer_func));
-  engine->client_->ScheduleCallback(engine->next_formfill_timer_id_,
-                                    elapse_time);
-  return engine->next_formfill_timer_id_;
-}
-
-void PDFiumEngine::Form_KillTimer(FPDF_FORMFILLINFO* param, int timer_id) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->formfill_timers_.erase(timer_id);
-}
-
-FPDF_SYSTEMTIME PDFiumEngine::Form_GetLocalTime(FPDF_FORMFILLINFO* param) {
-  base::Time time = base::Time::Now();
-  base::Time::Exploded exploded;
-  time.LocalExplode(&exploded);
-
-  FPDF_SYSTEMTIME rv;
-  rv.wYear = exploded.year;
-  rv.wMonth = exploded.month;
-  rv.wDayOfWeek = exploded.day_of_week;
-  rv.wDay = exploded.day_of_month;
-  rv.wHour = exploded.hour;
-  rv.wMinute = exploded.minute;
-  rv.wSecond = exploded.second;
-  rv.wMilliseconds = exploded.millisecond;
-  return rv;
-}
-
-void PDFiumEngine::Form_OnChange(FPDF_FORMFILLINFO* param) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->SetEditMode(true);
-}
-
-FPDF_PAGE PDFiumEngine::Form_GetPage(FPDF_FORMFILLINFO* param,
-                                     FPDF_DOCUMENT document,
-                                     int page_index) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  if (!engine->PageIndexInBounds(page_index))
-    return nullptr;
-  return engine->pages_[page_index]->GetPage();
-}
-
-FPDF_PAGE PDFiumEngine::Form_GetCurrentPage(FPDF_FORMFILLINFO* param,
-                                            FPDF_DOCUMENT document) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  int index = engine->last_page_mouse_down_;
-  if (index == -1) {
-    index = engine->GetMostVisiblePage();
-    if (index == -1) {
-      NOTREACHED();
-      return nullptr;
-    }
-  }
-
-  return engine->pages_[index]->GetPage();
-}
-
-int PDFiumEngine::Form_GetRotation(FPDF_FORMFILLINFO* param, FPDF_PAGE page) {
-  return 0;
-}
-
-void PDFiumEngine::Form_ExecuteNamedAction(FPDF_FORMFILLINFO* param,
-                                           FPDF_BYTESTRING named_action) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  std::string action(named_action);
-  if (action == "Print") {
-    engine->client_->Print();
-    return;
-  }
-
-  int index = engine->last_page_mouse_down_;
-  /* Don't try to calculate the most visible page if we don't have a left click
-     before this event (this code originally copied Form_GetCurrentPage which of
-     course needs to do that and which doesn't have recursion). This can end up
-     causing infinite recursion. See http://crbug.com/240413 for more
-     information. Either way, it's not necessary for the spec'd list of named
-     actions.
-  if (index == -1)
-    index = engine->GetMostVisiblePage();
-  */
-  if (index == -1)
-    return;
-
-  // This is the only list of named actions per the spec (see 12.6.4.11). Adobe
-  // Reader supports more, like FitWidth, but since they're not part of the spec
-  // and we haven't got bugs about them, no need to now.
-  if (action == "NextPage") {
-    engine->ScrollToPage(index + 1);
-  } else if (action == "PrevPage") {
-    engine->ScrollToPage(index - 1);
-  } else if (action == "FirstPage") {
-    engine->ScrollToPage(0);
-  } else if (action == "LastPage") {
-    engine->ScrollToPage(engine->pages_.size() - 1);
-  }
-}
-
-void PDFiumEngine::Form_SetTextFieldFocus(FPDF_FORMFILLINFO* param,
-                                          FPDF_WIDESTRING value,
-                                          FPDF_DWORD valueLen,
-                                          FPDF_BOOL is_focus) {
-  // Do nothing for now.
-  // TODO(gene): use this signal to trigger OSK.
-}
-
-void PDFiumEngine::Form_DoURIAction(FPDF_FORMFILLINFO* param,
-                                    FPDF_BYTESTRING uri) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->client_->NavigateTo(std::string(uri),
-                              WindowOpenDisposition::CURRENT_TAB);
-}
-
-void PDFiumEngine::Form_DoGoToAction(FPDF_FORMFILLINFO* param,
-                                     int page_index,
-                                     int zoom_mode,
-                                     float* position_array,
-                                     int size_of_array) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->ScrollToPage(page_index);
-}
-
-int PDFiumEngine::Form_Alert(IPDF_JSPLATFORM* param,
-                             FPDF_WIDESTRING message,
-                             FPDF_WIDESTRING title,
-                             int type,
-                             int icon) {
-  // See fpdfformfill.h for these values.
-  enum AlertType {
-    ALERT_TYPE_OK = 0,
-    ALERT_TYPE_OK_CANCEL,
-    ALERT_TYPE_YES_ON,
-    ALERT_TYPE_YES_NO_CANCEL
-  };
-
-  enum AlertResult {
-    ALERT_RESULT_OK = 1,
-    ALERT_RESULT_CANCEL,
-    ALERT_RESULT_NO,
-    ALERT_RESULT_YES
-  };
-
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  std::string message_str = WideStringToString(message);
-  if (type == ALERT_TYPE_OK) {
-    engine->client_->Alert(message_str);
-    return ALERT_RESULT_OK;
-  }
-
-  bool rv = engine->client_->Confirm(message_str);
-  if (type == ALERT_TYPE_OK_CANCEL)
-    return rv ? ALERT_RESULT_OK : ALERT_RESULT_CANCEL;
-  return rv ? ALERT_RESULT_YES : ALERT_RESULT_NO;
-}
-
-void PDFiumEngine::Form_Beep(IPDF_JSPLATFORM* param, int type) {
-  // Beeps are annoying, and not possible using javascript, so ignore for now.
-}
-
-int PDFiumEngine::Form_Response(IPDF_JSPLATFORM* param,
-                                FPDF_WIDESTRING question,
-                                FPDF_WIDESTRING title,
-                                FPDF_WIDESTRING default_response,
-                                FPDF_WIDESTRING label,
-                                FPDF_BOOL password,
-                                void* response,
-                                int length) {
-  std::string question_str = WideStringToString(question);
-  std::string default_str = WideStringToString(default_response);
-
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  std::string rv = engine->client_->Prompt(question_str, default_str);
-  base::string16 rv_16 = base::UTF8ToUTF16(rv);
-  int rv_bytes = rv_16.size() * sizeof(base::char16);
-  if (response) {
-    int bytes_to_copy = rv_bytes < length ? rv_bytes : length;
-    memcpy(response, rv_16.c_str(), bytes_to_copy);
-  }
-  return rv_bytes;
-}
-
-int PDFiumEngine::Form_GetFilePath(IPDF_JSPLATFORM* param,
-                                   void* file_path,
-                                   int length) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  std::string rv = engine->client_->GetURL();
-  if (file_path && rv.size() <= static_cast<size_t>(length))
-    memcpy(file_path, rv.c_str(), rv.size());
-  return rv.size();
-}
-
-void PDFiumEngine::Form_Mail(IPDF_JSPLATFORM* param,
-                             void* mail_data,
-                             int length,
-                             FPDF_BOOL ui,
-                             FPDF_WIDESTRING to,
-                             FPDF_WIDESTRING subject,
-                             FPDF_WIDESTRING cc,
-                             FPDF_WIDESTRING bcc,
-                             FPDF_WIDESTRING message) {
-  // Note: |mail_data| and |length| are ignored. We don't handle attachments;
-  // there is no way with mailto.
-  std::string to_str = WideStringToString(to);
-  std::string cc_str = WideStringToString(cc);
-  std::string bcc_str = WideStringToString(bcc);
-  std::string subject_str = WideStringToString(subject);
-  std::string message_str = WideStringToString(message);
-
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->client_->Email(to_str, cc_str, bcc_str, subject_str, message_str);
-}
-
-void PDFiumEngine::Form_Print(IPDF_JSPLATFORM* param,
-                              FPDF_BOOL ui,
-                              int start,
-                              int end,
-                              FPDF_BOOL silent,
-                              FPDF_BOOL shrink_to_fit,
-                              FPDF_BOOL print_as_image,
-                              FPDF_BOOL reverse,
-                              FPDF_BOOL annotations) {
-  // No way to pass the extra information to the print dialog using JavaScript.
-  // Just opening it is fine for now.
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->client_->Print();
-}
-
-void PDFiumEngine::Form_SubmitForm(IPDF_JSPLATFORM* param,
-                                   void* form_data,
-                                   int length,
-                                   FPDF_WIDESTRING url) {
-  std::string url_str = WideStringToString(url);
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->client_->SubmitForm(url_str, form_data, length);
-}
-
-void PDFiumEngine::Form_GotoPage(IPDF_JSPLATFORM* param, int page_number) {
-  PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->ScrollToPage(page_number);
-}
-
 FPDF_BOOL PDFiumEngine::Pause_NeedToPauseNow(IFSDK_PAUSE* param) {
   PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
   return base::Time::Now() - engine->last_progressive_start_time_ >
@@ -4689,275 +4136,4 @@
   g_engine_for_fontmapper = old_engine_;
 }
 
-namespace {
-
-base::LazyInstance<PDFiumEngineExports>::Leaky g_pdf_engine_exports =
-    LAZY_INSTANCE_INITIALIZER;
-
-int CalculatePosition(FPDF_PAGE page,
-                      const PDFiumEngineExports::RenderingSettings& settings,
-                      pp::Rect* dest) {
-  // settings.bounds is in terms of the max DPI. Convert page sizes to match.
-  int dpi = std::max(settings.dpi_x, settings.dpi_y);
-  int page_width = static_cast<int>(
-      ConvertUnitDouble(FPDF_GetPageWidth(page), kPointsPerInch, dpi));
-  int page_height = static_cast<int>(
-      ConvertUnitDouble(FPDF_GetPageHeight(page), kPointsPerInch, dpi));
-
-  // Start by assuming that we will draw exactly to the bounds rect
-  // specified.
-  *dest = settings.bounds;
-
-  int rotate = 0;  // normal orientation.
-
-  // Auto-rotate landscape pages to print correctly.
-  if (settings.autorotate &&
-      (dest->width() > dest->height()) != (page_width > page_height)) {
-    rotate = 3;  // 90 degrees counter-clockwise.
-    std::swap(page_width, page_height);
-  }
-
-  // See if we need to scale the output
-  bool scale_to_bounds = false;
-  if (settings.fit_to_bounds &&
-      ((page_width > dest->width()) || (page_height > dest->height()))) {
-    scale_to_bounds = true;
-  } else if (settings.stretch_to_bounds &&
-             ((page_width < dest->width()) || (page_height < dest->height()))) {
-    scale_to_bounds = true;
-  }
-
-  if (scale_to_bounds) {
-    // If we need to maintain aspect ratio, calculate the actual width and
-    // height.
-    if (settings.keep_aspect_ratio) {
-      double scale_factor_x = page_width;
-      scale_factor_x /= dest->width();
-      double scale_factor_y = page_height;
-      scale_factor_y /= dest->height();
-      if (scale_factor_x > scale_factor_y) {
-        dest->set_height(page_height / scale_factor_x);
-      } else {
-        dest->set_width(page_width / scale_factor_y);
-      }
-    }
-  } else {
-    // We are not scaling to bounds. Draw in the actual page size. If the
-    // actual page size is larger than the bounds, the output will be
-    // clipped.
-    dest->set_width(page_width);
-    dest->set_height(page_height);
-  }
-
-  // Scale the bounds to device units if DPI is rectangular.
-  if (settings.dpi_x != settings.dpi_y) {
-    dest->set_width(dest->width() * settings.dpi_x / dpi);
-    dest->set_height(dest->height() * settings.dpi_y / dpi);
-  }
-
-  if (settings.center_in_bounds) {
-    pp::Point offset(
-        (settings.bounds.width() * settings.dpi_x / dpi - dest->width()) / 2,
-        (settings.bounds.height() * settings.dpi_y / dpi - dest->height()) / 2);
-    dest->Offset(offset);
-  }
-  return rotate;
-}
-
-}  // namespace
-
-PDFEngineExports::RenderingSettings::RenderingSettings(int dpi_x,
-                                                       int dpi_y,
-                                                       const pp::Rect& bounds,
-                                                       bool fit_to_bounds,
-                                                       bool stretch_to_bounds,
-                                                       bool keep_aspect_ratio,
-                                                       bool center_in_bounds,
-                                                       bool autorotate,
-                                                       bool use_color)
-    : dpi_x(dpi_x),
-      dpi_y(dpi_y),
-      bounds(bounds),
-      fit_to_bounds(fit_to_bounds),
-      stretch_to_bounds(stretch_to_bounds),
-      keep_aspect_ratio(keep_aspect_ratio),
-      center_in_bounds(center_in_bounds),
-      autorotate(autorotate),
-      use_color(use_color) {}
-
-PDFEngineExports::RenderingSettings::RenderingSettings(
-    const RenderingSettings& that) = default;
-
-PDFEngineExports* PDFEngineExports::Get() {
-  return g_pdf_engine_exports.Pointer();
-}
-
-#if defined(OS_WIN)
-bool PDFiumEngineExports::RenderPDFPageToDC(const void* pdf_buffer,
-                                            int buffer_size,
-                                            int page_number,
-                                            const RenderingSettings& settings,
-                                            HDC dc) {
-  ScopedFPDFDocument doc(
-      FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr));
-  if (!doc)
-    return false;
-  FPDF_PAGE page = FPDF_LoadPage(doc.get(), page_number);
-  if (!page)
-    return false;
-
-  RenderingSettings new_settings = settings;
-  // calculate the page size
-  if (new_settings.dpi_x == -1)
-    new_settings.dpi_x = GetDeviceCaps(dc, LOGPIXELSX);
-  if (new_settings.dpi_y == -1)
-    new_settings.dpi_y = GetDeviceCaps(dc, LOGPIXELSY);
-
-  pp::Rect dest;
-  int rotate = CalculatePosition(page, new_settings, &dest);
-
-  int save_state = SaveDC(dc);
-  // The caller wanted all drawing to happen within the bounds specified.
-  // Based on scale calculations, our destination rect might be larger
-  // than the bounds. Set the clip rect to the bounds.
-  IntersectClipRect(dc, settings.bounds.x(), settings.bounds.y(),
-                    settings.bounds.x() + settings.bounds.width(),
-                    settings.bounds.y() + settings.bounds.height());
-
-  int flags = FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH;
-  if (!settings.use_color)
-    flags |= FPDF_GRAYSCALE;
-
-  // A "temporary" hack. Some PDFs seems to render very slowly if
-  // FPDF_RenderPage() is directly used on a printer DC. I suspect it is
-  // because of the code to talk Postscript directly to the printer if
-  // the printer supports this. Need to discuss this with PDFium. For now,
-  // render to a bitmap and then blit the bitmap to the DC if we have been
-  // supplied a printer DC.
-  int device_type = GetDeviceCaps(dc, TECHNOLOGY);
-  if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER) {
-    FPDF_BITMAP bitmap =
-        FPDFBitmap_Create(dest.width(), dest.height(), FPDFBitmap_BGRx);
-    // Clear the bitmap
-    FPDFBitmap_FillRect(bitmap, 0, 0, dest.width(), dest.height(), 0xFFFFFFFF);
-    FPDF_RenderPageBitmap(bitmap, page, 0, 0, dest.width(), dest.height(),
-                          rotate, flags);
-    int stride = FPDFBitmap_GetStride(bitmap);
-    BITMAPINFO bmi;
-    memset(&bmi, 0, sizeof(bmi));
-    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-    bmi.bmiHeader.biWidth = dest.width();
-    bmi.bmiHeader.biHeight = -dest.height();  // top-down image
-    bmi.bmiHeader.biPlanes = 1;
-    bmi.bmiHeader.biBitCount = 32;
-    bmi.bmiHeader.biCompression = BI_RGB;
-    bmi.bmiHeader.biSizeImage = stride * dest.height();
-    StretchDIBits(dc, dest.x(), dest.y(), dest.width(), dest.height(), 0, 0,
-                  dest.width(), dest.height(), FPDFBitmap_GetBuffer(bitmap),
-                  &bmi, DIB_RGB_COLORS, SRCCOPY);
-    FPDFBitmap_Destroy(bitmap);
-  } else {
-    FPDF_RenderPage(dc, page, dest.x(), dest.y(), dest.width(), dest.height(),
-                    rotate, flags);
-  }
-  RestoreDC(dc, save_state);
-  FPDF_ClosePage(page);
-  return true;
-}
-
-void PDFiumEngineExports::SetPDFEnsureTypefaceCharactersAccessible(
-    PDFEnsureTypefaceCharactersAccessible func) {
-  FPDF_SetTypefaceAccessibleFunc(
-      reinterpret_cast<PDFiumEnsureTypefaceCharactersAccessible>(func));
-}
-
-void PDFiumEngineExports::SetPDFUseGDIPrinting(bool enable) {
-  FPDF_SetPrintTextWithGDI(enable);
-}
-
-void PDFiumEngineExports::SetPDFUsePrintMode(int mode) {
-  FPDF_SetPrintMode(mode);
-}
-#endif  // defined(OS_WIN)
-
-bool PDFiumEngineExports::RenderPDFPageToBitmap(
-    const void* pdf_buffer,
-    int pdf_buffer_size,
-    int page_number,
-    const RenderingSettings& settings,
-    void* bitmap_buffer) {
-  ScopedFPDFDocument doc(
-      FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr));
-  if (!doc)
-    return false;
-  FPDF_PAGE page = FPDF_LoadPage(doc.get(), page_number);
-  if (!page)
-    return false;
-
-  pp::Rect dest;
-  int rotate = CalculatePosition(page, settings, &dest);
-
-  FPDF_BITMAP bitmap = FPDFBitmap_CreateEx(
-      settings.bounds.width(), settings.bounds.height(), FPDFBitmap_BGRA,
-      bitmap_buffer, settings.bounds.width() * 4);
-  // Clear the bitmap
-  FPDFBitmap_FillRect(bitmap, 0, 0, settings.bounds.width(),
-                      settings.bounds.height(), 0xFFFFFFFF);
-  // Shift top-left corner of bounds to (0, 0) if it's not there.
-  dest.set_point(dest.point() - settings.bounds.point());
-
-  int flags = FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH;
-  if (!settings.use_color)
-    flags |= FPDF_GRAYSCALE;
-
-  FPDF_RenderPageBitmap(bitmap, page, dest.x(), dest.y(), dest.width(),
-                        dest.height(), rotate, flags);
-  FPDFBitmap_Destroy(bitmap);
-  FPDF_ClosePage(page);
-  return true;
-}
-
-bool PDFiumEngineExports::GetPDFDocInfo(const void* pdf_buffer,
-                                        int buffer_size,
-                                        int* page_count,
-                                        double* max_page_width) {
-  ScopedFPDFDocument doc(
-      FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr));
-  if (!doc)
-    return false;
-
-  if (!page_count && !max_page_width)
-    return true;
-
-  int page_count_local = FPDF_GetPageCount(doc.get());
-  if (page_count)
-    *page_count = page_count_local;
-
-  if (max_page_width) {
-    *max_page_width = 0;
-    for (int page_number = 0; page_number < page_count_local; page_number++) {
-      double page_width = 0;
-      double page_height = 0;
-      FPDF_GetPageSizeByIndex(doc.get(), page_number, &page_width,
-                              &page_height);
-      if (page_width > *max_page_width) {
-        *max_page_width = page_width;
-      }
-    }
-  }
-  return true;
-}
-
-bool PDFiumEngineExports::GetPDFPageSizeByIndex(const void* pdf_buffer,
-                                                int pdf_buffer_size,
-                                                int page_number,
-                                                double* width,
-                                                double* height) {
-  ScopedFPDFDocument doc(
-      FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr));
-  if (!doc)
-    return false;
-  return FPDF_GetPageSizeByIndex(doc.get(), page_number, width, height) != 0;
-}
-
 }  // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h
index 63596eb..bc9a2b3 100644
--- a/pdf/pdfium/pdfium_engine.h
+++ b/pdf/pdfium/pdfium_engine.h
@@ -19,6 +19,7 @@
 #include "base/time/time.h"
 #include "pdf/document_loader.h"
 #include "pdf/pdf_engine.h"
+#include "pdf/pdfium/pdfium_form_filler.h"
 #include "pdf/pdfium/pdfium_page.h"
 #include "pdf/pdfium/pdfium_range.h"
 #include "ppapi/cpp/completion_callback.h"
@@ -39,8 +40,6 @@
 
 class PDFiumEngine : public PDFEngine,
                      public DocumentLoader::Client,
-                     public FPDF_FORMFILLINFO,
-                     public IPDF_JSPLATFORM,
                      public IFSDK_PAUSE {
  public:
   explicit PDFiumEngine(PDFEngine::Client* client);
@@ -192,6 +191,7 @@
     DISALLOW_COPY_AND_ASSIGN(MouseDownState);
   };
 
+  friend class PDFiumFormFiller;
   friend class SelectionChangeInvalidator;
 
   struct FileAvail : public FX_FILEAVAIL {
@@ -506,151 +506,6 @@
   // Set if the document has any local edits.
   void SetEditMode(bool edit_mode);
 
-  // FPDF_FORMFILLINFO callbacks.
-  static void Form_Invalidate(FPDF_FORMFILLINFO* param,
-                              FPDF_PAGE page,
-                              double left,
-                              double top,
-                              double right,
-                              double bottom);
-  static void Form_OutputSelectedRect(FPDF_FORMFILLINFO* param,
-                                      FPDF_PAGE page,
-                                      double left,
-                                      double top,
-                                      double right,
-                                      double bottom);
-  static void Form_SetCursor(FPDF_FORMFILLINFO* param, int cursor_type);
-  static int Form_SetTimer(FPDF_FORMFILLINFO* param,
-                           int elapse,
-                           TimerCallback timer_func);
-  static void Form_KillTimer(FPDF_FORMFILLINFO* param, int timer_id);
-  static FPDF_SYSTEMTIME Form_GetLocalTime(FPDF_FORMFILLINFO* param);
-  static void Form_OnChange(FPDF_FORMFILLINFO* param);
-  static FPDF_PAGE Form_GetPage(FPDF_FORMFILLINFO* param,
-                                FPDF_DOCUMENT document,
-                                int page_index);
-  static FPDF_PAGE Form_GetCurrentPage(FPDF_FORMFILLINFO* param,
-                                       FPDF_DOCUMENT document);
-  static int Form_GetRotation(FPDF_FORMFILLINFO* param, FPDF_PAGE page);
-  static void Form_ExecuteNamedAction(FPDF_FORMFILLINFO* param,
-                                      FPDF_BYTESTRING named_action);
-  static void Form_SetTextFieldFocus(FPDF_FORMFILLINFO* param,
-                                     FPDF_WIDESTRING value,
-                                     FPDF_DWORD valueLen,
-                                     FPDF_BOOL is_focus);
-  static void Form_DoURIAction(FPDF_FORMFILLINFO* param, FPDF_BYTESTRING uri);
-  static void Form_DoGoToAction(FPDF_FORMFILLINFO* param,
-                                int page_index,
-                                int zoom_mode,
-                                float* position_array,
-                                int size_of_array);
-
-  // IPDF_JSPLATFORM callbacks.
-  static int Form_Alert(IPDF_JSPLATFORM* param,
-                        FPDF_WIDESTRING message,
-                        FPDF_WIDESTRING title,
-                        int type,
-                        int icon);
-  static void Form_Beep(IPDF_JSPLATFORM* param, int type);
-  static int Form_Response(IPDF_JSPLATFORM* param,
-                           FPDF_WIDESTRING question,
-                           FPDF_WIDESTRING title,
-                           FPDF_WIDESTRING default_response,
-                           FPDF_WIDESTRING label,
-                           FPDF_BOOL password,
-                           void* response,
-                           int length);
-  static int Form_GetFilePath(IPDF_JSPLATFORM* param,
-                              void* file_path,
-                              int length);
-  static void Form_Mail(IPDF_JSPLATFORM* param,
-                        void* mail_data,
-                        int length,
-                        FPDF_BOOL ui,
-                        FPDF_WIDESTRING to,
-                        FPDF_WIDESTRING subject,
-                        FPDF_WIDESTRING cc,
-                        FPDF_WIDESTRING bcc,
-                        FPDF_WIDESTRING message);
-  static void Form_Print(IPDF_JSPLATFORM* param,
-                         FPDF_BOOL ui,
-                         int start,
-                         int end,
-                         FPDF_BOOL silent,
-                         FPDF_BOOL shrink_to_fit,
-                         FPDF_BOOL print_as_image,
-                         FPDF_BOOL reverse,
-                         FPDF_BOOL annotations);
-  static void Form_SubmitForm(IPDF_JSPLATFORM* param,
-                              void* form_data,
-                              int length,
-                              FPDF_WIDESTRING url);
-  static void Form_GotoPage(IPDF_JSPLATFORM* param, int page_number);
-
-#if defined(PDF_ENABLE_XFA)
-  static void Form_EmailTo(FPDF_FORMFILLINFO* param,
-                           FPDF_FILEHANDLER* file_handler,
-                           FPDF_WIDESTRING to,
-                           FPDF_WIDESTRING subject,
-                           FPDF_WIDESTRING cc,
-                           FPDF_WIDESTRING bcc,
-                           FPDF_WIDESTRING message);
-  static void Form_DisplayCaret(FPDF_FORMFILLINFO* param,
-                                FPDF_PAGE page,
-                                FPDF_BOOL visible,
-                                double left,
-                                double top,
-                                double right,
-                                double bottom);
-  static void Form_SetCurrentPage(FPDF_FORMFILLINFO* param,
-                                  FPDF_DOCUMENT document,
-                                  int page);
-  static int Form_GetCurrentPageIndex(FPDF_FORMFILLINFO* param,
-                                      FPDF_DOCUMENT document);
-  static void Form_GetPageViewRect(FPDF_FORMFILLINFO* param,
-                                   FPDF_PAGE page,
-                                   double* left,
-                                   double* top,
-                                   double* right,
-                                   double* bottom);
-  static int Form_GetPlatform(FPDF_FORMFILLINFO* param,
-                              void* platform,
-                              int length);
-  static FPDF_BOOL Form_PopupMenu(FPDF_FORMFILLINFO* param,
-                                  FPDF_PAGE page,
-                                  FPDF_WIDGET widget,
-                                  int menu_flag,
-                                  float x,
-                                  float y);
-  static FPDF_BOOL Form_PostRequestURL(FPDF_FORMFILLINFO* param,
-                                       FPDF_WIDESTRING url,
-                                       FPDF_WIDESTRING data,
-                                       FPDF_WIDESTRING content_type,
-                                       FPDF_WIDESTRING encode,
-                                       FPDF_WIDESTRING header,
-                                       FPDF_BSTR* response);
-  static FPDF_BOOL Form_PutRequestURL(FPDF_FORMFILLINFO* param,
-                                      FPDF_WIDESTRING url,
-                                      FPDF_WIDESTRING data,
-                                      FPDF_WIDESTRING encode);
-  static void Form_UploadTo(FPDF_FORMFILLINFO* param,
-                            FPDF_FILEHANDLER* file_handler,
-                            int file_flag,
-                            FPDF_WIDESTRING dest);
-  static FPDF_LPFILEHANDLER Form_DownloadFromURL(FPDF_FORMFILLINFO* param,
-                                                 FPDF_WIDESTRING url);
-  static FPDF_FILEHANDLER* Form_OpenFile(FPDF_FORMFILLINFO* param,
-                                         int file_flag,
-                                         FPDF_WIDESTRING url,
-                                         const char* mode);
-  static void Form_GotoURL(FPDF_FORMFILLINFO* param,
-                           FPDF_DOCUMENT document,
-                           FPDF_WIDESTRING url);
-  static int Form_GetLanguage(FPDF_FORMFILLINFO* param,
-                              void* language,
-                              int length);
-#endif  // defined(PDF_ENABLE_XFA)
-
   // IFSDK_PAUSE callbacks
   static FPDF_BOOL Pause_NeedToPauseNow(IFSDK_PAUSE* param);
 
@@ -839,6 +694,8 @@
 
   bool edit_mode_;
 
+  PDFiumFormFiller form_filler_;
+
   DISALLOW_COPY_AND_ASSIGN(PDFiumEngine);
 };
 
@@ -868,39 +725,6 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedSubstFont);
 };
 
-class PDFiumEngineExports : public PDFEngineExports {
- public:
-  PDFiumEngineExports() {}
-
-// PDFEngineExports:
-#if defined(OS_WIN)
-  bool RenderPDFPageToDC(const void* pdf_buffer,
-                         int buffer_size,
-                         int page_number,
-                         const RenderingSettings& settings,
-                         HDC dc) override;
-  void SetPDFEnsureTypefaceCharactersAccessible(
-      PDFEnsureTypefaceCharactersAccessible func) override;
-
-  void SetPDFUseGDIPrinting(bool enable) override;
-  void SetPDFUsePrintMode(int mode) override;
-#endif  // defined(OS_WIN)
-  bool RenderPDFPageToBitmap(const void* pdf_buffer,
-                             int pdf_buffer_size,
-                             int page_number,
-                             const RenderingSettings& settings,
-                             void* bitmap_buffer) override;
-  bool GetPDFDocInfo(const void* pdf_buffer,
-                     int buffer_size,
-                     int* page_count,
-                     double* max_page_width) override;
-  bool GetPDFPageSizeByIndex(const void* pdf_buffer,
-                             int pdf_buffer_size,
-                             int page_number,
-                             double* width,
-                             double* height) override;
-};
-
 }  // namespace chrome_pdf
 
 #endif  // PDF_PDFIUM_PDFIUM_ENGINE_H_
diff --git a/pdf/pdfium/pdfium_engine_exports.cc b/pdf/pdfium/pdfium_engine_exports.cc
new file mode 100644
index 0000000..e6c94fb
--- /dev/null
+++ b/pdf/pdfium/pdfium_engine_exports.cc
@@ -0,0 +1,291 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "pdf/pdfium/pdfium_engine_exports.h"
+
+#include <algorithm>
+#include <utility>
+
+#include "base/no_destructor.h"
+#include "printing/units.h"
+#include "third_party/pdfium/public/cpp/fpdf_scopers.h"
+#include "third_party/pdfium/public/fpdfview.h"
+
+using printing::ConvertUnitDouble;
+using printing::kPointsPerInch;
+
+namespace chrome_pdf {
+
+namespace {
+
+int CalculatePosition(FPDF_PAGE page,
+                      const PDFiumEngineExports::RenderingSettings& settings,
+                      pp::Rect* dest) {
+  // settings.bounds is in terms of the max DPI. Convert page sizes to match.
+  int dpi = std::max(settings.dpi_x, settings.dpi_y);
+  int page_width = static_cast<int>(
+      ConvertUnitDouble(FPDF_GetPageWidth(page), kPointsPerInch, dpi));
+  int page_height = static_cast<int>(
+      ConvertUnitDouble(FPDF_GetPageHeight(page), kPointsPerInch, dpi));
+
+  // Start by assuming that we will draw exactly to the bounds rect
+  // specified.
+  *dest = settings.bounds;
+
+  int rotate = 0;  // normal orientation.
+
+  // Auto-rotate landscape pages to print correctly.
+  if (settings.autorotate &&
+      (dest->width() > dest->height()) != (page_width > page_height)) {
+    rotate = 3;  // 90 degrees counter-clockwise.
+    std::swap(page_width, page_height);
+  }
+
+  // See if we need to scale the output
+  bool scale_to_bounds = false;
+  if (settings.fit_to_bounds &&
+      ((page_width > dest->width()) || (page_height > dest->height()))) {
+    scale_to_bounds = true;
+  } else if (settings.stretch_to_bounds &&
+             ((page_width < dest->width()) || (page_height < dest->height()))) {
+    scale_to_bounds = true;
+  }
+
+  if (scale_to_bounds) {
+    // If we need to maintain aspect ratio, calculate the actual width and
+    // height.
+    if (settings.keep_aspect_ratio) {
+      double scale_factor_x = page_width;
+      scale_factor_x /= dest->width();
+      double scale_factor_y = page_height;
+      scale_factor_y /= dest->height();
+      if (scale_factor_x > scale_factor_y) {
+        dest->set_height(page_height / scale_factor_x);
+      } else {
+        dest->set_width(page_width / scale_factor_y);
+      }
+    }
+  } else {
+    // We are not scaling to bounds. Draw in the actual page size. If the
+    // actual page size is larger than the bounds, the output will be
+    // clipped.
+    dest->set_width(page_width);
+    dest->set_height(page_height);
+  }
+
+  // Scale the bounds to device units if DPI is rectangular.
+  if (settings.dpi_x != settings.dpi_y) {
+    dest->set_width(dest->width() * settings.dpi_x / dpi);
+    dest->set_height(dest->height() * settings.dpi_y / dpi);
+  }
+
+  if (settings.center_in_bounds) {
+    pp::Point offset(
+        (settings.bounds.width() * settings.dpi_x / dpi - dest->width()) / 2,
+        (settings.bounds.height() * settings.dpi_y / dpi - dest->height()) / 2);
+    dest->Offset(offset);
+  }
+  return rotate;
+}
+
+}  // namespace
+
+PDFEngineExports::RenderingSettings::RenderingSettings(int dpi_x,
+                                                       int dpi_y,
+                                                       const pp::Rect& bounds,
+                                                       bool fit_to_bounds,
+                                                       bool stretch_to_bounds,
+                                                       bool keep_aspect_ratio,
+                                                       bool center_in_bounds,
+                                                       bool autorotate,
+                                                       bool use_color)
+    : dpi_x(dpi_x),
+      dpi_y(dpi_y),
+      bounds(bounds),
+      fit_to_bounds(fit_to_bounds),
+      stretch_to_bounds(stretch_to_bounds),
+      keep_aspect_ratio(keep_aspect_ratio),
+      center_in_bounds(center_in_bounds),
+      autorotate(autorotate),
+      use_color(use_color) {}
+
+PDFEngineExports::RenderingSettings::RenderingSettings(
+    const RenderingSettings& that) = default;
+
+PDFEngineExports* PDFEngineExports::Get() {
+  static base::NoDestructor<PDFiumEngineExports> exports;
+  return exports.get();
+}
+
+PDFiumEngineExports::PDFiumEngineExports() {}
+
+PDFiumEngineExports::~PDFiumEngineExports() {}
+
+#if defined(OS_WIN)
+bool PDFiumEngineExports::RenderPDFPageToDC(const void* pdf_buffer,
+                                            int buffer_size,
+                                            int page_number,
+                                            const RenderingSettings& settings,
+                                            HDC dc) {
+  ScopedFPDFDocument doc(
+      FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr));
+  if (!doc)
+    return false;
+  ScopedFPDFPage page(FPDF_LoadPage(doc.get(), page_number));
+  if (!page)
+    return false;
+
+  RenderingSettings new_settings = settings;
+  // calculate the page size
+  if (new_settings.dpi_x == -1)
+    new_settings.dpi_x = GetDeviceCaps(dc, LOGPIXELSX);
+  if (new_settings.dpi_y == -1)
+    new_settings.dpi_y = GetDeviceCaps(dc, LOGPIXELSY);
+
+  pp::Rect dest;
+  int rotate = CalculatePosition(page.get(), new_settings, &dest);
+
+  int save_state = SaveDC(dc);
+  // The caller wanted all drawing to happen within the bounds specified.
+  // Based on scale calculations, our destination rect might be larger
+  // than the bounds. Set the clip rect to the bounds.
+  IntersectClipRect(dc, settings.bounds.x(), settings.bounds.y(),
+                    settings.bounds.x() + settings.bounds.width(),
+                    settings.bounds.y() + settings.bounds.height());
+
+  int flags = FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH;
+  if (!settings.use_color)
+    flags |= FPDF_GRAYSCALE;
+
+  // A "temporary" hack. Some PDFs seems to render very slowly if
+  // FPDF_RenderPage() is directly used on a printer DC. I suspect it is
+  // because of the code to talk Postscript directly to the printer if
+  // the printer supports this. Need to discuss this with PDFium. For now,
+  // render to a bitmap and then blit the bitmap to the DC if we have been
+  // supplied a printer DC.
+  int device_type = GetDeviceCaps(dc, TECHNOLOGY);
+  if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER) {
+    ScopedFPDFBitmap bitmap(
+        FPDFBitmap_Create(dest.width(), dest.height(), FPDFBitmap_BGRx));
+    // Clear the bitmap
+    FPDFBitmap_FillRect(bitmap.get(), 0, 0, dest.width(), dest.height(),
+                        0xFFFFFFFF);
+    FPDF_RenderPageBitmap(bitmap.get(), page.get(), 0, 0, dest.width(),
+                          dest.height(), rotate, flags);
+    int stride = FPDFBitmap_GetStride(bitmap.get());
+    BITMAPINFO bmi;
+    memset(&bmi, 0, sizeof(bmi));
+    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    bmi.bmiHeader.biWidth = dest.width();
+    bmi.bmiHeader.biHeight = -dest.height();  // top-down image
+    bmi.bmiHeader.biPlanes = 1;
+    bmi.bmiHeader.biBitCount = 32;
+    bmi.bmiHeader.biCompression = BI_RGB;
+    bmi.bmiHeader.biSizeImage = stride * dest.height();
+    StretchDIBits(dc, dest.x(), dest.y(), dest.width(), dest.height(), 0, 0,
+                  dest.width(), dest.height(),
+                  FPDFBitmap_GetBuffer(bitmap.get()), &bmi, DIB_RGB_COLORS,
+                  SRCCOPY);
+  } else {
+    FPDF_RenderPage(dc, page.get(), dest.x(), dest.y(), dest.width(),
+                    dest.height(), rotate, flags);
+  }
+  RestoreDC(dc, save_state);
+  return true;
+}
+
+void PDFiumEngineExports::SetPDFEnsureTypefaceCharactersAccessible(
+    PDFEnsureTypefaceCharactersAccessible func) {
+  FPDF_SetTypefaceAccessibleFunc(
+      reinterpret_cast<PDFiumEnsureTypefaceCharactersAccessible>(func));
+}
+
+void PDFiumEngineExports::SetPDFUseGDIPrinting(bool enable) {
+  FPDF_SetPrintTextWithGDI(enable);
+}
+
+void PDFiumEngineExports::SetPDFUsePrintMode(int mode) {
+  FPDF_SetPrintMode(mode);
+}
+#endif  // defined(OS_WIN)
+
+bool PDFiumEngineExports::RenderPDFPageToBitmap(
+    const void* pdf_buffer,
+    int pdf_buffer_size,
+    int page_number,
+    const RenderingSettings& settings,
+    void* bitmap_buffer) {
+  ScopedFPDFDocument doc(
+      FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr));
+  if (!doc)
+    return false;
+  ScopedFPDFPage page(FPDF_LoadPage(doc.get(), page_number));
+  if (!page)
+    return false;
+
+  pp::Rect dest;
+  int rotate = CalculatePosition(page.get(), settings, &dest);
+
+  ScopedFPDFBitmap bitmap(FPDFBitmap_CreateEx(
+      settings.bounds.width(), settings.bounds.height(), FPDFBitmap_BGRA,
+      bitmap_buffer, settings.bounds.width() * 4));
+  // Clear the bitmap
+  FPDFBitmap_FillRect(bitmap.get(), 0, 0, settings.bounds.width(),
+                      settings.bounds.height(), 0xFFFFFFFF);
+  // Shift top-left corner of bounds to (0, 0) if it's not there.
+  dest.set_point(dest.point() - settings.bounds.point());
+
+  int flags = FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH;
+  if (!settings.use_color)
+    flags |= FPDF_GRAYSCALE;
+
+  FPDF_RenderPageBitmap(bitmap.get(), page.get(), dest.x(), dest.y(),
+                        dest.width(), dest.height(), rotate, flags);
+  return true;
+}
+
+bool PDFiumEngineExports::GetPDFDocInfo(const void* pdf_buffer,
+                                        int buffer_size,
+                                        int* page_count,
+                                        double* max_page_width) {
+  ScopedFPDFDocument doc(
+      FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr));
+  if (!doc)
+    return false;
+
+  if (!page_count && !max_page_width)
+    return true;
+
+  int page_count_local = FPDF_GetPageCount(doc.get());
+  if (page_count)
+    *page_count = page_count_local;
+
+  if (max_page_width) {
+    *max_page_width = 0;
+    for (int page_number = 0; page_number < page_count_local; page_number++) {
+      double page_width = 0;
+      double page_height = 0;
+      FPDF_GetPageSizeByIndex(doc.get(), page_number, &page_width,
+                              &page_height);
+      if (page_width > *max_page_width) {
+        *max_page_width = page_width;
+      }
+    }
+  }
+  return true;
+}
+
+bool PDFiumEngineExports::GetPDFPageSizeByIndex(const void* pdf_buffer,
+                                                int pdf_buffer_size,
+                                                int page_number,
+                                                double* width,
+                                                double* height) {
+  ScopedFPDFDocument doc(
+      FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr));
+  if (!doc)
+    return false;
+  return FPDF_GetPageSizeByIndex(doc.get(), page_number, width, height) != 0;
+}
+
+}  // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_engine_exports.h b/pdf/pdfium/pdfium_engine_exports.h
new file mode 100644
index 0000000..b37de82
--- /dev/null
+++ b/pdf/pdfium/pdfium_engine_exports.h
@@ -0,0 +1,55 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PDF_PDFIUM_PDFIUM_ENGINE_EXPORTS_H_
+#define PDF_PDFIUM_PDFIUM_ENGINE_EXPORTS_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "build/build_config.h"
+#include "pdf/pdf_engine.h"
+
+namespace chrome_pdf {
+
+class PDFiumEngineExports : public PDFEngineExports {
+ public:
+  PDFiumEngineExports();
+  ~PDFiumEngineExports() override;
+
+// PDFEngineExports:
+#if defined(OS_WIN)
+  bool RenderPDFPageToDC(const void* pdf_buffer,
+                         int buffer_size,
+                         int page_number,
+                         const RenderingSettings& settings,
+                         HDC dc) override;
+  void SetPDFEnsureTypefaceCharactersAccessible(
+      PDFEnsureTypefaceCharactersAccessible func) override;
+
+  void SetPDFUseGDIPrinting(bool enable) override;
+  void SetPDFUsePrintMode(int mode) override;
+#endif  // defined(OS_WIN)
+  bool RenderPDFPageToBitmap(const void* pdf_buffer,
+                             int pdf_buffer_size,
+                             int page_number,
+                             const RenderingSettings& settings,
+                             void* bitmap_buffer) override;
+  bool GetPDFDocInfo(const void* pdf_buffer,
+                     int buffer_size,
+                     int* page_count,
+                     double* max_page_width) override;
+  bool GetPDFPageSizeByIndex(const void* pdf_buffer,
+                             int pdf_buffer_size,
+                             int page_number,
+                             double* width,
+                             double* height) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PDFiumEngineExports);
+};
+
+}  // namespace chrome_pdf
+
+#endif  // PDF_PDFIUM_PDFIUM_ENGINE_EXPORTS_H_
diff --git a/pdf/pdfium/pdfium_form_filler.cc b/pdf/pdfium/pdfium_form_filler.cc
new file mode 100644
index 0000000..b1d7fe0
--- /dev/null
+++ b/pdf/pdfium/pdfium_form_filler.cc
@@ -0,0 +1,626 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "pdf/pdfium/pdfium_form_filler.h"
+
+#include <algorithm>
+#include <string>
+
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "pdf/pdfium/pdfium_engine.h"
+
+namespace chrome_pdf {
+
+namespace {
+
+std::string WideStringToString(FPDF_WIDESTRING wide_string) {
+  return base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(wide_string));
+}
+
+}  // namespace
+
+PDFiumFormFiller::PDFiumFormFiller(PDFiumEngine* engine) : engine_(engine) {
+  // Initialize FPDF_FORMFILLINFO member variables.  Deriving from this struct
+  // allows the static callbacks to be able to cast the FPDF_FORMFILLINFO in
+  // callbacks to ourself instead of maintaining a map of them to
+  // PDFiumEngine.
+  FPDF_FORMFILLINFO::version = 1;
+  FPDF_FORMFILLINFO::m_pJsPlatform = this;
+  FPDF_FORMFILLINFO::Release = nullptr;
+  FPDF_FORMFILLINFO::FFI_Invalidate = Form_Invalidate;
+  FPDF_FORMFILLINFO::FFI_OutputSelectedRect = Form_OutputSelectedRect;
+  FPDF_FORMFILLINFO::FFI_SetCursor = Form_SetCursor;
+  FPDF_FORMFILLINFO::FFI_SetTimer = Form_SetTimer;
+  FPDF_FORMFILLINFO::FFI_KillTimer = Form_KillTimer;
+  FPDF_FORMFILLINFO::FFI_GetLocalTime = Form_GetLocalTime;
+  FPDF_FORMFILLINFO::FFI_OnChange = Form_OnChange;
+  FPDF_FORMFILLINFO::FFI_GetPage = Form_GetPage;
+  FPDF_FORMFILLINFO::FFI_GetCurrentPage = Form_GetCurrentPage;
+  FPDF_FORMFILLINFO::FFI_GetRotation = Form_GetRotation;
+  FPDF_FORMFILLINFO::FFI_ExecuteNamedAction = Form_ExecuteNamedAction;
+  FPDF_FORMFILLINFO::FFI_SetTextFieldFocus = Form_SetTextFieldFocus;
+  FPDF_FORMFILLINFO::FFI_DoURIAction = Form_DoURIAction;
+  FPDF_FORMFILLINFO::FFI_DoGoToAction = Form_DoGoToAction;
+#if defined(PDF_ENABLE_XFA)
+  FPDF_FORMFILLINFO::version = 2;
+  FPDF_FORMFILLINFO::FFI_EmailTo = Form_EmailTo;
+  FPDF_FORMFILLINFO::FFI_DisplayCaret = Form_DisplayCaret;
+  FPDF_FORMFILLINFO::FFI_SetCurrentPage = Form_SetCurrentPage;
+  FPDF_FORMFILLINFO::FFI_GetCurrentPageIndex = Form_GetCurrentPageIndex;
+  FPDF_FORMFILLINFO::FFI_GetPageViewRect = Form_GetPageViewRect;
+  FPDF_FORMFILLINFO::FFI_GetPlatform = Form_GetPlatform;
+  FPDF_FORMFILLINFO::FFI_PageEvent = nullptr;
+  FPDF_FORMFILLINFO::FFI_PopupMenu = Form_PopupMenu;
+  FPDF_FORMFILLINFO::FFI_PostRequestURL = Form_PostRequestURL;
+  FPDF_FORMFILLINFO::FFI_PutRequestURL = Form_PutRequestURL;
+  FPDF_FORMFILLINFO::FFI_UploadTo = Form_UploadTo;
+  FPDF_FORMFILLINFO::FFI_DownloadFromURL = Form_DownloadFromURL;
+  FPDF_FORMFILLINFO::FFI_OpenFile = Form_OpenFile;
+  FPDF_FORMFILLINFO::FFI_GotoURL = Form_GotoURL;
+  FPDF_FORMFILLINFO::FFI_GetLanguage = Form_GetLanguage;
+#endif  // defined(PDF_ENABLE_XFA)
+
+  IPDF_JSPLATFORM::version = 3;
+  IPDF_JSPLATFORM::app_alert = Form_Alert;
+  IPDF_JSPLATFORM::app_beep = Form_Beep;
+  IPDF_JSPLATFORM::app_response = Form_Response;
+  IPDF_JSPLATFORM::Doc_getFilePath = Form_GetFilePath;
+  IPDF_JSPLATFORM::Doc_mail = Form_Mail;
+  IPDF_JSPLATFORM::Doc_print = Form_Print;
+  IPDF_JSPLATFORM::Doc_submitForm = Form_SubmitForm;
+  IPDF_JSPLATFORM::Doc_gotoPage = Form_GotoPage;
+  IPDF_JSPLATFORM::Field_browse = nullptr;
+}
+
+// static
+void PDFiumFormFiller::Form_Invalidate(FPDF_FORMFILLINFO* param,
+                                       FPDF_PAGE page,
+                                       double left,
+                                       double top,
+                                       double right,
+                                       double bottom) {
+  PDFiumEngine* engine = GetEngine(param);
+  int page_index = engine->GetVisiblePageIndex(page);
+  if (page_index == -1) {
+    // This can sometime happen when the page is closed because it went off
+    // screen, and PDFium invalidates the control as it's being deleted.
+    return;
+  }
+
+  pp::Rect rect = engine->pages_[page_index]->PageToScreen(
+      engine->GetVisibleRect().point(), engine->current_zoom_, left, top, right,
+      bottom, engine->current_rotation_);
+  engine->client_->Invalidate(rect);
+}
+
+// static
+void PDFiumFormFiller::Form_OutputSelectedRect(FPDF_FORMFILLINFO* param,
+                                               FPDF_PAGE page,
+                                               double left,
+                                               double top,
+                                               double right,
+                                               double bottom) {
+  PDFiumEngine* engine = GetEngine(param);
+  int page_index = engine->GetVisiblePageIndex(page);
+  if (page_index == -1) {
+    NOTREACHED();
+    return;
+  }
+  pp::Rect rect = engine->pages_[page_index]->PageToScreen(
+      engine->GetVisibleRect().point(), engine->current_zoom_, left, top, right,
+      bottom, engine->current_rotation_);
+  if (rect.IsEmpty())
+    return;
+
+  engine->form_highlights_.push_back(rect);
+}
+
+// static
+void PDFiumFormFiller::Form_SetCursor(FPDF_FORMFILLINFO* param,
+                                      int cursor_type) {
+  // We don't need this since it's not enough to change the cursor in all
+  // scenarios.  Instead, we check which form field we're under in OnMouseMove.
+}
+
+// static
+int PDFiumFormFiller::Form_SetTimer(FPDF_FORMFILLINFO* param,
+                                    int elapse,
+                                    TimerCallback timer_func) {
+  PDFiumEngine* engine = GetEngine(param);
+  base::TimeDelta elapse_time = base::TimeDelta::FromMilliseconds(elapse);
+  engine->formfill_timers_.emplace(
+      std::piecewise_construct,
+      std::forward_as_tuple(++engine->next_formfill_timer_id_),
+      std::forward_as_tuple(elapse_time, timer_func));
+  engine->client_->ScheduleCallback(engine->next_formfill_timer_id_,
+                                    elapse_time);
+  return engine->next_formfill_timer_id_;
+}
+
+// static
+void PDFiumFormFiller::Form_KillTimer(FPDF_FORMFILLINFO* param, int timer_id) {
+  PDFiumEngine* engine = GetEngine(param);
+  engine->formfill_timers_.erase(timer_id);
+}
+
+// static
+FPDF_SYSTEMTIME PDFiumFormFiller::Form_GetLocalTime(FPDF_FORMFILLINFO* param) {
+  base::Time time = base::Time::Now();
+  base::Time::Exploded exploded;
+  time.LocalExplode(&exploded);
+
+  FPDF_SYSTEMTIME rv;
+  rv.wYear = exploded.year;
+  rv.wMonth = exploded.month;
+  rv.wDayOfWeek = exploded.day_of_week;
+  rv.wDay = exploded.day_of_month;
+  rv.wHour = exploded.hour;
+  rv.wMinute = exploded.minute;
+  rv.wSecond = exploded.second;
+  rv.wMilliseconds = exploded.millisecond;
+  return rv;
+}
+
+// static
+void PDFiumFormFiller::Form_OnChange(FPDF_FORMFILLINFO* param) {
+  PDFiumEngine* engine = GetEngine(param);
+  engine->SetEditMode(true);
+}
+
+// static
+FPDF_PAGE PDFiumFormFiller::Form_GetPage(FPDF_FORMFILLINFO* param,
+                                         FPDF_DOCUMENT document,
+                                         int page_index) {
+  PDFiumEngine* engine = GetEngine(param);
+  if (!engine->PageIndexInBounds(page_index))
+    return nullptr;
+  return engine->pages_[page_index]->GetPage();
+}
+
+// static
+FPDF_PAGE PDFiumFormFiller::Form_GetCurrentPage(FPDF_FORMFILLINFO* param,
+                                                FPDF_DOCUMENT document) {
+  PDFiumEngine* engine = GetEngine(param);
+  int index = engine->last_page_mouse_down_;
+  if (index == -1) {
+    index = engine->GetMostVisiblePage();
+    if (index == -1) {
+      NOTREACHED();
+      return nullptr;
+    }
+  }
+
+  return engine->pages_[index]->GetPage();
+}
+
+// static
+int PDFiumFormFiller::Form_GetRotation(FPDF_FORMFILLINFO* param,
+                                       FPDF_PAGE page) {
+  return 0;
+}
+
+// static
+void PDFiumFormFiller::Form_ExecuteNamedAction(FPDF_FORMFILLINFO* param,
+                                               FPDF_BYTESTRING named_action) {
+  PDFiumEngine* engine = GetEngine(param);
+  std::string action(named_action);
+  if (action == "Print") {
+    engine->client_->Print();
+    return;
+  }
+
+  int index = engine->last_page_mouse_down_;
+  /* Don't try to calculate the most visible page if we don't have a left click
+     before this event (this code originally copied Form_GetCurrentPage which of
+     course needs to do that and which doesn't have recursion). This can end up
+     causing infinite recursion. See http://crbug.com/240413 for more
+     information. Either way, it's not necessary for the spec'd list of named
+     actions.
+  if (index == -1)
+    index = engine->GetMostVisiblePage();
+  */
+  if (index == -1)
+    return;
+
+  // This is the only list of named actions per the spec (see 12.6.4.11). Adobe
+  // Reader supports more, like FitWidth, but since they're not part of the spec
+  // and we haven't got bugs about them, no need to now.
+  if (action == "NextPage") {
+    engine->ScrollToPage(index + 1);
+  } else if (action == "PrevPage") {
+    engine->ScrollToPage(index - 1);
+  } else if (action == "FirstPage") {
+    engine->ScrollToPage(0);
+  } else if (action == "LastPage") {
+    engine->ScrollToPage(engine->pages_.size() - 1);
+  }
+}
+
+// static
+void PDFiumFormFiller::Form_SetTextFieldFocus(FPDF_FORMFILLINFO* param,
+                                              FPDF_WIDESTRING value,
+                                              FPDF_DWORD valueLen,
+                                              FPDF_BOOL is_focus) {
+  // Do nothing for now.
+  // TODO(gene): use this signal to trigger OSK.
+}
+
+// static
+void PDFiumFormFiller::Form_DoURIAction(FPDF_FORMFILLINFO* param,
+                                        FPDF_BYTESTRING uri) {
+  PDFiumEngine* engine = GetEngine(param);
+  engine->client_->NavigateTo(std::string(uri),
+                              WindowOpenDisposition::CURRENT_TAB);
+}
+
+// static
+void PDFiumFormFiller::Form_DoGoToAction(FPDF_FORMFILLINFO* param,
+                                         int page_index,
+                                         int zoom_mode,
+                                         float* position_array,
+                                         int size_of_array) {
+  PDFiumEngine* engine = GetEngine(param);
+  engine->ScrollToPage(page_index);
+}
+
+#if defined(PDF_ENABLE_XFA)
+
+// static
+void PDFiumFormFiller::Form_EmailTo(FPDF_FORMFILLINFO* param,
+                                    FPDF_FILEHANDLER* file_handler,
+                                    FPDF_WIDESTRING to,
+                                    FPDF_WIDESTRING subject,
+                                    FPDF_WIDESTRING cc,
+                                    FPDF_WIDESTRING bcc,
+                                    FPDF_WIDESTRING message) {
+  std::string to_str = WideStringToString(to);
+  std::string subject_str = WideStringToString(subject);
+  std::string cc_str = WideStringToString(cc);
+  std::string bcc_str = WideStringToString(bcc);
+  std::string message_str = WideStringToString(message);
+
+  PDFiumEngine* engine = GetEngine(param);
+  engine->client_->Email(to_str, cc_str, bcc_str, subject_str, message_str);
+}
+
+// static
+void PDFiumFormFiller::Form_DisplayCaret(FPDF_FORMFILLINFO* param,
+                                         FPDF_PAGE page,
+                                         FPDF_BOOL visible,
+                                         double left,
+                                         double top,
+                                         double right,
+                                         double bottom) {}
+
+// static
+void PDFiumFormFiller::Form_SetCurrentPage(FPDF_FORMFILLINFO* param,
+                                           FPDF_DOCUMENT document,
+                                           int page) {
+  PDFiumEngine* engine = GetEngine(param);
+  pp::Rect page_view_rect = engine->GetPageContentsRect(page);
+  engine->ScrolledToYPosition(page_view_rect.height());
+  pp::Point pos(1, page_view_rect.height());
+  engine->SetScrollPosition(pos);
+}
+
+// static
+int PDFiumFormFiller::Form_GetCurrentPageIndex(FPDF_FORMFILLINFO* param,
+                                               FPDF_DOCUMENT document) {
+  PDFiumEngine* engine = GetEngine(param);
+  return engine->GetMostVisiblePage();
+}
+
+// static
+void PDFiumFormFiller::Form_GetPageViewRect(FPDF_FORMFILLINFO* param,
+                                            FPDF_PAGE page,
+                                            double* left,
+                                            double* top,
+                                            double* right,
+                                            double* bottom) {
+  PDFiumEngine* engine = GetEngine(param);
+  int page_index = engine->GetVisiblePageIndex(page);
+  if (!engine->PageIndexInBounds(page_index)) {
+    *left = 0;
+    *right = 0;
+    *top = 0;
+    *bottom = 0;
+    return;
+  }
+
+  pp::Rect page_view_rect = engine->GetPageContentsRect(page_index);
+
+  float toolbar_height_in_screen_coords =
+      engine->GetToolbarHeightInScreenCoords();
+
+  float page_width = FPDF_GetPageWidth(page);
+  float page_height = FPDF_GetPageHeight(page);
+
+  // To convert from a screen scale to a page scale, we multiply by
+  // (page_height / page_view_rect.height()) and
+  // (page_width / page_view_rect.width()),
+  // The base point of the page in screen coords is (page_view_rect.x(),
+  // page_view_rect.y()).
+  // Therefore, to convert an x position from screen to page
+  // coords, we use (page_width * (x - base_x) / page_view_rect.width()).
+  // For y positions, (page_height * (y - base_y) / page_view_rect.height()).
+
+  // The top-most y position that can be relied to be visible on the screen is
+  // the bottom of the toolbar, which is y = toolbar_height_in_screen_coords.
+  float screen_top_in_page_coords =
+      page_height * (toolbar_height_in_screen_coords - page_view_rect.y()) /
+      page_view_rect.height();
+  // The bottom-most y position that is visible on the screen is the bottom of
+  // the plugin area, which is y = engine->plugin_size_.height().
+  float screen_bottom_in_page_coords =
+      page_height * (engine->plugin_size_.height() - page_view_rect.y()) /
+      page_view_rect.height();
+  // The left-most x position that is visible on the screen is the left of the
+  // plugin area, which is x = 0.
+  float screen_left_in_page_coords =
+      page_width * (0 - page_view_rect.x()) / page_view_rect.width();
+  // The right-most x position that is visible on the screen is the right of the
+  // plugin area, which is x = engine->plugin_size_.width().
+  float screen_right_in_page_coords =
+      page_width * (engine->plugin_size_.width() - page_view_rect.x()) /
+      page_view_rect.width();
+
+  // Return the edge of the screen or of the page, since we're restricted to
+  // both.
+  *left = std::max(screen_left_in_page_coords, 0.0f);
+  *right = std::min(screen_right_in_page_coords, page_width);
+  *top = std::max(screen_top_in_page_coords, 0.0f);
+  *bottom = std::min(screen_bottom_in_page_coords, page_height);
+}
+
+// static
+int PDFiumFormFiller::Form_GetPlatform(FPDF_FORMFILLINFO* param,
+                                       void* platform,
+                                       int length) {
+  int platform_flag = -1;
+
+#if defined(WIN32)
+  platform_flag = 0;
+#elif defined(__linux__)
+  platform_flag = 1;
+#else
+  platform_flag = 2;
+#endif
+
+  std::string javascript =
+      "alert(\"Platform:" + base::NumberToString(platform_flag) + "\")";
+
+  return platform_flag;
+}
+
+// static
+FPDF_BOOL PDFiumFormFiller::Form_PopupMenu(FPDF_FORMFILLINFO* param,
+                                           FPDF_PAGE page,
+                                           FPDF_WIDGET widget,
+                                           int menu_flag,
+                                           float x,
+                                           float y) {
+  return false;
+}
+
+// static
+FPDF_BOOL PDFiumFormFiller::Form_PostRequestURL(FPDF_FORMFILLINFO* param,
+                                                FPDF_WIDESTRING url,
+                                                FPDF_WIDESTRING data,
+                                                FPDF_WIDESTRING content_type,
+                                                FPDF_WIDESTRING encode,
+                                                FPDF_WIDESTRING header,
+                                                FPDF_BSTR* response) {
+  std::string url_str = WideStringToString(url);
+  std::string data_str = WideStringToString(data);
+  std::string content_type_str = WideStringToString(content_type);
+  std::string encode_str = WideStringToString(encode);
+  std::string header_str = WideStringToString(header);
+
+  std::string javascript = "alert(\"Post:" + url_str + "," + data_str + "," +
+                           content_type_str + "," + encode_str + "," +
+                           header_str + "\")";
+  return true;
+}
+
+// static
+FPDF_BOOL PDFiumFormFiller::Form_PutRequestURL(FPDF_FORMFILLINFO* param,
+                                               FPDF_WIDESTRING url,
+                                               FPDF_WIDESTRING data,
+                                               FPDF_WIDESTRING encode) {
+  std::string url_str = WideStringToString(url);
+  std::string data_str = WideStringToString(data);
+  std::string encode_str = WideStringToString(encode);
+
+  std::string javascript =
+      "alert(\"Put:" + url_str + "," + data_str + "," + encode_str + "\")";
+
+  return true;
+}
+
+// static
+void PDFiumFormFiller::Form_UploadTo(FPDF_FORMFILLINFO* param,
+                                     FPDF_FILEHANDLER* file_handle,
+                                     int file_flag,
+                                     FPDF_WIDESTRING to) {
+  std::string to_str = WideStringToString(to);
+  // TODO: needs the full implementation of form uploading
+}
+
+// static
+FPDF_LPFILEHANDLER PDFiumFormFiller::Form_DownloadFromURL(
+    FPDF_FORMFILLINFO* param,
+    FPDF_WIDESTRING url) {
+  // NOTE: Think hard about the security implications before allowing
+  // a PDF file to perform this action.
+  return nullptr;
+}
+
+// static
+FPDF_FILEHANDLER* PDFiumFormFiller::Form_OpenFile(FPDF_FORMFILLINFO* param,
+                                                  int file_flag,
+                                                  FPDF_WIDESTRING url,
+                                                  const char* mode) {
+  // NOTE: Think hard about the security implications before allowing
+  // a PDF file to perform this action.
+  return nullptr;
+}
+
+// static
+void PDFiumFormFiller::Form_GotoURL(FPDF_FORMFILLINFO* param,
+                                    FPDF_DOCUMENT document,
+                                    FPDF_WIDESTRING url) {
+  std::string url_str = WideStringToString(url);
+  // TODO: needs to implement GOTO URL action
+}
+
+// static
+int PDFiumFormFiller::Form_GetLanguage(FPDF_FORMFILLINFO* param,
+                                       void* language,
+                                       int length) {
+  return 0;
+}
+
+#endif  // defined(PDF_ENABLE_XFA)
+
+// static
+int PDFiumFormFiller::Form_Alert(IPDF_JSPLATFORM* param,
+                                 FPDF_WIDESTRING message,
+                                 FPDF_WIDESTRING title,
+                                 int type,
+                                 int icon) {
+  // See fpdfformfill.h for these values.
+  enum AlertType {
+    ALERT_TYPE_OK = 0,
+    ALERT_TYPE_OK_CANCEL,
+    ALERT_TYPE_YES_ON,
+    ALERT_TYPE_YES_NO_CANCEL
+  };
+
+  enum AlertResult {
+    ALERT_RESULT_OK = 1,
+    ALERT_RESULT_CANCEL,
+    ALERT_RESULT_NO,
+    ALERT_RESULT_YES
+  };
+
+  PDFiumEngine* engine = GetEngine(param);
+  std::string message_str = WideStringToString(message);
+  if (type == ALERT_TYPE_OK) {
+    engine->client_->Alert(message_str);
+    return ALERT_RESULT_OK;
+  }
+
+  bool rv = engine->client_->Confirm(message_str);
+  if (type == ALERT_TYPE_OK_CANCEL)
+    return rv ? ALERT_RESULT_OK : ALERT_RESULT_CANCEL;
+  return rv ? ALERT_RESULT_YES : ALERT_RESULT_NO;
+}
+
+// static
+void PDFiumFormFiller::Form_Beep(IPDF_JSPLATFORM* param, int type) {
+  // Beeps are annoying, and not possible using javascript, so ignore for now.
+}
+
+// static
+int PDFiumFormFiller::Form_Response(IPDF_JSPLATFORM* param,
+                                    FPDF_WIDESTRING question,
+                                    FPDF_WIDESTRING title,
+                                    FPDF_WIDESTRING default_response,
+                                    FPDF_WIDESTRING label,
+                                    FPDF_BOOL password,
+                                    void* response,
+                                    int length) {
+  std::string question_str = WideStringToString(question);
+  std::string default_str = WideStringToString(default_response);
+
+  PDFiumEngine* engine = GetEngine(param);
+  std::string rv = engine->client_->Prompt(question_str, default_str);
+  base::string16 rv_16 = base::UTF8ToUTF16(rv);
+  int rv_bytes = rv_16.size() * sizeof(base::char16);
+  if (response) {
+    int bytes_to_copy = rv_bytes < length ? rv_bytes : length;
+    memcpy(response, rv_16.c_str(), bytes_to_copy);
+  }
+  return rv_bytes;
+}
+
+// static
+int PDFiumFormFiller::Form_GetFilePath(IPDF_JSPLATFORM* param,
+                                       void* file_path,
+                                       int length) {
+  PDFiumEngine* engine = GetEngine(param);
+  std::string rv = engine->client_->GetURL();
+  if (file_path && rv.size() <= static_cast<size_t>(length))
+    memcpy(file_path, rv.c_str(), rv.size());
+  return rv.size();
+}
+
+// static
+void PDFiumFormFiller::Form_Mail(IPDF_JSPLATFORM* param,
+                                 void* mail_data,
+                                 int length,
+                                 FPDF_BOOL ui,
+                                 FPDF_WIDESTRING to,
+                                 FPDF_WIDESTRING subject,
+                                 FPDF_WIDESTRING cc,
+                                 FPDF_WIDESTRING bcc,
+                                 FPDF_WIDESTRING message) {
+  // Note: |mail_data| and |length| are ignored. We don't handle attachments;
+  // there is no way with mailto.
+  std::string to_str = WideStringToString(to);
+  std::string cc_str = WideStringToString(cc);
+  std::string bcc_str = WideStringToString(bcc);
+  std::string subject_str = WideStringToString(subject);
+  std::string message_str = WideStringToString(message);
+
+  PDFiumEngine* engine = GetEngine(param);
+  engine->client_->Email(to_str, cc_str, bcc_str, subject_str, message_str);
+}
+
+// static
+void PDFiumFormFiller::Form_Print(IPDF_JSPLATFORM* param,
+                                  FPDF_BOOL ui,
+                                  int start,
+                                  int end,
+                                  FPDF_BOOL silent,
+                                  FPDF_BOOL shrink_to_fit,
+                                  FPDF_BOOL print_as_image,
+                                  FPDF_BOOL reverse,
+                                  FPDF_BOOL annotations) {
+  // No way to pass the extra information to the print dialog using JavaScript.
+  // Just opening it is fine for now.
+  PDFiumEngine* engine = GetEngine(param);
+  engine->client_->Print();
+}
+
+// static
+void PDFiumFormFiller::Form_SubmitForm(IPDF_JSPLATFORM* param,
+                                       void* form_data,
+                                       int length,
+                                       FPDF_WIDESTRING url) {
+  std::string url_str = WideStringToString(url);
+  PDFiumEngine* engine = GetEngine(param);
+  engine->client_->SubmitForm(url_str, form_data, length);
+}
+
+// static
+void PDFiumFormFiller::Form_GotoPage(IPDF_JSPLATFORM* param, int page_number) {
+  PDFiumEngine* engine = GetEngine(param);
+  engine->ScrollToPage(page_number);
+}
+
+// static
+PDFiumEngine* PDFiumFormFiller::GetEngine(FPDF_FORMFILLINFO* info) {
+  auto* form_filler = static_cast<PDFiumFormFiller*>(info);
+  return form_filler->engine_;
+}
+
+// static
+PDFiumEngine* PDFiumFormFiller::GetEngine(IPDF_JSPLATFORM* platform) {
+  auto* form_filler = static_cast<PDFiumFormFiller*>(platform);
+  return form_filler->engine_;
+}
+
+}  // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_form_filler.h b/pdf/pdfium/pdfium_form_filler.h
new file mode 100644
index 0000000..e0ac4980
--- /dev/null
+++ b/pdf/pdfium/pdfium_form_filler.h
@@ -0,0 +1,175 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PDF_PDFIUM_PDFIUM_FORM_FILLER_H_
+#define PDF_PDFIUM_PDFIUM_FORM_FILLER_H_
+
+#include "base/macros.h"
+#include "third_party/pdfium/public/fpdf_formfill.h"
+
+namespace chrome_pdf {
+
+class PDFiumEngine;
+
+class PDFiumFormFiller : public FPDF_FORMFILLINFO, public IPDF_JSPLATFORM {
+ public:
+  explicit PDFiumFormFiller(PDFiumEngine* engine);
+
+ private:
+  // FPDF_FORMFILLINFO callbacks.
+  static void Form_Invalidate(FPDF_FORMFILLINFO* param,
+                              FPDF_PAGE page,
+                              double left,
+                              double top,
+                              double right,
+                              double bottom);
+  static void Form_OutputSelectedRect(FPDF_FORMFILLINFO* param,
+                                      FPDF_PAGE page,
+                                      double left,
+                                      double top,
+                                      double right,
+                                      double bottom);
+  static void Form_SetCursor(FPDF_FORMFILLINFO* param, int cursor_type);
+  static int Form_SetTimer(FPDF_FORMFILLINFO* param,
+                           int elapse,
+                           TimerCallback timer_func);
+  static void Form_KillTimer(FPDF_FORMFILLINFO* param, int timer_id);
+  static FPDF_SYSTEMTIME Form_GetLocalTime(FPDF_FORMFILLINFO* param);
+  static void Form_OnChange(FPDF_FORMFILLINFO* param);
+  static FPDF_PAGE Form_GetPage(FPDF_FORMFILLINFO* param,
+                                FPDF_DOCUMENT document,
+                                int page_index);
+  static FPDF_PAGE Form_GetCurrentPage(FPDF_FORMFILLINFO* param,
+                                       FPDF_DOCUMENT document);
+  static int Form_GetRotation(FPDF_FORMFILLINFO* param, FPDF_PAGE page);
+  static void Form_ExecuteNamedAction(FPDF_FORMFILLINFO* param,
+                                      FPDF_BYTESTRING named_action);
+  static void Form_SetTextFieldFocus(FPDF_FORMFILLINFO* param,
+                                     FPDF_WIDESTRING value,
+                                     FPDF_DWORD valueLen,
+                                     FPDF_BOOL is_focus);
+  static void Form_DoURIAction(FPDF_FORMFILLINFO* param, FPDF_BYTESTRING uri);
+  static void Form_DoGoToAction(FPDF_FORMFILLINFO* param,
+                                int page_index,
+                                int zoom_mode,
+                                float* position_array,
+                                int size_of_array);
+
+#if defined(PDF_ENABLE_XFA)
+  static void Form_EmailTo(FPDF_FORMFILLINFO* param,
+                           FPDF_FILEHANDLER* file_handler,
+                           FPDF_WIDESTRING to,
+                           FPDF_WIDESTRING subject,
+                           FPDF_WIDESTRING cc,
+                           FPDF_WIDESTRING bcc,
+                           FPDF_WIDESTRING message);
+  static void Form_DisplayCaret(FPDF_FORMFILLINFO* param,
+                                FPDF_PAGE page,
+                                FPDF_BOOL visible,
+                                double left,
+                                double top,
+                                double right,
+                                double bottom);
+  static void Form_SetCurrentPage(FPDF_FORMFILLINFO* param,
+                                  FPDF_DOCUMENT document,
+                                  int page);
+  static int Form_GetCurrentPageIndex(FPDF_FORMFILLINFO* param,
+                                      FPDF_DOCUMENT document);
+  static void Form_GetPageViewRect(FPDF_FORMFILLINFO* param,
+                                   FPDF_PAGE page,
+                                   double* left,
+                                   double* top,
+                                   double* right,
+                                   double* bottom);
+  static int Form_GetPlatform(FPDF_FORMFILLINFO* param,
+                              void* platform,
+                              int length);
+  static FPDF_BOOL Form_PopupMenu(FPDF_FORMFILLINFO* param,
+                                  FPDF_PAGE page,
+                                  FPDF_WIDGET widget,
+                                  int menu_flag,
+                                  float x,
+                                  float y);
+  static FPDF_BOOL Form_PostRequestURL(FPDF_FORMFILLINFO* param,
+                                       FPDF_WIDESTRING url,
+                                       FPDF_WIDESTRING data,
+                                       FPDF_WIDESTRING content_type,
+                                       FPDF_WIDESTRING encode,
+                                       FPDF_WIDESTRING header,
+                                       FPDF_BSTR* response);
+  static FPDF_BOOL Form_PutRequestURL(FPDF_FORMFILLINFO* param,
+                                      FPDF_WIDESTRING url,
+                                      FPDF_WIDESTRING data,
+                                      FPDF_WIDESTRING encode);
+  static void Form_UploadTo(FPDF_FORMFILLINFO* param,
+                            FPDF_FILEHANDLER* file_handler,
+                            int file_flag,
+                            FPDF_WIDESTRING dest);
+  static FPDF_LPFILEHANDLER Form_DownloadFromURL(FPDF_FORMFILLINFO* param,
+                                                 FPDF_WIDESTRING url);
+  static FPDF_FILEHANDLER* Form_OpenFile(FPDF_FORMFILLINFO* param,
+                                         int file_flag,
+                                         FPDF_WIDESTRING url,
+                                         const char* mode);
+  static void Form_GotoURL(FPDF_FORMFILLINFO* param,
+                           FPDF_DOCUMENT document,
+                           FPDF_WIDESTRING url);
+  static int Form_GetLanguage(FPDF_FORMFILLINFO* param,
+                              void* language,
+                              int length);
+#endif  // defined(PDF_ENABLE_XFA)
+
+  // IPDF_JSPLATFORM callbacks.
+  static int Form_Alert(IPDF_JSPLATFORM* param,
+                        FPDF_WIDESTRING message,
+                        FPDF_WIDESTRING title,
+                        int type,
+                        int icon);
+  static void Form_Beep(IPDF_JSPLATFORM* param, int type);
+  static int Form_Response(IPDF_JSPLATFORM* param,
+                           FPDF_WIDESTRING question,
+                           FPDF_WIDESTRING title,
+                           FPDF_WIDESTRING default_response,
+                           FPDF_WIDESTRING label,
+                           FPDF_BOOL password,
+                           void* response,
+                           int length);
+  static int Form_GetFilePath(IPDF_JSPLATFORM* param,
+                              void* file_path,
+                              int length);
+  static void Form_Mail(IPDF_JSPLATFORM* param,
+                        void* mail_data,
+                        int length,
+                        FPDF_BOOL ui,
+                        FPDF_WIDESTRING to,
+                        FPDF_WIDESTRING subject,
+                        FPDF_WIDESTRING cc,
+                        FPDF_WIDESTRING bcc,
+                        FPDF_WIDESTRING message);
+  static void Form_Print(IPDF_JSPLATFORM* param,
+                         FPDF_BOOL ui,
+                         int start,
+                         int end,
+                         FPDF_BOOL silent,
+                         FPDF_BOOL shrink_to_fit,
+                         FPDF_BOOL print_as_image,
+                         FPDF_BOOL reverse,
+                         FPDF_BOOL annotations);
+  static void Form_SubmitForm(IPDF_JSPLATFORM* param,
+                              void* form_data,
+                              int length,
+                              FPDF_WIDESTRING url);
+  static void Form_GotoPage(IPDF_JSPLATFORM* param, int page_number);
+
+  static PDFiumEngine* GetEngine(FPDF_FORMFILLINFO* info);
+  static PDFiumEngine* GetEngine(IPDF_JSPLATFORM* platform);
+
+  PDFiumEngine* const engine_;
+
+  DISALLOW_COPY_AND_ASSIGN(PDFiumFormFiller);
+};
+
+}  // namespace chrome_pdf
+
+#endif  // PDF_PDFIUM_PDFIUM_FORM_FILLER_H_
diff --git a/services/network/mojo_net_log.cc b/services/network/mojo_net_log.cc
index 2db347d..81bbefb8 100644
--- a/services/network/mojo_net_log.cc
+++ b/services/network/mojo_net_log.cc
@@ -7,8 +7,16 @@
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/task_scheduler/post_task.h"
+#include "base/task_scheduler/task_traits.h"
 #include "base/values.h"
 #include "net/log/file_net_log_observer.h"
+#include "net/log/net_log_util.h"
+#include "net/url_request/url_request_context.h"
+#include "services/network/network_context.h"
+#include "services/network/network_service.h"
 #include "services/network/public/cpp/network_switches.h"
 
 namespace network {
@@ -37,4 +45,207 @@
   file_net_log_observer_->StartObserving(this, capture_mode);
 }
 
+NetLogExporter::NetLogExporter(NetworkContext* network_context)
+    : network_context_(network_context), state_(STATE_IDLE) {}
+
+NetLogExporter::~NetLogExporter() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  // In case scratch directory creation didn't finish by the time |this| is
+  // destroyed, |destination_| is still owned here (rather than handed over to
+  // FileNetLogObserver); ask the scheduler to close it someplace suitable.
+  if (destination_.IsValid())
+    CloseFileOffThread(std::move(destination_));
+
+  // ~FileNetLogObserver will take care of unregistering from NetLog even
+  // if StopObserving isn't invoked.
+}
+
+void NetLogExporter::Start(base::File destination,
+                           base::Value extra_constants,
+                           NetLogExporter::CaptureMode capture_mode,
+                           uint64_t max_file_size,
+                           StartCallback callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(destination.IsValid());
+
+  if (state_ != STATE_IDLE) {
+    CloseFileOffThread(std::move(destination));
+    std::move(callback).Run(net::ERR_UNEXPECTED);
+    return;
+  }
+
+  // Store the file explicitly since destroying it involves disk I/O, so must
+  // be carefully controlled.
+  destination_ = std::move(destination);
+
+  net::NetLogCaptureMode net_capture_mode;
+  switch (capture_mode) {
+    case NetLogExporter::CaptureMode::DEFAULT:
+      net_capture_mode = net::NetLogCaptureMode::Default();
+      break;
+    case NetLogExporter::CaptureMode::INCLUDE_COOKIES_AND_CREDENTIALS:
+      net_capture_mode = net::NetLogCaptureMode::IncludeCookiesAndCredentials();
+      break;
+    case NetLogExporter::CaptureMode::INCLUDE_SOCKET_BYTES:
+      net_capture_mode = net::NetLogCaptureMode::IncludeSocketBytes();
+      break;
+  }
+
+  state_ = STATE_WAITING_DIR;
+  static_assert(kUnlimitedFileSize == net::FileNetLogObserver::kNoLimit,
+                "Inconsistent unbounded size constants");
+  if (max_file_size != kUnlimitedFileSize) {
+    base::PostTaskWithTraitsAndReplyWithResult(
+        FROM_HERE,
+        {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+        base::BindOnce(&NetLogExporter::CreateScratchDir,
+                       scratch_dir_create_handler_for_tests_),
+
+        // Note: this a static method which takes a weak pointer as an argument,
+        // so it will run if |this| is deleted.
+        base::BindOnce(&NetLogExporter::StartWithScratchDirOrCleanup,
+                       AsWeakPtr(), std::move(extra_constants),
+                       net_capture_mode, max_file_size, std::move(callback)));
+  } else {
+    StartWithScratchDir(std::move(extra_constants), net_capture_mode,
+                        max_file_size, std::move(callback), base::FilePath());
+  }
+}
+
+void NetLogExporter::Stop(base::Value polled_data_value,
+                          StopCallback callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  base::DictionaryValue* polled_data = nullptr;
+  bool ok = polled_data_value.GetAsDictionary(&polled_data);
+  DCHECK(ok);  // mojo is supposed to enforce that.
+
+  if (state_ != STATE_RUNNING) {
+    std::move(callback).Run(net::ERR_UNEXPECTED);
+    return;
+  }
+
+  std::unique_ptr<base::DictionaryValue> net_info = net::GetNetInfo(
+      network_context_->url_request_context(), net::NET_INFO_ALL_SOURCES);
+  if (polled_data)
+    net_info->MergeDictionary(polled_data);
+
+  file_net_observer_->StopObserving(
+      std::move(net_info),
+      base::BindOnce([](StopCallback sc) { std::move(sc).Run(net::OK); },
+                     std::move(callback)));
+  file_net_observer_ = nullptr;
+  state_ = STATE_IDLE;
+}
+
+void NetLogExporter::SetCreateScratchDirHandlerForTesting(
+    const base::RepeatingCallback<base::FilePath()>& handler) {
+  scratch_dir_create_handler_for_tests_ = handler;
+}
+
+void NetLogExporter::CloseFileOffThread(base::File file) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  if (file.IsValid()) {
+    base::PostTaskWithTraits(
+        FROM_HERE,
+        {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+        base::BindOnce([](base::File f) { f.Close(); }, std::move(file)));
+  }
+}
+
+base::FilePath NetLogExporter::CreateScratchDir(
+    base::RepeatingCallback<base::FilePath()>
+        scratch_dir_create_handler_for_tests) {
+  if (scratch_dir_create_handler_for_tests)
+    return scratch_dir_create_handler_for_tests.Run();
+
+  base::ScopedTempDir scratch_dir;
+  if (scratch_dir.CreateUniqueTempDir())
+    return scratch_dir.Take();
+  else
+    return base::FilePath();
+}
+
+void NetLogExporter::StartWithScratchDirOrCleanup(
+    base::WeakPtr<NetLogExporter> object,
+    base::Value extra_constants,
+    net::NetLogCaptureMode capture_mode,
+    uint64_t max_file_size,
+    StartCallback callback,
+    const base::FilePath& scratch_dir_path) {
+  NetLogExporter* instance = object.get();
+  if (instance) {
+    instance->StartWithScratchDir(std::move(extra_constants), capture_mode,
+                                  max_file_size, std::move(callback),
+                                  scratch_dir_path);
+  } else if (!scratch_dir_path.empty()) {
+    // An NetLogExporter got destroyed while it was trying to create a scratch
+    // dir.
+    base::PostTaskWithTraits(
+        FROM_HERE,
+        {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
+        base::BindOnce(
+            [](const base::FilePath& dir) {
+              // The delete is non-recursive (2nd argument false) since the
+              // only time this is invoked the directory is expected to be
+              // empty.
+              base::DeleteFile(dir, false);
+            },
+            scratch_dir_path));
+  }
+}
+
+void NetLogExporter::StartWithScratchDir(
+    base::Value extra_constants_value,
+    net::NetLogCaptureMode capture_mode,
+    uint64_t max_file_size,
+    StartCallback callback,
+    const base::FilePath& scratch_dir_path) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  base::DictionaryValue* extra_constants = nullptr;
+  bool ok = extra_constants_value.GetAsDictionary(&extra_constants);
+  DCHECK(ok);  // mojo is supposed to enforce that before Start() is invoked.
+
+  if (scratch_dir_path.empty() && max_file_size != kUnlimitedFileSize) {
+    state_ = STATE_IDLE;
+    CloseFileOffThread(std::move(destination_));
+    std::move(callback).Run(net::ERR_INSUFFICIENT_RESOURCES);
+    return;
+  }
+
+  state_ = STATE_RUNNING;
+
+  std::unique_ptr<base::DictionaryValue> constants = net::GetNetConstants();
+
+  if (extra_constants)
+    constants->MergeDictionary(extra_constants);
+
+  if (max_file_size != kUnlimitedFileSize) {
+    file_net_observer_ = net::FileNetLogObserver::CreateBoundedPreExisting(
+        scratch_dir_path, std::move(destination_), max_file_size,
+        std::move(constants));
+  } else {
+    DCHECK(scratch_dir_path.empty());
+    file_net_observer_ = net::FileNetLogObserver::CreateUnboundedPreExisting(
+        std::move(destination_), std::move(constants));
+  }
+
+  // There might not be a NetworkService object e.g. on iOS; in that case
+  // assume this present NetworkContext is all there is.
+  if (network_context_->network_service()) {
+    network_context_->network_service()->CreateNetLogEntriesForActiveObjects(
+        file_net_observer_.get());
+  } else {
+    std::set<net::URLRequestContext*> contexts;
+    contexts.insert(network_context_->url_request_context());
+    net::CreateNetLogEntriesForActiveObjects(contexts,
+                                             file_net_observer_.get());
+  }
+
+  file_net_observer_->StartObserving(
+      network_context_->url_request_context()->net_log(), capture_mode);
+  std::move(callback).Run(net::OK);
+}
+
 }  // namespace network
diff --git a/services/network/mojo_net_log.h b/services/network/mojo_net_log.h
index b837223..14b37371 100644
--- a/services/network/mojo_net_log.h
+++ b/services/network/mojo_net_log.h
@@ -8,7 +8,9 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "base/threading/thread_checker.h"
 #include "net/log/net_log.h"
+#include "services/network/public/mojom/network_service.mojom.h"
 
 namespace base {
 class CommandLine;
@@ -20,6 +22,8 @@
 
 namespace network {
 
+class NetworkContext;
+
 // NetLog used by NetworkService when it owns the NetLog, rather than when a
 // pre-existing one is passed in to its constructor.
 //
@@ -39,6 +43,67 @@
   DISALLOW_COPY_AND_ASSIGN(MojoNetLog);
 };
 
+// API implementation for exporting ongoing netlogs.
+class COMPONENT_EXPORT(NETWORK_SERVICE) NetLogExporter
+    : public mojom::NetLogExporter,
+      public base::SupportsWeakPtr<NetLogExporter> {
+ public:
+  // This expects to live on the same thread as NetworkContext, e.g.
+  // IO thread or NetworkService main thread.
+  explicit NetLogExporter(NetworkContext* network_context);
+  ~NetLogExporter() override;
+
+  void Start(base::File destination,
+             base::Value extra_constants,
+             NetLogExporter::CaptureMode capture_mode,
+             uint64_t max_file_size,
+             StartCallback callback) override;
+  void Stop(base::Value polled_data, StopCallback callback) override;
+
+  // Sets a callback that will be used to create a scratch directory instead
+  // of the normal codepath. For test use only.
+  void SetCreateScratchDirHandlerForTesting(
+      const base::RepeatingCallback<base::FilePath()>& handler);
+
+ private:
+  void CloseFileOffThread(base::File file);
+
+  // Run off-thread by task scheduler, as does disk I/O.
+  static base::FilePath CreateScratchDir(
+      base::RepeatingCallback<base::FilePath()>
+          scratch_dir_create_handler_for_tests);
+
+  static void StartWithScratchDirOrCleanup(
+      base::WeakPtr<NetLogExporter> object,
+      base::Value extra_constants,
+      net::NetLogCaptureMode capture_mode,
+      uint64_t max_file_size,
+      StartCallback callback,
+      const base::FilePath& scratch_dir_path);
+
+  void StartWithScratchDir(base::Value extra_constants,
+                           net::NetLogCaptureMode capture_mode,
+                           uint64_t max_file_size,
+                           StartCallback callback,
+                           const base::FilePath& scratch_dir_path);
+
+  // NetworkContext owns |this| via StrongBindingSet, so this object can't
+  // outlive it.
+  NetworkContext* network_context_;
+  enum State { STATE_IDLE, STATE_WAITING_DIR, STATE_RUNNING } state_;
+
+  std::unique_ptr<net::FileNetLogObserver> file_net_observer_;
+  base::File destination_;
+
+  // Test-only injectable replacement for CreateScratchDir.
+  base::RepeatingCallback<base::FilePath()>
+      scratch_dir_create_handler_for_tests_;
+
+  THREAD_CHECKER(thread_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(NetLogExporter);
+};
+
 }  // namespace network
 
 #endif  // SERVICES_NETWORK_MOJO_NET_LOG_H_
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 47f79b9..b66c33af 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -48,6 +48,7 @@
 #include "net/url_request/url_request_context_builder.h"
 #include "services/network/http_server_properties_pref_delegate.h"
 #include "services/network/ignore_errors_cert_verifier.h"
+#include "services/network/mojo_net_log.h"
 #include "services/network/network_service.h"
 #include "services/network/proxy_config_service_mojo.h"
 #include "services/network/public/cpp/features.h"
@@ -670,6 +671,12 @@
 #endif  // !defined(OS_IOS)
 }
 
+void NetworkContext::CreateNetLogExporter(
+    mojom::NetLogExporterRequest request) {
+  net_log_exporter_bindings_.AddBinding(std::make_unique<NetLogExporter>(this),
+                                        std::move(request));
+}
+
 void NetworkContext::AddHSTSForTesting(const std::string& host,
                                        base::Time expiry,
                                        bool include_subdomains,
diff --git a/services/network/network_context.h b/services/network/network_context.h
index 350749c..0ab994a 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -15,6 +15,7 @@
 #include "base/callback.h"
 #include "base/component_export.h"
 #include "base/containers/unique_ptr_adapters.h"
+#include "base/files/file.h"
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -152,6 +153,7 @@
                        int32_t process_id,
                        int32_t render_frame_id,
                        const url::Origin& origin) override;
+  void CreateNetLogExporter(mojom::NetLogExporterRequest request) override;
   void AddHSTSForTesting(const std::string& host,
                          base::Time expiry,
                          bool include_subdomains,
@@ -229,6 +231,8 @@
   std::set<std::unique_ptr<URLLoaderFactory>, base::UniquePtrComparator>
       url_loader_factories_;
 
+  mojo::StrongBindingSet<mojom::NetLogExporter> net_log_exporter_bindings_;
+
   int current_resource_scheduler_client_id_ = 0;
 
   // Owned by the URLRequestContext
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index a193fed4..4b3caa2a 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/barrier_closure.h"
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -19,11 +20,13 @@
 #include "base/run_loop.h"
 #include "base/strings/string_split.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/synchronization/waitable_event.h"
 #include "base/test/gtest_util.h"
 #include "base/test/mock_entropy_provider.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/simple_test_clock.h"
+#include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/network_session_configurator/browser/network_session_configurator.h"
@@ -56,6 +59,7 @@
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_builder.h"
 #include "net/url_request/url_request_job_factory.h"
+#include "services/network/mojo_net_log.h"
 #include "services/network/network_context.h"
 #include "services/network/network_service.h"
 #include "services/network/public/cpp/features.h"
@@ -1349,6 +1353,179 @@
 }
 #endif
 
+TEST_F(NetworkContextTest, CreateNetLogExporter) {
+  // Basic flow around start/stop.
+  std::unique_ptr<NetworkContext> network_context =
+      CreateContextWithParams(CreateContextParams());
+
+  mojom::NetLogExporterPtr net_log_exporter;
+  network_context->CreateNetLogExporter(mojo::MakeRequest(&net_log_exporter));
+
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+  base::FilePath out_path(temp_dir.GetPath().AppendASCII("out.json"));
+  base::File out_file(out_path,
+                      base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+  ASSERT_TRUE(out_file.IsValid());
+
+  base::Value dict_start(base::Value::Type::DICTIONARY);
+  const char kKeyEarly[] = "early";
+  const char kValEarly[] = "morning";
+  dict_start.SetKey(kKeyEarly, base::Value(kValEarly));
+
+  net::TestCompletionCallback cb;
+  net_log_exporter->Start(std::move(out_file), std::move(dict_start),
+                          mojom::NetLogExporter_CaptureMode::DEFAULT,
+                          100 * 1024, cb.callback());
+  EXPECT_EQ(net::OK, cb.WaitForResult());
+
+  base::Value dict_late(base::Value::Type::DICTIONARY);
+  const char kKeyLate[] = "late";
+  const char kValLate[] = "snowval";
+  dict_late.SetKey(kKeyLate, base::Value(kValLate));
+
+  net_log_exporter->Stop(std::move(dict_late), cb.callback());
+  EXPECT_EQ(net::OK, cb.WaitForResult());
+
+  // Check that file got written.
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(out_path, &contents));
+
+  // Contents should have net constants, without the client needing any
+  // net:: methods.
+  EXPECT_NE(std::string::npos, contents.find("ERR_IO_PENDING")) << contents;
+
+  // The additional stuff inject should also occur someplace.
+  EXPECT_NE(std::string::npos, contents.find(kKeyEarly)) << contents;
+  EXPECT_NE(std::string::npos, contents.find(kValEarly)) << contents;
+  EXPECT_NE(std::string::npos, contents.find(kKeyLate)) << contents;
+  EXPECT_NE(std::string::npos, contents.find(kValLate)) << contents;
+}
+
+TEST_F(NetworkContextTest, CreateNetLogExporterUnbounded) {
+  // Make sure that exporting without size limit works.
+  std::unique_ptr<NetworkContext> network_context =
+      CreateContextWithParams(CreateContextParams());
+
+  mojom::NetLogExporterPtr net_log_exporter;
+  network_context->CreateNetLogExporter(mojo::MakeRequest(&net_log_exporter));
+
+  base::FilePath temp_path;
+  ASSERT_TRUE(base::CreateTemporaryFile(&temp_path));
+  base::File out_file(temp_path,
+                      base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+  ASSERT_TRUE(out_file.IsValid());
+
+  net::TestCompletionCallback cb;
+  net_log_exporter->Start(
+      std::move(out_file), base::Value(base::Value::Type::DICTIONARY),
+      network::mojom::NetLogExporter::CaptureMode::DEFAULT,
+      network::mojom::NetLogExporter::kUnlimitedFileSize, cb.callback());
+  EXPECT_EQ(net::OK, cb.WaitForResult());
+
+  net_log_exporter->Stop(base::Value(base::Value::Type::DICTIONARY),
+                         cb.callback());
+  EXPECT_EQ(net::OK, cb.WaitForResult());
+
+  // Check that file got written.
+  std::string contents;
+  ASSERT_TRUE(base::ReadFileToString(temp_path, &contents));
+
+  // Contents should have net constants, without the client needing any
+  // net:: methods.
+  EXPECT_NE(std::string::npos, contents.find("ERR_IO_PENDING")) << contents;
+
+  base::DeleteFile(temp_path, false);
+}
+
+TEST_F(NetworkContextTest, CreateNetLogExporterErrors) {
+  // Some basic state machine misuses.
+  std::unique_ptr<NetworkContext> network_context =
+      CreateContextWithParams(CreateContextParams());
+
+  mojom::NetLogExporterPtr net_log_exporter;
+  network_context->CreateNetLogExporter(mojo::MakeRequest(&net_log_exporter));
+
+  net::TestCompletionCallback cb;
+  net_log_exporter->Stop(base::Value(base::Value::Type::DICTIONARY),
+                         cb.callback());
+  EXPECT_EQ(net::ERR_UNEXPECTED, cb.WaitForResult());
+
+  base::FilePath temp_path;
+  ASSERT_TRUE(base::CreateTemporaryFile(&temp_path));
+  base::File temp_file(temp_path,
+                       base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+  ASSERT_TRUE(temp_file.IsValid());
+
+  net_log_exporter->Start(
+      std::move(temp_file), base::Value(base::Value::Type::DICTIONARY),
+      mojom::NetLogExporter_CaptureMode::DEFAULT, 100 * 1024, cb.callback());
+  EXPECT_EQ(net::OK, cb.WaitForResult());
+
+  // Can't start twice.
+  base::FilePath temp_path2;
+  ASSERT_TRUE(base::CreateTemporaryFile(&temp_path2));
+  base::File temp_file2(
+      temp_path2, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+  ASSERT_TRUE(temp_file2.IsValid());
+
+  net_log_exporter->Start(
+      std::move(temp_file2), base::Value(base::Value::Type::DICTIONARY),
+      mojom::NetLogExporter_CaptureMode::DEFAULT, 100 * 1024, cb.callback());
+  EXPECT_EQ(net::ERR_UNEXPECTED, cb.WaitForResult());
+
+  base::DeleteFile(temp_path, false);
+  base::DeleteFile(temp_path2, false);
+
+  // Forgetting to stop is recovered from.
+}
+
+TEST_F(NetworkContextTest, DestroyNetLogExporterWhileCreatingScratchDir) {
+  // Make sure that things behave OK if NetLogExporter is destroyed during the
+  // brief window it owns the scratch directory.
+  std::unique_ptr<NetworkContext> network_context =
+      CreateContextWithParams(CreateContextParams());
+
+  std::unique_ptr<NetLogExporter> net_log_exporter =
+      std::make_unique<NetLogExporter>(network_context.get());
+
+  base::WaitableEvent block_mktemp(
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED);
+
+  base::ScopedTempDir dir;
+  ASSERT_TRUE(dir.CreateUniqueTempDir());
+  base::FilePath path = dir.Take();
+  EXPECT_TRUE(base::PathExists(path));
+
+  net_log_exporter->SetCreateScratchDirHandlerForTesting(base::BindRepeating(
+      [](base::WaitableEvent* block_on,
+         const base::FilePath& path) -> base::FilePath {
+        base::ScopedAllowBaseSyncPrimitivesForTesting need_to_block;
+        block_on->Wait();
+        return path;
+      },
+      &block_mktemp, path));
+
+  base::FilePath temp_path;
+  ASSERT_TRUE(base::CreateTemporaryFile(&temp_path));
+  base::File temp_file(temp_path,
+                       base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+  ASSERT_TRUE(temp_file.IsValid());
+
+  net_log_exporter->Start(std::move(temp_file),
+                          base::Value(base::Value::Type::DICTIONARY),
+                          mojom::NetLogExporter_CaptureMode::DEFAULT, 100,
+                          base::BindOnce([](int) {}));
+  net_log_exporter = nullptr;
+  block_mktemp.Signal();
+
+  scoped_task_environment_.RunUntilIdle();
+
+  EXPECT_FALSE(base::PathExists(path));
+  base::DeleteFile(temp_path, false);
+}
+
 }  // namespace
 
 }  // namespace network
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index 45cd115c..ef667fb 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -19,6 +19,7 @@
 #include "net/dns/host_resolver.h"
 #include "net/dns/mapped_host_resolver.h"
 #include "net/log/net_log.h"
+#include "net/log/net_log_util.h"
 #include "net/nqe/network_quality_estimator.h"
 #include "net/nqe/network_quality_estimator_params.h"
 #include "net/url_request/url_request_context_builder.h"
@@ -198,6 +199,14 @@
   network_contexts_.erase(network_context);
 }
 
+void NetworkService::CreateNetLogEntriesForActiveObjects(
+    net::NetLog::ThreadSafeObserver* observer) {
+  std::set<net::URLRequestContext*> contexts;
+  for (NetworkContext* nc : network_contexts_)
+    contexts.insert(nc->url_request_context());
+  return net::CreateNetLogEntriesForActiveObjects(contexts, observer);
+}
+
 void NetworkService::SetClient(mojom::NetworkServiceClientPtr client) {
   client_ = std::move(client);
 }
diff --git a/services/network/network_service.h b/services/network/network_service.h
index 694809b..cd76b69 100644
--- a/services/network/network_service.h
+++ b/services/network/network_service.h
@@ -12,6 +12,7 @@
 #include "base/component_export.h"
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "net/log/net_log.h"
 #include "services/network/keepalive_statistics_recorder.h"
 #include "services/network/network_change_manager.h"
 #include "services/network/network_service.h"
@@ -23,7 +24,6 @@
 namespace net {
 class HostResolver;
 class LoggingNetworkChangeObserver;
-class NetLog;
 class NetworkQualityEstimator;
 class URLRequestContext;
 }  // namespace net
@@ -87,6 +87,11 @@
   void RegisterNetworkContext(NetworkContext* network_context);
   void DeregisterNetworkContext(NetworkContext* network_context);
 
+  // Invokes net::CreateNetLogEntriesForActiveObjects(observer) on all
+  // URLRequestContext's known to |this|.
+  void CreateNetLogEntriesForActiveObjects(
+      net::NetLog::ThreadSafeObserver* observer);
+
   // mojom::NetworkService implementation:
   void SetClient(mojom::NetworkServiceClientPtr client) override;
   void CreateNetworkContext(mojom::NetworkContextRequest request,
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom
index 7f1e32445..51f08f4 100644
--- a/services/network/public/mojom/network_service.mojom
+++ b/services/network/public/mojom/network_service.mojom
@@ -4,7 +4,9 @@
 
 module network.mojom;
 
+import "mojo/public/mojom/base/file.mojom";
 import "mojo/public/mojom/base/file_path.mojom";
+import "mojo/public/mojom/base/values.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "net/interfaces/address_list.mojom";
 import "net/interfaces/ip_endpoint.mojom";
@@ -179,6 +181,52 @@
   int64 total_bytes_sent;
 };
 
+// Manages export of ongoing NetLog events to a file.
+// Both Start and Stop must succeed, in that order, for the export to
+// be complete and have a well-formed file. You may call Start again after
+// Stop's callback has been invoked, but doing things like calling Start twice
+// without intervening successful stops will result in an error.
+interface NetLogExporter {
+
+  enum CaptureMode {
+    // Log all events, but do not include the actual transferred bytes, and
+    // remove cookies and HTTP credentials and HTTP/2 GOAWAY frame debug data.
+    DEFAULT,
+
+    // Log all events, but do not include the actual transferred bytes as
+    // parameters for bytes sent/received events.
+    INCLUDE_COOKIES_AND_CREDENTIALS,
+
+    // Log everything possible, even if it is slow and memory expensive.
+    // Includes logging of transferred bytes.
+    INCLUDE_SOCKET_BYTES
+  };
+
+  const uint64 kUnlimitedFileSize = 0xFFFFFFFFFFFFFFFF;
+
+  // Starts logging to |destination|, including definitions of |extra_constants|
+  // in the log in addition to the standard constants required by the log.
+  // Contents in |destination| might not be complete until Stop() is called
+  // successfully.
+  //
+  // If |max_file_size| is kUnlimitedFileSize log size will not be limited.
+  //
+  // Returns network error code.
+  Start(
+    mojo_base.mojom.File destination,
+    mojo_base.mojom.DictionaryValue extra_constants,
+    CaptureMode capture_mode,
+    uint64 max_file_size) => (int32 net_error);
+
+  // Finalizes the log file. If |polled_values| is provided, it will be
+  // included alongside net configuration info inside the 'polledData' field
+  // of the log object.
+  //
+  // Returns network error code; if successful this will occur only after
+  // the file has been fully written.
+  Stop(mojo_base.mojom.DictionaryValue polled_values) => (int32 net_error);
+};
+
 // Represents a distinct context for making network requests, with its own
 // storage (e.g. cookies and cache).
 interface NetworkContext {
@@ -297,6 +345,13 @@
                   int32 render_frame_id,
                   url.mojom.Origin origin);
 
+  // Create a NetLogExporter, which helps export NetLog to an existing file.
+  // Note that the log is generally global, including all NetworkContexts
+  // managed by the same NetworkService. The particular NetworkContext this is
+  // called on will determine which NetworkContext gets its information and
+  // configuration summary written out at the end of the log.
+  CreateNetLogExporter(NetLogExporter& exporter);
+
   [Sync]
   // Adds explicitly-specified data as if it was processed from an
   // HSTS header.
diff --git a/services/network/test/test_network_context.h b/services/network/test/test_network_context.h
index 1327565..3df3bb6 100644
--- a/services/network/test/test_network_context.h
+++ b/services/network/test/test_network_context.h
@@ -80,6 +80,7 @@
                        int32_t process_id,
                        int32_t render_frame_id,
                        const url::Origin& origin) override {}
+  void CreateNetLogExporter(mojom::NetLogExporterRequest exporter) override {}
   void AddHSTSForTesting(const std::string& host,
                          base::Time expiry,
                          bool include_subdomains,
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index 6b9bf634..99b3a40 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -522,8 +522,7 @@
 
       const void* buffer;
       uint32_t num_bytes;
-      MojoResult rv = MojoBeginReadData(consumer, &buffer, &num_bytes,
-                                        MOJO_READ_DATA_FLAG_NONE);
+      MojoResult rv = MojoBeginReadData(consumer, nullptr, &buffer, &num_bytes);
       // If no data has been received yet, spin the message loop until it has.
       if (rv == MOJO_RESULT_SHOULD_WAIT) {
         mojo::SimpleWatcher watcher(
@@ -550,7 +549,7 @@
       CHECK_EQ(rv, MOJO_RESULT_OK);
 
       body.append(static_cast<const char*>(buffer), num_bytes);
-      MojoEndReadData(consumer, num_bytes);
+      MojoEndReadData(consumer, num_bytes, nullptr);
     }
 
     return body;
@@ -560,15 +559,16 @@
     MojoHandle consumer = client()->response_body().value();
 
     uint32_t num_bytes = 0;
-    MojoResult result =
-        MojoReadData(consumer, nullptr, &num_bytes, MOJO_READ_DATA_FLAG_QUERY);
+    MojoReadDataOptions options;
+    options.struct_size = sizeof(options);
+    options.flags = MOJO_READ_DATA_FLAG_QUERY;
+    MojoResult result = MojoReadData(consumer, &options, nullptr, &num_bytes);
     CHECK_EQ(MOJO_RESULT_OK, result);
     if (num_bytes == 0)
       return std::string();
 
     std::vector<char> buffer(num_bytes);
-    result = MojoReadData(consumer, buffer.data(), &num_bytes,
-                          MOJO_READ_DATA_FLAG_NONE);
+    result = MojoReadData(consumer, nullptr, buffer.data(), &num_bytes);
     CHECK_EQ(MOJO_RESULT_OK, result);
     CHECK_EQ(num_bytes, buffer.size());
 
diff --git a/services/ui/public/cpp/gpu/context_provider_command_buffer.cc b/services/ui/public/cpp/gpu/context_provider_command_buffer.cc
index bf1e6d7..3f0507b 100644
--- a/services/ui/public/cpp/gpu/context_provider_command_buffer.cc
+++ b/services/ui/public/cpp/gpu/context_provider_command_buffer.cc
@@ -237,7 +237,7 @@
     return bind_result_;
   }
 
-  if (attributes_.enable_raster_decoder) {
+  if (attributes_.enable_oop_rasterization) {
     DCHECK(attributes_.enable_raster_interface);
     DCHECK(!attributes_.enable_gles2_interface);
     DCHECK(!support_grcontext_);
@@ -400,7 +400,6 @@
     return nullptr;
   }
 
-  DCHECK(!attributes_.enable_raster_decoder);
   if (!gles2_impl_.get())
     return nullptr;
 
@@ -424,7 +423,7 @@
   if (gr_context_)
     return gr_context_->get();
 
-  if (attributes_.enable_raster_decoder)
+  if (attributes_.enable_oop_rasterization)
     return nullptr;
 
   // TODO(vmiura): crbug.com/793508 Disable access to GrContext if
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 46ec92f..276ac70 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -217,10 +217,6 @@
 #define SK_SUPPORT_LEGACY_YUV_COLORSPACE
 #endif
 
-#ifndef SK_SUPPORT_LEGACY_BACKEND_OBJECTS
-#define SK_SUPPORT_LEGACY_BACKEND_OBJECTS
-#endif
-
 // Max. verb count for paths rendered by the edge-AA tessellating path renderer.
 #define GR_AA_TESSELLATOR_MAX_VERB_COUNT 10
 
diff --git a/skia/ext/texture_handle.h b/skia/ext/texture_handle.h
deleted file mode 100644
index 83cb759..0000000
--- a/skia/ext/texture_handle.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SKIA_EXT_TEXTURE_HANDLE_H_
-#define SKIA_EXT_TEXTURE_HANDLE_H_
-
-#include "third_party/skia/include/gpu/gl/GrGLTypes.h"
-
-namespace skia {
-
-// TODO(bsalomon): Remove this conversion when Skia bug 5019 is fixed.
-inline const GrGLTextureInfo* GrBackendObjectToGrGLTextureInfo(
-    GrBackendObject object) {
-  return reinterpret_cast<const GrGLTextureInfo*>(object);
-}
-
-}  // namespace skia
-
-#endif  // SKIA_EXT_TEXTURE_HANDLE_H_
diff --git a/storage/browser/blob/blob_transport_strategy.cc b/storage/browser/blob/blob_transport_strategy.cc
index bb8c6570..f9c40e7 100644
--- a/storage/browser/blob/blob_transport_strategy.cc
+++ b/storage/browser/blob/blob_transport_strategy.cc
@@ -149,7 +149,7 @@
     mojo::ScopedDataPipeProducerHandle producer_handle;
     MojoCreateDataPipeOptions options;
     options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+    options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
     options.element_num_bytes = 1;
     options.capacity_num_bytes =
         std::min(expected_source_size, limits_.max_shared_memory_size);
diff --git a/testing/buildbot/OWNERS b/testing/buildbot/OWNERS
index ad0ef62d..23b6c77 100644
--- a/testing/buildbot/OWNERS
+++ b/testing/buildbot/OWNERS
@@ -7,6 +7,7 @@
 jochen@chromium.org
 kbr@chromium.org
 machenbach@chromium.org
+martiniss@chromium.org
 maruel@chromium.org
 sky@chromium.org
 tansell@chromium.org
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index a0720c1..c5cacdc 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -514,6 +514,14 @@
       }
     ]
   },
+  "Android WebView O (dbg)": {
+    "cts_tests": [
+      {
+        "arch": "arm64",
+        "platform": "O"
+      }
+    ]
+  },
   "Android arm Builder (dbg)": {
     "additional_compile_targets": [
       "dump_syms",
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index e03aa78..6487e625 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -695,5 +695,100 @@
         }
       }
     ]
+  },
+  "android-pixel2-perf": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "-v",
+          "--browser=android-chromium",
+          "--upload-results"
+        ],
+        "isolate_name": "performance_test_suite",
+        "merge": {
+          "args": [
+            "--service-account-file",
+            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
+          ],
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "performance_test_suite",
+        "override_compile_targets": [
+          "performance_test_suite"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_is": "O",
+              "device_type": "walleye",
+              "os": "Android",
+              "pool": "chrome.test.perf-fyi"
+            }
+          ],
+          "expiration": 36000,
+          "hard_timeout": 36000,
+          "ignore_task_failure": false,
+          "io_timeout": 1800,
+          "shards": 7,
+          "upload_test_results": true
+        },
+        "trigger_script": {
+          "args": [
+            "--multiple-dimension-script-verbose",
+            "True"
+          ],
+          "script": "//testing/trigger_scripts/perf_device_trigger.py"
+        }
+      }
+    ]
+  },
+  "android-pixel2_webview-perf": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "-v",
+          "--browser=android-webview",
+          "--upload-results",
+          "--webview-embedder-apk=../../out/Release/apks/SystemWebViewShell.apk"
+        ],
+        "isolate_name": "performance_webview_test_suite",
+        "merge": {
+          "args": [
+            "--service-account-file",
+            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
+          ],
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "performance_webview_test_suite",
+        "override_compile_targets": [
+          "performance_webview_test_suite"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_is": "O",
+              "device_type": "walleye",
+              "os": "Android",
+              "pool": "chrome.test.perf-webview-fyi"
+            }
+          ],
+          "expiration": 36000,
+          "hard_timeout": 36000,
+          "ignore_task_failure": false,
+          "io_timeout": 1800,
+          "shards": 7,
+          "upload_test_results": true
+        },
+        "trigger_script": {
+          "args": [
+            "--multiple-dimension-script-verbose",
+            "True"
+          ],
+          "script": "//testing/trigger_scripts/perf_device_trigger.py"
+        }
+      }
+    ]
   }
 }
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index e453a7e..59b9e43b 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -30852,9 +30852,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -30884,9 +30884,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -30914,9 +30914,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -30946,9 +30946,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -30978,7 +30978,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31010,7 +31010,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31038,9 +31038,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31070,9 +31070,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31102,7 +31102,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31134,7 +31134,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31162,9 +31162,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31194,9 +31194,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31224,9 +31224,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31256,9 +31256,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31286,9 +31286,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31318,9 +31318,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31348,9 +31348,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31380,9 +31380,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31410,9 +31410,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31442,9 +31442,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31474,7 +31474,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31506,7 +31506,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31534,9 +31534,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31566,9 +31566,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31596,9 +31596,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31628,9 +31628,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31658,9 +31658,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31690,9 +31690,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31720,9 +31720,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31752,9 +31752,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31782,9 +31782,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31814,9 +31814,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31844,9 +31844,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31876,9 +31876,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31908,7 +31908,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31940,7 +31940,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -31968,9 +31968,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32000,7 +32000,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32032,7 +32032,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32060,9 +32060,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32092,9 +32092,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32122,9 +32122,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32154,9 +32154,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32186,7 +32186,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32218,7 +32218,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32246,9 +32246,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32278,9 +32278,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32308,9 +32308,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32340,9 +32340,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32370,9 +32370,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32402,7 +32402,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32434,7 +32434,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32462,9 +32462,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32494,9 +32494,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32524,9 +32524,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32556,9 +32556,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32586,9 +32586,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32618,9 +32618,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32648,9 +32648,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32680,9 +32680,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32710,9 +32710,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32742,9 +32742,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32774,7 +32774,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32806,7 +32806,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32836,7 +32836,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32868,7 +32868,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32896,9 +32896,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32928,9 +32928,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32958,9 +32958,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -32990,9 +32990,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33020,9 +33020,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33052,9 +33052,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33084,7 +33084,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33116,7 +33116,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33144,9 +33144,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33176,9 +33176,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33206,9 +33206,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33238,9 +33238,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33270,7 +33270,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33302,7 +33302,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33330,9 +33330,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33362,9 +33362,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33392,9 +33392,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33424,9 +33424,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33454,9 +33454,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33486,9 +33486,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33516,9 +33516,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33548,9 +33548,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33578,9 +33578,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33610,9 +33610,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33642,7 +33642,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33674,7 +33674,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33704,7 +33704,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33736,7 +33736,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33764,9 +33764,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33796,9 +33796,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33826,9 +33826,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33856,9 +33856,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33888,9 +33888,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33920,9 +33920,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33950,9 +33950,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -33980,9 +33980,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34012,9 +34012,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34044,9 +34044,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34076,7 +34076,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34108,7 +34108,7 @@
               "gpu": "8086:1616",
               "id": "build180-b4",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34136,9 +34136,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34168,9 +34168,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34198,9 +34198,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34230,9 +34230,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34260,9 +34260,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34292,9 +34292,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34322,9 +34322,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34354,9 +34354,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34384,9 +34384,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34416,9 +34416,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build118-b1",
+              "id": "build195-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34446,9 +34446,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34476,9 +34476,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34508,9 +34508,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34540,9 +34540,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34570,9 +34570,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build117-b1",
+              "id": "build194-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34600,9 +34600,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34632,9 +34632,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build119-b1",
+              "id": "build196-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34662,9 +34662,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
@@ -34694,9 +34694,9 @@
           "dimension_sets": [
             {
               "gpu": "8086:1616",
-              "id": "build120-b1",
+              "id": "build197-b7",
               "os": "Windows-10",
-              "pool": "Chrome-perf"
+              "pool": "chrome.test.perf"
             }
           ],
           "expiration": 36000,
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
index 8cf84774..0ee189a 100644
--- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -149,6 +149,8 @@
 -ExtensionWebRequestApiTest.WebRequestDeclarative2
 -ExtensionWebRequestApiTest.WebRequestDiceHeaderProtection
 -ExtensionWebRequestApiTest.WebRequestTypes
+-ExtensionWebRequestApiTest.WebRequestTestOSDD

+-ExtensionWebRequestApiTest.WebRequestURLFetcherInterception
 -LocalNTPInterceptionWebRequestAPITest.OneGoogleBarRequestsHidden
 
 # https://crbug.com/721400
@@ -235,6 +237,7 @@
 
 # Requires a replacement for ChromeNetworkDelegate.
 -VariationsHttpHeadersBrowserTest.TestStrippingHeadersFromResourceRequest
+-VariationsHttpHeadersBrowserTest.TestStrippingHeadersFromInternalRequest
 
 # Fails because of missing support to navigate to filesystem: URLs.
 # https://crbug.com/797292
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index 36fb155..9af3968 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -282,6 +282,36 @@
       return []
     return exception.get('key_removals', {}).get(tester_name, [])
 
+  def maybe_fixup_args_array(self, arr):
+    # The incoming array of strings may be an array of command line
+    # arguments. To make it easier to turn on certain features per-bot
+    # or per-test-suite, look specifically for any --enable-features
+    # flags, and merge them into comma-separated lists. (This might
+    # need to be extended to handle other arguments in the future,
+    # too.)
+    enable_str = '--enable-features='
+    enable_str_len = len(enable_str)
+    enable_features_args = []
+    idx = 0
+    first_idx = -1
+    while idx < len(arr):
+      flag = arr[idx]
+      delete_current_entry = False
+      if flag.startswith(enable_str):
+        arg = flag[enable_str_len:]
+        enable_features_args.extend(arg.split(','))
+        if first_idx < 0:
+          first_idx = idx
+        else:
+          delete_current_entry = True
+      if delete_current_entry:
+        del arr[idx]
+      else:
+        idx += 1
+    if first_idx >= 0:
+      arr[first_idx] = enable_str + ','.join(enable_features_args)
+    return arr
+
   def dictionary_merge(self, a, b, path=None, update=True):
     """http://stackoverflow.com/questions/7204805/
         python-dictionaries-of-dictionaries-merge
@@ -301,7 +331,7 @@
           # arguments adjacent (like --time-out-ms [arg], etc.)
           if all(isinstance(x, str)
                  for x in itertools.chain(a[key], b[key])):
-            a[key] = a[key] + b[key]
+            a[key] = self.maybe_fixup_args_array(a[key] + b[key])
           else:
             # TODO(kbr): this only works properly if the two arrays are
             # the same length, which is currently always the case in the
@@ -327,10 +357,9 @@
     return a
 
   def initialize_args_for_test(self, generated_test, tester_config):
-    if 'args' in tester_config:
-      if 'args' not in generated_test:
-        generated_test['args'] = []
-      generated_test['args'].extend(tester_config['args'])
+    if 'args' in tester_config or 'args' in generated_test:
+      generated_test['args'] = self.maybe_fixup_args_array(
+        generated_test.get('args', []) + tester_config.get('args', []))
 
   def initialize_swarming_dictionary_for_test(self, generated_test,
                                               tester_config):
diff --git a/testing/buildbot/generate_buildbot_json_unittest.py b/testing/buildbot/generate_buildbot_json_unittest.py
index 835c654..880f08dbf 100755
--- a/testing/buildbot/generate_buildbot_json_unittest.py
+++ b/testing/buildbot/generate_buildbot_json_unittest.py
@@ -50,6 +50,24 @@
 ]
 """
 
+FOO_GTESTS_WITH_ENABLE_FEATURES_WATERFALL = """\
+[
+  {
+    'name': 'chromium.test',
+    'machines': {
+      'Fake Tester': {
+        'test_suites': {
+          'gtest_tests': 'foo_tests',
+        },
+        'args': [
+          '--enable-features=Baz',
+        ],
+      },
+    },
+  },
+]
+"""
+
 FOO_GTESTS_MULTI_DIMENSION_WATERFALL = """\
 [
   {
@@ -312,6 +330,18 @@
 }
 """
 
+FOO_TEST_SUITE_WITH_ENABLE_FEATURES = """\
+{
+  'foo_tests': {
+    'foo_test': {
+      'args': [
+        '--enable-features=Foo,Bar',
+      ],
+    },
+  },
+}
+"""
+
 FOO_SCRIPT_SUITE = """\
 {
   'foo_scripts': {
@@ -637,6 +667,26 @@
 }
 """
 
+MERGED_ENABLE_FEATURES_OUTPUT = """\
+{
+  "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
+  "AAAAA2 See generate_buildbot_json.py to make changes": {},
+  "Fake Tester": {
+    "gtest_tests": [
+      {
+        "args": [
+          "--enable-features=Foo,Bar,Baz"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true
+        },
+        "test": "foo_test"
+      }
+    ]
+  }
+}
+"""
+
 MODIFIED_OUTPUT = """\
 {
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
@@ -995,6 +1045,13 @@
     fbb.files['chromium.test.json'] = MERGED_ARGS_OUTPUT
     fbb.check_output_file_consistency(verbose=True)
 
+  def test_enable_features_arg_merges(self):
+    fbb = FakeBBGen(FOO_GTESTS_WITH_ENABLE_FEATURES_WATERFALL,
+                    FOO_TEST_SUITE_WITH_ENABLE_FEATURES,
+                    EMPTY_EXCEPTIONS)
+    fbb.files['chromium.test.json'] = MERGED_ENABLE_FEATURES_OUTPUT
+    fbb.check_output_file_consistency(verbose=True)
+
   def test_test_filtering(self):
     fbb = FakeBBGen(COMPOSITION_GTEST_SUITE_WATERFALL,
                     GOOD_COMPOSITION_TEST_SUITES,
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 0284e3d..9f15556a 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1095,6 +1095,21 @@
       "../../tools/perf/run_benchmark",
     ],
   },
+  "performance_webview_test_suite": {
+    "label": "//chrome/test:performance_webview_test_suite",
+    "type": "script",
+    "script": "//third_party/catapult/devil/devil/android/tools/system_app.py",
+    "args": [
+      "remove",
+      "--package",
+      "com.android.webview",
+      "com.google.android.webview",
+      "-v",
+      "--",
+      "../../testing/scripts/run_performance_tests.py",
+      "../../tools/perf/run_benchmark",
+    ],
+  },
   "telemetry_perf_webview_tests": {
     "label": "//chrome/test:telemetry_perf_webview_tests",
     "type": "script",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 3866e1e1..3281b07d 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1509,8 +1509,10 @@
       'Out of Process Profiling Linux',
       'ThinLTO Linux ToT',
       # chromium.memory
-      'Linux MSan Tests',  # https://crbug.com/830659
-      'Linux ChromiumOS MSan Tests',  # https://crbug.com/830659
+      # Can't run on MSAN because gl_tests uses the hardware driver,
+      # which isn't instrumented.
+      'Linux MSan Tests',
+      'Linux ChromiumOS MSan Tests',
     ],
     'modifications': {
       'KitKat Tablet Tester': {
@@ -1524,7 +1526,6 @@
         },
       },
       # chromium.memory
-      # https://crbug.com/830659
       # TODO(kbr): figure out a better way to specify blocks of
       # arguments like this for tests on multiple machines.
       'Linux ASan LSan Tests (1)': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 12e13cf..994ecf17 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -38,6 +38,11 @@
     'platform': 'N',
   },
 
+  'android_o_cts_tests': {
+    'arch': 'arm64',
+    'platform': 'O',
+  },
+
   'android_fyi_instrumentation_tests': {
     'chrome_public_test_apk': {},
     'chrome_sync_shell_test_apk': {},
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 8f6e88d..979b9db 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -163,6 +163,13 @@
         'use_swarming': False,
         'os_type': 'android',
       },
+      'Android WebView O (dbg)': {
+        'test_suites': {
+          'cts_tests': 'android_o_cts_tests',
+        },
+        'use_swarming': False,
+        'os_type': 'android',
+      },
       'KitKat Phone Tester (dbg)': {
         'test_suites': {
           'gtest_tests': 'chromium_android_gtests',
diff --git a/testing/scripts/run_performance_tests.py b/testing/scripts/run_performance_tests.py
index fff45ee7..f5f411e1 100755
--- a/testing/scripts/run_performance_tests.py
+++ b/testing/scripts/run_performance_tests.py
@@ -244,16 +244,22 @@
       sharding = None
       sharding = sharding_map[shard_index]['benchmarks']
 
+      # We don't execute tests on the reference build on android webview
+      # since telemetry doesn't support it.  See crbug.com/612455
+      is_webview = any(('browser' in a and 'webview' in a) for a in rest_args)
+
       for benchmark in sharding:
         # Need to run the benchmark twice on browser and reference build
         return_code = (execute_benchmark(
             benchmark, isolated_out_dir, args, rest_args, False) or return_code)
         # We ignore the return code of the reference build since we do not
         # monitor it.
-        execute_benchmark(benchmark, isolated_out_dir, args, rest_args, True)
+        if not is_webview:
+          execute_benchmark(benchmark, isolated_out_dir, args, rest_args, True)
 
   return return_code
 
+
 # This is not really a "script test" so does not need to manually add
 # any additional compile targets.
 def main_compile_targets(args):
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 97dcf8a3..c1712a57 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -241,12 +241,14 @@
 crbug.com/591099 external/wpt/credential-management/federatedcredential-framed-get.sub.https.html [ Pass ]
 crbug.com/591099 external/wpt/credential-management/passwordcredential-framed-get.sub.https.html [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-top-below-inline-001r.xht [ Failure Pass ]
+crbug.com/635619 external/wpt/css/CSS2/floats/floats-in-table-caption-001.html [ Failure ]
 crbug.com/714962 external/wpt/css/CSS2/linebox/vertical-align-baseline-005a.xht [ Failure Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001e.xht [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001h.xht [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002e.xht [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-nested-002.xht [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-remove-006.xht [ Pass ]
+crbug.com/635619 external/wpt/css/CSS2/normal-flow/margin-collapsing-in-table-caption-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/root-box-001.xht [ Failure ]
 crbug.com/591099 external/wpt/css/CSS2/text/white-space-mixed-003.xht [ Pass ]
 crbug.com/714962 external/wpt/css/css-backgrounds/background-attachment-local/attachment-local-clipping-color-5.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 7591d14..13f23fb 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -271,6 +271,7 @@
 crbug.com/796943 fast/text/international/shape-across-elements-simple.html [ Failure ]
 
 ### virtual/layout_ng/external/wpt/css/CSS2/floats
+crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-in-table-caption-001.html [ Failure ]
 crbug.com/711704 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-rule3-outside-left-002.xht [ Failure ]
 crbug.com/711704 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-rule3-outside-right-002.xht [ Failure ]
 crbug.com/711704 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-rule7-outside-left-001.xht [ Failure ]
@@ -278,6 +279,7 @@
 crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/floats/floats-wrap-bfc-006.xht [ Failure ]
 
 ### virtual/layout_ng/external/wpt/css/CSS2/normal-flow
+crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/margin-collapsing-in-table-caption-002.html [ Failure ]
 crbug.com/704961 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/width-inherit-001.xht [ Failure ]
 
 # Inline: border in continuations. Fail in Blink.
@@ -4664,6 +4666,7 @@
 crbug.com/833655 [ Linux ] media/controls/closed-captions-dynamic-update.html [ Skip ]
 crbug.com/833655 [ Linux ] virtual/new-remote-playback-pipeline/media/controls/closed-captions-dynamic-update.html [ Skip ]
 crbug.com/833655 [ Linux ] virtual/video-surface-layer/media/controls/closed-captions-dynamic-update.html [ Skip ]
+crbug.com/833658 [ Linux Win Mac ] media/video-controls-focus-movement-on-hide.html [ Pass Failure ]
 crbug.com/833100 [ Mac ] external/wpt/battery-status/battery-full-manual.https.html [ Failure ]
 
 crbug.com/834446 [ Linux ] http/tests/misc/performance-memory.html [ Pass Failure ]
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/floats/floats-in-table-caption-001-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/floats/floats-in-table-caption-001-ref.html
new file mode 100644
index 0000000..bf02b99
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/floats/floats-in-table-caption-001-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="David Grogan" href="dgrogan@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/CSS22/tables.html#model">
+<meta name="flags" content="" />
+<title>
+Caption block containers are rendered same as normal block boxes
+</title>
+
+<p>
+The words floated and inline should be legible below, with inline appearing just
+to the right of the border surrounding floated.
+</p>
+
+<div style="float:left; border: 1px solid black;">
+  floated
+</div>
+inline
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/floats/floats-in-table-caption-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/floats/floats-in-table-caption-001.html
new file mode 100644
index 0000000..2bc9850
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/floats/floats-in-table-caption-001.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="David Grogan" href="dgrogan@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/CSS22/tables.html#model">
+<link rel="match" href="floats-in-table-caption-001-ref.html">
+<meta name="flags" content="" />
+<meta name="assert" content="Basic floats are honored inside a caption" />
+<title>
+Caption block containers are rendered same as normal block boxes
+</title>
+
+<p>
+The words floated and inline should be legible below, with inline appearing just
+to the right of the border surrounding floated.
+</p>
+
+<table>
+  <!-- 200px allows floated and inline to not wrap -->
+  <caption style="text-align:left; width:200px">
+    <div style="float:left; border: 1px solid black;">
+      floated
+    </div>
+    inline
+  </caption>
+</table>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/margin-collapsing-in-table-caption-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/margin-collapsing-in-table-caption-001.html
new file mode 100644
index 0000000..c06d737
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/margin-collapsing-in-table-caption-001.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="David Grogan" href="dgrogan@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/CSS22/tables.html#model">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+<meta name="flags" content="" />
+<meta name="assert" content="margins between sibling blocks are collapsed inside caption" />
+<title>
+Caption block containers are rendered same as normal block boxes
+</title>
+
+<style>
+div {
+  margin: 10px;
+  height: 35px;
+}
+</style>
+
+<p>Test passes if there is a filled green square.</p>
+
+<table>
+  <caption style="width:100px; background:green">
+    <div></div>
+    <div></div>
+  </caption>
+</table>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/margin-collapsing-in-table-caption-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/margin-collapsing-in-table-caption-002.html
new file mode 100644
index 0000000..1890330
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/CSS2/normal-flow/margin-collapsing-in-table-caption-002.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<link rel="author" title="David Grogan" href="dgrogan@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/CSS22/tables.html#model">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+<meta name="flags" content="" />
+<meta name="assert" content="margins between parent and child block collapse inside caption" />
+<title>
+Caption block containers are rendered same as normal block boxes
+</title>
+
+<style>
+div {
+  margin-top: 100px;
+}
+</style>
+
+<p>Test passes if there is a filled green square.</p>
+
+<table>
+  <caption style="width:100px; background:green">
+    <div>
+      <div></div>
+    </div>
+  </caption>
+</table>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-interface.js b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-interface.js
index 7aee234eb4..56d30a4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-interface.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-interface.js
@@ -69,6 +69,11 @@
   }, "animationEventInit argument is empty dictionary");
 
   test(function() {
+    var event = new AnimationEvent("test", {pseudoElement: "::testPseudo"});
+    assert_equals(event.pseudoElement, "::testPseudo");
+  }, "AnimationEvent.pseudoElement initialized from the dictionary");
+
+  test(function() {
     var event = new AnimationEvent("test", {animationName: "sample"});
     assert_equals(event.animationName, "sample");
   }, "animationName set to 'sample'");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-pseudoelement.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-pseudoelement.html
new file mode 100644
index 0000000..8de41cc6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-pseudoelement.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Animations Test: AnimationEvent pseudoElement</title>
+<link rel="help" href="https://drafts.csswg.org/css-animations/#interface-animationevent">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  #target::before {
+    content: "";
+    animation: move 1s;
+  }
+
+  @keyframes move {
+    to { transform: translate(100px); }
+  }
+</style>
+<div id='target'></div>
+<script>
+  async_test(function(t) {
+    var target = document.getElementById('target');
+    target.addEventListener("animationstart", t.step_func(function(evt) {
+      assert_true(evt instanceof window.AnimationEvent);
+      assert_equals(evt.pseudoElement, "::before");
+
+      t.done();
+    }), true);
+  }, "AnimationEvent should have the correct pseudoElement memeber");
+</script>
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-types.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-types.html
index d1cb914..77f514a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-types.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/animationevent-types.html
@@ -39,9 +39,11 @@
 
       assert_idl_attribute(evt, "animationName", "animationstart has animationName property");
       assert_idl_attribute(evt, "elapsedTime", "animationstart has elapsedTime property");
+      assert_idl_attribute(evt, "pseudoElement", "animationstart has pseudoElement property");
 
       assert_equals(evt.animationName, "sample", "animationstart has animationName value");
       assert_equals(evt.elapsedTime, 1, "animationstart has elapsedTime value");
+      assert_equals(evt.pseudoElement, "", "animaitonstart has correct pseudoElement value");
 
       t.done();
     }), true);
@@ -53,9 +55,11 @@
 
       assert_idl_attribute(evt, "animationName", "animationend has animationName property");
       assert_idl_attribute(evt, "elapsedTime", "animationend has elapsedTime property");
+      assert_idl_attribute(evt, "pseudoElement", "animationstart has pseudoElement property");
 
       assert_equals(evt.animationName, "sample", "animationend has animationName value");
       assert_equals(evt.elapsedTime, 4, "animationend has elapsedTime value");
+      assert_equals(evt.pseudoElement, "", "animaitonstart has correct pseudoElement value");
 
       t.done();
     }), true);
@@ -67,9 +71,11 @@
 
       assert_idl_attribute(evt, "animationName", "animationiteration has animationName property");
       assert_idl_attribute(evt, "elapsedTime", "animationiteration has elapsedTime property");
+      assert_idl_attribute(evt, "pseudoElement", "animationstart has pseudoElement property");
 
       assert_equals(evt.animationName, "sample", "animationiteration has animationName value");
       assert_equals(evt.elapsedTime, 2, "animationiteration has elapsedTime value");
+      assert_equals(evt.pseudoElement, "", "animaitonstart has correct pseudoElement value");
 
       t.done();
     }), true);
diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer-copy-channel.html b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-copy-channel.html
similarity index 97%
rename from third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer-copy-channel.html
rename to third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-copy-channel.html
index d55903a..7d0af70d 100644
--- a/third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer-copy-channel.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-copy-channel.html
@@ -5,10 +5,10 @@
       Test Basic Functionality of AudioBuffer.copyFromChannel and
       AudioBuffer.copyToChannel
     </title>
-    <script src="../../resources/testharness.js"></script>
-    <script src="../../resources/testharnessreport.js"></script>
-    <script src="../resources/audit-util.js"></script>
-    <script src="../resources/audit.js"></script>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/webaudio/resources/audit-util.js"></script>
+    <script src="/webaudio/resources/audit.js"></script>
   </head>
   <body>
     <script id="layout-test-code">
diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer-getChannelData.html b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-getChannelData.html
similarity index 85%
rename from third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer-getChannelData.html
rename to third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-getChannelData.html
index 69f343a..612a91c 100644
--- a/third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer-getChannelData.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-getChannelData.html
@@ -4,11 +4,11 @@
     <title>
       Test AudioBuffer.getChannelData() Returns the Same Object
     </title>
-    <script src="../../resources/testharness.js"></script>
-    <script src="../../resources/testharnessreport.js"></script>
-    <script src="../resources/audit-util.js"></script>
-    <script src="../resources/audit.js"></script>
-    <script src="../resources/audioparam-testing.js"></script>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/webaudio/resources/audit-util.js"></script>
+    <script src="/webaudio/resources/audit.js"></script>
+    <script src="/webaudio/resources/audioparam-testing.js"></script>
   </head>
   <body>
     <script id="layout-test-code">
diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer.html b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer.html
similarity index 89%
rename from third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer.html
rename to third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer.html
index 2c568eab..07a34f07 100644
--- a/third_party/WebKit/LayoutTests/webaudio/AudioBuffer/audiobuffer.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer.html
@@ -4,10 +4,10 @@
     <title>
       audiobuffer.html
     </title>
-    <script src="../../resources/testharness.js"></script>
-    <script src="../../resources/testharnessreport.js"></script>
-    <script src="../resources/audit-util.js"></script>
-    <script src="../resources/audit.js"></script>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/webaudio/resources/audit-util.js"></script>
+    <script src="/webaudio/resources/audit.js"></script>
   </head>
   <body>
     <script id="layout-test-code">
diff --git a/third_party/WebKit/LayoutTests/paint/frames/iframe-with-big-fixed-background-expected.html b/third_party/WebKit/LayoutTests/paint/frames/iframe-with-big-fixed-background-expected.html
new file mode 100644
index 0000000..bd226f1b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/frames/iframe-with-big-fixed-background-expected.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style='background: green; width: 100px; height: 100px;'></div>
diff --git a/third_party/WebKit/LayoutTests/paint/frames/iframe-with-big-fixed-background.html b/third_party/WebKit/LayoutTests/paint/frames/iframe-with-big-fixed-background.html
new file mode 100644
index 0000000..87ae9da9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/frames/iframe-with-big-fixed-background.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<iframe frameborder='0' srcdoc="<!DOCTYPE html>
+<style>
+  ::-webkit-scrollbar { display: none; }
+  body {
+    background: url('data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\' width=\'600\' height=\'600\'><rect width=\'100%\' height=\'100%\' fill=\'green\'></rect></svg>') no-repeat fixed;
+    min-height: 600px;
+    min-width: 600px;
+  }
+</style>" style="width: 100px; height: 100px;"></iframe>
diff --git a/third_party/WebKit/LayoutTests/paint/frames/iframe-with-scrolled-fixed-background-expected.html b/third_party/WebKit/LayoutTests/paint/frames/iframe-with-scrolled-fixed-background-expected.html
new file mode 100644
index 0000000..bd226f1b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/frames/iframe-with-scrolled-fixed-background-expected.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style='background: green; width: 100px; height: 100px;'></div>
diff --git a/third_party/WebKit/LayoutTests/paint/frames/iframe-with-scrolled-fixed-background.html b/third_party/WebKit/LayoutTests/paint/frames/iframe-with-scrolled-fixed-background.html
new file mode 100644
index 0000000..87791fea
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/paint/frames/iframe-with-scrolled-fixed-background.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<iframe frameborder='0' srcdoc="<!DOCTYPE html>
+<style>
+  ::-webkit-scrollbar { display: none; }
+  body {
+    background: url('data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\' width=\'100\' height=\'100\'><rect width=\'100%\' height=\'100%\' fill=\'green\'></rect></svg>') no-repeat fixed;
+    min-height: 600px;
+    min-width: 600px;
+  }
+</style>
+<script>
+  onload = function(e) {
+    document.documentElement.scrollTop = 20;
+  }
+</script>" style="width: 100px; height: 100px;"></iframe>
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 68a3015..2735c3ea 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -45,6 +45,7 @@
     attribute @@toStringTag
     getter animationName
     getter elapsedTime
+    getter pseudoElement
     method constructor
 interface ApplicationCache : EventTarget
     attribute @@toStringTag
@@ -7899,6 +7900,7 @@
     attribute @@toStringTag
     getter animationName
     getter elapsedTime
+    getter pseudoElement
     method constructor
 interface WebKitCSSMatrix : DOMMatrixReadOnly
     attribute @@toStringTag
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index e0fea76..5605ee8c 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -202,6 +202,7 @@
     attribute @@toStringTag
     getter animationName
     getter elapsedTime
+    getter pseudoElement
     method constructor
 interface AnimationPlaybackEvent : Event
     attribute @@toStringTag
@@ -8742,6 +8743,7 @@
     attribute @@toStringTag
     getter animationName
     getter elapsedTime
+    getter pseudoElement
     method constructor
 interface WebKitCSSMatrix : DOMMatrixReadOnly
     attribute @@toStringTag
diff --git a/third_party/android_crazy_linker/BUILD.gn b/third_party/android_crazy_linker/BUILD.gn
index 407e63b..33fad91 100644
--- a/third_party/android_crazy_linker/BUILD.gn
+++ b/third_party/android_crazy_linker/BUILD.gn
@@ -151,6 +151,8 @@
       "src/src/crazy_linker_system_unittest.cpp",
       "src/src/crazy_linker_thread_unittest.cpp",
       "src/src/crazy_linker_util_unittest.cpp",
+      "src/src/crazy_linker_zip_test_data.cpp",
+      "src/src/crazy_linker_zip_test_data.h",
       "src/src/crazy_linker_zip_unittest.cpp",
     ]
 
diff --git a/third_party/android_crazy_linker/src/include/crazy_linker.h b/third_party/android_crazy_linker/src/include/crazy_linker.h
index 347cd7c..51cbec29 100644
--- a/third_party/android_crazy_linker/src/include/crazy_linker.h
+++ b/third_party/android_crazy_linker/src/include/crazy_linker.h
@@ -14,8 +14,11 @@
 //
 //   - It can use an arbitrary search path.
 //
-//   - It can load a library at a memory fixed address, or from a fixed
-//     file offset (both must be page-aligned).
+//   - It can load a library at a memory fixed address.
+//
+//   - It can load libraries from zip archives (as long as they are
+//     page aligned and uncompressed). Even when running on pre-Android M
+//     systems.
 //
 //   - It can share the RELRO section between two libraries
 //     loaded at the same address in two distinct processes.
@@ -80,15 +83,6 @@
 // Return the current load address in a context.
 size_t crazy_context_get_load_address(crazy_context_t* context) _CRAZY_PUBLIC;
 
-// Set the explicit file offset in a context object. The value should
-// always page-aligned, or the load will fail.
-// Note you can not use the same file with multiple offsets. See crbug/388223.
-void crazy_context_set_file_offset(crazy_context_t* context,
-                                   size_t file_offset) _CRAZY_PUBLIC;
-
-// Return the current file offset in a context object.
-size_t crazy_context_get_file_offset(crazy_context_t* context);
-
 // Add one or more paths to the list of library search paths held
 // by a given context. |path| is a string using a column (:) as a
 // list separator. As with the PATH variable, an empty list item
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
index 0852699..d6ec8d2 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_api.cpp
@@ -34,7 +34,6 @@
  public:
   crazy_context_t()
       : load_address(0),
-        file_offset(0),
         error(),
         search_paths(),
         java_vm(NULL),
@@ -47,7 +46,6 @@
   void ResetSearchPaths();
 
   size_t load_address;
-  size_t file_offset;
   Error error;
   SearchPathList search_paths;
   void* java_vm;
@@ -95,15 +93,6 @@
   return context->load_address;
 }
 
-void crazy_context_set_file_offset(crazy_context_t* context,
-                                   size_t file_offset) {
-  context->file_offset = file_offset;
-}
-
-size_t crazy_context_get_file_offset(crazy_context_t* context) {
-  return context->file_offset;
-}
-
 crazy_status_t crazy_context_add_search_path(crazy_context_t* context,
                                              const char* file_path) {
   context->search_paths.AddPaths(file_path);
@@ -205,8 +194,8 @@
   ScopedDelayedCallbackPoster poster(context, globals->rdebug());
 
   LibraryView* wrap = globals->libraries()->LoadLibrary(
-      lib_name, RTLD_NOW, context->load_address, context->file_offset,
-      &context->search_paths, false, &context->error);
+      lib_name, RTLD_NOW, context->load_address, 0, &context->search_paths,
+      false, &context->error);
 
   if (!wrap)
     return CRAZY_STATUS_FAILURE;
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_zip_test_data.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_zip_test_data.cpp
new file mode 100644
index 0000000..d210fdf
--- /dev/null
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_zip_test_data.cpp
@@ -0,0 +1,107 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTO-GENERATED BY generate_zip_test_tables.sh - DO NOT EDIT!!
+
+#include "crazy_linker_zip_test_data.h"
+
+namespace crazy {
+namespace testing {
+
+// An empty zip archive
+const unsigned char empty_archive_zip[] = {
+    0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+const unsigned int empty_archive_zip_len = 22;
+
+// A zip archive with a single file named 'hello_world.txt' that
+// contains the bytes for 'Hello World Hello World\n' without
+// compression.
+const unsigned char hello_zip[] = {
+    0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x86,
+    0xa3, 0x4c, 0xfd, 0x95, 0x3b, 0x3f, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00,
+    0x00, 0x00, 0x0f, 0x00, 0x1c, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f,
+    0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x74, 0x78, 0x74, 0x55, 0x54, 0x09,
+    0x00, 0x03, 0xb0, 0x22, 0xeb, 0x5a, 0xb0, 0x22, 0xeb, 0x5a, 0x75, 0x78,
+    0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f, 0x00, 0x00, 0x04, 0x53, 0x5f, 0x01,
+    0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64,
+    0x20, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64,
+    0x0a, 0x50, 0x4b, 0x01, 0x02, 0x1e, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xd4, 0x86, 0xa3, 0x4c, 0xfd, 0x95, 0x3b, 0x3f, 0x18, 0x00, 0x00,
+    0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00, 0x00, 0x00, 0x00, 0x68,
+    0x65, 0x6c, 0x6c, 0x6f, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x74,
+    0x78, 0x74, 0x55, 0x54, 0x05, 0x00, 0x03, 0xb0, 0x22, 0xeb, 0x5a, 0x75,
+    0x78, 0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f, 0x00, 0x00, 0x04, 0x53, 0x5f,
+    0x01, 0x00, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+    0x01, 0x00, 0x55, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00};
+const unsigned int hello_zip_len = 204;
+
+// The same zip archive, but with the file stored compressed.
+const unsigned char hello_compressed_zip[] = {
+    0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0xd4, 0x86,
+    0xa3, 0x4c, 0xfd, 0x95, 0x3b, 0x3f, 0x11, 0x00, 0x00, 0x00, 0x18, 0x00,
+    0x00, 0x00, 0x0f, 0x00, 0x1c, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f,
+    0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x74, 0x78, 0x74, 0x55, 0x54, 0x09,
+    0x00, 0x03, 0xb0, 0x22, 0xeb, 0x5a, 0xb0, 0x22, 0xeb, 0x5a, 0x75, 0x78,
+    0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f, 0x00, 0x00, 0x04, 0x53, 0x5f, 0x01,
+    0x00, 0xf3, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x08, 0xcf, 0x2f, 0xca, 0x49,
+    0x51, 0xf0, 0x40, 0xb0, 0xb9, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x1e, 0x03,
+    0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0xd4, 0x86, 0xa3, 0x4c, 0xfd, 0x95,
+    0x3b, 0x3f, 0x11, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00,
+    0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa4, 0x81,
+    0x00, 0x00, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f, 0x77, 0x6f,
+    0x72, 0x6c, 0x64, 0x2e, 0x74, 0x78, 0x74, 0x55, 0x54, 0x05, 0x00, 0x03,
+    0xb0, 0x22, 0xeb, 0x5a, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f,
+    0x00, 0x00, 0x04, 0x53, 0x5f, 0x01, 0x00, 0x50, 0x4b, 0x05, 0x06, 0x00,
+    0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x55, 0x00, 0x00, 0x00, 0x5a,
+    0x00, 0x00, 0x00, 0x00, 0x00};
+const unsigned int hello_compressed_zip_len = 197;
+
+// A zip archive with two uncompressed files under lib/test-abi/
+// named 'libfoo.so' and 'crazy.libbar.so', with the following data:
+// - first lib:  'This is the first test library!'
+// - second lib: 'This is the second test library!'
+const unsigned char lib_archive_zip[] = {
+    0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x86,
+    0xa3, 0x4c, 0x84, 0x92, 0x26, 0x8e, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00,
+    0x00, 0x00, 0x16, 0x00, 0x1c, 0x00, 0x6c, 0x69, 0x62, 0x2f, 0x74, 0x65,
+    0x73, 0x74, 0x2d, 0x61, 0x62, 0x69, 0x2f, 0x6c, 0x69, 0x62, 0x66, 0x6f,
+    0x6f, 0x2e, 0x73, 0x6f, 0x55, 0x54, 0x09, 0x00, 0x03, 0xb0, 0x22, 0xeb,
+    0x5a, 0xb0, 0x22, 0xeb, 0x5a, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xab,
+    0x6f, 0x00, 0x00, 0x04, 0x53, 0x5f, 0x01, 0x00, 0x54, 0x68, 0x69, 0x73,
+    0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73,
+    0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61,
+    0x72, 0x79, 0x21, 0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xd4, 0x86, 0xa3, 0x4c, 0xa0, 0xb1, 0x85, 0x09, 0x20, 0x00, 0x00,
+    0x00, 0x20, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x6c, 0x69, 0x62,
+    0x2f, 0x74, 0x65, 0x73, 0x74, 0x2d, 0x61, 0x62, 0x69, 0x2f, 0x63, 0x72,
+    0x61, 0x7a, 0x79, 0x2e, 0x6c, 0x69, 0x62, 0x62, 0x61, 0x72, 0x2e, 0x73,
+    0x6f, 0x55, 0x54, 0x09, 0x00, 0x03, 0xb0, 0x22, 0xeb, 0x5a, 0xb0, 0x22,
+    0xeb, 0x5a, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f, 0x00, 0x00,
+    0x04, 0x53, 0x5f, 0x01, 0x00, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
+    0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20,
+    0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79,
+    0x21, 0x50, 0x4b, 0x01, 0x02, 0x1e, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xd4, 0x86, 0xa3, 0x4c, 0x84, 0x92, 0x26, 0x8e, 0x1f, 0x00, 0x00,
+    0x00, 0x1f, 0x00, 0x00, 0x00, 0x16, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x00, 0x00, 0x00, 0x00, 0x6c,
+    0x69, 0x62, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2d, 0x61, 0x62, 0x69, 0x2f,
+    0x6c, 0x69, 0x62, 0x66, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x55, 0x54, 0x05,
+    0x00, 0x03, 0xb0, 0x22, 0xeb, 0x5a, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04,
+    0xab, 0x6f, 0x00, 0x00, 0x04, 0x53, 0x5f, 0x01, 0x00, 0x50, 0x4b, 0x01,
+    0x02, 0x1e, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x86, 0xa3,
+    0x4c, 0xa0, 0xb1, 0x85, 0x09, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
+    0x00, 0x1c, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0xa4, 0x81, 0x6f, 0x00, 0x00, 0x00, 0x6c, 0x69, 0x62, 0x2f, 0x74,
+    0x65, 0x73, 0x74, 0x2d, 0x61, 0x62, 0x69, 0x2f, 0x63, 0x72, 0x61, 0x7a,
+    0x79, 0x2e, 0x6c, 0x69, 0x62, 0x62, 0x61, 0x72, 0x2e, 0x73, 0x6f, 0x55,
+    0x54, 0x05, 0x00, 0x03, 0xb0, 0x22, 0xeb, 0x5a, 0x75, 0x78, 0x0b, 0x00,
+    0x01, 0x04, 0xab, 0x6f, 0x00, 0x00, 0x04, 0x53, 0x5f, 0x01, 0x00, 0x50,
+    0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0xbe,
+    0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00};
+const unsigned int lib_archive_zip_len = 441;
+
+}  // namespace testing
+}  // namespace crazy
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_zip_test_data.h b/third_party/android_crazy_linker/src/src/crazy_linker_zip_test_data.h
new file mode 100644
index 0000000..84d7254
--- /dev/null
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_zip_test_data.h
@@ -0,0 +1,26 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CRAZY_LINKER_ZIP_TEST_DATA_H
+#define CRAZY_LINKER_ZIP_TEST_DATA_H
+
+namespace crazy {
+namespace testing {
+
+extern const unsigned char empty_archive_zip[];
+extern const unsigned int empty_archive_zip_len;
+
+extern const unsigned char hello_zip[];
+extern const unsigned int hello_zip_len;
+
+extern const unsigned char hello_compressed_zip[];
+extern const unsigned int hello_compressed_zip_len;
+
+extern const unsigned char lib_archive_zip[];
+extern const unsigned int lib_archive_zip_len;
+
+}  // namespace testing
+}  // namespace crazy
+
+#endif  // CRAZY_LINKER_ZIP_TEST_DATA_H
diff --git a/third_party/android_crazy_linker/src/src/crazy_linker_zip_unittest.cpp b/third_party/android_crazy_linker/src/src/crazy_linker_zip_unittest.cpp
index 44b0380..f1c231a 100644
--- a/third_party/android_crazy_linker/src/src/crazy_linker_zip_unittest.cpp
+++ b/third_party/android_crazy_linker/src/src/crazy_linker_zip_unittest.cpp
@@ -8,68 +8,16 @@
 
 #include "crazy_linker_util.h"  // FOR CRAZY_OFFSET_FAILED?
 #include "crazy_linker_zip_archive.h"
+#include "crazy_linker_zip_test_data.h"
 
 #include <gtest/gtest.h>
 
 namespace crazy {
 
+using namespace crazy::testing;
+
 namespace {
 
-// START OF AUTO-GENERATED SECTION - DO NOT EDIT
-// This section was generated by generate_zip_test_tables.sh
-
-// An empty zip archive
-unsigned char empty_archive_zip[] = {
-    0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-unsigned int empty_archive_zip_len = 22;
-
-// A zip archive with a single file named 'hello_world.txt' that
-// contains the bytes for 'Hello World Hello World\n' without
-// compression.
-unsigned char hello_zip[] = {
-    0x50, 0x4b, 0x03, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x75,
-    0x49, 0x4c, 0xfd, 0x95, 0x3b, 0x3f, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00,
-    0x00, 0x00, 0x0f, 0x00, 0x1c, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f,
-    0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x74, 0x78, 0x74, 0x55, 0x54, 0x09,
-    0x00, 0x03, 0xd6, 0xa4, 0x7d, 0x5a, 0xd6, 0xa4, 0x7d, 0x5a, 0x75, 0x78,
-    0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f, 0x00, 0x00, 0x04, 0x88, 0x13, 0x00,
-    0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64,
-    0x20, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64,
-    0x0a, 0x50, 0x4b, 0x01, 0x02, 0x1e, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x13, 0x75, 0x49, 0x4c, 0xfd, 0x95, 0x3b, 0x3f, 0x18, 0x00, 0x00,
-    0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x68,
-    0x65, 0x6c, 0x6c, 0x6f, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x74,
-    0x78, 0x74, 0x55, 0x54, 0x05, 0x00, 0x03, 0xd6, 0xa4, 0x7d, 0x5a, 0x75,
-    0x78, 0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f, 0x00, 0x00, 0x04, 0x88, 0x13,
-    0x00, 0x00, 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
-    0x01, 0x00, 0x55, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00};
-unsigned int hello_zip_len = 204;
-
-// The same zip archive, but with the file stored compressed.
-unsigned char hello_compressed_zip[] = {
-    0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x13, 0x75,
-    0x49, 0x4c, 0xfd, 0x95, 0x3b, 0x3f, 0x11, 0x00, 0x00, 0x00, 0x18, 0x00,
-    0x00, 0x00, 0x0f, 0x00, 0x1c, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f,
-    0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x74, 0x78, 0x74, 0x55, 0x54, 0x09,
-    0x00, 0x03, 0xd6, 0xa4, 0x7d, 0x5a, 0xd6, 0xa4, 0x7d, 0x5a, 0x75, 0x78,
-    0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f, 0x00, 0x00, 0x04, 0x88, 0x13, 0x00,
-    0x00, 0xf3, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x08, 0xcf, 0x2f, 0xca, 0x49,
-    0x51, 0xf0, 0x40, 0xb0, 0xb9, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x1e, 0x03,
-    0x14, 0x00, 0x02, 0x00, 0x08, 0x00, 0x13, 0x75, 0x49, 0x4c, 0xfd, 0x95,
-    0x3b, 0x3f, 0x11, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, 0x00,
-    0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa0, 0x81,
-    0x00, 0x00, 0x00, 0x00, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x5f, 0x77, 0x6f,
-    0x72, 0x6c, 0x64, 0x2e, 0x74, 0x78, 0x74, 0x55, 0x54, 0x05, 0x00, 0x03,
-    0xd6, 0xa4, 0x7d, 0x5a, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xab, 0x6f,
-    0x00, 0x00, 0x04, 0x88, 0x13, 0x00, 0x00, 0x50, 0x4b, 0x05, 0x06, 0x00,
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x55, 0x00, 0x00, 0x00, 0x5a,
-    0x00, 0x00, 0x00, 0x00, 0x00};
-unsigned int hello_compressed_zip_len = 197;
-
-// END OF AUTO-GENERATED SECTION
-
 // Convenience function to add a file to the mock filesystem from the
 // data tables above.
 void AddZipArchiveBytes(crazy::SystemMock* sys,
@@ -129,7 +77,8 @@
 // Find the offset of the file 'hello_world.txt' in the zip archive
 // stored at |data| with |data_size| bytes. Return CRAZY_OFFSET_FAILED if
 // not found.
-int32_t FindHelloWorldZipFileOffset(unsigned char* data, size_t data_size) {
+int32_t FindHelloWorldZipFileOffset(const unsigned char* data,
+                                    size_t data_size) {
   SystemMock sys;
   AddZipArchiveBytes(&sys, "hello.zip", data, data_size);
   return FindStartOffsetOfFileInZipFile("hello.zip", "hello_world.txt");
diff --git a/third_party/android_crazy_linker/src/tests/generate_zip_test_tables.sh b/third_party/android_crazy_linker/src/tests/generate_zip_test_tables.sh
index 59c9fb7c..41337f6 100755
--- a/third_party/android_crazy_linker/src/tests/generate_zip_test_tables.sh
+++ b/third_party/android_crazy_linker/src/tests/generate_zip_test_tables.sh
@@ -6,7 +6,7 @@
 
 # Simple script used to regenerate zip files used for unit-testing the
 # crazy linker zip parser. This outputs a fragment of C code through 'xdd'
-# on Linux that can be copied into crazy_linker_zip_unittest.cpp directly.
+# on Linux that can be copied into crazy_linker_zip_test_data.cpp directly.
 
 set -e
 
@@ -20,19 +20,38 @@
 TMP_DIR=/tmp/zip-files-tmp-$$
 OUTPUT_DIR=/tmp/zip-files
 
+generate_c_source () {
+  # Turn generated table const, it's cleaner.
+  # Also indent with 4 spaces (Chromium style).
+  xxd -i $1 | \
+    sed -e 's/^unsigned/const unsigned/g' | \
+    sed -e 's/^  0x/    0x/g'
+}
+
 # Preparing temporary directory.
 mkdir -p $TMP_DIR
 rm -rf $TMP_DIR/*
 cd $TMP_DIR
 
-printf "// START OF AUTO-GENERATED SECTION - DO NOT EDIT\n"
-printf "// This section was generated by $PROGNAME\n\n"
+cat <<EOF
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// AUTO-GENERATED BY $PROGNAME - DO NOT EDIT!!
+
+#include "crazy_linker_zip_test_data.h"
+
+namespace crazy {
+namespace testing {
+
+EOF
 
 printf "// An empty zip archive\n"
 touch empty_file
 zip -q empty_archive empty_file
 zip -q -d empty_archive empty_file 2>/dev/null
-xxd -i empty_archive.zip
+generate_c_source empty_archive.zip
 printf "\n"
 
 printf "// A zip archive with a single file named 'hello_world.txt' that\n"
@@ -40,14 +59,35 @@
 printf "// compression.\n"
 echo "Hello World Hello World" > hello_world.txt
 zip -q -0 hello.zip hello_world.txt
-xxd -i hello.zip
+generate_c_source hello.zip
 printf "\n"
 
 printf "// The same zip archive, but with the file stored compressed.\n"
 zip -q -9 hello_compressed.zip hello_world.txt
-xxd -i hello_compressed.zip
+generate_c_source hello_compressed.zip
 printf "\n"
 
-printf "// END OF AUTO-GENERATED SECTION\n\n"
+LIB_SUBDIR=lib/test-abi
+LIB1_NAME=libfoo.so
+LIB2_NAME=crazy.libbar.so
+LIB1_TEXT="This is the first test library!"
+LIB2_TEXT="This is the second test library!"
+cat <<EOF
+// A zip archive with two uncompressed files under $LIB_SUBDIR/
+// named '$LIB1_NAME' and '$LIB2_NAME', with the following data:
+// - first lib:  '$LIB1_TEXT'
+// - second lib: '$LIB2_TEXT'
+EOF
+mkdir -p $LIB_SUBDIR
+printf "This is the first test library!" > $LIB_SUBDIR/$LIB1_NAME
+printf "This is the second test library!" > $LIB_SUBDIR/$LIB2_NAME
+zip -q -0 lib_archive.zip $LIB_SUBDIR/$LIB1_NAME $LIB_SUBDIR/$LIB2_NAME
+generate_c_source lib_archive.zip
+
+cat <<EOF
+
+}  // namespace testing
+}  // namespace crazy
+EOF
 
 rm -rf $TMP_DIR
diff --git a/third_party/blink/public/web/web_fullscreen_options.h b/third_party/blink/public/web/web_fullscreen_options.h
index 75ce62cf..ae7648b 100644
--- a/third_party/blink/public/web/web_fullscreen_options.h
+++ b/third_party/blink/public/web/web_fullscreen_options.h
@@ -12,6 +12,10 @@
   // Prefer that the bottom navigation bar be shown when in fullscreen
   // mode on devices with overlay navigation bars.
   bool prefers_navigation_bar = false;
+
+  bool operator==(const WebFullscreenOptions& rhs) {
+    return prefers_navigation_bar == rhs.prefers_navigation_bar;
+  }
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc
index 09e0d161..045f51a 100644
--- a/third_party/blink/renderer/core/animation/css/css_animations.cc
+++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -1109,8 +1109,10 @@
     const AtomicString& event_name,
     double elapsed_time) {
   if (animation_target_->GetDocument().HasListenerType(listener_type)) {
-    AnimationEvent* event =
-        AnimationEvent::Create(event_name, name_, elapsed_time);
+    String pseudo_element_name = PseudoElement::PseudoElementNameForEvents(
+        animation_target_->GetPseudoId());
+    AnimationEvent* event = AnimationEvent::Create(
+        event_name, name_, elapsed_time, pseudo_element_name);
     event->SetTarget(GetEventTarget());
     GetDocument().EnqueueAnimationFrameEvent(event);
   }
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_test.cc b/third_party/blink/renderer/core/animation/keyframe_effect_test.cc
index c920881..8f70fa7 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect_test.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect_test.cc
@@ -31,12 +31,7 @@
   void SetUp() override {
     PageTestBase::SetUp(IntSize());
     element = GetDocument().CreateElementForBinding("foo");
-
-    GetDocument().GetAnimationClock().ResetTimeForTesting(
-        base::TimeTicks() +
-        base::TimeDelta::FromSecondsD(GetDocument().Timeline().ZeroTime()));
     GetDocument().documentElement()->AppendChild(element.Get());
-    EXPECT_EQ(0, GetDocument().Timeline().currentTime());
   }
 
   KeyframeEffectModelBase* CreateEmptyEffectModel() {
diff --git a/third_party/blink/renderer/core/events/animation_event.cc b/third_party/blink/renderer/core/events/animation_event.cc
index 357965ae..caaf3a21 100644
--- a/third_party/blink/renderer/core/events/animation_event.cc
+++ b/third_party/blink/renderer/core/events/animation_event.cc
@@ -33,14 +33,17 @@
                                const AnimationEventInit& initializer)
     : Event(type, initializer),
       animation_name_(initializer.animationName()),
-      elapsed_time_(initializer.elapsedTime()) {}
+      elapsed_time_(initializer.elapsedTime()),
+      pseudo_element_(initializer.pseudoElement()) {}
 
 AnimationEvent::AnimationEvent(const AtomicString& type,
                                const String& animation_name,
-                               double elapsed_time)
+                               double elapsed_time,
+                               const String& pseudo_element)
     : Event(type, Bubbles::kYes, Cancelable::kYes),
       animation_name_(animation_name),
-      elapsed_time_(elapsed_time) {}
+      elapsed_time_(elapsed_time),
+      pseudo_element_(pseudo_element) {}
 
 AnimationEvent::~AnimationEvent() = default;
 
@@ -52,6 +55,10 @@
   return elapsed_time_;
 }
 
+const String& AnimationEvent::pseudoElement() const {
+  return pseudo_element_;
+}
+
 const AtomicString& AnimationEvent::InterfaceName() const {
   return EventNames::AnimationEvent;
 }
diff --git a/third_party/blink/renderer/core/events/animation_event.h b/third_party/blink/renderer/core/events/animation_event.h
index 204dc01..8d4478e 100644
--- a/third_party/blink/renderer/core/events/animation_event.h
+++ b/third_party/blink/renderer/core/events/animation_event.h
@@ -38,8 +38,10 @@
   static AnimationEvent* Create() { return new AnimationEvent; }
   static AnimationEvent* Create(const AtomicString& type,
                                 const String& animation_name,
-                                double elapsed_time) {
-    return new AnimationEvent(type, animation_name, elapsed_time);
+                                double elapsed_time,
+                                const String& pseudo_element) {
+    return new AnimationEvent(type, animation_name, elapsed_time,
+                              pseudo_element);
   }
   static AnimationEvent* Create(const AtomicString& type,
                                 const AnimationEventInit& initializer) {
@@ -50,6 +52,7 @@
 
   const String& animationName() const;
   double elapsedTime() const;
+  const String& pseudoElement() const;
 
   const AtomicString& InterfaceName() const override;
 
@@ -59,11 +62,13 @@
   AnimationEvent();
   AnimationEvent(const AtomicString& type,
                  const String& animation_name,
-                 double elapsed_time);
+                 double elapsed_time,
+                 const String& pseudo_element);
   AnimationEvent(const AtomicString&, const AnimationEventInit&);
 
   String animation_name_;
   double elapsed_time_;
+  String pseudo_element_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/events/animation_event.idl b/third_party/blink/renderer/core/events/animation_event.idl
index 7daded32..35384704 100644
--- a/third_party/blink/renderer/core/events/animation_event.idl
+++ b/third_party/blink/renderer/core/events/animation_event.idl
@@ -31,5 +31,5 @@
     readonly attribute DOMString animationName;
     // TODO(foolip): elapsedTime should be float.
     readonly attribute double elapsedTime;
-    // TODO(foolip): readonly attribute DOMString pseudoElement;
+    readonly attribute DOMString pseudoElement;
 };
diff --git a/third_party/blink/renderer/core/events/animation_event_init.idl b/third_party/blink/renderer/core/events/animation_event_init.idl
index c50bd68..f4ce77f 100644
--- a/third_party/blink/renderer/core/events/animation_event_init.idl
+++ b/third_party/blink/renderer/core/events/animation_event_init.idl
@@ -8,5 +8,5 @@
     DOMString animationName = "";
     // TODO(foolip): elapsedTime should be float.
     double elapsedTime = 0.0;
-    // TODO(foolip): DOMString pseudoElement = "";
+    DOMString pseudoElement = "";
 };
diff --git a/third_party/blink/renderer/core/frame/fullscreen_controller.cc b/third_party/blink/renderer/core/frame/fullscreen_controller.cc
index 3c839491..b1546cf 100644
--- a/third_party/blink/renderer/core/frame/fullscreen_controller.cc
+++ b/third_party/blink/renderer/core/frame/fullscreen_controller.cc
@@ -137,6 +137,9 @@
 
 void FullscreenController::EnterFullscreen(LocalFrame& frame,
                                            const FullscreenOptions& options) {
+  // TODO(dtapuska): If we are already in fullscreen. If the options are
+  // different than the currently requested one we may wish to request
+  // fullscreen mode again.
   // If already fullscreen or exiting fullscreen, synchronously call
   // |DidEnterFullscreen()|. When exiting, the coming |DidExitFullscreen()| call
   // will again notify all frames.
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index ff368550..7e6b3fdb 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3809,7 +3809,8 @@
 #if DCHECK_IS_ON()
   DCHECK(!ShouldCheckForPaintInvalidation() || PaintInvalidationStateIsDirty());
 #endif
-  if (!RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
+  if (!RuntimeEnabledFeatures::SlimmingPaintV175Enabled() ||
+      !RuntimeEnabledFeatures::PartialRasterInvalidationEnabled())
     fragment_.SetPartialInvalidationRect(LayoutRect());
 
   ClearShouldDoFullPaintInvalidation();
diff --git a/third_party/blink/renderer/core/mojo/mojo.cc b/third_party/blink/renderer/core/mojo/mojo.cc
index 52e0db1..59701c14 100644
--- a/third_party/blink/renderer/core/mojo/mojo.cc
+++ b/third_party/blink/renderer/core/mojo/mojo.cc
@@ -29,7 +29,7 @@
 void Mojo::createMessagePipe(MojoCreateMessagePipeResult& result_dict) {
   MojoCreateMessagePipeOptions options = {0};
   options.struct_size = sizeof(::MojoCreateMessagePipeOptions);
-  options.flags = MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE;
+  options.flags = MOJO_CREATE_MESSAGE_PIPE_FLAG_NONE;
 
   mojo::ScopedMessagePipeHandle handle0, handle1;
   MojoResult result = mojo::CreateMessagePipe(&options, &handle0, &handle1);
@@ -54,7 +54,7 @@
 
   ::MojoCreateDataPipeOptions options = {0};
   options.struct_size = sizeof(options);
-  options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
   options.element_num_bytes = options_dict.elementNumBytes();
   options.capacity_num_bytes = options_dict.capacityNumBytes();
 
@@ -76,7 +76,7 @@
   MojoCreateSharedBufferOptions* options = nullptr;
   mojo::Handle handle;
   MojoResult result =
-      MojoCreateSharedBuffer(options, num_bytes, handle.mutable_value());
+      MojoCreateSharedBuffer(num_bytes, options, handle.mutable_value());
 
   result_dict.setResult(result);
   if (result == MOJO_RESULT_OK) {
diff --git a/third_party/blink/renderer/core/mojo/mojo_handle.cc b/third_party/blink/renderer/core/mojo/mojo_handle.cc
index 2aeadf1..9932560 100644
--- a/third_party/blink/renderer/core/mojo/mojo_handle.cc
+++ b/third_party/blink/renderer/core/mojo/mojo_handle.cc
@@ -146,16 +146,22 @@
     num_bytes = view->byteLength();
   }
 
+  ::MojoWriteDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoResult result =
-      MojoWriteData(handle_.get().value(), elements, &num_bytes, flags);
+      MojoWriteData(handle_.get().value(), elements, &num_bytes, &options);
   result_dict.setResult(result);
   result_dict.setNumBytes(result == MOJO_RESULT_OK ? num_bytes : 0);
 }
 
 void MojoHandle::queryData(MojoReadDataResult& result_dict) {
   uint32_t num_bytes = 0;
-  MojoResult result = MojoReadData(handle_.get().value(), nullptr, &num_bytes,
-                                   MOJO_READ_DATA_FLAG_QUERY);
+  ::MojoReadDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = MOJO_READ_DATA_FLAG_QUERY;
+  MojoResult result =
+      MojoReadData(handle_.get().value(), &options, nullptr, &num_bytes);
   result_dict.setResult(result);
   result_dict.setNumBytes(num_bytes);
 }
@@ -167,8 +173,11 @@
   if (options_dict.allOrNone())
     flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
 
+  ::MojoReadDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoResult result =
-      MojoReadData(handle_.get().value(), nullptr, &num_bytes, flags);
+      MojoReadData(handle_.get().value(), &options, nullptr, &num_bytes);
   result_dict.setResult(result);
   result_dict.setNumBytes(result == MOJO_RESULT_OK ? num_bytes : 0);
 }
@@ -194,8 +203,11 @@
     num_bytes = view->byteLength();
   }
 
+  ::MojoReadDataOptions options;
+  options.struct_size = sizeof(options);
+  options.flags = flags;
   MojoResult result =
-      MojoReadData(handle_.get().value(), elements, &num_bytes, flags);
+      MojoReadData(handle_.get().value(), &options, elements, &num_bytes);
   result_dict.setResult(result);
   result_dict.setNumBytes(result == MOJO_RESULT_OK ? num_bytes : 0);
 }
@@ -204,8 +216,8 @@
                            unsigned num_bytes,
                            MojoMapBufferResult& result_dict) {
   void* data = nullptr;
-  MojoResult result = MojoMapBuffer(handle_.get().value(), offset, num_bytes,
-                                    &data, MOJO_MAP_BUFFER_FLAG_NONE);
+  MojoResult result =
+      MojoMapBuffer(handle_.get().value(), offset, num_bytes, nullptr, &data);
   result_dict.setResult(result);
   if (result == MOJO_RESULT_OK) {
     WTF::ArrayBufferContents::DataHandle data_handle(
@@ -223,9 +235,9 @@
     const MojoDuplicateBufferHandleOptions& options_dict,
     MojoCreateSharedBufferResult& result_dict) {
   ::MojoDuplicateBufferHandleOptions options = {
-      sizeof(options), MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
+      sizeof(options), MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_NONE};
   if (options_dict.readOnly())
-    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
+    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_FLAG_READ_ONLY;
 
   mojo::Handle handle;
   MojoResult result = MojoDuplicateBufferHandle(handle_.get().value(), &options,
diff --git a/third_party/blink/renderer/core/paint/background_image_geometry.cc b/third_party/blink/renderer/core/paint/background_image_geometry.cc
index 02079084..b3b4c2ba 100644
--- a/third_party/blink/renderer/core/paint/background_image_geometry.cc
+++ b/third_party/blink/renderer/core/paint/background_image_geometry.cc
@@ -455,8 +455,12 @@
   if (RuntimeEnabledFeatures::RootLayerScrollingEnabled()) {
     // The LayoutView is the only object that can paint a fixed background into
     // its scrolling contents layer, so it gets a special adjustment here.
-    if (obj.IsLayoutView())
-      rect.SetLocation(IntPoint(ToLayoutView(obj).ScrolledContentOffset()));
+    if (obj.IsLayoutView()) {
+      CompositedLayerMapping* mapping =
+          obj.Layer()->GetCompositedLayerMapping();
+      if (mapping && mapping->BackgroundPaintsOntoScrollingContentsLayer())
+        rect.SetLocation(IntPoint(ToLayoutView(obj).ScrolledContentOffset()));
+    }
   } else {
     rect.SetLocation(IntPoint(frame_view->ScrollOffsetInt()));
   }
diff --git a/third_party/blink/renderer/core/paint/object_paint_invalidator.cc b/third_party/blink/renderer/core/paint/object_paint_invalidator.cc
index eff5243..6195363 100644
--- a/third_party/blink/renderer/core/paint/object_paint_invalidator.cc
+++ b/third_party/blink/renderer/core/paint/object_paint_invalidator.cc
@@ -533,10 +533,12 @@
     return;
 
   if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) {
-    // PaintController will handle raster invalidation of the partial rect.
-    object_.GetMutableForPainting().SetPartialInvalidationRect(
-        UnionRect(object_.PartialInvalidationRect(),
-                  UnionRect(new_selection_rect, old_selection_rect)));
+    if (RuntimeEnabledFeatures::PartialRasterInvalidationEnabled()) {
+      // PaintController will handle raster invalidation of the partial rect.
+      object_.GetMutableForPainting().SetPartialInvalidationRect(
+          UnionRect(object_.PartialInvalidationRect(),
+                    UnionRect(new_selection_rect, old_selection_rect)));
+    }
   } else {
     FullyInvalidatePaint(PaintInvalidationReason::kSelection,
                          old_selection_rect, new_selection_rect);
@@ -555,13 +557,18 @@
   if (rect.IsEmpty())
     return;
 
-  context_.MapLocalRectToVisualRectInBacking(object_, rect);
-  if (rect.IsEmpty())
-    return;
+  if (!RuntimeEnabledFeatures::SlimmingPaintV175Enabled() ||
+      RuntimeEnabledFeatures::PartialRasterInvalidationEnabled()) {
+    context_.MapLocalRectToVisualRectInBacking(object_, rect);
+    if (rect.IsEmpty())
+      return;
+  }
 
   if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) {
-    // PaintController will handle raster invalidation of the partial rect.
-    object_.GetMutableForPainting().SetPartialInvalidationRect(rect);
+    if (RuntimeEnabledFeatures::PartialRasterInvalidationEnabled()) {
+      // PaintController will handle raster invalidation of the partial rect.
+      object_.GetMutableForPainting().SetPartialInvalidationRect(rect);
+    }
   } else {
     InvalidatePaintRectangleWithContext(rect,
                                         PaintInvalidationReason::kRectangle);
diff --git a/third_party/blink/renderer/core/paint/object_paint_invalidator_test.cc b/third_party/blink/renderer/core/paint/object_paint_invalidator_test.cc
index 0982a20..aec9c0e 100644
--- a/third_party/blink/renderer/core/paint/object_paint_invalidator_test.cc
+++ b/third_party/blink/renderer/core/paint/object_paint_invalidator_test.cc
@@ -281,6 +281,10 @@
   EXPECT_EQ(LayoutRect(10, 10, 80, 80), target->PartialInvalidationRect());
   EXPECT_TRUE(target->MayNeedPaintInvalidation());
 
+  GetDocument().View()->UpdateLifecycleToPrePaintClean();
+  if (!RuntimeEnabledFeatures::SlimmingPaintV175Enabled() ||
+      !RuntimeEnabledFeatures::PartialRasterInvalidationEnabled())
+    EXPECT_EQ(LayoutRect(), target->PartialInvalidationRect());
   GetDocument().View()->UpdateAllLifecyclePhases();
   EXPECT_EQ(LayoutRect(), target->PartialInvalidationRect());
 
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index 9380c366..79c035b 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -2657,9 +2657,9 @@
 BackgroundPaintLocation PaintLayer::GetBackgroundPaintLocation(
     uint32_t* reasons) const {
   BackgroundPaintLocation location;
-  bool has_scrolling_layers =
-      scrollable_area_ && scrollable_area_->NeedsCompositedScrolling();
-  if (!ScrollsOverflow() && !has_scrolling_layers) {
+  bool may_have_scrolling_layers_without_scrolling =
+      IsRootLayer() && RuntimeEnabledFeatures::RootLayerScrollingEnabled();
+  if (!ScrollsOverflow() && !may_have_scrolling_layers_without_scrolling) {
     location = kBackgroundPaintInGraphicsLayer;
   } else if (RuntimeEnabledFeatures::RootLayerScrollingEnabled()) {
     // If we care about LCD text, paint root backgrounds into scrolling contents
diff --git a/third_party/blink/renderer/core/paint/view_painter.cc b/third_party/blink/renderer/core/paint/view_painter.cc
index 9c8aef3..6701f52 100644
--- a/third_party/blink/renderer/core/paint/view_painter.cc
+++ b/third_party/blink/renderer/core/paint/view_painter.cc
@@ -244,9 +244,9 @@
     bool should_paint_in_viewport_space =
         (*it)->Attachment() == EFillAttachment::kFixed;
     if (should_paint_in_viewport_space) {
-      box_model_painter.PaintFillLayer(
-          paint_info, Color(), **it, LayoutRect(LayoutRect::InfiniteIntRect()),
-          kBackgroundBleedNone, geometry);
+      box_model_painter.PaintFillLayer(paint_info, Color(), **it,
+                                       LayoutRect(background_rect),
+                                       kBackgroundBleedNone, geometry);
     } else {
       context.Save();
       // TODO(trchen): We should be able to handle 3D-transformed root
diff --git a/third_party/blink/renderer/platform/graphics/compositing/composited_layer_raster_invalidator.cc b/third_party/blink/renderer/platform/graphics/compositing/composited_layer_raster_invalidator.cc
index ceb9cc70..f55abfb 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/composited_layer_raster_invalidator.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/composited_layer_raster_invalidator.cc
@@ -45,6 +45,15 @@
   return kNotFound;
 }
 
+static bool ApproximatelyEqual(const SkMatrix& a, const SkMatrix& b) {
+  static constexpr float kTolerance = 1e-5f;
+  for (int i = 0; i < 9; i++) {
+    if (std::abs(a[i] - b[i]) > kTolerance)
+      return false;
+  }
+  return true;
+}
+
 PaintInvalidationReason
 CompositedLayerRasterInvalidator::ChunkPropertiesChanged(
     const RefCountedPropertyTreeState& new_chunk_state,
@@ -55,7 +64,8 @@
   // transform nodes when no raster invalidation is needed. For example, when
   // a composited layer previously not transformed now gets transformed.
   // Check for real accumulated transform change instead.
-  if (new_chunk.chunk_to_layer_transform != old_chunk.chunk_to_layer_transform)
+  if (!ApproximatelyEqual(new_chunk.chunk_to_layer_transform,
+                          old_chunk.chunk_to_layer_transform))
     return PaintInvalidationReason::kPaintProperty;
 
   // Treat the chunk property as changed if the effect node pointer is
@@ -111,7 +121,7 @@
   size_t max_matched_old_index = 0;
   for (const auto& new_chunk : new_chunks) {
     mapper.SwitchToChunk(new_chunk);
-    const auto& new_chunk_info =
+    auto& new_chunk_info =
         new_chunks_info.emplace_back(*this, mapper, new_chunk);
 
     if (!new_chunk.is_cacheable) {
@@ -150,6 +160,13 @@
       // Ignore the display item raster invalidations because we have fully
       // invalidated the chunk.
     } else {
+      // We may have ignored tiny changes of transform, in which case we should
+      // use the old chunk_to_layer_transform for later comparison to correctly
+      // invalidate animating transform in tiny increments when the accumulated
+      // change exceeds the tolerance.
+      new_chunk_info.chunk_to_layer_transform =
+          old_chunk_info.chunk_to_layer_transform;
+
       if (reason == PaintInvalidationReason::kIncremental)
         IncrementallyInvalidateChunk(old_chunk_info, new_chunk_info);
 
diff --git a/third_party/blink/renderer/platform/graphics/compositing/composited_layer_raster_invalidator_test.cc b/third_party/blink/renderer/platform/graphics/compositing/composited_layer_raster_invalidator_test.cc
index 04cfb9a..2b10b67b 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/composited_layer_raster_invalidator_test.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/composited_layer_raster_invalidator_test.cc
@@ -629,4 +629,54 @@
   invalidator.SetTracksRasterInvalidations(false);
 }
 
+TEST_F(CompositedLayerRasterInvalidatorTest, TransformPropertyTinyChange) {
+  CompositedLayerRasterInvalidator invalidator(kNoopRasterInvalidation);
+
+  auto layer_transform = CreateTransform(TransformPaintPropertyNode::Root(),
+                                         TransformationMatrix().Scale(5));
+  auto chunk_transform = CreateTransform(
+      layer_transform, TransformationMatrix().Translate(10, 20));
+
+  PropertyTreeState layer_state(layer_transform.get(),
+                                ClipPaintPropertyNode::Root(),
+                                EffectPaintPropertyNode::Root());
+  auto artifact = Chunk(0).Properties(chunk_transform.get()).Build();
+
+  GeometryMapperTransformCache::ClearCache();
+  invalidator.SetTracksRasterInvalidations(true);
+  invalidator.Generate(artifact, kDefaultLayerBounds, layer_state);
+  EXPECT_TRUE(TrackedRasterInvalidations(invalidator).IsEmpty());
+
+  // Change chunk_transform by tiny difference, which should be ignored.
+  chunk_transform->Update(layer_state.Transform(),
+                          TransformPaintPropertyNode::State{
+                              TransformationMatrix(chunk_transform->Matrix())
+                                  .Translate(0.0000001, -0.0000001)
+                                  .Scale(1.0000001)
+                                  .Rotate(0.0000001)});
+  auto new_artifact = Chunk(0).Properties(chunk_transform.get()).Build();
+
+  GeometryMapperTransformCache::ClearCache();
+  invalidator.Generate(new_artifact, kDefaultLayerBounds, layer_state);
+  EXPECT_TRUE(TrackedRasterInvalidations(invalidator).IsEmpty());
+
+  // Tiny differences should accumulate and cause invalidation when the
+  // accumulation is large enough.
+  bool invalidated = false;
+  for (int i = 0; i < 100 && !invalidated; i++) {
+    chunk_transform->Update(layer_state.Transform(),
+                            TransformPaintPropertyNode::State{
+                                TransformationMatrix(chunk_transform->Matrix())
+                                    .Translate(0.0000001, -0.0000001)
+                                    .Scale(1.0000001)
+                                    .Rotate(0.0000001)});
+    auto new_artifact = Chunk(0).Properties(chunk_transform.get()).Build();
+
+    GeometryMapperTransformCache::ClearCache();
+    invalidator.Generate(new_artifact, kDefaultLayerBounds, layer_state);
+    invalidated = !TrackedRasterInvalidations(invalidator).IsEmpty();
+  }
+  EXPECT_TRUE(invalidated);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/buffering_data_pipe_writer_test.cc b/third_party/blink/renderer/platform/loader/fetch/buffering_data_pipe_writer_test.cc
index 0788a28..0ce03bb 100644
--- a/third_party/blink/renderer/platform/loader/fetch/buffering_data_pipe_writer_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/buffering_data_pipe_writer_test.cc
@@ -24,7 +24,7 @@
   mojo::ScopedDataPipeConsumerHandle consumer;
   MojoCreateDataPipeOptions options;
   options.struct_size = sizeof(MojoCreateDataPipeOptions);
-  options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
   options.element_num_bytes = 1;
   options.capacity_num_bytes = kCapacity;
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc b/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc
index ca96ba6..309a75c 100644
--- a/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc
@@ -300,7 +300,7 @@
   mojo::ScopedDataPipeConsumerHandle consumer;
   MojoCreateDataPipeOptions options;
   options.struct_size = sizeof(MojoCreateDataPipeOptions);
-  options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+  options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
   options.element_num_bytes = 1;
   options.capacity_num_bytes = kCapacity;
 
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 308ddc8..7c26667 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -538,7 +538,7 @@
     },
     {
       name: "FullscreenOptions",
-      status: "test",
+      status: "experimental",
     },
     {
       name: "FullscreenUnprefixed",
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py b/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py
index a2fd36d..9cd0ec1 100644
--- a/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py
+++ b/third_party/blink/tools/blinkpy/web_tests/controllers/manager.py
@@ -395,6 +395,10 @@
 
         test_inputs = []
         for _ in xrange(iterations):
+            # TODO(crbug.com/650747): We may want to switch the two loops below
+            # to make the behavior consistent with gtest runner (--gtest_repeat
+            # is an alias for --repeat-each now), which looks like "ABCABCABC".
+            # And remember to update the help text when we do so.
             for test in tests_to_run:
                 for _ in xrange(repeat_each):
                     test_inputs.append(self._test_input_for_file(test))
diff --git a/third_party/blink/tools/blinkpy/web_tests/layout_package/bot_test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/layout_package/bot_test_expectations.py
index b38ea02..f7ce07b 100644
--- a/third_party/blink/tools/blinkpy/web_tests/layout_package/bot_test_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/layout_package/bot_test_expectations.py
@@ -188,7 +188,7 @@
     def unexpected_results_by_path(self):
         """For tests with unexpected results, returns original expectations + results."""
         def exp_to_string(exp):
-            return TestExpectations.EXPECTATIONS_TO_STRING.get(exp, None).upper()
+            return TestExpectations.EXPECTATIONS_TO_STRING.get(exp, None)
 
         def string_to_exp(string):
             # Needs a bit more logic than the method above,
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
index e45f6fb..e9ca9f5 100644
--- a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
@@ -720,17 +720,10 @@
             expectations.remove(SKIP)
 
         for expectation in expectations:
-            retval.append(self.expectation_to_string(expectation))
+            retval.append(TestExpectations.expectation_to_string(expectation))
 
         return ' '.join(retval)
 
-    def expectation_to_string(self, expectation):
-        """Return the uppercased string equivalent of a given expectation."""
-        for item in TestExpectations.EXPECTATIONS.items():
-            if item[1] == expectation:
-                return item[0].upper()
-        raise ValueError(expectation)
-
     def remove_expectation_line(self, test):
         if not self.has_test(test.name):
             return
@@ -926,7 +919,7 @@
         TestExpectationParser.REBASELINE_MODIFIER: REBASELINE,
     }
 
-    EXPECTATIONS_TO_STRING = dict((k, v) for (v, k) in EXPECTATIONS.iteritems())
+    EXPECTATIONS_TO_STRING = {k: v.upper() for (v, k) in EXPECTATIONS.iteritems()}
 
     # (aggregated by category, pass/fail/skip, type)
     EXPECTATION_DESCRIPTIONS = {
@@ -965,6 +958,14 @@
         assert ' ' not in string  # This only handles one expectation at a time.
         return cls.EXPECTATIONS.get(string.lower())
 
+    @classmethod
+    def expectation_to_string(cls, expectation):
+        """Return the uppercased string equivalent of a given expectation."""
+        try:
+            return cls.EXPECTATIONS_TO_STRING[expectation]
+        except KeyError:
+            raise ValueError(expectation)
+
     @staticmethod
     def result_was_expected(result, expected_results, test_needs_rebaselining):
         """Returns whether we got a result we were expecting.
@@ -1118,9 +1119,6 @@
     def get_expectations_string(self, test):
         return self._model.get_expectations_string(test)
 
-    def expectation_to_string(self, expectation):
-        return self._model.expectation_to_string(expectation)
-
     def matches_an_expected_result(self, test, result, pixel_tests_are_enabled, sanitizer_is_enabled):
         expected_results = self._model.get_expectations(test)
         if sanitizer_is_enabled:
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_run_results.py b/third_party/blink/tools/blinkpy/web_tests/models/test_run_results.py
index 766bcdb..3e7668df 100644
--- a/third_party/blink/tools/blinkpy/web_tests/models/test_run_results.py
+++ b/third_party/blink/tools/blinkpy/web_tests/models/test_run_results.py
@@ -27,8 +27,8 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import collections
 import logging
-import signal
 import time
 
 from blinkpy.web_tests.models import test_expectations
@@ -50,28 +50,42 @@
         self.total = num_tests
         self.remaining = self.total
         self.expectations = expectations
+
+        # Various counters:
         self.expected = 0
         self.expected_failures = 0
+        self.expected_skips = 0
+        self.total_failures = 0
         self.unexpected = 0
-        self.unexpected_failures = 0
         self.unexpected_crashes = 0
+        self.unexpected_failures = 0
         self.unexpected_timeouts = 0
+
+        # The wall clock time spent running the tests (layout_test_runner.run()).
+        self.run_time = 0
+
+        # Map of test name to the *last* result for the test.
+        self.results_by_name = {}
+
+        # Map of test name to the *last* unexpected result for the test.
+        self.unexpected_results_by_name = {}
+
+        # All results from a run except SKIP, including all iterations.
+        self.all_results = []
+
+        # Map of test name to the *last* failures for the test.
+        self.failures_by_name = {}
+
         self.tests_by_expectation = {}
         self.tests_by_timeline = {}
-        self.results_by_name = {}  # Map of test name to the last result for the test.
-        self.all_results = []  # All results from a run, including every iteration of every test.
-        self.unexpected_results_by_name = {}
-        self.failures_by_name = {}
-        self.total_failures = 0
-        self.expected_skips = 0
         for expectation in test_expectations.TestExpectations.EXPECTATIONS.values():
             self.tests_by_expectation[expectation] = set()
         for timeline in test_expectations.TestExpectations.TIMELINES.values():
             self.tests_by_timeline[timeline] = expectations.get_tests_with_timeline(timeline)
+
         self.slow_tests = set()
         self.interrupted = False
         self.keyboard_interrupted = False
-        self.run_time = 0  # The wall clock time spent running the tests (layout_test_runner.run()).
 
     def add(self, test_result, expected, test_is_slow):
         result_type_for_stats = test_result.type
@@ -163,84 +177,116 @@
     # FIXME: Remove this. It is redundant with results['num_failures_by_type'].
     results['skipped'] = len(tbt[test_expectations.NOW] & tbe[test_expectations.SKIP])
 
+    # TODO(dpranke): Some or all of these counters can be removed.
     num_passes = 0
     num_flaky = 0
     num_regressions = 0
-    keywords = {}
-    for expectation_string, expectation_enum in test_expectations.TestExpectations.EXPECTATIONS.iteritems():
-        keywords[expectation_enum] = expectation_string.upper()
 
+    keywords = test_expectations.TestExpectations.EXPECTATIONS_TO_STRING
+
+    # Calculate the number of failures by types (only in initial results).
     num_failures_by_type = {}
     for expectation in initial_results.tests_by_expectation:
         tests = initial_results.tests_by_expectation[expectation]
         if expectation != test_expectations.WONTFIX:
             tests &= tbt[test_expectations.NOW]
         num_failures_by_type[keywords[expectation]] = len(tests)
-    # The number of failures by type.
     results['num_failures_by_type'] = num_failures_by_type
 
+    # Combine all iterations and retries together into a dictionary with the
+    # following structure:
+    #    { test_name: [ (result, is_unexpected), ... ], ... }
+    # where result is a single TestResult, is_unexpected is a boolean
+    # representing whether the result is unexpected in that run.
+    merged_results_by_name = collections.defaultdict(list)
+    for test_run_results in [initial_results] + all_retry_results:
+        # all_results does not include SKIP, so we need results_by_name.
+        for test_name, result in test_run_results.results_by_name.iteritems():
+            if result.type == test_expectations.SKIP:
+                is_unexpected = test_name in test_run_results.unexpected_results_by_name
+                merged_results_by_name[test_name].append((result, is_unexpected))
+
+        # results_by_name only includes the last result, so we need all_results.
+        for result in test_run_results.all_results:
+            test_name = result.test_name
+            is_unexpected = test_name in test_run_results.unexpected_results_by_name
+            merged_results_by_name[test_name].append((result, is_unexpected))
+
+    # Finally, compute the tests dict.
     tests = {}
+    for test_name, merged_results in merged_results_by_name.iteritems():
+        initial_result = merged_results[0][0]
 
-    for test_name, result in initial_results.results_by_name.iteritems():
-        expected = expectations.get_expectations_string(test_name)
-        actual = [keywords[result.type]]
-        actual_types = [result.type]
-        crash_sites = [result.crash_site]
-
-        if only_include_failing and result.type == test_expectations.SKIP:
+        if only_include_failing and initial_result.type == test_expectations.SKIP:
             continue
 
-        if result.type == test_expectations.PASS:
-            num_passes += 1
-            if not result.has_stderr and only_include_failing:
-                continue
-        elif (result.type != test_expectations.SKIP and
-              test_name in initial_results.unexpected_results_by_name):
-            # Loop through retry results to collate results and determine
-            # whether this is a regression, unexpected pass, or flaky test.
-            is_flaky = False
-            has_unexpected_pass = False
-            for retry_attempt_results in all_retry_results:
-                # If a test passes on one of the retries, it won't be in the subsequent retries.
-                if test_name not in retry_attempt_results.results_by_name:
-                    break
+        expected = expectations.get_expectations_string(test_name)
+        actual = []
+        actual_types = []
+        crash_sites = []
 
-                retry_result = retry_attempt_results.results_by_name[test_name]
-                retry_result_type = retry_result.type
-                actual.append(keywords[retry_result_type])
-                actual_types.append(retry_result_type)
-                crash_sites.append(retry_result.crash_site)
-                if test_name in retry_attempt_results.unexpected_results_by_name:
-                    if retry_result_type == test_expectations.PASS:
-                        # The test failed unexpectedly at first, then passed
-                        # unexpectedly on a subsequent run -> unexpected pass.
-                        has_unexpected_pass = True
-                else:
-                    # The test failed unexpectedly at first but then ran as
-                    # expected on a subsequent run -> flaky.
-                    is_flaky = True
+        all_pass = True
+        has_expected = False
+        has_unexpected = False
+        has_unexpected_pass = False
+        has_stderr = False
+        for result, is_unexpected in merged_results:
+            actual.append(keywords[result.type])
+            actual_types.append(result.type)
+            crash_sites.append(result.crash_site)
 
-            if len(set(actual)) == 1:
-                actual = [actual[0]]
-                actual_types = [actual_types[0]]
-
-            if is_flaky:
-                num_flaky += 1
-            elif has_unexpected_pass:
-                num_passes += 1
-                if not result.has_stderr and only_include_failing:
-                    continue
+            if result.type != test_expectations.PASS:
+                all_pass = False
+            if result.has_stderr:
+                has_stderr = True
+            if is_unexpected:
+                has_unexpected = True
+                if result.type == test_expectations.PASS:
+                    has_unexpected_pass = True
             else:
-                # Either no retries or all retries failed unexpectedly.
-                num_regressions += 1
+                has_expected = True
+        # A test is flaky if it has both expected and unexpected runs (NOT pass
+        # and failure).
+        is_flaky = has_expected and has_unexpected
+
+        if len(set(actual)) == 1:
+            actual = [actual[0]]
+            actual_types = [actual_types[0]]
+
+        if is_flaky:
+            num_flaky += 1
+        elif all_pass or has_unexpected_pass:
+            # We count two situations as a "pass":
+            # 1. All test runs pass (which is obviously non-flaky, but does not
+            #    imply whether the runs are expected, e.g. they can be all
+            #    unexpected passes).
+            # 2. The test isn't flaky and has at least one unexpected pass
+            #    (which implies all runs are unexpected). One tricky example
+            #    that doesn't satisfy #1 is that if a test is expected to
+            #    crash but in fact fails and then passes, it will be counted
+            #    as "pass".
+            num_passes += 1
+            if not has_stderr and only_include_failing:
+                continue
+        elif has_unexpected and result.type != test_expectations.SKIP:
+            # Either no retries or all retries failed unexpectedly.
+            # TODO(robertma): When will there be unexpected skip? Do we really
+            # want to ignore them when counting regressions?
+            num_regressions += 1
 
         test_dict = {}
 
-        rounded_run_time = round(result.test_run_time, 1)
+        test_dict['expected'] = expected
+        test_dict['actual'] = ' '.join(actual)
+
+        # Fields below are optional. To avoid bloating the output results json
+        # too much, only add them when they are True or non-empty.
+
+        rounded_run_time = round(initial_result.test_run_time, 1)
         if rounded_run_time:
             test_dict['time'] = rounded_run_time
 
-        if result.has_stderr:
+        if has_stderr:
             test_dict['has_stderr'] = True
 
         expectation_line = expectations.model().get_expectation_line(test_name)
@@ -254,41 +300,39 @@
         if base_expectations:
             test_dict['base_expectations'] = base_expectations
 
-        if result.reftest_type:
-            test_dict.update(reftest_type=list(result.reftest_type))
-
-        test_dict['expected'] = expected
-        test_dict['actual'] = ' '.join(actual)
+        if initial_result.reftest_type:
+            test_dict.update(reftest_type=list(initial_result.reftest_type))
 
         crash_sites = [site for site in crash_sites if site]
         if len(crash_sites) > 0:
             test_dict['crash_site'] = crash_sites[0]
 
-        if test_failures.has_failure_type(test_failures.FailureTextMismatch, result.failures):
-            for failure in result.failures:
+        if test_failures.has_failure_type(test_failures.FailureTextMismatch, initial_result.failures):
+            for failure in initial_result.failures:
                 if isinstance(failure, test_failures.FailureTextMismatch):
                     test_dict['text_mismatch'] = failure.text_mismatch_category()
                     break
 
         def is_expected(actual_result):
             return expectations.matches_an_expected_result(test_name, actual_result,
-                                                           port_obj.get_option('pixel_tests') or result.reftest_type,
+                                                           port_obj.get_option('pixel_tests') or initial_result.reftest_type,
                                                            port_obj.get_option('enable_sanitizer'))
 
-        # To avoid bloating the output results json too much, only add an entry for whether the failure is unexpected.
+        # Note: is_unexpected is intended to capture the *last* result. In the
+        # normal use case (stop retrying failures once they pass), this is
+        # equivalent to checking if none of the results is expected.
         if not any(is_expected(actual_result) for actual_result in actual_types):
             test_dict['is_unexpected'] = True
 
-        test_dict.update(_interpret_test_failures(result.failures))
-
-        for retry_attempt_results in all_retry_results:
-            retry_result = retry_attempt_results.unexpected_results_by_name.get(test_name)
-            if retry_result:
-                test_dict.update(_interpret_test_failures(retry_result.failures))
-
-        if result.has_repaint_overlay:
+        if initial_result.has_repaint_overlay:
             test_dict['has_repaint_overlay'] = True
 
+        test_dict.update(_interpret_test_failures(initial_result.failures))
+        for retry_result, is_unexpected in merged_results[1:]:
+            # TODO(robertma): Why do we only update unexpected retry failures?
+            if is_unexpected:
+                test_dict.update(_interpret_test_failures(retry_result.failures))
+
         # Store test hierarchically by directory. e.g.
         # foo/bar/baz.html: test_dict
         # foo/bar/baz1.html: test_dict
@@ -311,10 +355,8 @@
             current_map = current_map[part]
 
     results['tests'] = tests
-    # FIXME: Remove this. It is redundant with results['num_failures_by_type'].
     results['num_passes'] = num_passes
     results['num_flaky'] = num_flaky
-    # FIXME: Remove this. It is redundant with results['num_failures_by_type'].
     results['num_regressions'] = num_regressions
     # Does results.html have enough information to compute this itself? (by
     # checking total number of results vs. total number of tests?)
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_run_results_unittest.py b/third_party/blink/tools/blinkpy/web_tests/models/test_run_results_unittest.py
index 6f08ad6d..2e19b54 100644
--- a/third_party/blink/tools/blinkpy/web_tests/models/test_run_results_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/models/test_run_results_unittest.py
@@ -398,6 +398,27 @@
         self.assertEquals(summary['num_passes'], 0)
         self.assertEquals(summary['num_regressions'], 0)
 
+    def test_summarized_results_with_iterations(self):
+        test_name = 'passes/text.html'
+        expectations = test_expectations.TestExpectations(self.port, [test_name])
+        initial_results = test_run_results.TestRunResults(expectations, 3)
+        initial_results.add(get_result(test_name, test_expectations.CRASH), False, False)
+        initial_results.add(get_result(test_name, test_expectations.IMAGE), False, False)
+        initial_results.add(get_result(test_name, test_expectations.TIMEOUT), False, False)
+        all_retry_results = [test_run_results.TestRunResults(expectations, 2)]
+        all_retry_results[0].add(get_result(test_name, test_expectations.TEXT), False, False)
+        all_retry_results[0].add(get_result(test_name, test_expectations.LEAK), False, False)
+
+        summary = test_run_results.summarize_results(
+            self.port, expectations, initial_results, all_retry_results,
+            enabled_pixel_tests_in_retry=True)
+        print summary
+        self.assertEquals(summary['tests']['passes']['text.html']['expected'], 'PASS')
+        self.assertEquals(summary['tests']['passes']['text.html']['actual'], 'CRASH IMAGE TIMEOUT TEXT LEAK')
+        self.assertEquals(summary['num_flaky'], 0)
+        self.assertEquals(summary['num_passes'], 0)
+        self.assertEquals(summary['num_regressions'], 1)
+
     def test_summarized_results_regression(self):
         summary = summarized_results(self.port, expected=False, passing=False, flaky=False)
 
diff --git a/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests.py b/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests.py
index b50962b..d80c5df 100644
--- a/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests.py
+++ b/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests.py
@@ -342,7 +342,6 @@
                       "'unexpected' == Ignore any tests that had unexpected results on the bot.")),
             optparse.make_option(
                 '--iterations',
-                '--gtest_repeat',
                 type='int',
                 default=1,
                 help='Number of times to run the set of tests (e.g. ABCABCABC)'),
@@ -379,6 +378,7 @@
                 help='Output per-test profile information, using the specified profiler.'),
             optparse.make_option(
                 '--repeat-each',
+                '--gtest_repeat',
                 type='int',
                 default=1,
                 help='Number of times to run each test (e.g. AAABBBCCC)'),
diff --git a/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests_unittest.py b/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests_unittest.py
index cab57c4..e5359bbf 100644
--- a/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/run_webkit_tests_unittest.py
@@ -401,12 +401,12 @@
     def test_gtest_repeat(self):
         tests_to_run = ['passes/image.html', 'passes/text.html']
         tests_run = get_tests_run(['--gtest_repeat', '2', '--order', 'natural'] + tests_to_run)
-        self.assertEqual(tests_run, ['passes/image.html', 'passes/text.html', 'passes/image.html', 'passes/text.html'])
+        self.assertEqual(tests_run, ['passes/image.html', 'passes/image.html', 'passes/text.html', 'passes/text.html'])
 
-    def test_gtest_repeat_overrides_iterations(self):
+    def test_gtest_repeat_overrides_repeat_each(self):
         tests_to_run = ['passes/image.html', 'passes/text.html']
-        tests_run = get_tests_run(['--iterations', '4', '--gtest_repeat', '2', '--order', 'natural'] + tests_to_run)
-        self.assertEqual(tests_run, ['passes/image.html', 'passes/text.html', 'passes/image.html', 'passes/text.html'])
+        tests_run = get_tests_run(['--repeat-each', '4', '--gtest_repeat', '2', '--order', 'natural'] + tests_to_run)
+        self.assertEqual(tests_run, ['passes/image.html', 'passes/image.html', 'passes/text.html', 'passes/text.html'])
 
     def test_ignore_flag(self):
         # Note that passes/image.html is expected to be run since we specified it directly.
diff --git a/third_party/boringssl/BUILD.generated_tests.gni b/third_party/boringssl/BUILD.generated_tests.gni
index a79959d..b4857e0 100644
--- a/third_party/boringssl/BUILD.generated_tests.gni
+++ b/third_party/boringssl/BUILD.generated_tests.gni
@@ -11,6 +11,8 @@
   "src/crypto/test/malloc.cc",
   "src/crypto/test/test_util.cc",
   "src/crypto/test/test_util.h",
+  "src/crypto/test/wycheproof_util.cc",
+  "src/crypto/test/wycheproof_util.h",
   "src/ssl/test/async_bio.h",
   "src/ssl/test/fuzzer.h",
   "src/ssl/test/fuzzer_tags.h",
diff --git a/third_party/boringssl/crypto_test_data.cc b/third_party/boringssl/crypto_test_data.cc
index 2044b5af..f19576e 100644
--- a/third_party/boringssl/crypto_test_data.cc
+++ b/third_party/boringssl/crypto_test_data.cc
@@ -66,7 +66,22 @@
  *       crypto/x509/many_names3.pem \
  *       crypto/x509/some_names1.pem \
  *       crypto/x509/some_names2.pem \
- *       crypto/x509/some_names3.pem */
+ *       crypto/x509/some_names3.pem \
+ *       third_party/wycheproof/aes_cbc_pkcs5_test.txt \
+ *       third_party/wycheproof/aes_gcm_siv_test.txt \
+ *       third_party/wycheproof/aes_gcm_test.txt \
+ *       third_party/wycheproof/chacha20_poly1305_test.txt \
+ *       third_party/wycheproof/dsa_test.txt \
+ *       third_party/wycheproof/ecdh_test.txt \
+ *       third_party/wycheproof/ecdsa_secp224r1_sha224_test.txt \
+ *       third_party/wycheproof/ecdsa_secp224r1_sha256_test.txt \
+ *       third_party/wycheproof/ecdsa_secp256r1_sha256_test.txt \
+ *       third_party/wycheproof/ecdsa_secp384r1_sha384_test.txt \
+ *       third_party/wycheproof/ecdsa_secp384r1_sha512_test.txt \
+ *       third_party/wycheproof/ecdsa_secp521r1_sha512_test.txt \
+ *       third_party/wycheproof/eddsa_test.txt \
+ *       third_party/wycheproof/rsa_signature_test.txt \
+ *       third_party/wycheproof/x25519_test.txt */
 
 /* clang-format off */
 
@@ -2767,6 +2782,276 @@
 };
 static const size_t kLen52 = 18953;
 
+static const char *kData53[] = {
+    "# Imported from Wycheproof's aes_cbc_pkcs5_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: AES-CBC-PKCS5\n# Generator version: 0.4\n\n[ivSize = 128]\n[keySize = 128]\n\n# tcId = 1\n# empty message\nct = b10ab60153276941361000414aed0a9d\niv = da9520f7d3520277035173299388bee2\nkey = e34f15c7bd819930fe9d66e0c166e61c\nmsg = \nresult = valid\n\n# tcId = 2\n# message size divisible by block size\nct = d1fa697f3e2e04d64f1a0da203813ca5bc226a0b1d42287b2a5b994a66eaf14a\niv = c9ee3cd746bf208c65ca9e72a266d54f\nkey = e09eaa5a3f5e56d279d5e7a03373f6ea\nmsg = ef4eab37181f98423e53e947e7050fd0\nresult = valid\n\n# tcId = 3\n# message size divisible by block size\nct = 514cbc69aced506926deacdeb0cc0a5a07d540f65d825b65c7db0075cf930a06e0124ae598461cab0b3251baa853e377\niv = 8b2e86a9a185cfa6f51c7cc595b822bc\nkey = 9bd3902ed0996c869b572272e76f3889\nmsg = a7ba19d49ee1ea02f098aa8e30c740d893a4456ccc294040484ed8a00a55f93e\nresult = valid\n\n# tcId = 4\n# message size divisible by block size\nct = 137c824d7f7dc36f24216dde37c2e1c10cee533f6453de92e44b898fc3037d2e9e19d67a96387136dd9717a56e28614a5c177158f402ce2936fd98d1feb6a817\niv = 2717d10eb2eea3b39ec257e43307a260\nkey = 75ce184447cada672e02290310d224f7\nmsg = c774810a31a6421ad8eaafd5c22fa2455e2c167fee4a0b73ff927b2d96c69da1e939407b86b1c19bcfc69c434c3cf8a2\nresult = valid\n\n# tcId = 5\n# small plaintext size\nct = 599d77aca16910b42d8b4ac9560efe1b\niv = 155fd397579b0b5d991d42607f2cc9ad\nkey = e1e726677f4893890f8c027f9d8ef80d\nmsg = 3f\nresult = valid\n\n# tcId = 6\n# small plaintext size\nct = 74e20bf03a0ad4b49edc86a1b19c3d1d\niv = 4eb836be6808db264cb1111a3283b394\nkey = b151f491c4c006d1f28214aa3da9a985\nmsg = 27d9\nresult = valid\n\n# tcId = 7\n# small plaintext size\nct = 3f7a26558ba51cf352219d34c46907ae\niv = a8446c27ea9068d8d924d5c4eac91157\nkey = c36ff15f72777ee21deec07b63c1a0cd\nmsg = 50b428\nresult = valid\n\n# tcId = 8\n# small plaintext size\nct = c29d1463baccc558fd720c897da5bb98\niv = ef026d27da3702d7bb72e5e364a8f8f2\nkey = 32b9c5c78c3a0689a86052420fa1e8fc\nmsg = 0b9262ec\nresult = valid\n\n# tcId = 9\n# small plaintext size\nct = e24a717914f9cc8eaa1dc96f7840d6af\niv = c9defd3929dcd6c355c144e9750dd869\nkey = 43151bbaef367277ebfc97509d0aa49c\nmsg = eaa91273e7\nresult = valid\n\n# tcId = 10\n# small plaintext size\nct = f080e487f4e5b7aed793ea95ffe4bb30\niv = ce91e0454b0123f1ead0f158826459e9\nkey = 481440298525cc261f8159159aedf62d\nmsg = 6123c556c5cc\nresult = valid\n\n# tcId = 11\n# small plaintext size\nct = 27cadee413ed901f51c9366d731d95f6\niv = 1cb7bc8fe00523e7743d3cd9f483d6fe\nkey = 9ca26eb88731efbf7f810d5d95e196ac\nmsg = 7e48f06183aa40\nresult = valid\n\n# tcId = 12\n# small plaintext size\nct = 59bf12427b51a3aee0c9d3c540d04d24\niv = a345f084229dbfe0ceab6c6939571532\nkey = 48f0d03e41cc55c4b58f737b5acdea32\nmsg = f4a133aa6d5985a0\nresult = valid\n\n# tcId = 13\n# small plaintext size\nct = 1a0a18355f8ca4e6e2cf31da18d070da\niv = e5b6f73f132355b7be7d977bea068dfc\nkey = 1c958849f31996b28939ce513087d1be\nmsg = b0d2fee11b8e2f86b7\nresult = valid\n\n# tcId = 14\n# small plaintext size\nct = cef498ea61715a27f400418d1d5bfbf0\niv = c7cd10ca949ea03e7d4ba204b69e09b8\nkey = 39de0ebea97c09b2301a90009a423253\nmsg = 81e5c33b4c620852f044\nresult = valid\n\n# tcId = 15\n# small plaintext size\nct = 7ab43ddc45835ce40d2280bcea6a63f2\niv = bb8c9af30821dfeb7124392a554d9f01\nkey = 91656d8fc0aced60ddb1c4006d0dde53\nmsg = 7b3e440fe566790064b2ec\nresult = valid\n\n# tcId = 16\n# small plaintext size\nct = c70b457c945ad40895cf4c8be3ce7c66\niv = 54c3b90ca6e933f9094334d0263d3775\nkey = af7d5134720b5386158d51ea126e7cf9\nmsg = 7cc6fcc925c20f3c83b5567c\nresult = valid\n\n# tcId = 17\n# small plaintext size\nct = f9900afee2acfe63f8f15d81bbf64c39\niv = 9a2c5e91d4f0b9b9da64b46c5c2c8cb2\nkey = 4ed56753de6f75a032ebabca3ce27971\nmsg = 0c8c0f5619d9f8da5339281285\nresult = valid\n\n# tcId = 18\n# small plaintext size\nct = da4137bd8ac78e75a700b3de806f2d6f\niv = cf7951501104e1434309e6b936ec1742\nkey = beba50c936b696c15e25046dffb23a64\nmsg = 821ea8532fbabffb6e3d212e9b46\nresult = valid\n\n# tcId = 19\n# small plaintext size\nct = fed05321d11d978e2ec32527ecfce06c\niv = 90f5cf4fbfd2e2a1ab8eef402617bd5c\nkey = 501d81ebf912ddb87fbe3b7aac1437bc\nmsg = 2368e3c3636b5e8e94d2081adbf798\nresult = valid\n\n# tcId = 20\n# plaintext size > 16\nct = 8d55dc10584e243f55d2bdbb5758b7fabcd58c8d3785f01c7e3640b2a1dadcd9\niv = 54f2459e40e002763144f4752cde2fb5\nkey = 831e664c9e3f0c3094c0b27b9d908eb2\nmsg = 26603bb76dd0a0180791c4ed4d3b058807\nresult = valid\n\n# tcId = 21\n# plaintext size > 16\nct = e9199842355ea0c3dbf1b2a94fef1c802a95d024df9e407883cf5bf1f02c3cdc\niv = 088e01c2c65b26e7ad6af7b92ea09d73\nkey = cbffc6c8c7f76f46349c32d666f4efb0\nmsg = 6df067add738195fd55ac2e76b476971b9a0e6d8\nresult = valid\n\n# tcId = 22\n# plaintext size > 16\nct = 19beb4db2be0f3aff0083583038b2281a77c85b5f345ba4d2bc7f742a14f9247\niv = d9c9468796a2f5741b84d2d41430c5d3\nkey = fda6a01194beb462953d7e6c49b32dac\nmsg = f60ae3b036abcab78c98fc1d4b67970c0955cb6fe24483f8907fd73319679b\nresult = valid\n\n# tcId = 23\n# plaintext size > 16\nct = 84904fc92bd2e7590aa268e667370327b9446f41067dd40d3e5091a63a0d5687e4926e00cc3cb461c3b85d80ee2da818\niv = c98b47808add45c0c891983ec4b09846\nkey = efd9caa8ac68e9e29acdae57e93bcea8\nmsg = 3e1d2001f1e475b972738936443a5f51eedaf802a66fadf2406cfaadb0549149fcb9f485e534dc2d\nresult = valid\n\n# tcId = 24\n# plaintext size > 16\nct = 1d1391593a336be4b207295ad0542bc4ef2f39053066e12c38f71603f377fd42f4f0b2b5a42cdfeaee2af039f06fcf347abe171af3157ff07f3cdd3b33e11a60caecf9890325c132eeb66ab847278d165c26bca7c30486bb2fd83b63c5ff7ae0\niv = 08e9410de244d3f40607ebae38fa74e7\nkey = 37e4dbdc436258d5a9adb9f205c77cf3\nmsg = 24a874aec067116ad22eb55846ded3f5e86919a135585c929a86d92b2958fed110e52e33804887243584a6a94402cc9a105e0c940ec335bd2890f16dcce3fc8bd02873c80ade6f1ac08683130bcca454\nresult = valid\n\n# tcId = 25\n# zero padding\nct = aa62606a287476777b92d8e4c4e53028\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 26\n# zero padding\nct = ada437b682c92384b6c23ec10a21b3d8\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 27\n# zero padding\nct = 26c5b3e540ee3dd6b52d14afd01a44f8\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 28\n# zero padding\nct = fbcbdfdaaf17980be939c0b243266ecbc0deb417e98aba3ee12fea2921f8ae51\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 29\n# zero padding\nct = fbcbdfdaaf17980be939c0b243266ecb1188ff22f6563f6173440547d1e0dfd8\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 30\n# padding with 0xff\nct = 726570a34cea08139d9f836579102a0e\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 31\n# padding with 0xff\nct = c8ef7ac3fd659ce7157d72a25f0a5048\niv = 2346",
+    "8aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 32\n# padding with 0xff\nct = 6123c889bbc766acd4bca4cb982f9978\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 33\n# padding with 0xff\nct = fbcbdfdaaf17980be939c0b243266ecb442cd16f7410fca70924b573f7967e84\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 34\n# padding with 0xff\nct = fbcbdfdaaf17980be939c0b243266ecbb20f899b0e7c1d65b931af94b5c44c25\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 35\n# bit padding\nct = 50aeed98a820c5a037a5aa4d4ef3090b\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 36\n# bit padding\nct = 25ee339006f948f42713543c62467ef9\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 37\n# bit padding\nct = 97914574676ed5b8db0b6f3931195b3f\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 38\n# bit padding\nct = fbcbdfdaaf17980be939c0b243266ecb2874a1e2d28dd18e5573df9fd59fd789\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 39\n# bit padding\nct = fbcbdfdaaf17980be939c0b243266ecbb547c4fddbdcd3e02f438a2e48587594\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 40\n# padding longer than 1 block\nct = d17ccbb26f0aa95f397b20063547349bac24c5429cbea591e96595cccc11451b\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 41\n# padding longer than 1 block\nct = fc07025e81d43efa85f92afdf8781b1e88598e12d6812df43733e93414b9e901\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 42\n# padding longer than 1 block\nct = deb1746f4e9e0be4a21825b071b6e93303031651e0c59091e2ae0fbcce11b987\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 43\n# padding longer than 1 block\nct = fbcbdfdaaf17980be939c0b243266ecb563d35096fde10ccb6f768438c9eb4ec90f399b76924c716e9f94143263306c6\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 44\n# padding longer than 1 block\nct = fbcbdfdaaf17980be939c0b243266ecbc8fd2e2c5362acf5212bd47859aa827d8469b87b0e6adafe3dba98c1885b6345\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 45\n# ANSI X.923 padding\nct = ca5dd2d09bd56eec9e8acaeca20af68e\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 46\n# ANSI X.923 padding\nct = 01e53a5ec9b0957c45f79ed0f4b2b982\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 47\n# ANSI X.923 padding\nct = fbcbdfdaaf17980be939c0b243266ecbd3909bb3457e5b946ff709be9a2ed84d\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 48\n# ANSI X.923 padding\nct = fbcbdfdaaf17980be939c0b243266ecbc5ab3ab637166a6a067b82b5672c08f8\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 49\n# ISO 10126 padding\nct = ba0726bd6dea11382b19c842e2ddead2\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 50\n# ISO 10126 padding\nct = 22f18b85c729903744fb8db5ed2840d4\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding",
+    ". This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 51\n# ISO 10126 padding\nct = fbcbdfdaaf17980be939c0b243266ecb6b103fbe43519a18880b7e6d9153e1c2\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 52\n# ISO 10126 padding\nct = fbcbdfdaaf17980be939c0b243266ecbe00bdb15b8a61285447498700d35e0c6\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 53\n# padding longer than message\nct = d17ccbb26f0aa95f397b20063547349b\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 54\n# padding longer than message\nct = 2056dfa339fa00be6836999411a98c76\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 55\n# padding longer than message\nct = f92628f6418d8d9c9afac233861b3835\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 56\n# padding longer than message\nct = fbcbdfdaaf17980be939c0b243266ecbc0c41093b495a7d5a080d976493fd0e7\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 57\n# padding longer than message\nct = fbcbdfdaaf17980be939c0b243266ecb6770446a5ccaa26f7d4f970cc5834eba\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 58\n#  invalid padding\nct = 4ff3e623fdd432608c183f40864177af\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 59\n#  invalid padding\nct = 6a1ef1e6ae6a788777aabd9ccf3cf43a\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 60\n#  invalid padding\nct = fbcbdfdaaf17980be939c0b243266ecbee1345cd513161b241f4ae2799b0327f\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 61\n#  invalid padding\nct = fbcbdfdaaf17980be939c0b243266ecbe0d539beef6f2d4f7cda4fd9f4f05570\niv = 23468aa734f5f0f19827316ff168e94f\nkey = db4f3e5e3795cc09a073fa6a81e5a6bc\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n[ivSize = 128]\n[keySize = 192]\n\n# tcId = 62\n# empty message\nct = ff0c315873b4b1872abef2353b792ef0\niv = db20f9a6f4d6b4e478f1a4b9d4051d34\nkey = 3d6bf9edae6d881eade0ff8c7076a4835b71320c1f36b631\nmsg = \nresult = valid\n\n# tcId = 63\n# message size divisible by block size\nct = 7dbd573e4db58a318edfe29f199d8cda538a49f36486337c2711163e55fd5d0b\niv = 69a76dc4da64d89c580eb75ae975ec39\nkey = f4bfa5aa4f0f4d62cf736cd2969c43d580fdb92f2753bedb\nmsg = 0e239f239705b282ce2200fe20de1165\nresult = valid\n\n# tcId = 64\n# message size divisible by block size\nct = bd0258909e5b72438d95ca4b29c8a79c6228fd06a3b2fa06f7659654c7b24610f23f2fb16313b7d3614cb0cd16fabb8e\niv = 6525667350930fb945dd1895a3abfcd1\nkey = 9d11abc1fcb248a436598e695be12c3c2ed90a18ba09d62c\nmsg = aa5182cae2a8fb068c0b3fb2be3e57ae523d13dffd1a944587707c2b67447f3f\nresult = valid\n\n# tcId = 65\n# message size divisible by block size\nct = 6cbeacf8de25d7dd9dcdc087bf2f80873b1eb335400589076f8d2bf81e294c5d72b85eb8ac9558b0de9e9fbee4b18716e5220c507fbb9d319a08f67816765ca6\niv = 3943d8fddd5bb2a59772df31a31a8fff\nkey = 7e41d83181659a2c38da5ead353cdb04c2b4d4a3cfe58e25\nmsg = 8a32d11c7a11aa72e13381632b1310f4fd90fc209a6a350e61c069a561871214f9c04fc1df7354cbe4d8d639c525d324\nresult = valid\n\n# tcId = 66\n# small plaintext size\nct = 519925956d32e4fa350b1144f088e4e8\niv = 1379d48493f743e6a149deb3b9bab31e\nkey = 915429743435c28997a33b33b6574a953d81dae0e7032e6a\nmsg = 58\nresult = valid\n\n# tcId = 67\n# small plaintext size\nct = bfb90aa7de1bdeed5bdc5703bdfd9630\niv = 48c7f44b43a1279d820733e6cb30617a\nkey = f0c288ba26b284f9fb321b444a6517b3cdda1a799d55fdff\nmsg = 0f7e\nresult = valid\n\n# tcId = 68\n# small plaintext size\nct = b1a25816908c086f26037d10b7be9ad9\niv = 2c287b38cc30c8c351b087b91a6a97ba\nkey = 6b55e4d4fd6847a80a6bfb0dcc0aa93f9fd797fc5c50292e\nmsg = 33f530\nresult = valid\n\n# tcId = 69\n# small plaintext size\nct = 74dbdecbfa94b71d2d6ef03200c7d095\niv = 61f6060919c9c09ef06be28f39c344aa\nkey = 1eb21a9e995a8e45c9e71ecbd6fe615b3e0318007c64b644\nmsg = 3aa73c48\nresult = valid\n\n# tcId = 70\n# small plaintext size\nct = 10c860aaee23c3c3c1b9306b189dd80d\niv = 7682005907bfef3ce00196a17ad2246d\nkey = 710e2d5d4a9f0bc7e50796655e046a18cc5769d7764355da\nmsg = 7e4c690a88\nresult = valid\n\n# tcId = 71\n# small plaintext size\nct = 673dcd444386930a0cc577fab4501e5c\niv = 1f6c912997ce007701e5fdf407c6b421\nkey = d8c09ea400779b63e774bdacd0cb7b5dd6f736ca23d52acf\nmsg = e9520280973b\nresult = valid\n\n# tcId = 72\n# small plaintext size\nct = 059e5f72a81d8820add8eae8fabcdd42\niv = 5854033ae50de090678432781a168b6c\nkey = 8e67e9a0863b55bed408866f1cbc05357abe3f9d79f406f2\nmsg = 4880b412287a0b\nresult = valid\n\n# tcId = 73\n# small plaintext size\nct = c412159fd5ae20d771b7d2e734124d6a\niv = 003b2d86d8b636c58cf664565572d5e6\nkey = 28d8da67806410e5565bcc5a9d7ab9fb357413fa0158378c\nmsg = 004e3f4a4e6db955\nresult = valid\n\n# tcId = 74\n# small plaintext size\nct = 4aba571c2c5ab9a6140f16efc68c8ec1\niv = 3f22b50f888ab9424ba871d15aac55b7\nkey = dc968dd89fd602bb7eca6f3a8a13e4f59c08d02a514b1934\nmsg = 41a25354efeb1bc3b8\nresult = valid\n\n# tcId = 75\n# small plaintext size\nct = 66d1b9152a8cd1a88eab341c775070b4\niv = e4b8dde04b49fa6b88bfccd8d70c21d1\nkey = 7658951c0f620d82afd92756cc2d7983b79da3e56fdd1b78\nmsg = f0e82fb5c5666f4af49f\nresult = valid\n\n# tcId = 76\n# small plaintext size\nct = d9377788e2881a48f9347786db7df51f\niv = 7753f616cd8796c9b8a3bbfbe6cb1e7f\nkey = d9574c3a221b986690931faac5258d9d3c52362b2cb9b054\nmsg = 178ea8404ba54ee4e4522c\nresult = valid\n\n# tcId = 77\n# small plaintext size\nct = db",
+    "825f4434ea3bb53576fa7385fb7dfe\niv = eae9ee19ccb7f8b087675709c4d35f73\nkey = 704409bab28085c44981f28f75dd143a4f747106f63f262e\nmsg = cda5709e7f115624e74ab031\nresult = valid\n\n# tcId = 78\n# small plaintext size\nct = 3e7287df2a5ed9de4d817e352bd47ea7\niv = a6aaff339a729d30a7ec1328db36d23e\nkey = d8d06ef6a53bbff5c8f12d791b8f4c67e574bf440736d1cc\nmsg = a1171eae1979f48345dd9485a0\nresult = valid\n\n# tcId = 79\n# small plaintext size\nct = 17c3ade4b469ae614760039a8fa6250e\niv = 92fda71e88c70d18ed71b992735a2150\nkey = 71129e781613f39d9ac39fbde2628b44c250c14deb5ef9e2\nmsg = 967593cc64bcbf7f3c58d04cb82b\nresult = valid\n\n# tcId = 80\n# small plaintext size\nct = 9cafecff2a28d02f732573f65a2cadca\niv = ed6596c86b98123ad2f3c573e974d051\nkey = 850fc859e9f7b89a367611dee6698f33962d8245ca8dc331\nmsg = 586f4f171af116519061a8e0e77940\nresult = valid\n\n# tcId = 81\n# plaintext size > 16\nct = 401ad889bdb9d38816c782e00b168ccccde9bf75f4be868ceb91237e8b37b750\niv = c45b52a240eba3bdde5dfd57f3d474fb\nkey = cfd3f68873d81a27d2bfce876c79f6e609074dec39e34614\nmsg = b1973cb25aa87ef9d1a8888b0a0f5c04c6\nresult = valid\n\n# tcId = 82\n# plaintext size > 16\nct = 455d516e87851e6c894578a0f7126e0acbc7cfbb1d80296647ab89a79dfa6f71\niv = 07ece5fe02266e073499fd4d66929034\nkey = b7f165bced1613da5e747fdf9255832d30c07f2deeb5a326\nmsg = 289647ea8d0ff31375a82aa1c620903048bb1d0e\nresult = valid\n\n# tcId = 83\n# plaintext size > 16\nct = cbf541330a5a9bda24984976b0cf96ba08ef521fa2cdb3df839128570e222ac4\niv = d799157bc1f77c182027be918b30783a\nkey = 9bbe6e004fb260dadb02b68b78954f1da5e6a2d02e0aeefe\nmsg = 665423092ce95b927e98b8082030f58e33f3ec1b0c29532c2f421855f00f97\nresult = valid\n\n# tcId = 84\n# plaintext size > 16\nct = 03225f08592efca14ad8ecf822465e8be4157465d0be150dd3d645b6fef1b19ca7bbaa5940b2a7895fa2b0ee55b0d4ec\niv = fdf97645e4192ba84728bbf6683f79de\nkey = 1381fbd5e79045d40f29790fc1a436c95b040a046ebf0b0f\nmsg = d575dce596dd0a2cd1c18dab7eb0948fafb8669969a48b6314493bfb8daf8acacd51382f9bb5b357\nresult = valid\n\n# tcId = 85\n# plaintext size > 16\nct = 27ad00313f328f0d3e6c3238ab560cb7243a9f54f7dff79b5a7a879439993d458017f09e8d3f694098bc19e61fe54085138664abb51a5b328cf2c9ce5d59726fff5e1b7553c143d9e0493c51cab23ff2ecdad91bd72bb12b32f3b611f9a4225d\niv = 059685f59247eea5d3f2a1532cb9d6b2\nkey = 1bb4ed0e8435e20729f48c1b7e3af6e69e4cebf0731131cf\nmsg = 6d29dab6a0568c961ab3c825e0d89940cef06c63ade7e557cd3e92792eaf23c8cd5a0f029c63b1cdce4754ccfad7a73c7c9e50ffe081e9136f5e9a424077339de12ea43572afe1b034e833e5887763aa\nresult = valid\n\n# tcId = 86\n# zero padding\nct = 2c010faa25c68c3b30b8c1491c316d5f\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 87\n# zero padding\nct = 818454d433154a8e00e8f590b8a1c38c\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 88\n# zero padding\nct = 0a7423fae3f4c8d4633f839d36f2e9ff\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 89\n# zero padding\nct = a7cfcdabcc5a2736a2708c1cb0b61432e83f6e522c371e6e71bde539595b70b7\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 90\n# zero padding\nct = a7cfcdabcc5a2736a2708c1cb0b6143254d15f47701fa54f5957828f386e1d97\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 91\n# padding with 0xff\nct = 6ded36cc7603e514014dfb7199900676\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 92\n# padding with 0xff\nct = 839f772f8e5f50afdc02f954094869fe\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 93\n# padding with 0xff\nct = eefe3553c099c187929b287e54f95726\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 94\n# padding with 0xff\nct = a7cfcdabcc5a2736a2708c1cb0b61432d0531a2641d40467353542d79ce20ea8\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 95\n# padding with 0xff\nct = a7cfcdabcc5a2736a2708c1cb0b61432aaf08a090ecf66167ba5958100be7950\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 96\n# bit padding\nct = c0e402c8bbdda18c8ddd86470bd4b244\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 97\n# bit padding\nct = dc185d4572565e01131e471ec4c48125\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 98\n# bit padding\nct = 3ad1ddf3c3b320398785e6ec6544e9a2\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 99\n# bit padding\nct = a7cfcdabcc5a2736a2708c1cb0b614325876f90cfbbdbcd85e8252d37c44c638\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message",
+    " encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 100\n# bit padding\nct = a7cfcdabcc5a2736a2708c1cb0b61432d18f57216b0e6426d911998a0e44156b\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 101\n# padding longer than 1 block\nct = f1605abb4e6628347c616da350fe243043a8d7b6aea244ca013f45241d802213\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 102\n# padding longer than 1 block\nct = a5f027fb9514ec8844534d452c940feb2c1807f57ed628156cf753f2ab698356\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 103\n# padding longer than 1 block\nct = f346fbc9744d723c42bbb2a4c934cdd4f1019e58c226cb2491fed621271a38f3\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 104\n# padding longer than 1 block\nct = a7cfcdabcc5a2736a2708c1cb0b6143263eb325d36e13aa1d3dd1d7e071700104c7eb3e22e0859aa06296bc3194bb909\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 105\n# padding longer than 1 block\nct = a7cfcdabcc5a2736a2708c1cb0b61432219485d41584bd110a6d7a9cad472815d93921c48d4bcb509fdf2e63d7627c37\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 106\n# ANSI X.923 padding\nct = 215571a18a70140f3a0fd4c1b2dd6316\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 107\n# ANSI X.923 padding\nct = 2529985ec0ec3cf4bd22746e00d7bdc6\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 108\n# ANSI X.923 padding\nct = a7cfcdabcc5a2736a2708c1cb0b614329a8058657ac4a150e995cf83efccf051\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 109\n# ANSI X.923 padding\nct = a7cfcdabcc5a2736a2708c1cb0b614328a068626780ba600f880bd5323f8ac15\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 110\n# ISO 10126 padding\nct = 13e75f9ffe2afa81b9a2e7faf74aab6d\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 111\n# ISO 10126 padding\nct = a382197fe491f5c3f91b629dc47c3d58\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 112\n# ISO 10126 padding\nct = a7cfcdabcc5a2736a2708c1cb0b614320b842e5d6e32660263ff814a0277659f\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 113\n# ISO 10126 padding\nct = a7cfcdabcc5a2736a2708c1cb0b614321d2f736515cfe17921800eb392e0139d\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 114\n# padding longer than message\nct = f1605abb4e6628347c616da350fe2430\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 115\n# padding longer than message\nct = b3602ff0f797cbbdde35105d27e55b94\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 116\n# padding longer than message\nct = 0334c1bc34b597f60a639e74d8b45c4e\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 117\n# padding longer than message\nct = a7cfcdabcc5a2736a2708c1cb0b61432c3f9fe42d9715035bcda97d27405ced7\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 118\n# padding longer than message\nct = a7cfcdabcc5a2736a2708c1cb0b61432362b014a9ab",
+    "daf25ae1f6dfb99d03d9d\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 119\n#  invalid padding\nct = 97ab405b86c388f144cf74fbb9358493\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 120\n#  invalid padding\nct = 691f6009802f0fb4920928db7eca1349\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 121\n#  invalid padding\nct = a7cfcdabcc5a2736a2708c1cb0b61432a99fc96a6fa0c9fcb18de1672d74914d\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 122\n#  invalid padding\nct = a7cfcdabcc5a2736a2708c1cb0b61432dd1bb2e98102322fb1aa92c979d4c7c3\niv = a3fe6f76e8f582830bbe83574a7bb729\nkey = 9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n[ivSize = 128]\n[keySize = 256]\n\n# tcId = 123\n# empty message\nct = e7c166554d1bb32792c981fa674cc4d8\niv = eb38ef61717e1324ae064e86f1c3e797\nkey = 7bf9e536b66a215c22233fe2daaa743a898b9acb9f7802de70b40e3d6e43ef97\nmsg = \nresult = valid\n\n# tcId = 124\n# message size divisible by block size\nct = 299295be47e9f5441fe83a7a811c4aeb2650333e681e69fa6b767d28a6ccf282\niv = 9ec7b863ac845cad5e4673da21f5b6a9\nkey = 612e837843ceae7f61d49625faa7e7494f9253e20cb3adcea686512b043936cd\nmsg = cc37fae15f745a2f40e2c8b192f2b38d\nresult = valid\n\n# tcId = 125\n# message size divisible by block size\nct = a615a39ff8f59f82cf72ed13e1b01e32459700561be112412961365c7a0b58aa7a16d68c065e77ebe504999051476bd7\niv = e70d83a77a2ce722ac214c00837acedf\nkey = 96e1e4896fb2cd05f133a6a100bc5609a7ac3ca6d81721e922dadd69ad07a892\nmsg = 91a17e4dfcc3166a1add26ff0e7c12056e8a654f28a6de24f4ba739ceb5b5b18\nresult = valid\n\n# tcId = 126\n# message size divisible by block size\nct = ed3ed8ecdbabc0a8c06259e913f3ab9a1f1dc6d05e5dfdd9c80e1008f3423064d540681291bbd3e159820fee3ff190a68fe506d8ab9e62c8e7b3816093336dbc\niv = bd003c0a9d804c29f053a77cb380cb47\nkey = 649e373e681ef52e3c10ac265484750932a9918f28fb824f7cb50adab39781fe\nmsg = 39b447bd3a01983c1cb761b456d69000948ceb870562a536126a0d18a8e7e49b16de8fe672f13d0808d8b7d957899917\nresult = valid\n\n# tcId = 127\n# small plaintext size\nct = 42c0b89a706ed2606cd94f9cb361fa51\niv = 014d2e13dfbcb969ba3bb91442d52eca\nkey = e754076ceab3fdaf4f9bcab7d4f0df0cbbafbc87731b8f9b7cd2166472e8eebc\nmsg = 40\nresult = valid\n\n# tcId = 128\n# small plaintext size\nct = b90c326b72eb222ddb4dae47f2bc223c\niv = fae3e2054113f6b3b904aadbfe59655c\nkey = ea3b016bdd387dd64d837c71683808f335dbdc53598a4ea8c5f952473fafaf5f\nmsg = 6601\nresult = valid\n\n# tcId = 129\n# small plaintext size\nct = 567c45c5e6d570bef583d21cac43757d\niv = 203cd3e0068e43d38b6f2e48a188f252\nkey = 73d4709637857dafab6ad8b2b0a51b06524717fedf100296644f7cfdaae1805b\nmsg = f1d300\nresult = valid\n\n# tcId = 130\n# small plaintext size\nct = c45afe62fc9351ad0fc9b03bc2f3a91f\niv = abcf220eede012279c3a2d33295ff273\nkey = d5c81b399d4c0d1583a13da56de6d2dc45a66e7b47c24ab1192e246dc961dd77\nmsg = 2ae63cbf\nresult = valid\n\n# tcId = 131\n# small plaintext size\nct = 281fa533d0740cc6cdf94dd1a5f7402d\niv = 01373953578902909ae4f6cb0a72587c\nkey = 2521203fa0dddf59d837b2830f87b1aa61f958155df3ca4d1df2457cb4284dc8\nmsg = af3a015ea1\nresult = valid\n\n# tcId = 132\n# small plaintext size\nct = 3f3f39697bd7e88d85a14132be1cbc48\niv = 3fb0d5ecd06c71150748b599595833cb\nkey = 665a02bc265a66d01775091da56726b6668bfd903cb7af66fb1b78a8a062e43c\nmsg = 3f56935def3f\nresult = valid\n\n# tcId = 133\n# small plaintext size\nct = 379990d91557614836381d5026fa04a0\niv = 27a2db6114ece34fb6c23302d9ba07c6\nkey = facd75b22221380047305bc981f570e2a1af38928ea7e2059e3af5fc6b82b493\nmsg = 57bb86beed156f\nresult = valid\n\n# tcId = 134\n# small plaintext size\nct = 7ecefe24caa78a68f4031d40fdb9a43a\niv = 9b2b631e3f24bdc814a14abb3416059e\nkey = 505aa98819809ef63b9a368a1e8bc2e922da45b03ce02d9a7966b15006dba2d5\nmsg = 2e4e7ef728fe11af\nresult = valid\n\n# tcId = 135\n# small plaintext size\nct = ffe4ec8baf4af40ab2e7f4d6193fae9c\niv = 92cfc4eb146b18b73fc76483fc5e1229\nkey = f942093842808ba47f64e427f7351dde6b9546e66de4e7d60aa6f328182712cf\nmsg = 852a21d92848e627c7\nresult = valid\n\n# tcId = 136\n# small plaintext size\nct = ef96215e7950e7be8aae78b9ec8aaf39\niv = 4ceed8dcb75b6259dad737bdef96f099\nkey = 64be162b39c6e5f1fed9c32d9f674d9a8cde6eaa2443214d86bd4a1fb53b81b4\nmsg = 195a3b292f93baff0a2c\nresult = valid\n\n# tcId = 137\n# small plaintext size\nct = 4ed0eac75b05868078303875f82fb4f0\niv = 2d4cead3f1120a2b4b59419d04951e20\nkey = b259a555d44b8a20c5489e2f38392ddaa6be9e35b9833b67e1b5fdf6cb3e4c6c\nmsg = afd73117330c6e8528a6e4\nresult = valid\n\n# tcId = 138\n# small plaintext size\nct = f4d298caea7c390fc8c7f558f584f852\niv = a10392634143c2a3332fa0fb3f72200a\nkey = 2c6fc62daa77ba8c6881b3dd6989898fef646663cc7b0a3db8228a707b85f2dc\nmsg = 0ff54d6b6759120c2e8a51e3\nresult = valid\n\n# tcId = 139\n# small plaintext size\nct = 5e1c00e2ec829f92b87c6adf5c25262d\niv = 38b916a7ad3a9251ae3bd8865ca3a688\nkey = abab815d51df29f740e4e2079fb798e0152836e6ab57d1536ae8929e52c06eb8\nmsg = f0058d412a104e53d820b95a7f\nresult = valid\n\n# tcId = 140\n# small plaintext size\nct = bf3a04ddb2dbfe7c6dc9e15aa67be25d\niv = bfcc3ac44d12e42d780c1188ac64b57f\nkey = 3d5da1af83f7287458bff7a7651ea5d8db72259401333f6b82096996dd7eaf19\nmsg = aacc36972f183057919ff57b49e1\nresult = valid\n\n# tcId = 141\n# small plaintext size\nct = fdcfa77f5bd09326b4c11f9281b72474\niv = 35bc82e3503b95044c6406a8b2c2ecff\nkey = c19bdf314c6cf64381425467f42aefa17c1cc9358be16ce31b1d214859ce86aa\nmsg = 5d066a92c300e9b6ddd63a7c13ae33\nresult = valid\n\n# tcId = 142\n# plaintext size > 16\nct = fbea776fb1653635f88e2937ed2450ba4e9063e96d7cdba04928f01cb85492fe\niv = 4b74bd981ea9d074757c3e2ef515e5fb\nkey = 73216fafd0022d0d6ee27198b2272578fa8f04dd9f44467fbb6437aa45641bf7\nmsg = d5247b8f6c3edcbfb1d591d13ece23d2f5\nresult = valid\n\n# tcId = 143\n# plaintext size > 16\nct = 3a79bb6084c7116b58afe52d7181a0aacee1caa11df959090e2e7b0073d74817\niv = 9a1d8ccc24c5e4d3995480af236be103\nkey = c2039f0d05951aa8d9fbdf68be58a37cf99bd1afcedda286a9db470c3729ca92\nmsg = ed5b5e28e9703bdf5c7b3b080f2690a605fcd0d9\nresult = valid\n\n# tcId = 144\n# plaintext size > 16\nct = 642b11efb79b49e5d038bc7aa29b8c6c3ce0bf11c3a69670eb565799908be66d\niv = 400aab92803bcbb44a96ef789655b34e\nkey = 4f097858a1aec62cf18f0966b2b120783aa4ae9149d3213109740506ae47adfe\nmsg = ee53d8e5039e82d9fcca114e375a014febfea117a7e709d9008d43858e3660\nresult = valid\n\n# tcId = 145\n# plaintext size > 16\nct = a9b051354f0cf61f11921b330e60f996de796aeb68140a0f9c5962e1f48e4805262fb6f53b26d9bb2fa0e359efe14734\niv = 6eedf45753ffe38f2407fbc28ab5959c\nkey = 5f99f7d60653d79f088dd07ef306b65e057d36e053fa1c9f6854425c019fd4df\nmsg = fcc9212c23675c5d69a1266c77389bc955e453daba20034aabbcd502a1b73e05af30f8b7622abdbc\nresult = valid\n\n# tcId = 146\n# plaintext size > 16\nct = 5074f46f1a6d0eeff070d623172eb15bbfc83e7d16466a00c9da5f4545eecf44adbf60cf9ac9aa1a3ec5eca22d4a34a7b21ca44d214c9d04ab1cb0b2c07001de9adb46f3c12f8f48436b516a409bf6cbdf1871dee3115d5cbb7943558b68867e\niv = f88551c6aa197f9ad80251c2e32d7663\nkey = 95aaa5df4ccb529e9b2dc",
+    "929e770c1f419f8e8933bfb36f632f532b3dcad2ba6\nmsg = f5735567b7c8312f116517788b091cc6cb1d474b010a77910154fd11c3b2f0cd19f713b63d66492e8cc7ee8ad714783f46c305a26416e11ff4b99ec5ce2550593cc5ec1b86ba6a66d10f82bdff827055\nresult = valid\n\n# tcId = 147\n# zero padding\nct = e07558d746574528fb813f34e3fb7719\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 148\n# zero padding\nct = c01af61276368818a8295f7d4b5bb2fd\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 149\n# zero padding\nct = 97dd9716f06be49160399a5b212250ae\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 150\n# zero padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce783bb4b4e18d7c646f38e0bb8ff92896\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 151\n# zero padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce64679a46621b792f643542a735f0bbbf\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 152\n# padding with 0xff\nct = c007ddffb76b95208505fe7f3be96172\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 153\n# padding with 0xff\nct = e9b7719c4c2b9fa6b94cb50e87b28156\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 154\n# padding with 0xff\nct = 77b31f474c4bd489dbadd532643d1fa5\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 155\n# padding with 0xff\nct = 8881e9e02fa9e3037b397957ba1fb7cea0166e9e1c0122cb2e2983fc0fac7176\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 156\n# padding with 0xff\nct = 8881e9e02fa9e3037b397957ba1fb7ce6f0effa789cbb0b875cc53cc8f7b3caf\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 157\n# bit padding\nct = 4dd5f910c94700235c9ed239160e34e2\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 158\n# bit padding\nct = 94d18b5923f8f3608ae7ad494fbb517e\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 159\n# bit padding\nct = 0c92886dbcb030b873123a25d224da42\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 160\n# bit padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce851be67798a2937cd6681165da6dce03\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 161\n# bit padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce45658a37aaebc51098866b0894007e8e\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 162\n# padding longer than 1 block\nct = 524236e25956e950713bec0d3d579068f34e4d18c4ccab081317dae526fe7fca\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 163\n# padding longer than 1 block\nct = d29eb845640c3a8878f51bc50e290aa4a65a34a93728fe8f82fdb8d3d2b7c648\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 164\n# padding longer than 1 block\nct = c34563be2952277c0f5c67ae1d6f847118730dd7f6a502ceef3c4bce5999f7aa\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padd",
+    "ing during decryption.\n\n# tcId = 165\n# padding longer than 1 block\nct = 8881e9e02fa9e3037b397957ba1fb7cec0f74a1aa92fd9c96f9d15d193d1695c1eb33486e269277612f90f509f0535c2\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 166\n# padding longer than 1 block\nct = 8881e9e02fa9e3037b397957ba1fb7ce151ade309ec5200bacdd83b57ce794cd2b3bf9f8957def829e8465f7db266f9e\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 167\n# ANSI X.923 padding\nct = fb38cbef13f1d5be9c0ac7ed9cbe023c\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 168\n# ANSI X.923 padding\nct = 18cf8988abe9a2463a3a75db1fac8bcc\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 169\n# ANSI X.923 padding\nct = 8881e9e02fa9e3037b397957ba1fb7cee16d6fc4b4d3cdf6f915996e437fd4cc\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 170\n# ANSI X.923 padding\nct = 8881e9e02fa9e3037b397957ba1fb7cea8f41f61ead6e9936cbe7ee5a1163b9b\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 171\n# ISO 10126 padding\nct = a05c14da0109093c195b4998812fe150\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 172\n# ISO 10126 padding\nct = c477877250c8e4ca2869f35c4757cdb4\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 173\n# ISO 10126 padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce69f57c6e99c7b9df7d4879ccd15caf3d\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 174\n# ISO 10126 padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce77f89a247c928f147748ce6bc8fc4b67\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 175\n# padding longer than message\nct = 524236e25956e950713bec0d3d579068\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 176\n# padding longer than message\nct = e03b6f2ae1c963b6dfa40b42d34314b7\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 177\n# padding longer than message\nct = df14f4cbbccca57b9727d68270a1b6c1\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 303132333435363738396162636465\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 178\n# padding longer than message\nct = 8881e9e02fa9e3037b397957ba1fb7ceea228bf1edd41c390e2eef140142bc00\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 179\n# padding longer than message\nct = 8881e9e02fa9e3037b397957ba1fb7ce3937e0e9abf7f672a34a500ba8e9099a\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 180\n#  invalid padding\nct = 32ac6057df2a5d1e2e5131348c6ebc4e\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = \nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 181\n#  invalid padding\nct = df4a7c3b9f4756d30fca0d18e9b28960\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 6162636465666768\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 182\n#  invalid padding\nct = 8881e9e02fa9e3037b397957ba1fb7ceae2855c47c7988873d57f901e049494b\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 30313233343536373839414243444546\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n# tcId = 18",
+    "3\n#  invalid padding\nct = 8881e9e02fa9e3037b397957ba1fb7ce0714c8de200b27ac91d9257fc93c13be\niv = f010f61c31c9aa8fa0d5be5f6b0f2f70\nkey = 7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a\nmsg = 3031323334353637383941424344454647\nresult = invalid\n# The ciphertext in this test vector is the message encrypted with an invalid or\n# unexpected padding. This allows to find implementations that are not properly\n# checking the padding during decryption.\n\n",
+};
+static const size_t kLen53 = 65998;
+
+static const char *kData54[] = {
+    "# Imported from Wycheproof's aes_gcm_siv_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: AES-GCM\n# Generator version: 0.4\n\n[ivSize = 96]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 1\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = \niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = \nresult = valid\ntag = dc20e2d83f25705bb49e439eca56de25\n\n# tcId = 2\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = b5d839330ac7b786\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0100000000000000\nresult = valid\ntag = 578782fff6013b815b287c22493a364c\n\n# tcId = 3\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 7323ea61d05932260047d942\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 010000000000000000000000\nresult = valid\ntag = a4978db357391a0bc4fdec8b0d106639\n\n# tcId = 4\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 743f7c8077ab25f8624e2e948579cf77\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 01000000000000000000000000000000\nresult = valid\ntag = 303aaf90f6fe21199c6068577437a0c4\n\n# tcId = 5\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 84e07e62ba83a6585417245d7ec413a9fe427d6315c09b57ce45f2e3936a9445\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0100000000000000000000000000000002000000000000000000000000000000\nresult = valid\ntag = 1a8e45dcd4578c667cd86847bf6155ff\n\n# tcId = 6\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 3fd24ce1f5a67b75bf2351f181a475c7b800a5b4d3dcf70106b1eea82fa1d64df42bf7226122fa92e17a40eeaac1201b\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000\nresult = valid\ntag = 5e6e311dbf395d35b0fe39c2714388f8\n\n# tcId = 7\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 2433668f1058190f6d43e360f4f35cd8e475127cfca7028ea8ab5c20f7ab2af02516a2bdcbc08d521be37ff28c152bba36697f25b4cd169c6590d1dd39566d3f\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nresult = valid\ntag = 8a263dd317aa88d56bdf3936dba75bb8\n\n# tcId = 8\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 1e6daba35669f427\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0200000000000000\nresult = valid\ntag = 3b0a1a2560969cdf790d99759abd1508\n\n# tcId = 9\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 296c7889fd99f41917f44620\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 020000000000000000000000\nresult = valid\ntag = 08299c5102745aaa3a0c469fad9e075a\n\n# tcId = 10\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = e2b0c5da79a901c1745f700525cb335b\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 02000000000000000000000000000000\nresult = valid\ntag = 8f8936ec039e4e4bb97ebd8c4457441f\n\n# tcId = 11\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 620048ef3c1e73e57e02bb8562c416a319e73e4caac8e96a1ecb2933145a1d71\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0200000000000000000000000000000003000000000000000000000000000000\nresult = valid\ntag = e6af6a7f87287da059a71684ed3498e1\n\n# tcId = 12\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 50c8303ea93925d64090d07bd109dfd9515a5a33431019c17d93465999a8b0053201d723120a8562b838cdff25bf9d1e\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nresult = valid\ntag = 6a8cc3865f76897c2e4b245cf31c51f2\n\n# tcId = 13\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 2f5c64059db55ee0fb847ed513003746aca4e61c711b5de2e7a77ffd02da42feec601910d3467bb8b36ebbaebce5fba30d36c95f48a3e7980f0e7ac299332a80\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000\nresult = valid\ntag = cdc46ae475563de037001ef84ae21744\n\n# tcId = 14\n# draft-irtf-cfrg-gcmsiv-06\naad = 010000000000000000000000\nct = a8fe3e87\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 02000000\nresult = valid\ntag = 07eb1f84fb28f8cb73de8e99e2f48a14\n\n# tcId = 15\n# draft-irtf-cfrg-gcmsiv-06\naad = 010000000000000000000000000000000200\nct = 6bb0fecf5ded9b77f902c7d5da236a4391dd0297\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 0300000000000000000000000000000004000000\nresult = valid\ntag = 24afc9805e976f451e6d87f6fe106514\n\n# tcId = 16\n# draft-irtf-cfrg-gcmsiv-06\naad = 0100000000000000000000000000000002000000\nct = 44d0aaf6fb2f1f34add5e8064e83e12a2ada\niv = 030000000000000000000000\nkey = 01000000000000000000000000000000\nmsg = 030000000000000000000000000000000400\nresult = valid\ntag = bff9b2ef00fb47920cc72a0c0f13b9fd\n\n# tcId = 17\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = \niv = f46e44bb3da0015c94f70887\nkey = e66021d5eb8e4f4066d4adb9c33560e4\nmsg = \nresult = valid\ntag = a4194b79071b01a87d65f706e3949578\n\n# tcId = 18\n# draft-irtf-cfrg-gcmsiv-06\naad = 46bb91c3c5\nct = af60eb\niv = bae8e37fc83441b16034566b\nkey = 36864200e0eaf5284d884a0e77d31646\nmsg = 7a806c\nresult = valid\ntag = 711bd85bc1e4d3e0a462e074eea428a8\n\n# tcId = 19\n# draft-irtf-cfrg-gcmsiv-06\naad = fc880c94a95198874296\nct = bb93a3e34d3c\niv = afc0577e34699b9e671fdd4f\nkey = aedb64a6c590bc84d1a5e269e4b47801\nmsg = bdc66f146545\nresult = valid\ntag = d6a9c45545cfc11f03ad743dba20f966\n\n# tcId = 20\n# draft-irtf-cfrg-gcmsiv-06\naad = 046787f3ea22c127aaf195d1894728\nct = 4f37281f7ad12949d0\niv = 275d1ab32f6d1f0434d8848c\nkey = d5cc1fd161320b6920ce07787f86743b\nmsg = 1177441f195495860f\nresult = valid\ntag = 1d02fd0cd174c84fc5dae2f60f52fd2b\n\n# tcId = 21\n# draft-irtf-cfrg-gcmsiv-06\naad = c9882e5386fd9f92ec489c8fde2be2cf97e74e93\nct = f54673c5ddf710c745641c8b\niv = 9e9ad8780c8d63d0ab4149c0\nkey = b3fed1473c528b8426a582995929a149\nmsg = 9f572c614b4745914474e7c7\nresult = valid\ntag = c1dc2f871fb7561da1286e655e24b7b0\n\n# tcId = 22\n# draft-irtf-cfrg-gcmsiv-06\naad = 2950a70d5a1db2316fd568378da107b52b0da55210cc1c1b0a\nct = c9ff545e07b88a015f05b274540aa1\niv = ac80e6f61455bfac8308a2d4\nkey = 2d4ed87da44102952ef94b02b805249b\nmsg = 0d8c8451178082355c9e940fea2f58\nresult = valid\ntag = 83b3449b9f39552de99dc214a1190b0b\n\n# tcId = 23\n# draft-irtf-cfrg-gcmsiv-06\naad = 1860f762ebfbd08284e421702de0de18baa9c9596291b08466f37de21c7f\nct = 6298b296e24e8cc35dce0bed484b7f30d580\niv = ae06556fb6aa7890bebc18fe\nkey = bde3b2f204d1e9f8b06bc47f9745b3d1\nmsg = 6b3db4da3d57aa94842b9803a96e07fb6de7\nresult = valid\ntag = 3e377094f04709f64d7b985310a4db84\n\n# tcId = 24\n# draft-irtf-cfrg-gcmsiv-06\naad = 7576f7028ec6eb5ea7e298342a94d4b202b370ef9768ec6561c4fe6b7e7296fa859c21\nct = 391cc328d484a4f46406181bcd62efd9b3ee197d05\niv = 6245709fb18853f68d833640\nkey = f901cfe8a69615a93fdf7a98cad48179\nmsg = e42a3c02c25b64869e146d7b233987bddfc240871d\nresult = valid\ntag = 2d15506c84a9edd65e13e9d24a2a6e70\n\n# tcId = 25\naad = \nct = \niv = 438a547a94ea88dce46c6c85\nkey = bedcfb5a011ebc84600fcb296c15af0d\nmsg = \nresult = valid\ntag = 596d0538e48526be1c991e40cc031073\n\n# tcId = 26\naad = \nct = 4f\niv = b30c084727ad1c592ac21d12\nkey = 384ea416ac3c2f51a76e7d8226346d4e\nmsg = 35\nresult = valid\ntag = 8b2b805fc0885e2b470d9dbe6cb15ed3\n\n# tcId = 27\naad = \nct = 04c7a55f97846e54\niv = b5e006ded553110e6dc56529\nkey = cae31cd9f55526eb038241fc44cac1e5\nmsg = d10989f2c52e94ad\nresult = valid\ntag = 48168ff846356c33032c719b518f18a8\n\n# tcId = 28\naad = \nct = fd9521041b0397a15b0070b93f48a9\niv = ecb0c42f7000ef0e6f95f24d\nkey = dd6197cd63c963919cf0c273ef6b28bf\nmsg = 4dcc1485365866e25ac3f2ca6aba97\nresult = valid\ntag = 09df91414578f7faf757d04ee26ab901\n\n# tcId = 29\naad = \nct = 6eb905287ddfafc32f6b1c10046c089f\niv = 0e1666f2dc652f7708fb8f0d\nkey = ffdf4228361ea1f8165852136b3480f7\nmsg = 25b12e28ac0ef6ead0226a3b2288c800\nresult = valid\ntag = 4ff9f939a77c34b0cb1ee75fcb0dd29a\n\n# tcId = 30\naad = \nct = 6f62bd09d4f36f73e289ab6dd114727fe3\niv = 965ff6643116ac1443a2dec7\nkey = c15ed227dd2e237ecd087eaaaad19ea4\nmsg = fee62fde973fe025ad6b322dcdf3c63fc7\nresult = valid\ntag = ea727c084db2bc948de0928edddd7fcf\n\n# tcId = 31\naad = \nct = 80133a4bea7311f0d3c9835144c37c4ef0ef20c8f",
+    "2e36be1\niv = fbbc04fd6e025b7193eb57f6\nkey = a8ee11b26d7ceb7f17eaa1e4b83a2cf6\nmsg = c08f085e6a9e0ef3636280c11ecfadf0c1e72919ffc17eaf\nresult = valid\ntag = b92f47c1af6713e14fbdf60efebb50c6\n\n# tcId = 32\naad = \nct = 778b308e4ca17607df36c0b94695bc64603173b814701a9f69147b42478a0b1f\niv = a2dbe708db51c68ef02994a6\nkey = 7519588f30f7f08ff98e1beee6a2a783\nmsg = 1851956319256ebb0f9ccaf325a24abfc5c3e90b055e57cdc0c7ab2165ae03b1\nresult = valid\ntag = b75c98952c0aa11958a55c9c2ecf33f5\n\n# tcId = 33\naad = 30\nct = 173ba6370171be47dbb6163a63a3b725\niv = 4bad10c6d84fd43fd13ad36f\nkey = a5b5b6bae45b741fe4663890098f326a\nmsg = 127b150080ec0bc7704e26f4ab11abb6\nresult = valid\ntag = 53aefed6e971d5a1f435f0730a6dd0fd\n\n# tcId = 34\naad = 743e\nct = 959f0ff12481dedc4302ad7a904f9486\niv = 2186a3091237adae83540e24\nkey = 0cecb9f512932d68e2c7c0bc4bd621c8\nmsg = 437aeb94d842283ba57bb758e3d229f0\nresult = valid\ntag = 0215be2ab9b0672a7b82893891057c9c\n\n# tcId = 35\naad = 25591707c004f506f4b51e85e29f6a\nct = 8ae3a16a237f1358ac8cfeb5f4cc2818\niv = 0c908e58cddad69dea1a32c3\nkey = 55e04c122780be52ed9328928039008c\nmsg = 26eb70672eef03667b34cc7d0df05872\nresult = valid\ntag = 28f5aa8a34a9f7c01c17759d142b1bae\n\n# tcId = 36\naad = c07092d799dac2b4c05fbddd04743c34\nct = d5220f6a49d1e4c10d38c77c8156ebd0\niv = c30968c967e53505621628db\nkey = 5f0a1b5f8f8673d566ec7f54e7dca4f2\nmsg = f6538476daf04524cf134309dd84e187\nresult = valid\ntag = 80b50f526286dad22d40984636f0e9ce\n\n# tcId = 37\naad = 3ea12d80f40f34f812479d2ecc13d2d6df\nct = 3e771b9376e1d1cde3d9b73349c958bc\niv = a51c37f467893c1608e56274\nkey = 671a70e883fb0611dffd0b1dd9b8cca2\nmsg = 3baf3edf04dc0c97aae081cdeb08021d\nresult = valid\ntag = ebd3ea678a1e87839a4356584ea89bac\n\n# tcId = 38\naad = 5189ea6f39b2a78c0202fdff146c5cc6bdc7491d4786f80c6c6aef65634c05da\nct = 05b568a589d0a77a8ee9c6f06415c6b6\niv = 52c20979cdaaade573dba650\nkey = 63f03172505d90e94900125cb8a4b0dd\nmsg = 602c98997ee03fd11ce00e92de193977\nresult = valid\ntag = 91ba5089dffb7538199c441728d5f84a\n\n# tcId = 39\n# Testing for ctr overflow\naad = 395f4091b410c373073bcdc79e02d3af\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 00112233445566778899aabbccddeeff\nmsg = 43488548d88e6f774bcd2d52c18fbcc933a4e9a9613ff3edbe959ec59522adc098b3133b8d17b9e9dad631ad33752c95\nresult = valid\ntag = 00000000000000000000000000000000\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 40\n# Testing for ctr overflow\naad = 616b2dff4d665e5f7ab890723dd981b1\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = f012c6a7eb0e8af5bc45e015e7680a693dc709b95383f6a94babec1bc36e4be3cf4f55a31a94f11c6c3f90eed99682bc\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 41\n# Testing for ctr overflow\naad = 387a8997605fd04ae8951c4759087864\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 030303030303030303030303\nkey = 00112233445566778899aabbccddeeff\nmsg = 71ceee58179d6fb968521e9594dbf98cc0040f6aa38fe873c32a9b122d6cbfd51aa4778b3f4f37be7348690d97e2468b\nresult = valid\ntag = fefffffffefffffffefffffffeffffff\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 42\n# Testing for ctr overflow\naad = 6783b0d5e9d8a2a7274065797097d1ae\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 060606060606060606060606\nkey = 00112233445566778899aabbccddeeff\nmsg = 2e14f9e9a09ea204557367898a80dcad117af3666bea25762b70633a9f3614fbe631ba617c371fd5566d5e613496e69f\nresult = valid\ntag = ffffff7f00112233445566778899aabb\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 43\n# Testing for ctr overflow\naad = 2933810c146f4f7dd146dd43f35199c6\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 00112233445566778899aabbccddeeff\nmsg = 27fac75879c9d87cd52a0793137ba792f6f145148158eb538f2081e09cd0315986a7025045ecbb2ca1bb18a17bfcd567\nresult = valid\ntag = ffffffffffffff7f0011223344556677\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 44\n# Flipped bit 0 in tag\naad = 27dd62060507dae87c4f93f391ba15f9\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 45\n# Flipped bit 0 in tag\naad = 9ea3371e258288d5a01b15384e2c99ee\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 46\n# Flipped bit 0 in tag\naad = ce24e3ec0fe7b8550d621b71fdb5d0eb\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 47\n# Flipped bit 7 in tag\naad = 1471f354b359c235117febba854a823b\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 48\n# Flipped bit 7 in tag\naad = 11f820294fc9d13f1895d2fb5509913b\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 49\n# Flipped bit 8 in tag\naad = 45e7257b814f09de44177b27b914822f\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 50\n# Flipped bit 8 in tag\naad = 4c49780b5438c4a7ea9795b9856fdae1\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 51\n# Flipped bit 8 in tag\naad = ecc2f2f4142837a34f9cd1fa030a5d7f\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 52\n# Flipped bit 31 in tag\naad = 69c7f5605da8e0684990b087411f8cf5\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 53\n# Flipped bit 31 in tag\naad = 20b346be60e7e97588bf504ce707ce0b\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 54\n# Flipped bit 63 in tag\naad = 19b298f3a061a73cb774da927ce11ca2\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 55\n# Flipped bit 63 in tag\naad = bff8c631e61c18a050a523ad4a750a20\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 56\n# Flipped bit 64 in tag\naad = 7b6171302b689c926852163e310f08d4\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 57\n# Flipped bit 97 in tag\naad = 555036128fa18ecadd090cb772ac0bf3\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 58\n# Flipped bit",
+    " 97 in tag\naad = a5b43b8e1dbb2bfbda1b625fee4064a7\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 59\n# Flipped bit 120 in tag\naad = ae47cc5d7681dd480c23469c5519b647\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 60\n# Flipped bit 120 in tag\naad = d53dd677184702eaa660f1349195fc04\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 61\n# Flipped bit 120 in tag\naad = dc78584e4599dd4b2fb333db2f9ccb95\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 62\n# Flipped bit 121 in tag\naad = 0bfd9271e79153a8afdb7f3d96fe446f\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 63\n# Flipped bit 121 in tag\naad = 1e0537a95b7200134d0b440657d50fd1\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 64\n# Flipped bit 121 in tag\naad = 7633155df35857258d23b0651d60847c\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 65\n# Flipped bit 126 in tag\naad = ab0a064b473de43598adf81ee297d856\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 0fed395814f1750a\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 66\n# Flipped bit 127 in tag\naad = f62bdc3f4fcb699ee12f6e87dcc704cb\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 67\n# Flipped bit 127 in tag\naad = 1320051031807b8f44e9d2cb1ec6aa92\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 03c0e39b77bd62d32568f4c86c90bfdb\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 68\n# Flipped bit 127 in tag\naad = 329b813d3ae2225d3e15f97a28037bcc\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 69\n# Flipped bit 0..127 in tag\naad = edc723bedd0078696acdea005c74b841\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = 63995888995b338c\nresult = invalid\ntag = 00000000000000000000000000000000\n\n[ivSize = 96]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 70\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = \niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = \nresult = valid\ntag = 07f5f4169bbf55a8400cd47ea6fd400f\n\n# tcId = 71\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = c2ef328e5c71c83b\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0100000000000000\nresult = valid\ntag = 843122130f7364b761e0b97427e3df28\n\n# tcId = 72\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 9aab2aeb3faa0a34aea8e2b1\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 010000000000000000000000\nresult = valid\ntag = 8ca50da9ae6559e48fd10f6e5c9ca17e\n\n# tcId = 73\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 85a01b63025ba19b7fd3ddfc033b3e76\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 01000000000000000000000000000000\nresult = valid\ntag = c9eac6fa700942702e90862383c6c366\n\n# tcId = 74\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 4a6a9db4c8c6549201b9edb53006cba821ec9cf850948a7c86c68ac7539d027f\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0100000000000000000000000000000002000000000000000000000000000000\nresult = valid\ntag = e819e63abcd020b006a976397632eb5d\n\n# tcId = 75\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = c00d121893a9fa603f48ccc1ca3c57ce7499245ea0046db16c53c7c66fe717e39cf6c748837b61f6ee3adcee17534ed5\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000\nresult = valid\ntag = 790bc96880a99ba804bd12c0e6a22cc4\n\n# tcId = 76\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = c2d5160a1f8683834910acdafc41fbb1632d4a353e8b905ec9a5499ac34f96c7e1049eb080883891a4db8caaa1f99dd004d80487540735234e3744512c6f90ce\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nresult = valid\ntag = 112864c269fc0d9d88c61fa47e39aa08\n\n# tcId = 77\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 1de22967237a8132\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0200000000000000\nresult = valid\ntag = 91213f267e3b452f02d01ae33e4ec854\n\n# tcId = 78\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 163d6f9cc1b346cd453a2e4c\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 020000000000000000000000\nresult = valid\ntag = c1a4a19ae800941ccdc57cc8413c277f\n\n# tcId = 79\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = c91545823cc24f17dbb0e9e807d5ec17\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 02000000000000000000000000000000\nresult = valid\ntag = b292d28ff61189e8e49f3875ef91aff7\n\n# tcId = 80\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 07dad364bfc2b9da89116d7bef6daaaf6f255510aa654f920ac81b94e8bad365\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0200000000000000000000000000000003000000000000000000000000000000\nresult = valid\ntag = aea1bad12702e1965604374aab96dbbc\n\n# tcId = 81\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = c67a1f0f567a5198aa1fcc8e3f21314336f7f51ca8b1af61feac35a86416fa47fbca3b5f749cdf564527f2314f42fe25\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000\nresult = valid\ntag = 03332742b228c647173616cfd44c54eb\n\n# tcId = 82\n# draft-irtf-cfrg-gcmsiv-06\naad = 01\nct = 67fd45e126bfb9a79930c43aad2d36967d3f0e4d217c1e551f59727870beefc98cb933a8fce9de887b1e40799988db1fc3f91880ed405b2dd298318858467c89\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000\nresult = valid\ntag = 5bde0285037c5de81e5b570a049b62a0\n\n# tcId = 83\n# draft-irtf-cfrg-gcmsiv-06\naad = 010000000000000000000000\nct = 22b3f4cd\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 02000000\nresult = valid\ntag = 1835e517741dfddccfa07fa4661b74cf\n\n# tcId = 84\n# draft-irtf-cfrg-gcmsiv-06\naad = 010000000000000000000000000000000200\nct = 43dd0163cdb48f9fe3212bf61b201976067f342b\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 0300000000000000000000000000000004000000\nresult = valid\ntag = b879ad976d8242acc188ab59cabfe307\n\n# tcId = 85\n# draft-irtf-cfrg-gcmsiv-06\naad = 0100000000000000000000000000000002000000\nct = 462401724b5ce6588d5a54aae5375513a075\niv = 030000000000000000000000\nkey = 0100000000000000000000000000000000000000000000000000000000000000\nmsg = 030000000000000000000000000000000400\nresult = valid\ntag = cfcdf5042112aa29685c912fc2056543\n\n# tcId = 86\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = \niv = e0",
+    "eaf5284d884a0e77d31646\nkey = e66021d5eb8e4f4066d4adb9c33560e4f46e44bb3da0015c94f7088736864200\nmsg = \nresult = valid\ntag = 169fbb2fbf389a995f6390af22228a62\n\n# tcId = 87\n# draft-irtf-cfrg-gcmsiv-06\naad = 4fbdc66f14\nct = 0eaccb\niv = e4b47801afc0577e34699b9e\nkey = bae8e37fc83441b16034566b7a806c46bb91c3c5aedb64a6c590bc84d1a5e269\nmsg = 671fdd\nresult = valid\ntag = 93da9bb81333aee0c785b240d319719d\n\n# tcId = 88\n# draft-irtf-cfrg-gcmsiv-06\naad = 6787f3ea22c127aaf195\nct = a254dad4f3f9\niv = 2f6d1f0434d8848c1177441f\nkey = 6545fc880c94a95198874296d5cc1fd161320b6920ce07787f86743b275d1ab3\nmsg = 195495860f04\nresult = valid\ntag = 6b62b84dc40c84636a5ec12020ec8c2c\n\n# tcId = 89\n# draft-irtf-cfrg-gcmsiv-06\naad = 489c8fde2be2cf97e74e932d4ed87d\nct = 0df9e308678244c44b\niv = 9f572c614b4745914474e7c7\nkey = d1894728b3fed1473c528b8426a582995929a1499e9ad8780c8d63d0ab4149c0\nmsg = c9882e5386fd9f92ec\nresult = valid\ntag = c0fd3dc6628dfe55ebb0b9fb2295c8c2\n\n# tcId = 90\n# draft-irtf-cfrg-gcmsiv-06\naad = 0da55210cc1c1b0abde3b2f204d1e9f8b06bc47f\nct = 8dbeb9f7255bf5769dd56692\niv = 5c9e940fea2f582950a70d5a\nkey = a44102952ef94b02b805249bac80e6f61455bfac8308a2d40d8c845117808235\nmsg = 1db2316fd568378da107b52b\nresult = valid\ntag = 404099c2587f64979f21826706d497d5\n\n# tcId = 91\n# draft-irtf-cfrg-gcmsiv-06\naad = f37de21c7ff901cfe8a69615a93fdf7a98cad481796245709f\nct = 793576dfa5c0f88729a7ed3c2f1bff\niv = 6de71860f762ebfbd08284e4\nkey = 9745b3d1ae06556fb6aa7890bebc18fe6b3db4da3d57aa94842b9803a96e07fb\nmsg = 21702de0de18baa9c9596291b08466\nresult = valid\ntag = b3080d28f6ebb5d3648ce97bd5ba67fd\n\n# tcId = 92\n# draft-irtf-cfrg-gcmsiv-06\naad = 9c2159058b1f0fe91433a5bdc20e214eab7fecef4454a10ef0657df21ac7\nct = 857e16a64915a787637687db4a9519635cdd\niv = 028ec6eb5ea7e298342a94d4\nkey = b18853f68d833640e42a3c02c25b64869e146d7b233987bddfc240871d7576f7\nmsg = b202b370ef9768ec6561c4fe6b7e7296fa85\nresult = valid\ntag = 454fc2a154fea91f8363a39fec7d0a49\n\n# tcId = 93\n# draft-irtf-cfrg-gcmsiv-06\naad = 734320ccc9d9bbbb19cb81b2af4ecbc3e72834321f7aa0f70b7282b4f33df23f167541\nct = 626660c26ea6612fb17ad91e8e767639edd6c9faee\niv = 688089e55540db1872504e1c\nkey = 3c535de192eaed3822a2fbbe2ca9dfc88255e14a661b8aa82cc54236093bbc23\nmsg = ced532ce4159b035277d4dfbb7db62968b13cd4eec\nresult = valid\ntag = 9d6c7029675b89eaf4ba1ded1a286594\n\n# tcId = 94\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = f3f80f2cf0cb2dd9c5984fcda908456cc537703b5ba70324a6793a7bf218d3ea\niv = 000000000000000000000000\nkey = 0000000000000000000000000000000000000000000000000000000000000000\nmsg = 000000000000000000000000000000004db923dc793ee6497c76dcc03a98e108\nresult = valid\ntag = ffffffff000000000000000000000000\n\n# tcId = 95\n# draft-irtf-cfrg-gcmsiv-06\naad = \nct = 18ce4f0b8cb4d0cac65fea8f79257b20888e53e72299e56d\niv = 000000000000000000000000\nkey = 0000000000000000000000000000000000000000000000000000000000000000\nmsg = eb3640277c7ffd1303c7a542d02d3e4c0000000000000000\nresult = valid\ntag = ffffffff000000000000000000000000\n\n# tcId = 96\naad = \nct = \niv = 4da5bf8dfd5852c1ea12379d\nkey = 80ba3192c803ce965ea371d5ff073cf0f43b6a2ab576b208426e11409c09b9b0\nmsg = \nresult = valid\ntag = 181720f6ecdcdd332c89d20e09f11b0f\n\n# tcId = 97\naad = \nct = fa\niv = 99e23ec48985bccdeeab60f1\nkey = cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273\nmsg = 2a\nresult = valid\ntag = 868ee11a7fe13996ac26962a7e861962\n\n# tcId = 98\naad = \nct = c32210c306fac7dc\niv = 4f07afedfdc3b6c2361823d3\nkey = 51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152\nmsg = be3308f72a2c6aed\nresult = valid\ntag = da60d8ff4d550e6801b0ce488ed1b6fe\n\n# tcId = 99\naad = \nct = 0180029193bbb29e326b5817e8ea01\niv = 68ab7fdbf61901dad461d23c\nkey = 67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb\nmsg = 51f8c1f731ea14acdb210a6d973e07\nresult = valid\ntag = 4dd43e861c5f141a693ebc056ed0f0f9\n\n# tcId = 100\naad = \nct = 31cb136074adcd00cf75e9587d7e8424\niv = 2fcb1b38a99e71b84740ad9b\nkey = 59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a\nmsg = 549b365af913f3b081131ccb6b825588\nresult = valid\ntag = 567871b7aaaf3c00f42fd9d5962df514\n\n# tcId = 101\naad = \nct = c97e58e8730a567e8bdf5eb981cdd5f323\niv = 45aaa3e5d16d2d42dc03445d\nkey = 3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011\nmsg = 3ff1514b1c503915918f0c0c31094a6e1f\nresult = valid\ntag = 4b2dc825fef9dc6bf234f2b8ff798f9e\n\n# tcId = 102\naad = \nct = c2669f9fc8fe6013c4dd22468d43c2af73647b7018531d29\niv = e6b1adf2fd58a8762c65f31b\nkey = 0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7\nmsg = 10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111\nresult = valid\ntag = 06a58c8d44e99b3262cad0e920df1f85\n\n# tcId = 103\naad = \nct = faaef557c31a231115f393c4b3c1a1413fb40b4204458d5f9ef8a9f2f12486ae\niv = 72cfd90ef3026ca22b7e6e6a\nkey = e1731d5854e1b70cb3ffe8b786a2b3ebf0994370954757b9dc8c7bc5354634a3\nmsg = b9c554cbc36ac18ae897df7beecac1dbeb4eafa156bb60ce2e5d48f05715e678\nresult = valid\ntag = 72fc457255aadf708719c46986caefad\n\n# tcId = 104\naad = 02\nct = 12fffdccd1e5a9708fa30ccf99137067\niv = 87345f1055fd9e2102d50656\nkey = 7d00b48095adfa3272050607b264185002ba99957c498be022770f2ce2f3143c\nmsg = e5ccaa441bc814688f8f6e8f28b500b2\nresult = valid\ntag = 688e0b634f51c4f6d983629c8a63c1c0\n\n# tcId = 105\naad = b648\nct = b75b8e96de2ef9704ade5c64cab59671\niv = 87a3163ec0598ad95b3aa713\nkey = 6432717f1db85e41ac7836bce25185a080d5762b9e2b18444b6ec72c3bd8e4dc\nmsg = 02cde168fba3f544bbd0332f7adeada8\nresult = valid\ntag = dec00ceb899c4a6a29be67f1b30435e0\n\n# tcId = 106\naad = bd4cd02fc7502bbdbdf6c9a3cbe8f0\nct = 8e67034384170a646e9eea1606a8e899\niv = 6f573aa86baa492ba46596df\nkey = 8e34cf73d245a1082a920b86364eb896c4946467bcb3d58929fcb36690e6394f\nmsg = 16ddd23ff53f3d23c06334487040eb47\nresult = valid\ntag = fe7a3dd42beb5ff70bb471ff76f0d341\n\n# tcId = 107\naad = 89cce9fb47441d07e0245a66fe8b778b\nct = 7eeb00c65fe7e0c79255e3cd90013588\niv = 1a6518f02ede1da6809266d9\nkey = cb5575f5c7c45c91cf320b139fb594237560d0a3e6f865a67d4f633f2c08f016\nmsg = 623b7850c321e2cf0c6fbcc8dfd1aff2\nresult = valid\ntag = 957d35fb25fdc17f00db33756967fd02\n\n# tcId = 108\naad = d19f2d989095f7ab03a5fde84416e00c0e\nct = f83e3b4333400d6393d085fe947057c4\niv = 564dee49ab00d240fc1068c3\nkey = a5569e729a69b24ba6e0ff15c4627897436824c941e9d00b2e93fddc4ba77657\nmsg = 87b3a4d7b26d8d3203a0de1d64ef82e3\nresult = valid\ntag = 7a30291bb506ae3961f61d683c9d94d1\n\n# tcId = 109\naad = ba446f6f9a0ced22450feb10737d9007fd69abc19b1d4d9049a5551e86ec2b37\nct = 97db4d850442eb33e6089af6f3cadf7b\niv = 8df4b15a888c33286a7b7651\nkey = 3937986af86dafc1ba0c4672d8abc46c207062682d9c264ab06d6c5807205130\nmsg = dc9e9eaf11e314182df6a4eba17aec9c\nresult = valid\ntag = 3ccbb125b2835754c1409d227e374d0b\n\n# tcId = 110\n# Testing for ctr overflow\naad = 40c32e00c2fdab59c1a1c573b46b5068\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = bdd411814564c4218d224d50591c818855a862a0a519ac0b3d71a2edb12aa71eb81959bcc6b84c45aa424c9aca0b7bdd\nresult = valid\ntag = 00000000000000000000000000000000\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 111\n# Testing for ctr overflow\naad = 2cc3a1973e0560f7224a394e52fa8488\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 000000000000000000000000\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = d04846a01f472262e60a1cb4cfcbdcb05c3f819628a3a49395c5dae96c434b2417ce071699afa74a60c32c0bafd9c01a\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 112\n# Testing for ctr overflow\naad = 2e34d12622a441b557eeb1d647c6cb73\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 79637cee9decf33e3080de3d2c55bd21cd529ba8080b583edb6cfe13cda04bd00debe58b8cd48d6e02a1ecfc4d87923a\nresult = valid\ntag = fefffffffefffffffefffffffeffffff\n# The counter for A",
+    "ES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 113\n# Testing for ctr overflow\naad = 0814a95481bf915a4097949e3525c7e7\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 000000000000000000000000\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 6492a73880dac7f36743715b0fc7063d3e46a25044310bba5849ed88bfcb54b0adbe3978040bda849906e1aa09d1a8e3\nresult = valid\ntag = ffffff7f00112233445566778899aabb\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 114\n# Testing for ctr overflow\naad = b691ef42f2ab8d1b4a581bb08394b13a\nct = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 010101010101010101010101\nkey = 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\nmsg = 7848d9e872f40bca1b82a4e7185fb75193b3496cc1dc2a72b86ed156ab8389e71687ed25eb6485e66561fa8c39853368\nresult = valid\ntag = ffffffffffffff7f0011223344556677\n# The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 115\n# Flipped bit 0 in tag\naad = e144878b0bbbf01b75231277e1e0d114\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 116\n# Flipped bit 0 in tag\naad = 0289eaa93eb084107d2088435ef2a0cd\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 117\n# Flipped bit 1 in tag\naad = f3bd6013669b7d9371727fcb1aafea75\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 118\n# Flipped bit 7 in tag\naad = 922e91b2c5016e4303c737d1608ca25f\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 119\n# Flipped bit 7 in tag\naad = 7195dd0addce5dd7014bfddb2f23206f\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 120\n# Flipped bit 7 in tag\naad = 32fc2a53e9678f1fc6d63081c36c6f2c\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 121\n# Flipped bit 8 in tag\naad = c55ba71ee250216f8ecfe822d712dd38\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 122\n# Flipped bit 8 in tag\naad = 5546acf865fc305fbd7ff1092cb9c2c3\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 123\n# Flipped bit 31 in tag\naad = 6b060eebe1843b409a4dfd0be8f86a2b\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 124\n# Flipped bit 31 in tag\naad = c4adb92f1a60eb2faff88675f62a7276\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 125\n# Flipped bit 32 in tag\naad = 70c5a8591f52f869c6415a6d7000e253\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 126\n# Flipped bit 63 in tag\naad = b5fe79f182cb9f2945208e29513928d1\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 127\n# Flipped bit 63 in tag\naad = c1dbf87e4a586b040c53f6dd9063b4cd\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 128\n# Flipped bit 64 in tag\naad = 845466e603ca85a224693d150ae13ba3\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 129\n# Flipped bit 97 in tag\naad = 18cb9f5eede6224fa3fcd525cf9f958b\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 130\n# Flipped bit 97 in tag\naad = 8c4fbca37d2e361856b9f80adf455fa0\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 131\n# Flipped bit 97 in tag\naad = bc517fe140abf2b42eb1cafe8c0715a9\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 132\n# Flipped bit 120 in tag\naad = 617e1c5ef62ed35cf678e670f116ff2f\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 133\n# Flipped bit 120 in tag\naad = e71802b7a37e8ef1f001ef0c52c636f2\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 134\n# Flipped bit 120 in tag\naad = be647e37f154d4a8edca5a29ca221cc5\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 135\n# Flipped bit 121 in tag\naad = b3caa01f49c7cbc56c7c92547257957e\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 136\n# Flipped bit 121 in tag\naad = ab0347a2aec4cc4c366583062442ba07\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 137\n# Flipped bit 126 in tag\naad = 62573ef39a27f77b37fb7bfc84e46cee\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 138\n# Flipped bit 126 in tag\naad = 28e3cadfb16834e824642e965588c200\nct = 0000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 759dfbbb8a251ccc\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 139\n# Flipped bit 126 in tag\naad = 7edd2fc15bed224a46dc8608e1766080\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeef",
+    "f\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 140\n# Flipped bit 127 in tag\naad = 7e0e03104e2c0ff20ba4c35742180c5b\nct = \niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 0987e35e40981a2730c1740c7201731f\n\n# tcId = 141\n# Flipped bit 127 in tag\naad = 9a24dc75c5ddd3bab57ff532eb86d224\nct = 00000000000000000000000000000000\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = f663044a4e7dd822aba0b7de2d869981\nresult = invalid\ntag = 13a1883272188b4c8d2727178198fe95\n\n# tcId = 142\n# Flipped bit 127 in tag\naad = 3196aec499c15bc043b6866ba0df6e6b\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 143\n# Flipped bit 0..127 in tag\naad = 55a2987aa94bf46ad1b6d253a44c1622\nct = ffffffffffffffff\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 49861b1fb6bcf8e4\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n",
+};
+static const size_t kLen54 = 42165;
+
+static const char *kData55[] = {
+    "# Imported from Wycheproof's aes_gcm_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: AES-GCM\n# Generator version: 0.4\n\n[ivSize = 96]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 1\naad = \nct = 26073cc1d851beff176384dc9896d5ff\niv = 028318abc1824029138141a2\nkey = 5b9604fe14eadba931b0ccf34843dab9\nmsg = 001d0c231287c1182784554ca3a21908\nresult = valid\ntag = 0a3ea7a5487cb5f7d70fb6c58d038554\n\n# tcId = 2\naad = 00112233445566778899aabbccddeeff\nct = 49d8b9783e911913d87094d1f63cc765\niv = 921d2507fa8007b7bd067d34\nkey = 5b9604fe14eadba931b0ccf34843dab9\nmsg = 001d0c231287c1182784554ca3a21908\nresult = valid\ntag = 1e348ba07cca2cf04c618cb4d43a5b92\n\n# tcId = 3\naad = aac39231129872a2\nct = eea945f3d0f98cc0fbab472a0cf24e87\niv = 0432bc49ac34412081288127\nkey = aa023d0478dcb2b2312498293d9a9129\nmsg = 2035af313d1346ab00154fea78322105\nresult = valid\ntag = 4bb9b4812519dadf9e1232016d068133\n\n# tcId = 4\naad = \nct = 54\niv = b30c084727ad1c592ac21d12\nkey = 384ea416ac3c2f51a76e7d8226346d4e\nmsg = 35\nresult = valid\ntag = 7c1e4ae88bb27e5638343cb9fd3f6337\n\n# tcId = 5\naad = \nct = a036ead03193903f\niv = b5e006ded553110e6dc56529\nkey = cae31cd9f55526eb038241fc44cac1e5\nmsg = d10989f2c52e94ad\nresult = valid\ntag = 3b626940e0e9f0cbea8e18c437fd6011\n\n# tcId = 6\naad = \nct = 8a9992388e735f80ee18f4a63c10ad\niv = ecb0c42f7000ef0e6f95f24d\nkey = dd6197cd63c963919cf0c273ef6b28bf\nmsg = 4dcc1485365866e25ac3f2ca6aba97\nresult = valid\ntag = 1486a91cccf92c9a5b00f7b0e034891c\n\n# tcId = 7\naad = \nct = f7bd379d130477176b8bb3cb23dbbbaa\niv = 0e1666f2dc652f7708fb8f0d\nkey = ffdf4228361ea1f8165852136b3480f7\nmsg = 25b12e28ac0ef6ead0226a3b2288c800\nresult = valid\ntag = 1ee6513ce30c7873f59dd4350a588f42\n\n# tcId = 8\naad = \nct = 0de51fe4f7f2d1f0f917569f5c6d1b009c\niv = 965ff6643116ac1443a2dec7\nkey = c15ed227dd2e237ecd087eaaaad19ea4\nmsg = fee62fde973fe025ad6b322dcdf3c63fc7\nresult = valid\ntag = 6cd8521422c0177e83ef1b7a845d97db\n\n# tcId = 9\naad = \nct = 7cd9f4e4f365704fff3b9900aa93ba54b672bac554275650\niv = fbbc04fd6e025b7193eb57f6\nkey = a8ee11b26d7ceb7f17eaa1e4b83a2cf6\nmsg = c08f085e6a9e0ef3636280c11ecfadf0c1e72919ffc17eaf\nresult = valid\ntag = f4eb193241226db017b32ec38ca47217\n\n# tcId = 10\naad = c3\nct = f58d453212c2c8a436e9283672f579f119122978\niv = 32bcb9b569e3b852d37c766a\nkey = 28ff3def08179311e2734c6d1c4e2871\nmsg = dfc61a20df8505b53e3cd59f25770d5018add3d6\nresult = valid\ntag = 5901131d0760c8715901d881fdfd3bc0\n\n# tcId = 11\naad = 834afdc5c737186b\nct = bf864616c2347509ca9b10446379b9bdbb3b8f64\niv = 9c3a4263d983456658aad4b1\nkey = e63a43216c08867210e248859eb5e99c\nmsg = b14da56b0462dc05b871fc815273ff4810f92f4b\nresult = valid\ntag = a97d25b490390b53c5db91f6ee2a15b8\n\n# tcId = 12\naad = 4020855c66ac4595058395f367201c4c\nct = a6f2ef3c7ef74a126dd2d5f6673964e27d5b34b6\niv = 33e90658416e7c1a7c005f11\nkey = 38449890234eb8afab0bbf82e2385454\nmsg = f762776bf83163b323ca63a6b3adeac1e1357262\nresult = valid\ntag = b8bbdc4f5014bc752c8b4e9b87f650a3\n\n# tcId = 13\naad = 76eb5f147250fa3c12bff0a6e3934a0b16860cf11646773b\nct = bd64802cfebaeb487d3a8f76ce943a37b3472dd5\niv = 9f0d85b605711f34cd2a35ba\nkey = 6a68671dfe323d419894381f85eb63fd\nmsg = 0fc67899c3f1bbe196d90f1eca3797389230aa37\nresult = valid\ntag = fce9a5b530c7d7af718be1ec0ae9ed4d\n\n# tcId = 14\n# special case\naad = \nct = f62d84d649e56bc8cfedc5d74a51e2f7\niv = 000000000000000000000000\nkey = 00112233445566778899aabbccddeeff\nmsg = ebd4a3e10cf6d41c50aeae007563b072\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 15\n# special case\naad = \nct = 431f31e6840931fd95f94bf88296ff69\niv = ffffffffffffffffffffffff\nkey = 00112233445566778899aabbccddeeff\nmsg = d593c4d8224f1b100c35e4f6c4006543\nresult = valid\ntag = 00000000000000000000000000000000\n\n# tcId = 16\n# special case\naad = \nct = d8eba6a5a03403851abc27f6e15d84c0\niv = 00112233445566778899aabb\nkey = 00112233445566778899aabbccddeeff\nmsg = 7fd49ba712d0d28f02ef54ed18db43f8\nresult = valid\ntag = 00000000000000000000000000000000\n\n[ivSize = 64]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 17\naad = aac39231129872a2\nct = 64c36bb3b732034e3a7d04efc5197785\niv = 0432bc49ac344120\nkey = aa023d0478dcb2b2312498293d9a9129\nmsg = 2035af313d1346ab00154fea78322105\nresult = valid\ntag = b7d0dd70b00d65b97cfd080ff4b819d1\n\n# tcId = 18\n# unusual IV size\naad = \nct = 9a078a04d14938918e004358\niv = 68cbeafe8f9e8a66\nkey = 25dd4d6cad5a4604957847c8c6d3fc4e\nmsg = 5c347835b3fa61c2ce253e5a\nresult = valid\ntag = 5452843e32c13c3e35ed8230fe3446c0\n\n[ivSize = 128]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 19\naad = 1a0293d8f90219058902139013908190bc490890d3ff12a3\nct = 64069c2d58690561f27ee199e6b479b6369eec688672bde9\niv = 3254202d854734812398127a3d134421\nkey = 2034a82547276c83dd3212a813572bce\nmsg = 02efd2e5782312827ed5d230189a2a342b277ce048462193\nresult = valid\ntag = 9b7abadd6e69c1d9ec925786534f5075\n\n# tcId = 20\naad = \nct = fd\niv = 9477849d6ccdfca112d92e53fae4a7ca\nkey = 209e6dbf2ad26a105445fc0207cd9e9a\nmsg = 01\nresult = valid\ntag = 032df7bba5d8ea1a14f16f70bd0e14ec\n\n# tcId = 21\naad = \nct = 2f333087bdca58219f9bfc273e45cc\niv = 5171524568e81d97e8c4de4ba56c10a0\nkey = a549442e35154032d07c8666006aa6a2\nmsg = 1182e93596cac5608946400bc73f3a\nresult = valid\ntag = e06d1ef473132957ad37eaef29733ca0\n\n# tcId = 22\naad = \nct = a780bd01c80885156c88a973264c8ee5\niv = 1275115499ae722268515bf0c164b49c\nkey = cfb4c26f126f6a0acb8e4e220f6c56cd\nmsg = 09dfd7f080275257cf97e76f966b1ad9\nresult = valid\ntag = 2adeffa682c8d8a81fada7d9fcdd2ee2\n\n# tcId = 23\naad = \nct = 7e47e10fe3c6fbfa381770eaf5d48d1482e71e0c44dff1e30ca6f95d92052084\niv = 95c1dd8c0f1705ece68937901f7add7b\nkey = 0b11ef3a08c02970f74281c860691c75\nmsg = f693d4edd825dbb0618d91113128880dbebb23e25d00ed1f077d870be9cc7536\nresult = valid\ntag = d01444fa5d9c499629d174ff3927a1ac\n\n# tcId = 24\n# J0:000102030405060708090a0b0c0d0e0f\naad = \nct = 00078d109d92143fcd5df56721b884fac64ac7762cc09eea2a3c68e92a17bdb575f87bda18be564e\niv = f95fde4a751913202aeeee32a0b55753\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 152a65045fe674f97627427af5be22da\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 25\n# J0:00000000000000000000000000000000\naad = \nct = 84d4c9c08b4f482861e3a9c6c35bc4d91df927374513bfd49f436bd73f325285daef4ff7e13d46a6\niv = 7b95b8c356810a84711d68150a1b7750\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 213a3cb93855d18e69337eee66aeec07\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 26\n# J0:ffffffffffffffffffffffffffffffff\naad = \nct = 948ca37a8e6649e88aeffb1c598f3607007702417ea0e0bc3c60ad5a949886de968cf53ea6462aed\niv = 1a552e67cdc4dc1a33b824874ebf0bed\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 99b381bfa2af9751c39d1b6e86d1be6a\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 27\n# J0:fffffffffffffffffffffffffffffffe\naad = \nct = 64b19314c31af45accdf7e3c4db79f0d948ca37a8e6649e88aeffb1c598f3607007702417ea0e0bc\niv = dd9d0b4a0c3d681524bffca31d907661\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 5281efc7f13ac8e14ccf5dca7bfbfdd1\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 28\n# J0:fffffffffffffffffffffffffffffffd\naad = \nct = 2bb69c3e5d1f91815c6b87a0d5bbea7164b19314c31af45accdf7e3c4db79f0d948ca37a8e6649e8\niv = 57c5643c4e37b4041db794cfe8e1f0f4\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = a3ea2c09ee4f8c8a12f45cddf9aeff81\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 29\n# J0:000102030405060708090a0bfffffff",
+    "f\naad = \nct = 127af9b39ecdfc57bb11a2847c7c2d3d8f938f40f877e0c4af37d0fe9af033052bd537c4ae978f60\niv = 99821c2dd5daecded07300f577f7aff1\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 07eb2fe4a958f8434d40684899507c7c\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 30\n# J0:000102030405060708090a0bfffffffe\naad = \nct = 0cf6ae47156b14dce03c8a07a2e172b1127af9b39ecdfc57bb11a2847c7c2d3d8f938f40f877e0c4\niv = 5e4a3900142358d1c774d8d124d8d27d\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = f145c2dcaf339eede427be934357eac0\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 31\n# J0:000102030405060708090a0bfffffffd\naad = \nct = f0c6ffc18bd46df5569185a9afd169eb0cf6ae47156b14dce03c8a07a2e172b1127af9b39ecdfc57\niv = d4125676562984c0fe7cb0bdd1a954e8\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = facd0bfe8701b7b4a2ba96d98af52bd9\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 32\n# J0:000102030405060708090a0b7fffffff\naad = \nct = d6928e094c06e0a7c4db42184cf7529e95de88b767edebe9b343000be3dab47ea08b744293eed698\niv = b97ec62a5e5900ccf9e4be332e336091\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = a03e729dcfd7a03155655fece8affd7e\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 33\n# J0:000102030405060708090a0b7ffffffe\naad = \nct = d82ce58771bf6487116bf8e96421877ed6928e094c06e0a7c4db42184cf7529e95de88b767edebe9\niv = 7eb6e3079fa0b4c3eee366177d1c1d1d\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 1e43926828bc9a1614c7b1639096c195\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 34\n# J0:000102030405060708090a0bffff7fff\naad = \nct = a197a37a5d79697078536bc27fe46cd8d475526d9044aa94f088a054f8e380c64f79414795c61480\niv = 0314fcd10fdd675d3c612962c931f635\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = f08baddf0b5285c91fc06a67fe4708ca\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 35\n# J0:000102030405060708090a0bffff7ffe\naad = \nct = 149fde9abbd3a43c2548575e0db9fb84a197a37a5d79697078536bc27fe46cd8d475526d9044aa94\niv = c4dcd9fcce24d3522b66f1469a1e8bb9\nkey = 00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = valid\ntag = 62a4b6875c288345d6a454399eac1afa\n# The counter for AES-GCM is reduced modulo 2**32. This test vector was\n# constructed to test for correct wrapping of the counter.\n\n# tcId = 36\n# special case\naad = \nct = 1cd5a06214235ceb044d4bad7b047312\niv = ffffffffffffffffffffffffffffffff\nkey = 00112233445566778899aabbccddeeff\nmsg = 4d82639c39d3f3490ee903dd0be7afcf\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\n\n[ivSize = 96]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 37\naad = 00000000ffffffff\nct = e27abdd2d2a53d2f136b\niv = 00112233445566778899aabb\nkey = 92ace3e348cd821092cd921aa3546374299ab46209691bc28b8752d17f123c20\nmsg = 00010203040506070809\nresult = valid\ntag = 9a4a2579529301bcfb71c78d4060f52c\n\n# tcId = 38\naad = aabbccddeeff\nct = \niv = 00112233445566778899aabb\nkey = 29d3a44f8723dc640239100c365423a312934ac80239212ac3df3421a2098123\nmsg = \nresult = valid\ntag = 2a7d77fa526b8250cb296078926b5020\n\n# tcId = 39\naad = \nct = 06\niv = 99e23ec48985bccdeeab60f1\nkey = cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273\nmsg = 2a\nresult = valid\ntag = 633c1e9703ef744ffffb40edf9d14355\n\n# tcId = 40\naad = \nct = cf332a12fdee800b\niv = 4f07afedfdc3b6c2361823d3\nkey = 51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152\nmsg = be3308f72a2c6aed\nresult = valid\ntag = 602e8d7c4799d62c140c9bb834876b09\n\n# tcId = 41\naad = \nct = 43fc101bff4b32bfadd3daf57a590e\niv = 68ab7fdbf61901dad461d23c\nkey = 67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb\nmsg = 51f8c1f731ea14acdb210a6d973e07\nresult = valid\ntag = ec04aacb7148a8b8be44cb7eaf4efa69\n\n# tcId = 42\naad = \nct = f58c16690122d75356907fd96b570fca\niv = 2fcb1b38a99e71b84740ad9b\nkey = 59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a\nmsg = 549b365af913f3b081131ccb6b825588\nresult = valid\ntag = 28752c20153092818faba2a334640d6e\n\n# tcId = 43\naad = \nct = 73a6b6f45f6ccc5131e07f2caa1f2e2f56\niv = 45aaa3e5d16d2d42dc03445d\nkey = 3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011\nmsg = 3ff1514b1c503915918f0c0c31094a6e1f\nresult = valid\ntag = 2d7379ec1db5952d4e95d30c340b1b1d\n\n# tcId = 44\naad = \nct = 0843fff52d934fc7a071ea62c0bd351ce85678cde3ea2c9e\niv = e6b1adf2fd58a8762c65f31b\nkey = 0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7\nmsg = 10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111\nresult = valid\ntag = 7355fde599006715053813ce696237a8\n\n# tcId = 45\naad = c0\nct = eb5500e3825952866d911253f8de860c00831c81\niv = 98bc2c7438d5cd7665d76f6e\nkey = b279f57e19c8f53f2f963f5f2519fdb7c1779be2ca2b3ae8e1128b7d6c627fc4\nmsg = fcc515b294408c8645c9183e3f4ecee5127846d1\nresult = valid\ntag = ecb660e1fb0541ec41e8d68a64141b3a\n\n# tcId = 46\naad = 956846a209e087ed\nct = feca44952447015b5df1f456df8ca4bb4eee2ce2\niv = 376187894605a8d45e30de51\nkey = cdccfe3f46d782ef47df4e72f0c02d9c7f774def970d23486f11a57f54247f17\nmsg = e28e0e9f9d22463ac0e42639b530f42102fded75\nresult = valid\ntag = 082e91924deeb77880e1b1c84f9b8d30\n\n# tcId = 47\naad = ab2ac7c44c60bdf8228c7884adb20184\nct = 43dda832e942e286da314daa99bef5071d9d2c78\niv = 5a86a50a0e8a179c734b996d\nkey = f32364b1d339d82e4f132d8f4a0ec1ff7e746517fa07ef1a7f422f4e25a48194\nmsg = 43891bccb522b1e72a6b53cf31c074e9d6c2df8e\nresult = valid\ntag = c3922583476ced575404ddb85dd8cd44\n\n# tcId = 48\naad = 972ab4e06390caae8f99dd6e2187be6c7ff2c08a24be16ef\nct = a929ee7e67c7a2f91bbcec6389a3caf43ab49305\niv = bc2a7757d0ce2d8b1f14ccd9\nkey = ff0089ee870a4a39f645b0a5da774f7a5911e9696fc9cad646452c2aa8595a12\nmsg = 748b28031621d95ee61812b4b4f47d04c6fc2ff3\nresult = valid\ntag = ebec6774b955e789591c822dab739e12\n\n[ivSize = 96]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 49\naad = \nct = fe\niv = 34047bc39b9c608384dff5b8\nkey = 21218af790428f8024d3e7e1428c9fcf578c216636d60e73\nmsg = e3\nresult = valid\ntag = 2e982e24b81cd120d35a70fe6935e665\n\n# tcId = 50\naad = \nct = 99f2ff1c8a44e5f2\niv = 4ebc13cf4636cc7c45e560a7\nkey = 3a8bf543c480925632118245bcbf5d01522b987a31a33da3\nmsg = 53fc72e71b59eeb3\nresult = valid\ntag = 6870f104ddc514477b400336fb01860e\n\n# tcId = 51\naad = \nct = afe8ef41591bfcc00db3c880ceb186\niv = 6e7ff7f0797685cfc44b05ff\nkey = 92f4d2672fceec43963ccffb17e6ea7578b11418b06a3b82\nmsg = c3ec16adb184affa8ae9738bffb916\nresult = valid\ntag = 29fff7f285768645c9c8bf7a471c9393\n\n# tcId = 52\naad = \nct = 90339dca02ef717f1603994aee6cf6d2\niv = be0326d23bdc2c64648d13f4\nkey = bcb6bc5ee6743df1396a34639327b25809ec9c81dd6a0c0e\nmsg = 80474a3a3b809560eee2ce7a7a33ea07\nresult = valid\ntag = e3d33e01ce64f271783147de226228bc\n\n# tcId = 53\naad = \nct = b98ed6321679941a3e521834296686ad98\niv = b6be6cd0681235d826aa28ea\nkey = 5e1d28213e092536525bbae09e214af4c891e202b2b4fa4f\nmsg = 53d59433a7db7f41b31ccb6d4a2d789965\nresult = valid\ntag = 9f50c03e055e519712c582ec9db3235b\n\n# tcId = 54\naad = \nct = addd303651119e52f6170dfc7a915064253d57532987b9ab\niv = b022067048505b20946216ef\nkey = 7f672d85e151aa490bc0eec8f66b5e5bee74af11642be3ff\nmsg = ef6412c72b03c643fa02565a0ae2378a9311c11a84065f80\nresult = valid\ntag = fa0484f8baa95f5b7a31c56d1b34c58b\n\n# tcId = 55\naad = cb\nct = 0d2c",
+    "3a3c0cc4b40e70ed45e188e356a0e1533b31\niv = 817fe51c31f2879141a34335\nkey = 969fed5068541d65418c2c1de8fe1f845e036030496e1272\nmsg = 3d8233191a2823bf767e99167b1d4af4f4848458\nresult = valid\ntag = 92909a80e90540e1878ab59ef300072b\n\n# tcId = 56\naad = 2ed8487153e21b12\nct = c7c1cbb85ce2a0a3f32cb9ef01ad45ec1118b66d\niv = 62b9cf1e923bc1138d05d205\nkey = fa5b9b41f93f8b682c04ba816c3fecc24eec095b04dd7497\nmsg = 18159841813a69fc0f8f4229e1678da7c9016711\nresult = valid\ntag = 253317f98bdab87531ece20475cd9ebb\n\n# tcId = 57\naad = 74318d8876528243f1944b73eb77e96e\nct = ecf5e403f19c007c8da7a456caf0a6d75762829b\niv = 3f1a1e02e90a4ba7a1db9df2\nkey = fbfb395662787e2d25a2e7510f818e825936a35114e237c9\nmsg = 2952a3d64107d5cbb9602239d05a5c5c222cf72b\nresult = valid\ntag = e0877a100f9dd9d6795f0e74c56a9fab\n\n# tcId = 58\naad = 5ca354a4cb8e4fc9798aa209ad4f739dc7c232fdd1f22584\nct = 94d844d98b9467daa7e8dde7f4290037354d7fb2\niv = 0802ae86c75a73bf79561521\nkey = 5d8e9c2222316c9ed5ff94513cc957436ae447a6e1a73a29\nmsg = 42b4439e1d2116f834b91c516a26299df279956b\nresult = valid\ntag = 62196638590cef429d6b1d1a59839c02\n\n[ivSize = 128]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 59\naad = \nct = dc\niv = 1e8259e0a43e571068f701cd2064fc0c\nkey = cee9abbc26b63e169f0ced621fe21d95904e75b881d93e6b\nmsg = 46\nresult = valid\ntag = af1f5535b125b34fc466902ea40cb3a2\n\n# tcId = 60\naad = \nct = 2aab5c87dcb4a4dae4e975ddb65aab\niv = c84442d6975f0359737de0fa828f958e\nkey = 189f0bd390ba40632586a45c39735c2b87113329c800f394\nmsg = b4bcd7b8eeca3050dd17682c6a914e\nresult = valid\ntag = 6b03b7557c7131e2352e495d54e61aef\n\n# tcId = 61\naad = \nct = d127fd2e67c0887d90eb92b91f357d97\niv = 13cd526ec77b58f62d48d03f8b88f2b8\nkey = b0724f15df5b792c2f49bc51df0ac5aad69be0030981613c\nmsg = 8da3ab9c3d195b04df452ad23953da4d\nresult = valid\ntag = eb05bda937faeed27f8833295d4ba559\n\n# tcId = 62\naad = \nct = 344c2cea17b06cb3da272e22a22a3a71ee0eaa1959a7facfff464660ddccedd1\niv = 1d3d62eccd8ac5e896f2654a7f606fc9\nkey = 998750ba784841e40a7c5b03985732b6397e5459a3843954\nmsg = 2f60ca3494a958dc3e6ebeb5d0b4e6dda0d0c4331ab9c957f6422a5100878ebf\nresult = valid\ntag = bab7fbf499ff06aad5f757b1c1a4fcc0\n\n[ivSize = 128]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 63\naad = \nct = 3f\niv = 0ad570d8863918fe89124e09d125a271\nkey = b7797eb0c1a6089ad5452d81fdb14828c040ddc4589c32b565aad8cb4de3e4a0\nmsg = ed\nresult = valid\ntag = fd8f593b83314e33c5a72efbeb7095e8\n\n# tcId = 64\naad = \nct = 041341078f0439e50b43c991635117\niv = 2a55caa137c5b0b66cf3809eb8f730c4\nkey = 4c010d9561c7234c308c01cea3040c925a9f324dc958ff904ae39b37e60e1e03\nmsg = 2a093c9ed72b8ff4994201e9f9e010\nresult = valid\ntag = 5b8a2f2da20ef657c903da88ef5f57bb\n\n# tcId = 65\naad = \nct = 469478d448f7e97d755541aa09ad95b0\niv = 7ee376910f08f497aa6c3aa7113697fd\nkey = e7f7a48df99edd92b81f508618aa96526b279debd9ddb292d385ddbae80b2259\nmsg = 5e51dbbb861b5ec60751c0996e00527f\nresult = valid\ntag = 254ada5cf662d90c5e11b2bd9c4db4c4\n\n# tcId = 66\naad = \nct = cb960201fa5ad41d41d1c2c8037c71d52b72e76b16b589d71b976627c9734c9d\niv = 5d1bde6fa0994b33efd8f23f531248a7\nkey = 4f84782bfbb64a973c3de3dcfa3430367fd68bc0b4c3b31e5d7c8141ba3e6a67\nmsg = 78cb6650a1908a842101ea85804fed00cc56fbdafafba0ef4d1ca607dcae57b6\nresult = valid\ntag = 8dfce16467c3a6ebb3e7242c9a551962\n\n[ivSize = 120]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 67\n# unusual IV size\naad = \nct = 2bc3ef8e7402b4631f48e9be\niv = b0a73119a97d623806b49d45ddf4c7\nkey = 34c74e28182948e03af02a01f46eb4f7\nmsg = fe82ba66cf2e265741f2c86c\nresult = valid\ntag = 4b6f6f5be291a90b9e93a8a82ddbc8d8\n\n[ivSize = 160]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 68\n# unusual IV size\naad = \nct = 4fe13ef29f118f85a63188f8\niv = e22b6b144ab26b5781316e7a42a76202ac4b2278\nkey = 55cb7cac77efe18a1ea3b30c65f3f346\nmsg = 2f3d11ea32bf5bc72cbe2b8d\nresult = valid\ntag = 05975b175316df8045889f43e0c857e0\n\n[ivSize = 64]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 69\n# unusual IV size\naad = \nct = a2966fb189f8d9d391503857\niv = 60d6bfca67f5d810\nkey = f6a4bf8c4e15034699ce5801cbbac7509cd3f94cf28d8307\nmsg = de8eaa41e5e6a590c3cfbf61\nresult = valid\ntag = e370e7dd328655929bd4691f396a1033\n\n[ivSize = 120]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 70\n# unusual IV size\naad = \nct = 9af1a022c61c4315aa0e923e\niv = edf93e16294f15eded83808f09320e\nkey = 66f75acbd8d3acf7af47d13e8384c2809d6b91503a7f294b\nmsg = a900c86b6b7e0e5563f8f826\nresult = valid\ntag = 20529bff3c59222ec33353af337b1d40\n\n[ivSize = 160]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 71\n# unusual IV size\naad = \nct = 073a5291b11df379f31b4f16\niv = 130c14c839e35b7d56b3350b194b0da342e6b65d\nkey = ef2e299dd4ecd7e3b9cc62780922cc2c89f78840564d1276\nmsg = 03f59579b14437199583270e\nresult = valid\ntag = 17205999491bd4c1d6c7ec3e56779c32\n\n[ivSize = 64]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 72\n# unusual IV size\naad = \nct = 99313a220d1fcb6658876283\niv = c0c568a400b7194f\nkey = df64c84ae52d9ca820a47421bed6e96f7165369fc4c1b65f8f6307b17ce1006c\nmsg = f5fafdded54a86a4edab44bd\nresult = valid\ntag = 00955d7d27f66868cfec734bf59c5e6d\n\n[ivSize = 120]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 73\n# unusual IV size\naad = \nct = fc213602aa423b87d7c2a874\niv = 17ca250fb733877556263223eadde1\nkey = e98b0669a645eb14cd06df6968fc5f10edc9f54feed264e3d410cdc61b72ef51\nmsg = f384b3ed7b274641f5db60cf\nresult = valid\ntag = 36b15bab6923b17218fe1c24048e2391\n\n[ivSize = 160]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 74\n# unusual IV size\naad = \nct = c1d76233e8c5042e92bf8d32\niv = 0f9d6ed7eef362dfa4a7dfa5c0f74c5b27bd4ebf\nkey = 849b3e6b8cdd85bdcfb8eb701aa5522ae2340fbe5214e389622cef76979225c4\nmsg = 8c5564e53051c0de273199b4\nresult = valid\ntag = 7cf036d235d3b2dd349a8c804b65144a\n\n[ivSize = 0]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 75\n# 0 size IV is not valid\naad = \nct = \niv = \nkey = 8f3f52e3c75c58f5cb261f518f4ad30a\nmsg = \nresult = invalid\ntag = cf71978ffcc778f3c85ac9c31b6fe191\n# AES-GCM does not allow an IV of length 0. Encrypting with such an IV leaks the\n# authentication key. Hence using an IV of length 0 is insecure even if the key\n# itself is only used for a single encryption.\n\n# tcId = 76\n# 0 size IV is not valid\naad = \nct = 00a29f0a5e2e7490279d1faf8b881c7b\niv = \nkey = 2a4bf90e56b70fdd8649d775c089de3b\nmsg = 324ced6cd15ecc5b3741541e22c18ad9\nresult = invalid\ntag = a2c7e8d7a19b884f742dfec3e76c75ee\n# AES-GCM does not allow an IV of length 0. Encrypting with such an IV leaks the\n# authentication key. Hence using an IV of length 0 is insecure even if the key\n# itself is only used for a single encryption.\n\n[ivSize = 0]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 77\n# 0 size IV is not valid\naad = \nct = \niv = \nkey = 0b18d21337035c7baa08211b702fa780ac7c09be8f9ed11f\nmsg = \nresult = invalid\ntag = ca69a2eb3a096ea36b1015d5dffff532\n# AES-GCM does not allow an IV of length 0. Encrypting with such an IV leaks the\n# authentication key. Hence using an IV of length 0 is insecure even if the key\n# itself is only used for a single encryption.\n\n# tcId = 78\n# 0 size IV is not valid\naad = \nct = 509b0658d09f7a5bb9db43b70c8387f7\niv = \nkey = ba76d594a6df915bb7ab7e6d1a8d024b2796336c1b8328a9\nmsg = d62f302742d61d823ea991b93430d589\nresult = invalid\ntag = 2c9488d53a0b2b5308c2757dfac7219f\n# AES-GCM does not allow an IV of length 0. Encrypting with such an IV leaks the\n# authentication key. Hence using an IV of length 0 is insecure even if the key\n# itself is only used for a single encryption.\n\n[ivSize = 0]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 79\n# 0 size IV is not valid\naad = \nct = \niv = \nkey = 3f8ca47b9a940582644e8ecf9c2d44e8138377a8379c5c11aafe7fec19856cf1\nmsg = \nresult = invalid\ntag = 1726aa695fbaa21a1db88455c670a4b0\n# AES-GCM does not allow an IV of length 0. Encrypting with such an IV leaks the\n# authentication key. Hence using an IV of length 0 is insecure even if the key\n# itself is only used for a single encryption.\n\n# tcId = 80\n# 0 size IV is not valid\naad = \nct = 7772ea358901f571d3d35c19497639d9\niv = \nkey = 7660d10966c6503903a552dde2a809ede9da490e5e5cc3e349da999671809883\nmsg = c314235341debfafa1526bb61044a7f1\nresult = invalid\ntag = 8fe0520ad744a11f0ccfd228454363fa\n# AES-GCM does not allow an IV of length 0. Encrypting with such an IV leaks the\n# authentication key. Hence using an IV of length 0 is insecure even if the key\n# itself is only used for a single encryption.\n\n[ivSize = 8]\n[keySize = ",
+    "128]\n[tagSize = 128]\n\n# tcId = 81\n# small IV sizes\naad = \nct = \niv = 80\nkey = 59a284f50aedd8d3e2a91637d3815579\nmsg = \nresult = acceptable\ntag = af498f701d2470695f6e7c8327a2398b\n\n# tcId = 82\n# small IV sizes\naad = \nct = 0a24612a9d1cbe967dbfe804bf8440e5\niv = 9d\nkey = fec58aa8cf06bfe05de829f27ec77693\nmsg = f2d99a9f893378e0757d27c2e3a3101b\nresult = acceptable\ntag = 96e6fd2cdc707e3ee0a1c90d34c9c36c\n\n[ivSize = 16]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 83\n# small IV sizes\naad = \nct = \niv = 0f2f\nkey = 88a972cce9eaf5a7813ce8149d0c1d0e\nmsg = \nresult = acceptable\ntag = 4ccf1efb4da05b4ae4452aea42f5424b\n\n# tcId = 84\n# small IV sizes\naad = \nct = ba3e7f8b2999995c7fc4006ca4f475ff\niv = 8760\nkey = b43967ee933e4632bd6562ba1201bf83\nmsg = 5a6ad6db70591d1e520b0122f05021a0\nresult = acceptable\ntag = 98f47a5279cebbcac214515710f6cd8a\n\n[ivSize = 32]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 85\n# small IV sizes\naad = \nct = \niv = cc851957\nkey = 4e9a97d3ed54c7b54610793ab05052e1\nmsg = \nresult = acceptable\ntag = e574b355bda2980e047e584feb1676ca\n\n# tcId = 86\n# small IV sizes\naad = \nct = 1b84baea9df1e65bee7b49e4a8cda1ec\niv = 7b5faeb2\nkey = d83c1d7a97c43f182409a4aa5609c1b1\nmsg = c8f07ba1d65554a9bd40390c30c5529c\nresult = acceptable\ntag = 5c0bb79d8240041edce0f94bd4bb384f\n\n[ivSize = 48]\n[keySize = 128]\n[tagSize = 128]\n\n# tcId = 87\n# small IV sizes\naad = \nct = \niv = 4ad80c2854fb\nkey = c6a705677affb49e276d9511caa46145\nmsg = \nresult = acceptable\ntag = 1e2ed72af590cafb8647d185865f5463\n\n# tcId = 88\n# small IV sizes\naad = \nct = 18291aa8dc7b07448aa8f71bb8e380bf\niv = d1dafc8de3e3\nkey = eba7699b56cc0aa2f66a2a5be9944413\nmsg = d021e53d9098a2df3d6b903cdad0cd9c\nresult = acceptable\ntag = 9c0e22e5c41b1039ff5661ffaefa8e0f\n\n[ivSize = 8]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 89\n# small IV sizes\naad = \nct = \niv = cb\nkey = c70ce38e84e5f53ed41c3f0d2ca493412ad32cb04c6e2efa\nmsg = \nresult = acceptable\ntag = 08d96edb5e22874cd10cb2256ca04bc6\n\n# tcId = 90\n# small IV sizes\naad = \nct = 6c5e796ba9a3ddc64f401e68d135101d\niv = 0f\nkey = 74c816b83dfd287210a3e2c6da8d3053bbfbd9b156d3fdd8\nmsg = f2b7b2c9b312cf2af78f003df15c8e19\nresult = acceptable\ntag = 96a132ed43924e98feb888ff682bdaef\n\n[ivSize = 16]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 91\n# small IV sizes\naad = \nct = \niv = 75e5\nkey = cbf45ba488932aea1a10e5862f92e4a7e277bda9f34af6d0\nmsg = \nresult = acceptable\ntag = 1f0d23070fcd748e25bf6454f5c9136e\n\n# tcId = 92\n# small IV sizes\naad = \nct = 550b48a43e821fd76f49f0f1a897aead\niv = 8989\nkey = e1c0446f11ae6aa4fa254f9a846fc6e13e45e537e47f2042\nmsg = 3a2f5ad0eb216e546e0bcaa377b6cbc7\nresult = acceptable\ntag = f6e0a979481f9957ddad0f21a777a73a\n\n[ivSize = 32]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 93\n# small IV sizes\naad = \nct = \niv = 68d7fc38\nkey = 567563bf4cf154902275a53bc57cd6dd7b370d27011bdac8\nmsg = \nresult = acceptable\ntag = 1475563e3212f3b5e40062569afd71e3\n\n# tcId = 94\n# small IV sizes\naad = \nct = 309133e76159fe8a41b20843486511ab\niv = bb9d2aa3\nkey = 834d0bb601170865a78139428a1503695a6a291ebd747cd1\nmsg = 6f79e18b4acd5a03d3a5f7e1a8d0f183\nresult = acceptable\ntag = 03ab26993b701910a2e8ecccd2ba9e52\n\n[ivSize = 48]\n[keySize = 192]\n[tagSize = 128]\n\n# tcId = 95\n# small IV sizes\naad = \nct = \niv = a984bdcdcae2\nkey = 99fb18f5ba430bb9ea942968ecb799b43406e1af4b6425a1\nmsg = \nresult = acceptable\ntag = d7b9a6b58a97982916e83219fbf71b1e\n\n# tcId = 96\n# small IV sizes\naad = \nct = e08261e46eaf90d978ea8f7889bccd4f\niv = 52aa01e0d0d6\nkey = b77b242aa0d51c92fda013e0cb0ef2437399ace5d3f507e4\nmsg = 4ba541a9914729216153801340ab1779\nresult = acceptable\ntag = c052a55df3926a50990a532efe3d80ec\n\n[ivSize = 8]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 97\n# small IV sizes\naad = \nct = \niv = a9\nkey = 8f9a38c1014966e4d9ae736139c5e79b99345874f42d4c7d2c81aa6797c417c0\nmsg = \nresult = acceptable\ntag = 2a268bf3a75fd7b00ba230b904bbb014\n\n# tcId = 98\n# small IV sizes\naad = \nct = 7bea30ecc2f73f8e121263b37966954c\niv = b3\nkey = 144cd8279229e8bb2de99d24e615306663913fe9177fcd270fafec493d43bca1\nmsg = 976229f5538f9636476d69f0c328e29d\nresult = acceptable\ntag = 8bbad4adc54b37a2b2f0f6e8617548c9\n\n[ivSize = 16]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 99\n# small IV sizes\naad = \nct = \niv = c332\nkey = 7d31861f9d3536e14016a3216b1042e0d2f7d4614314268b6f834ec7f38bbb65\nmsg = \nresult = acceptable\ntag = 1d978a693120c11f6d51a3ed88cd4ace\n\n# tcId = 100\n# small IV sizes\naad = \nct = 9c39f5b110361e9a770cc5e8b0f444bb\niv = da6c\nkey = 22b35fe9623ee11f8b60b6d22db3765b666ed972fa7ccd92b45f22deee02cab1\nmsg = 5341c78e4ce5bf8fbc3e077d1990dd5d\nresult = acceptable\ntag = b63ff43c12073ec5572b1be70f17e231\n\n[ivSize = 32]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 101\n# small IV sizes\naad = \nct = \niv = 6b30145e\nkey = c224e0bba3d7a99165f7996b67a0fce3e12f2c01179b197b69b7e628bca92096\nmsg = \nresult = acceptable\ntag = ae6f7c9a29f0d8204ca50b14a1e0dcf2\n\n# tcId = 102\n# small IV sizes\naad = \nct = f73f72f976a296ba3ca94bc6eb08cd46\niv = 5110604c\nkey = 093eb12343537ee8e91c1f715b862603f8daf9d4e1d7d67212a9d68e5aac9358\nmsg = 33efb58c91e8c70271870ec00fe2e202\nresult = acceptable\ntag = b824c33c13f289429659aa017c632f71\n\n[ivSize = 48]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 103\n# small IV sizes\naad = \nct = \niv = d4d857510888\nkey = 98e6f8ab673e804e865e32403a6551bf807a959343c60d34559360bc295ecb5b\nmsg = \nresult = acceptable\ntag = 3db16725fafc828d414ab61c16a6c38f\n\n# tcId = 104\n# small IV sizes\naad = \nct = ed463f4f43336af3f4d7e08770201145\niv = 1bdcd44b663e\nkey = 0bd0e8e7781166e1d876dec8fad34ba95b032a27cac0551595116091005947b7\nmsg = 91222263b12cf5616a049cbe29ab9b5b\nresult = acceptable\ntag = c8fc39906aca0c64e14a43ff750abd8a\n\n",
+};
+static const size_t kLen55 = 30122;
+
+static const char *kData56[] = {
+    "# Imported from Wycheproof's chacha20_poly1305_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: CHACHA20-POLY1305\n# Generator version: 0.4\n\n[ivSize = 96]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 1\n# rfc7539\naad = 50515253c0c1c2c3c4c5c6c7\nct = d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116\niv = 070000004041424344454647\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e\nresult = valid\ntag = 1ae10b594f09e26a7e902ecbd0600691\n\n# tcId = 2\naad = \nct = \niv = 4da5bf8dfd5852c1ea12379d\nkey = 80ba3192c803ce965ea371d5ff073cf0f43b6a2ab576b208426e11409c09b9b0\nmsg = \nresult = valid\ntag = 76acb342cf3166a5b63c0c0ea1383c8d\n\n# tcId = 3\naad = bd506764f2d2c410\nct = \niv = a92ef0ac991dd516a3c6f689\nkey = 7a4cd759172e02eb204db2c3f5c746227df584fc1345196391dbb9577a250742\nmsg = \nresult = valid\ntag = 906fa6284b52f87b7359cbaa7563c709\n\n# tcId = 4\naad = \nct = 3a\niv = 99e23ec48985bccdeeab60f1\nkey = cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273\nmsg = 2a\nresult = valid\ntag = cac27dec0968801e9f6eded69d807522\n\n# tcId = 5\naad = 91ca6c592cbcca53\nct = c4\niv = ab0dca716ee051d2782f4403\nkey = 46f0254965f769d52bdb4a70b443199f8ef207520d1220c55e4b70f0fda620ee\nmsg = 51\nresult = valid\ntag = 168310ca45b1f7c66cad4e99e43f72b9\n\n# tcId = 6\naad = \nct = 4d13\niv = 461af122e9f2e0347e03f2db\nkey = 2f7f7e4f592bb389194989743507bf3ee9cbde1786b6695fe6c025fd9ba4c100\nmsg = 5c60\nresult = valid\ntag = 91e8b61efb39c122195453077b22e5e2\n\n# tcId = 7\naad = 88364fc8060518bf\nct = b60d\niv = 61546ba5f1720590b6040ac6\nkey = c8833dce5ea9f248aa2030eacfe72bffe69a620caf793344e5718fe0d7ab1a58\nmsg = ddf2\nresult = valid\ntag = ead0fd4697ec2e5558237719d02437a2\n\n# tcId = 8\naad = \nct = 5dfe3440dbb3c3\niv = 3c4e654d663fa4596dc55bb7\nkey = 55568158d3a6483f1f7021eab69b703f614251cadc1af5d34a374fdbfc5adac7\nmsg = ab85e9c1571731\nresult = valid\ntag = ed7a434e2602d394281e0afa9fb7aa42\n\n# tcId = 9\naad = 84e46be8c0919053\nct = 4bd47212941ce3\niv = 58389375c69ee398de948396\nkey = e3c09e7fab1aefb516da6a33022a1dd4eb272c80d540c5da52a730f34d840d7f\nmsg = 4ee5cda20d4290\nresult = valid\ntag = 185f1408ee7fbf18f5abad6e2253a1ba\n\n# tcId = 10\naad = \nct = 8e9439a56eeec817\niv = 4f07afedfdc3b6c2361823d3\nkey = 51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152\nmsg = be3308f72a2c6aed\nresult = valid\ntag = fbe8a6ed8fabb1937539dd6c00e90021\n\n# tcId = 11\naad = 66c0ae70076cb14d\nct = b9b910433af052b0\niv = b4ea666ee119563366484a78\nkey = 1131c1418577a054de7a4ac551950f1a053f9ae46e5b75fe4abd5608d7cddadd\nmsg = a4c9c2801b71f7df\nresult = valid\ntag = 4530f51aeee024e0a445a6328fa67a18\n\n# tcId = 12\naad = \nct = ff7dc203b26c467a6b50db33\niv = 9a59fce26df0005e07538656\nkey = 99b62bd5afbe3fb015bde93f0abf483957a1c3eb3ca59cb50b39f7f8a9cc51be\nmsg = 42baae5978feaf5c368d14e0\nresult = valid\ntag = 578c0f2758c2e14e36d4fc106dcb29b4\n\n# tcId = 13\naad = a506e1a5c69093f9\nct = 9f8816de0994e938d9e53f95\niv = 58dbd4ad2c4ad35dd906e9ce\nkey = 85f35b6282cff440bc1020c8136ff27031110fa63ec16f1e825118b006b91257\nmsg = fdc85b94a4b2a6b759b1a0da\nresult = valid\ntag = d086fc6c9d8fa915fd8423a7cf05072f\n\n# tcId = 14\naad = \nct = 0b29638e1fbdd6df53970be2210042\niv = 68ab7fdbf61901dad461d23c\nkey = 67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb\nmsg = 51f8c1f731ea14acdb210a6d973e07\nresult = valid\ntag = 2a9134087d67a46e79178d0a93f5e1d2\n\n# tcId = 15\naad = 6453a53384632212\nct = 32db66c4a3819d81557455e5980fed\niv = d95b3243afaef714c5035b6a\nkey = e6f1118d41e4b43fb58221b7ed79673834e0d8ac5c4fa60bbc8bc4893a58894d\nmsg = 97469da667d6110f9cbda1d1a20673\nresult = valid\ntag = feae30dec94e6ad3a9eea06a0d703917\n\n# tcId = 16\naad = \nct = e9110e9f56ab3ca483500ceabab67a13\niv = 2fcb1b38a99e71b84740ad9b\nkey = 59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a\nmsg = 549b365af913f3b081131ccb6b825588\nresult = valid\ntag = 836ccabf15a6a22a51c1071cfa68fa0c\n\n# tcId = 17\naad = 034585621af8d7ff\nct = e4b113cb775945f3d3a8ae9ec141c00c\niv = 118a6964c2d3e380071f5266\nkey = b907a45075513fe8a8019edee3f2591487b2a030b03c6e1d771c862571d2ea1e\nmsg = 55a465644f5b650928cbee7c063214d6\nresult = valid\ntag = 7c43f16ce096d0dc27c95849dc383b7d\n\n# tcId = 18\naad = \nct = 02cc3acb5ee1fcdd12a03bb857976474d3\niv = 45aaa3e5d16d2d42dc03445d\nkey = 3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011\nmsg = 3ff1514b1c503915918f0c0c31094a6e1f\nresult = valid\ntag = d83b7463a2c3800fe958c28eaa290813\n\n# tcId = 19\naad = 9aaf299eeea78f79\nct = 35766488d2bc7c2b8d17cbbb9abfad9e6d\niv = f0384fb876121410633d993d\nkey = f60c6a1b625725f76c7037b48fe3577fa7f7b87b1bd5a982176d182306ffb870\nmsg = 63858ca3e2ce69887b578a3c167b421c9c\nresult = valid\ntag = 1f391e657b2738dda08448cba2811ceb\n\n# tcId = 20\naad = \nct = 42f26c56cb4be21d9d8d0c80fc99dde00d75f38074bfe764\niv = e6b1adf2fd58a8762c65f31b\nkey = 0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7\nmsg = 10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111\nresult = valid\ntag = 54aa7e13d48fff7d7557039457040a3a\n\n# tcId = 21\naad = 3e8bc5ade182ff08\nct = 123032437b4bfd6920e8f7e7e0087ae4889ebe7a0ad0e900\niv = 6b282ebecc541bcd7834ed55\nkey = c5bc09565646e7edda954f1f739223dada20b95c44ab033d0fae4b0283d18be3\nmsg = 9222f9018e54fd6de1200806a9ee8e4cc904d29f25cba193\nresult = valid\ntag = 3cf68f179550da63d3b96c2d55411865\n\n# tcId = 22\naad = \nct = 45c7d6b53acad4abb68876a6e96a48fb59524d2c92c9d8a189c9fd2db91746\niv = 04a9be03508a5f31371a6fd2\nkey = 2eb51c469aa8eb9e6c54a8349bae50a20f0e382711bba1152c424f03b6671d71\nmsg = b053999286a2824f42cc8c203ab24e2c97a685adcc2ad32662558e55a5c729\nresult = valid\ntag = 566d3ca10e311b695f3eae1551652493\n\n# tcId = 23\naad = 374618a06ea98a48\nct = 46a80c4187024720084627580080dde5a3f4a11093a7076ed6f3d326bc7b70\niv = 470a339ecb3219b8b81a1f8b\nkey = 7f5b74c07ed1b40fd14358fe2ff2a740c116c7706510e6a437f19ea49911cec4\nmsg = f45206abc25552b2abc9ab7fa243035fedaaddc3b2293956f1ea6e7156e7eb\nresult = valid\ntag = 534d4aa2835a52e72d14df0e4f47f25f\n\n# tcId = 24\naad = \nct = ea29afa49d36e8760f5fe19723b9811ed5d519934a440f5081ac430b953b0e21\niv = 72cfd90ef3026ca22b7e6e6a\nkey = e1731d5854e1b70cb3ffe8b786a2b3ebf0994370954757b9dc8c7bc5354634a3\nmsg = b9c554cbc36ac18ae897df7beecac1dbeb4eafa156bb60ce2e5d48f05715e678\nresult = valid\ntag = 222541af46b86533c6b68d2ff108a7ea\n\n# tcId = 25\naad = 2333e5ce0f93b059\nct = 6dad637897544d8bf6be9507ed4d1bb2e954bc427e5de729daf50762846ff2f4\niv = 262880d475f3dac5340dd1b8\nkey = 27d860631b0485a410702fea61bc873f3442260caded4abde25b786a2d97f145\nmsg = 6b2604996cd30c14a13a5257ed6cffd3bc5e29d6b97eb1799eb335e281ea451e\nresult = valid\ntag = 7b997d93c982189d7095dc794c746232\n\n# tcId = 26\naad = \nct = fba78ae4f9d808a62e3da40be2cb7700c3613d9eb2c529c652e76a432c658d27095f0eb8f940c324981ea935e507f9\niv = e74a515e7e2102b90bef55d2\nkey = cf0d40a4644e5f51815165d5301b22631f4544c49a1878e3a0a5e8e1aae0f264\nmsg = 973d0c753826bae466cf9abb3493152e9de7819e2bd0c71171346b4d2cebf8041aa3cedc0dfd7b467e26228bc86c9a\nresult = valid\ntag = 8f046956db3a512908bd7afc8f2ab0a9\n\n# tcId = 27\naad = b3e4064683b02d84\nct = a1ffed80761829ecce242e0e88b138049016bca018da2b6e19986b3e318cae8d806198fb4c527cc39350ebddeac573\niv = d4d807341683825b31cd4d95\nkey = 6cbfd71c645d184cf5d23c402bdb0d25ec54898c8a0273d42eb5be109fdcb2ac\nmsg = a98995504df16f748bfb7785ff91eeb3b660ea9ed3450c3d5e7b0e79ef653659a9978d75542ef91c456762215640b9\nresult = valid\ntag = c4cbf0befda0b70242c640d7cd02d7a3\n\n# tcId = 28\naad = \nct = 9a4ef22b181677b5755c08f747c0f8d8e8d4c18a9cc2405c12bb51bb1872c8e8b877678bec442cfcbb0ff464a64b74332cf072898c7e0eddf6232ea6e27efe50\niv = d61040a313ed492823cc065b\nkey = 5b1d1035c0b17ee0b0444767f80a25b8c1b741f4b50a4d3052226baa1c6fb701\nmsg = d096803181beef9e008ff85d5ddc38ddacf0f09ee5f7e07f1e4079cb64d0dc8f5e6711cd4921a7887de76e2678fdc67618f1185586bfea9d4c685d50e4bb9a82\nresult = valid\ntag = 9ff3427a0f32fa566d9ca0a78aefc013\n\n# tcId = 29\naad = 7193f623663321a2\nct = 5fbbdecc34b",
+    "e201614f636031eeb42f1cace3c79a12cffd871ee8e73820c829749f1abb4294367849fb6c2aa56bda8a3078f723d7c1c852024b017b58973fb1e\niv = d31c21aba175b70de4ebb19c\nkey = 97d635c4f47574d9998a90875da1d3a284b755b2d39297a5725235190e10a97e\nmsg = 94ee166d6d6ecf8832437136b4ae805d428864359586d9193a25016293edba443c58e07e7b7195ec5bd84582a9d56c8d4a108c7d7ce34e6c6f8ea1bec0567317\nresult = valid\ntag = 09263da7b4cb921452f97dca40f580ec\n\n# tcId = 30\naad = \nct = d0102f6c258bf49742cec34cf2d0fedf23d105fb4c84cf98515e1bc9a64f8ad5be8f0721bde50645d00083c3a263a31053b760245f52ae2866a5ec83b19f61be1d30d5c5d9fecc4cbbe08fd385813a2aa39a00ff9c10f7f23702add1e4b2ffa31c\niv = 17c86a8abbb7e003acde2799\nkey = fe6e55bdaed1f7284ca5fc0f8c5f2b8df56dc0f49e8ca66a41995e783351f901\nmsg = b429eb80fb8fe8baeda0c85b9c333458e7c2992e558475069d12d45c22217564121588032297eff56783742a5fc22d7410ffb29d66098661d76f126c3c27689e43b37267cac5a3a6d3ab49e391da29cd3054a5692e2807e4c3ea46c8761d50f592\nresult = valid\ntag = 41865fc71de12b19612127ce49993bb0\n\n# tcId = 31\naad = a11c40b603767330\nct = 7545391b51de01d5c53dfaca777909063e58edee4bb1227e7110ac4d2620c2aec2f848f56deeb037a8dced75afa8a6c890e2dee42f950bb33d9e2424d08a505d899563973ed38870f3de6ee2adc7fe072c366c14e2cf7ca62fb3d36bee11685461\niv = 46362f45d6379e63e5229460\nkey = aabc063474e65c4c3e9bdc480dea97b45110c8618846ff6b15bdd2a4a5682c4e\nmsg = ceb534ce50dc23ff638ace3ef63ab2cc2973eeada80785fc165d06c2f5100ff5e8ab2882c475afcd05ccd49f2e7d8f55ef3a72e3dc51d6852b8e6b9e7aece57be6556b0b6d9413e33fc5fc24a9a205ad59574bb39d944a92dc47970d84a6ad3176\nresult = valid\ntag = b70d44ef8c66c5c7bbf10dcadd7facf6\n\n# tcId = 32\naad = 02\nct = 7e72f5a185af16a611921b438f749f0b\niv = 87345f1055fd9e2102d50656\nkey = 7d00b48095adfa3272050607b264185002ba99957c498be022770f2ce2f3143c\nmsg = e5ccaa441bc814688f8f6e8f28b500b2\nresult = valid\ntag = 1242c670732334029adfe1c5001651e4\n\n# tcId = 33\naad = b648\nct = 85f29a719557cdd14d1f8fffab6d9e60\niv = 87a3163ec0598ad95b3aa713\nkey = 6432717f1db85e41ac7836bce25185a080d5762b9e2b18444b6ec72c3bd8e4dc\nmsg = 02cde168fba3f544bbd0332f7adeada8\nresult = valid\ntag = 732ca32becd515a1ed353f542e999858\n\n# tcId = 34\naad = bd4cd02fc7502bbdbdf6c9a3cbe8f0\nct = c1b295936d56fadac03e5f742bff73a1\niv = 6f573aa86baa492ba46596df\nkey = 8e34cf73d245a1082a920b86364eb896c4946467bcb3d58929fcb36690e6394f\nmsg = 16ddd23ff53f3d23c06334487040eb47\nresult = valid\ntag = 39c457dbab66382babb3b55800cda5b8\n\n# tcId = 35\naad = 89cce9fb47441d07e0245a66fe8b778b\nct = c84c9bb7c61c1bcb17772a1c500c5095\niv = 1a6518f02ede1da6809266d9\nkey = cb5575f5c7c45c91cf320b139fb594237560d0a3e6f865a67d4f633f2c08f016\nmsg = 623b7850c321e2cf0c6fbcc8dfd1aff2\nresult = valid\ntag = dbadf7a5138ca03459a2cd65831e092f\n\n# tcId = 36\naad = d19f2d989095f7ab03a5fde84416e00c0e\nct = 94bc80621ed1e71b1fd2b5c3a15e3568\niv = 564dee49ab00d240fc1068c3\nkey = a5569e729a69b24ba6e0ff15c4627897436824c941e9d00b2e93fddc4ba77657\nmsg = 87b3a4d7b26d8d3203a0de1d64ef82e3\nresult = valid\ntag = 333511861796978401598b963722f5b3\n\n# tcId = 37\naad = 5e6470facd99c1d81e37cd44015fe19480a2a4d3352a4ff560c0640fdbda\nct = 299b5d3f3d03c087209a16e285143111\niv = df8713e87ec3dbcfad14d53e\nkey = 56207465b4e48e6d04630f4a42f35cfc163ab289c22a2b4784f6f9290330bee0\nmsg = e601b38557797da2f8a4106a089d1da6\nresult = valid\ntag = 4b454ed198de117e83ec49fa8d8508d6\n\n# tcId = 38\naad = ba446f6f9a0ced22450feb10737d9007fd69abc19b1d4d9049a5551e86ec2b37\nct = 605bbf90aeb974f6602bc778056f0dca\niv = 8df4b15a888c33286a7b7651\nkey = 3937986af86dafc1ba0c4672d8abc46c207062682d9c264ab06d6c5807205130\nmsg = dc9e9eaf11e314182df6a4eba17aec9c\nresult = valid\ntag = 38ea23d99054b46b42ffe004129d2204\n\n# tcId = 39\naad = d41a828d5e71829247021905402ea257dccbc3b80fcd5675056b68bb59e62e8873\nct = 7b7ce0d824809a70de32562ccf2c2bbd\niv = be40e5f1a11817a0a8fa8949\nkey = 36372abcdb78e0279646ac3d176b9674e9154eecf0d5469c651ec7e16b4c1199\nmsg = 81ce84ede9b35859cc8c49a8f6be7dc6\nresult = valid\ntag = 15d44a00ce0d19b4231f921e22bc0a43\n\n# tcId = 40\naad = 3f2dd49bbf09d69a78a3d80ea2566614fc379474196c1aae84583da73d7ff85c6f42ca42056a9792cc1b9fb3c7d261\nct = ca82bff3e2f310ccc976672c4415e69b\niv = 84c87dae4eee27730ec35d12\nkey = 9f1479ed097d7fe529c11f2f5add9aaff4a1ca0b68997a2cb7f79749bd90aaf4\nmsg = a66747c89e857af3a18e2c79500087ed\nresult = valid\ntag = 57638c62a5d85ded774f913c813ea032\n\n# tcId = 41\naad = 00000000000000000000000000000000\nct = 0000000000000000000000000000000000000000000000000000000000000000\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40888094178355d304846443fee8df99470303fb3b7b80e030beebd329be\nresult = valid\ntag = e6d3d7324a1cbba777bbb0ecdda37807\n\n# tcId = 42\naad = 00000000000000000000000000000000\nct = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40888094178355d304846443fee8df99470303fb3b7b80e030beebd329bee3bcdb5b1edefcfe8bcda1b6a15c8c2b0869ffd2ec5e26e553b7b227fe87fdbd\nresult = valid\ntag = 062de6795f274fd2a305d76980bc9cce\n\n# tcId = 43\naad = 00000000000000000000000000000000\nct = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40888094178355d304846443fee8df99470303fb3b7b80e030beebd329bee3bcdb5b1edefcfe8bcda1b6a15c8c2b0869ffd2ec5e26e553b7b227fe87fdbd7ada44424269bffa5527f270acf68502b74c5ae2e60c0580981a4938459392c49bb2f284b646efc7f3f0b1361dc348ed77d30bc57692ed38fbac0188380488c7\nresult = valid\ntag = d8b47902baaeafb34203051529af282e\n\n# tcId = 44\naad = ffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bf777f6be87caa2cfb7b9bbc01172066b8fcfc04c4847f1fcf41142cd641\nresult = valid\ntag = b3891c849cb52c27747edfcf31213bb6\n\n# tcId = 45\naad = ffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bf777f6be87caa2cfb7b9bbc01172066b8fcfc04c4847f1fcf41142cd6411c4324a4e121030174325e495ea373d4f796002d13a1d91aac484dd801780242\nresult = valid\ntag = f0c12d26ef03029b62c008da27c5dc68\n\n# tcId = 46\naad = ffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bf777f6be87caa2cfb7b9bbc01172066b8fcfc04c4847f1fcf41142cd6411c4324a4e121030174325e495ea373d4f796002d13a1d91aac484dd8017802428525bbbdbd964005aad80d8f53097afd48b3a51d19f3fa7f67e5b6c7ba6c6d3b644d0d7b49b910380c0f4ec9e23cb712882cf43a896d12c70453fe77c7fb7738\nresult = valid\ntag = ee65783001c25691fa28d0f5f1c1d762\n\n# tcId = 47\naad = 00000080000000800000008000000080\nct = 0000008000000080000000800000008000000080000000800000008000000080\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40088094170355d304046443fe68df99478303fb3bfb80e0303eebd3293e\nresult = valid\ntag = 79ba7a29f5a7bb75797af87a610129a4\n\n# tcId = 48\naad = 00000080000000800000008000000080\nct = 00000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40088094170355d304046443fe68df99478303fb3bfb80e0303eebd3293ee3bcdbdb1edefc7e8bcda136a15c8cab0869ff52ec5e266553b7b2a7fe87fd3d\nresult = valid\ntag = 36b1743819e1b9ba1551e8ed922a959a\n\n# tcId = 49\naad = 0000008",
+    "0000000800000008000000080\nct = 0000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40088094170355d304046443fe68df99478303fb3bfb80e0303eebd3293ee3bcdbdb1edefc7e8bcda136a15c8cab0869ff52ec5e266553b7b2a7fe87fd3d7ada44c24269bf7a5527f2f0acf68582b74c5a62e60c0500981a49b8459392449bb2f204b646ef47f3f0b1b61dc3486d77d30b457692edb8fbac010838048847\nresult = valid\ntag = feac4955554e806f3a1902e24432c08a\n\n# tcId = 50\naad = ffffff7fffffff7fffffff7fffffff7f\nct = ffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7f\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bff77f6be8fcaa2cfbfb9bbc01972066b87cfc04c4047f1fcfc1142cd6c1\nresult = valid\ntag = 20a3798df1292c5972bf9741aec38a19\n\n# tcId = 51\naad = ffffff7fffffff7fffffff7fffffff7f\nct = ffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7f\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bff77f6be8fcaa2cfbfb9bbc01972066b87cfc04c4047f1fcfc1142cd6c11c432424e121038174325ec95ea37354f79600ad13a1d99aac484d58017802c2\nresult = valid\ntag = c03d9f67354a97b2f074f7551557e49c\n\n# tcId = 52\naad = ffffff7fffffff7fffffff7fffffff7f\nct = ffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7f\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bff77f6be8fcaa2cfbfb9bbc01972066b87cfc04c4047f1fcfc1142cd6c11c432424e121038174325ec95ea37354f79600ad13a1d99aac484d58017802c28525bb3dbd964085aad80d0f53097a7d48b3a59d19f3faff67e5b647ba6c6dbb644d0dfb49b910b80c0f4e49e23cb792882cf4ba896d12470453fef7c7fb77b8\nresult = valid\ntag = c86da8dd652286d50213d328d63e4006\n\n# tcId = 53\naad = 7fffffff7fffffff7fffffff7fffffff\nct = 7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 5a92bf77ff6be87c2a2cfb7b1bbc0117a066b8fc7c04c484ff1fcf41942cd641\nresult = valid\ntag = bede9083ceb36ddfe5fa811f95471c67\n\n# tcId = 54\naad = 7fffffff7fffffff7fffffff7fffffff\nct = 7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 5a92bf77ff6be87c2a2cfb7b1bbc0117a066b8fc7c04c484ff1fcf41942cd6419c4324a461210301f4325e49dea373d47796002d93a1d91a2c484dd881780242\nresult = valid\ntag = 300874bb0692b689dead9ae15b067390\n\n# tcId = 55\naad = 7fffffff7fffffff7fffffff7fffffff\nct = 7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 5a92bf77ff6be87c2a2cfb7b1bbc0117a066b8fc7c04c484ff1fcf41942cd6419c4324a461210301f4325e49dea373d47796002d93a1d91a2c484dd8817802420525bbbd3d9640052ad80d8fd3097afdc8b3a51d99f3fa7fe7e5b6c73a6c6d3be44d0d7bc9b910388c0f4ec9623cb712082cf43a096d12c78453fe7747fb7738\nresult = valid\ntag = 99cad85f45ca40942d0d4d5e950ade22\n\n# tcId = 56\naad = 00000000ffffffff00000000ffffffff\nct = 00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40887f6be87c55d304849bbc0117df994703fc04c48480e030be142cd641\nresult = valid\ntag = 8bbe145272e7c2d9a1891a3ab0983d9d\n\n# tcId = 57\naad = 00000000ffffffff00000000ffffffff\nct = 00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40887f6be87c55d304849bbc0117df994703fc04c48480e030be142cd641e3bcdb5be12103018bcda1b65ea373d40869ffd213a1d91a53b7b22701780242\nresult = valid\ntag = 3b41861913a8f6de7f61e225631bc382\n\n# tcId = 58\naad = 00000000ffffffff00000000ffffffff\nct = 00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 256d40887f6be87c55d304849bbc0117df994703fc04c48480e030be142cd641e3bcdb5be12103018bcda1b65ea373d40869ffd213a1d91a53b7b227017802427ada4442bd9640055527f27053097afdb74c5ae219f3fa7f981a4938ba6c6d3b9bb2f28449b91038f3f0b136e23cb71277d30bc5896d12c7fbac0188c7fb7738\nresult = valid\ntag = 8428bcf023ec6bf31fd9efb203ff0871\n\n# tcId = 59\naad = ffffffff00000000ffffffff00000000\nct = ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bf7780941783aa2cfb7b6443fee82066b8fc03fb3b7b7f1fcf41ebd329be\nresult = valid\ntag = 139fdf6474ea24f549b075825f2c7620\n\n# tcId = 60\naad = ffffffff00000000ffffffff00000000\nct = ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bf7780941783aa2cfb7b6443fee82066b8fc03fb3b7b7f1fcf41ebd329be1c4324a41edefcfe74325e49a15c8c2bf796002dec5e26e5ac484dd8fe87fdbd\nresult = valid\ntag = bbad8d863b835a8e8664fd1d4566b6b4\n\n# tcId = 61\naad = ffffffff00000000ffffffff00000000\nct = ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000\niv = 000000000000000001ee3200\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = da92bf7780941783aa2cfb7b6443fee82066b8fc03fb3b7b7f1fcf41ebd329be1c4324a41edefcfe74325e49a15c8c2bf796002dec5e26e5ac484dd8fe87fdbd8525bbbd4269bffaaad80d8facf6850248b3a51de60c058067e5b6c7459392c4644d0d7bb646efc70c0f4ec91dc348ed882cf43a7692ed380453fe77380488c7\nresult = valid\ntag = 42f2354297849a511d53e5571772f71f\n\n# tcId = 62\n# Flipped bit 0 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a2e3fdf9fba6861b5ad2607f40b7f447\n\n# tcId = 63\n# Flipped bit 1 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a1e3fdf9fba6861b5ad2607f40b7f447\n\n# tcId = 64\n# Flipped bit 7 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 23e3fdf9fba6861b5ad2607f40b7f447\n\n# tcId = 65\n# Flipped bit 8 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e2fdf9fba6861b5ad2607f40b7f447\n\n# tcId = 66\n# Flipped bit 31 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+    "\nmsg = \nresult = invalid\ntag = a3e3fd79fba6861b5ad2607f40b7f447\n\n# tcId = 67\n# Flipped bit 32 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9faa6861b5ad2607f40b7f447\n\n# tcId = 68\n# Flipped bit 33 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9f9a6861b5ad2607f40b7f447\n\n# tcId = 69\n# Flipped bit 63 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6869b5ad2607f40b7f447\n\n# tcId = 70\n# Flipped bit 64 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5bd2607f40b7f447\n\n# tcId = 71\n# Flipped bit 77 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5af2607f40b7f447\n\n# tcId = 72\n# Flipped bit 80 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5ad2617f40b7f447\n\n# tcId = 73\n# Flipped bit 96 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5ad2607f41b7f447\n\n# tcId = 74\n# Flipped bit 97 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5ad2607f42b7f447\n\n# tcId = 75\n# Flipped bit 120 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5ad2607f40b7f446\n\n# tcId = 76\n# Flipped bit 121 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5ad2607f40b7f445\n\n# tcId = 77\n# Flipped bit 126 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5ad2607f40b7f407\n\n# tcId = 78\n# Flipped bit 127 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6861b5ad2607f40b7f4c7\n\n# tcId = 79\n# Flipped bit 63 and 127 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = a3e3fdf9fba6869b5ad2607f40b7f4c7\n\n# tcId = 80\n# Tag changed to all zero expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 81\n# tag change to all 1 expected tag:a3e3fdf9fba6861b5ad2607f40b7f447\naad = 616164\nct = \niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = \nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 82\n# Flipped bit 0 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 26da374f17b7f1b23844a5490bfc4001\n\n# tcId = 83\n# Flipped bit 1 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 25da374f17b7f1b23844a5490bfc4001\n\n# tcId = 84\n# Flipped bit 7 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = a7da374f17b7f1b23844a5490bfc4001\n\n# tcId = 85\n# Flipped bit 8 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27db374f17b7f1b23844a5490bfc4001\n\n# tcId = 86\n# Flipped bit 31 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da37cf17b7f1b23844a5490bfc4001\n\n# tcId = 87\n# Flipped bit 32 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f16b7f1b23844a5490bfc4001\n\n# tcId = 88\n# Flipped bit 33 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f15b7f1b23844a5490bfc4001\n\n# tcId = 89\n# Flipped bit 63 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1323844a5490bfc4001\n\n# tcId = 90\n# Flipped bit 64 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23944a5490bfc4001\n\n# tcId = 91\n# Flipped bit 77 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23864a5490bfc4001\n\n# tcId = 92\n# Flipped bit 80 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23844a4490bfc4001\n\n# tcId = 93\n# Flipped bit 96 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23844a5490afc4001\n\n# tcId = 94\n# Flipped bit 97 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = ",
+    "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23844a54909fc4001\n\n# tcId = 95\n# Flipped bit 120 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23844a5490bfc4000\n\n# tcId = 96\n# Flipped bit 121 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23844a5490bfc4003\n\n# tcId = 97\n# Flipped bit 126 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23844a5490bfc4041\n\n# tcId = 98\n# Flipped bit 127 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1b23844a5490bfc4081\n\n# tcId = 99\n# Flipped bit 63 and 127 in tag expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 27da374f17b7f1323844a5490bfc4081\n\n# tcId = 100\n# Tag changed to all zero expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = 00000000000000000000000000000000\n\n# tcId = 101\n# tag change to all 1 expected tag:27da374f17b7f1b23844a5490bfc4001\naad = 616164\nct = 2cf8ae525fc86025268a4e1d88bead19\niv = 000102030405060708090a0b\nkey = 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff\nmsg = 00000000000000000000000000000000\nresult = invalid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 102\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 30303030303030300002506e\nkey = 3030303030303030303030303030303030303030303030303030303030303030\nmsg = d4500bf009493551c380adf52c573a69df7e8b762463330facc16a5726be7190c63c5a1c926584a096756828dcdc64acdf963d931bf1dae238f3f157224ac4b542d785b0dd84db6be3bc5a3663e84149ffbed09e54f78f16a8223b24cb019f58b21b0e551e7aa07327629551376ccbc3937671a0629bd95c9915c78555771e7a\nresult = valid\ntag = 0b300d8da56c2185755279553c4c82ca\n\n# tcId = 103\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 3030303030303030000318a5\nkey = 3030303030303030303030303030303030303030303030303030303030303030\nmsg = 7de87f6729945275d0655da4c7fde4569e16f111b5eb26c22d859e3ff822eced3a6dd9a60f22957f7b7c857e8822eb9fe0b8d7022141f2d0b48f4b5612d322a88dd0fe0b4d9179324f7c6c9e990efbd80e5ed6775826498b1efe0f71a0f3ec5b29cb28c2540a7dcd51b7daaee0ff4a7f3ac1ee54c29ee4c170de408f66692194\nresult = valid\ntag = c578e2aa44d309b7b6a5193bdc6118f5\n\n# tcId = 104\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 00000000000000000007b4f0\nkey = 3030303030303030303030303030303030303030303030303030303030303030\nmsg = 1b996f9a3ccc6785de22ff5b8add9502ce03a0faf5992a09522cdd1206d220b8f8bd07d1f1f5a1bd9a71d11c7f579b855818c08d4de036393183b7f590b335aed8de5b57b13c5fede2441c3e184aa9d46e61598506b3e11c43c62cbcaceced33190875b012218b1930fb7c38ec45ac11c353d0cf938dccb9efad8fedbe46daa5\nresult = valid\ntag = 4b0bda8ad043830d8319ab82c50c7663\n\n# tcId = 105\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 00000000000000000020fb66\nkey = 3030303030303030303030303030303030303030303030303030303030303030\nmsg = 86cbacae4d3f74ae01213e0551cc15160ea1be8408e3d5d74f01464995a69e6176cb9e02b2247ed299892f9182a45caf4c69405611766edfafdc285519ea30480c44f05e781eacf8fcecc7090abb28fa5fd585ac8cda7e8772e594e4ce6c883281932e0f89f877a1f04d9c32b06cf90b0e762b430c4d517c97107068f498ef7f\nresult = valid\ntag = 4bc98f72c494c2a43c2b15a1043f1cfa\n\n# tcId = 106\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 00000000000000000038bb90\nkey = 3030303030303030303030303030303030303030303030303030303030303030\nmsg = fab1cddf4fe198ef63add881d6ead6c57637bbe92018ca7c0b96fba0871e932db1fbf90761be25df8dfaf931ce5757e617b3d7a9f0bf0ffe5d591a33c143b8f53fd0b5a19609fd62e5c251a4281a200cfdc34f281710406f4e37625446ff6ef224913deb0d89af337128e3d155d16d3ec3246041432143e9ab3a6d2ccc2f4d62\nresult = valid\ntag = f7e9e151b02533c74658bfc7737c680d\n\n# tcId = 107\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 00000000000000000070484a\nkey = 3030303030303030303030303030303030303030303030303030303030303030\nmsg = 227202be7f3515e9d1c02eea2f1950b6481b048a4c91506cb40d504e6c949f82d197c25ad17dc721651125782ac7a71247feaef32f1f250ce4bb8f79acaa179d45a7b0545f0924325efa87d5e441d28478c61f2223ee67c3b41f4394535e2a24369a2e16613c459490c14fb1d755fe53fbe1ee45b1b21f7162e2fcaa742abefd\nresult = valid\ntag = 795bcff647c553c2e4eb6e0eafd9e04e\n\n# tcId = 108\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000000000000000000932f40\nkey = 3030303030303030303030303030303030303030303030303030303030303030\nmsg = fae58345c16cb",
+    "0f5cc537f2b1b3469c969463b3ea71bcf6b98d669a8e60e04fc08d5fd069c362638e3400ef4cb242e27e2245e68cb9ec583da5340b12edf423b7326ad20feeb57daca2e0467a32899b42df8e56d84e006bc8a7acc731e7c1f6becb5719f7077f0d4f4c61ab11ebac1001801ce33c4e4a77d831d3ce34e8410e1\nresult = valid\ntag = 1946d653960f947a74d3e8093cf48502\n\n# tcId = 109\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000000000000000000e29335\nkey = 3030303030303030303030303030303030303030303030303030303030303030\nmsg = ebb216ddd7ca709215f503df9ce63c5cd2194e7d9099e8a90b2afaad5eba35069925a603fdbc341aaed41505b10941fa3856a7e247b1040709746cfc2096caa631b2fff41c250506d889c1c90671ade853ee6394c19192a5cf3710d1073099e5bc946582fc0fab9f543c716ae2486a8683fdca39d2e14f23d00a582664f4ecb1\nresult = valid\ntag = 36c3002985dd21baf895d633573f12c0\n\n# tcId = 110\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 0000000000000000000ef7d5\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 408ae6ef1c7ef0fb2c2d610816fc7849efa58f78273f5f166ea65f81b575747d035b3040fede1eb9459788669788408e00413b3e376d152d204aa2b7a83558fcd48a0ef7a26b1cd6d35d23b3f5dfe0ca77a4ce32b94abf83da2aefcaf068380879e89fb0a3829595cf44c3852ae2cc662b689f9355d9c183801f6acc313f8907\nresult = valid\ntag = 6514518e0a264142e0b7351f967fc2ae\n\n# tcId = 111\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 0000000000000000003dfce4\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 0a0a24499bcade58cf1576c312aca984718cb4cc7e0153f5a9015810859644dfc021174e0b060a397448de8b484a8603be680a6934c0906f30dd17eae2d4c5faa777f8ca53370e08331b88c342bac959787bbb33930e3b56be86da7f2a6eb1f94089d1d181074d4302f8e0552d0de1fab306a21b42d4c3ba6e6f0cbcc81e877a\nresult = valid\ntag = 4c194da6a99fd65b40e9cad798f44b19\n\n# tcId = 112\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 0000000000000000018486a8\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 4a0aaff8494729188691701340f3ce2b8a78eed3a0f065994b72484e7991d25c29aa075eb1fc16de93fe069058112ab284a3ed18780326d1258a47222fa633d8b29f3bd9150b239b1546c2bb9b9f410febead396000ee477701532c3d0f5fbf895d280196d2f737c5e9fec50d92bb0df5d7e513be5b8ea971310d5bf16ba7aee\nresult = valid\ntag = c8ae7788cd2874abc138541e11fd0587\n\n# tcId = 113\n# checking for int overflows\naad = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875c783d35f613e6d9093d38e975c38fe3b89f7aed35cb5a2fcaa0346efb936554649cf6378171eae4396ea15dc240d1abf4472d9096524fa1b2b023b8b288222773d4d206616f9293f65b45dbbc74e7c2edfbcbbf1cfb679bb739a5862de2bcb937f74d5bf8671c5a8a5092f61d54c9aa5b\nresult = valid\ntag = 933a5163c7f62368327b3fbc1036c943\n\n# tcId = 114\n# special case tag\naad = 85ffffffffffffffffffffffffffffffa6902fcbc883bbc180b256ae34ad7f00\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000102030405060708090a0b\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d\nresult = valid\ntag = 000102030405060708090a0b0c0d0e0f\n\n# tcId = 115\n# special case tag\naad = ffffffffffffffffffffffffffffffff247e50642a1c0a2f8f77219609dba958\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000102030405060708090a0b\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d\nresult = valid\ntag = 00000000000000000000000000000000\n\n# tcId = 116\n# special case tag\naad = 7cffffffffffffffffffffffffffffffd9e72c064ac8961f3fa585e0e2abd600\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000102030405060708090a0b\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d\nresult = valid\ntag = ffffffffffffffffffffffffffffffff\n\n# tcId = 117\n# special case tag\naad = 65ffffffffffffffffffffffffffffff95af0f4d0b686eaeccca4307d596f502\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000102030405060708090a0b\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d\nresult = valid\ntag = 00000080000000800000008000000080\n\n# tcId = 118\n# special case tag\naad = ffffffffffffffffffffffffffffffff8540b464357707be3a39d55c34f8bcb3\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000102030405060708090a0b\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d\nresult = valid\ntag = ffffff7fffffff7fffffff7fffffff7f\n\n# tcId = 119\n# special case tag\naad = 4fffffffffffffffffffffffffffffff6623d990b898d830d212af2383330701\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000102030405060708090a0b\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d\nresult = valid\ntag = 01000000010000000100000001000000\n\n# tcId = 120\n# special case tag\naad = 83ffffffffffffffffffffffffffffff5f16d09f17787211b7d484e024f89701\nct = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\niv = 000102030405060708090a0b\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bb",
+    "cb3e4e74a71528ef51263ce24e0d575e0e44d\nresult = valid\ntag = ffffffff000000000000000000000000\n\n# tcId = 121\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = 0039e2fd2fd312149e989880884813e7caffffffffffffffffffffffffffffff3b0e869aaa8ea49632ffff37b9e8ce00caffffffffffffffffffffffffffffff3b0e869aaa8ea49632ffff37b9e8ce00\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 005235d2a919f28d3db7664a34ae6b444d3d35f613e6d9093d38e975c38fe3b85b8b94509e2b74a36d346e33d572659ba9f6378171eae4396ea15dc240d1abf483dce9f3073efadb7d23b87ace35168c\nresult = valid\ntag = a519ac1a35b4a57787510af78d8d200a\n\n# tcId = 122\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = d3ffffffffffffffffffffffffffffff6218b27f83b8b46602f6e1d834207b02ceffffffffffffffffffffffffffffff2a6416cedb1cdd296ef5d7d692daff02ceffffffffffffffffffffffffffffff2a6416cedb1cdd296ef5d7d692daff02\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = d39428d079351f665cd001354319875ce5da78766fa19290c031f75208506745ae7aed35cb5a2fcaa0346efb93655464496ddeb05509c6efffab75eb2df4ab09762d9096524fa1b2b023b8b2882227730149ef504b71b120ca4ff39519c2c210\nresult = valid\ntag = 302fe82ab0a09af64400d015ae83d9cc\n\n# tcId = 123\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = e9ffffffffffffffffffffffffffffffea33f347304abdadf8ce413433c84501e0ffffffffffffffffffffffffffffffb27f579688aee57064ce37329182ca01e0ffffffffffffffffffffffffffffffb27f579688aee57064ce37329182ca01\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = e99428d079351f665cd001354319875c6df1394edc539b5b3a0957be0fb85946807aed35cb5a2fcaa0346efb93655464d1769fe806bbfeb6f590950f2eac9e0a582d9096524fa1b2b023b8b2882227739952ae0818c38979c07413711a9af713\nresult = valid\ntag = 98a7e836e0ee4d023500d0557ec2cbe0\n\n# tcId = 124\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffffffffffffffffffffffffffffffffe33bc552ca8b9e96169e797e8f30301b603ca99944df76528c9d6f54ab833d0f603ca99944df76528c9d6f54ab833d0f\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875c64f90f5b2692b860d4596ff4b3402c5c00b9bb53707aa667d356fe50c7199694033561e7caca6d941dc3cd6914ad6904\nresult = valid\ntag = 6ab8dce2c59da4737130b0252f68a8d8\n\n# tcId = 125\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = 68ffffffffffffffffffffffffffffff374def6eb782ed002143115412b74600ffffffffffffffffffffffffffffffff4e233fb3e51d1ec7424507720dc5219dffffffffffffffffffffffffffffffff4e233fb3e51d1ec7424507720dc5219d\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 689428d079351f665cd001354319875cb08f25675b9bcbf6e38407de2ec75a479f7aed35cb5a2fcaa0346efb936554642d2af7cd6b080501d31ba54fb2eb7596472d9096524fa1b2b023b8b288222773650ec62d757072cee6ff233186dd1c8f\nresult = valid\ntag = 044dea608880412bfdffcf35579e9b26\n\n# tcId = 126\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = 6dffffffffffffffffffffffffffffff26a37fa2e81026945c39e9f2eba87702ffffffffffffffffffffffffffffffffa5f1cff246fa09666e3bdf50b7f544b3ffffffffffffffffffffffffffffffffa5f1cff246fa09666e3bdf50b7f544b3\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 6d9428d079351f665cd001354319875ca161b5ab040900629efeff78d7d86b459f7aed35cb5a2fcaa0346efb93655464c6f8078cc8ef12a0ff657d6d08db10b8472d9096524fa1b2b023b8b2882227738edc366cd697656fca81fb133ced79a1\nresult = valid\ntag = 1e6bea6314542e2ef9ffcf450b2e982b\n\n# tcId = 127\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff7bc3729809e9dfe44fba0addade2aadf03c456df823cb8a0c5b900b3c935b8d303c456df823cb8a0c5b900b3c935b8d3\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875cfc01b891e5f0f9128d7d1c579192b69863414415b69968959a7291b7a5af134860cd9ea10c29a36654e7a28e761becd8\nresult = valid\ntag = ed2017c8dba4775629049d786e3bceb1\n\n# tcId = 128\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffffffffffffffffffffffffffffffffecaf03dbf698b88677b0e2cb0ba3cafa73b0e72170ec9042edafd8a127f6d7ee73b0e72170ec9042edafd8a127f6d7ee\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875c6b6dc9d21a819e70b577f44137d3d6bd1335f5eb44494077b26449a54b6c7c7510b92f5ffef98b847cf17a9c98d883e5\nresult = valid\ntag = 073f17cb6778645925049d8822cbcab6\n\n# tcId = 129\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffa0fc3e8032c3d5fdb62a11f096307db5ffffffffffffffffffffffffffffff766c9a8025eadea73905328c3379c004b5ffffffffffffffffffffffffffffff766c9a8025eadea73905328c3379c004\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ffcb2b1106f8234c5e99d4db4c7048de323d35f613e6d9093d38e975c38fe3b816e9884a114f0e9266cea3885fe36b9fd6f6378171eae4396ea15dc240d1abf4cebef5e9885a80ea76d975c144a41888\nresult = valid\ntag = 8b9bb4b4861289658c696a8340150405\n\n# tcId = 130\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = 6ff5a7c2bd414c3985cb9490b5a56d2ea6ffffffffffffffffffffffffffffff6ce43e94b92c784684013c5f1fdce900a6ffffffffffffffffffffffffffffff6ce43e94b92c784684013c5f1fdce900\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 6f9e70ed3b8baca026e46a5a0943158d213d35f613e6d9093d38e975c38fe3b80c612c5e8d89a873dbcaad5b7346429bc5f6378171eae4396ea15dc240d1abf4d43651fd149c260bcbdd7b126801318c\nresult = valid\ntag = 8b3bbd51644459568d81ca1fa72ce404\n\n# tcId = 131\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = 4140df25b8d32194e78e51d41738cc6db2ffffffffffffffffffffffffffffff0b0686f93d849859fed6b818520d4501b2ffffffffffffffffffffffffffffff0b0686f93d849859fed6b818520d4501\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 412b080a3e19c10d44a1af1eabdeb4ce353d35f613e6d9093d38e975c38fe3b86b8394330921486ca11d291c3e97ee9ad1f6378171eae4396ea15dc240d1abf4b3d4e9909034c614b10aff5525d09d8d\nresult = valid\ntag = 86fbab2b4a94f47aa56f0aea65d11008\n\n# tcId = 132\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = b22c7068a583fa350f8529c375f8eb88b6fffffffffffffffffffffffffffffffa5b162d6f12d1ec39cd90b72bff7503b6fffffffffffffffffffffffffffffffa5b162d6f12d1ec39cd90b72bff7503\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = b247a74723491aacacaad709c91e932b313d35f613e6d9093d38e975c38fe3b89ade04e75bb701d9660601b34765de98d5f6378171eae4396ea15dc240d1abf442897944c2a28fa17611d7fa5c22ad8f\nresult = valid\ntag = a019ac2ed667e17da16f0afa19610d0d\n\n# tcId = 133\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = 7464496670da0f3c2699a700d23ecc3aaaffffffffffffffffffffffffffffff21a884658a253c0b261fc0b466b71901aaffffffffffffffffffffffffffffff21a884658a253c0b261fc0b466b71901\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 740f9e49f610efa585b659ca6ed8b4992d3d35f613e6d9093d38e975c38fe3b8412d96afbe80ec3e79d451b00a2db29ac9f6378171eae4396ea15dc240d1abf4997aeb0c2795624669c387f9116ac18d\nresult = valid\ntag = 736e18181696a5889c3159faabab20fd\n\n# tcId = 134\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = add18a3fdd024a9f8f0cc801347ba376b0ffffffffffffffffffffffffffffff77f94d341cd0245da90907532469f201b0ffffffffffffffffffffffffffffff77f94d341cd0245da90907532469f201\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = adba5d105bc8aa062c2336cb889ddbd5373d35f613e6d9093d38e975c38fe3b8177c5ffe2875f468f6c2965748f3599ad3f6378171eae4396ea15dc240d1abf4cf2b225db1607a10e6d5401e53b42a8d\nresult = valid\ntag = bad58f10a91e6a889aba32fd17d8331a\n\n# tcId = 135\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = feffffffffffffffffffffffffffffff47c327cc365d088759098c341b4aed03d4ffffffffffffffffffffffffffffff2b0b973f745b28aae937f59f18eac701d4ffff",
+    "ffffffffffffffffffffffffff2b0b973f745b28aae937f59f18eac701\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = fe9428d079351f665cd001354319875cc001edc5da442e719bce9abe273af144b47aed35cb5a2fcaa0346efb9365546448025f41fa4e336c786957a2a7c4930a6c2d9096524fa1b2b023b8b28822277300266ea1e43644a34d8dd1dc93f2fa13\nresult = valid\ntag = d68ce174079add028dd05cf814630488\n\n# tcId = 136\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = b57867453f66f4daf9e474691f9c8515d3ffffffffffffffffffffffffffffff01101359851ad324a0dae88dc2430202d3ffffffffffffffffffffffffffffff01101359851ad324a0dae88dc2430202\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = b513b06ab9ac14435acb8aa3a37afdb6543d35f613e6d9093d38e975c38fe3b861950193b1bf0311ff117989aed9a999b0f6378171eae4396ea15dc240d1abf4b9c27c3028aa8d69ef06afc0b59eda8e\nresult = valid\ntag = aa48a3887d4b059699c2fdf9c6787e0a\n\n# tcId = 137\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff5333c3e1f8d78eacca0707526cad018cafffffffffffffffffffffffffffffff3049702414b599502624fdfe29313204afffffffffffffffffffffffffffffff3049702414b599502624fdfe29313204\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875cd4f109e814cea85a08c011d850dd1dcbcf7aed35cb5a2fcaa0346efb936554645340b85a9aa08296b77a5fc3961f660f172d9096524fa1b2b023b8b2882227731b6489ba84d8f559829ed9bda2290f16\nresult = valid\ntag = b936a817f2211af129e2cf160fd42bcb\n\n# tcId = 138\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff588ea80ac1583f434a806813ae2a4a9eb6ffffffffffffffffffffffffffffff998d381adb2359ddbae786537d37b900b6ffffffffffffffffffffffffffffff998d381adb2359ddbae786537d37b900\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875cdf4c62032d4119b588477e99925a56d9d67aed35cb5a2fcaa0346efb93655464fa84f0645536421b2bb9246ec219ed0b0e2d9096524fa1b2b023b8b288222773b2a0c1844b4e35d41e5da210f62f8412\nresult = valid\ntag = 9f7ac4351f6b91e63097a713115d05be\n\n# tcId = 139\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff943ac00981d89d2c14febfa5fb9cba1297ffffffffffffffffffffffffffffff00417083a7aa8d13f2fbb5dfc255a80497ffffffffffffffffffffffffffffff00417083a7aa8d13f2fbb5dfc255a804\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875c13f80a006dc1bbdad639a92fc7eca655f77aed35cb5a2fcaa0346efb936554646348b8fd29bf96d563a517e27d7bfc0f2f2d9096524fa1b2b023b8b2882227732b6c891d37c7e11a5641919c494d9516\nresult = valid\ntag = 9a18a828070269f44700d009e7171cc9\n\n# tcId = 140\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff0527514c6e8876ce3bf49794595dda2d9cffffffffffffffffffffffffffffffd57800b44c65d9a331f28d6ee8b7dc019cffffffffffffffffffffffffffffffd57800b44c65d9a331f28d6ee8b7dc01\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875c82e59b4582915038f933811e652dc66afc7aed35cb5a2fcaa0346efb93655464b671c8cac270c265a0ac2f535799880a242d9096524fa1b2b023b8b288222773fe55f92adc08b5aa9548a92d63afe113\nresult = valid\ntag = b436a82b93d555f74300d0199ba718ce\n\n# tcId = 141\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = ffffffffffffffffffffffffffffffff7613e28e5b384f7063ea6f83b71dfa48a0ffffffffffffffffffffffffffffffc4ce90e77df311376de8650dc2a90d04a0ffffffffffffffffffffffffffffffc4ce90e77df311376de8650dc2a90d04\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = ff9428d079351f665cd001354319875cf1d12887b7216986a12d79098b6de60fc07aed35cb5a2fcaa0346efb93655464a7c75899f3e60af1fcb6c7307d87590f182d9096524fa1b2b023b8b288222773efe36979ed9e7d3ec952414e49b13016\nresult = valid\ntag = ce54a82e1fa942fa3f00d0294f3715d3\n\n# tcId = 142\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = cb9a0db18d63d7ead7c960d6b286745fb3ffffffffffffffffffffffffffffffdebab4a1584250bffc2fc84d95decf04b3ffffffffffffffffffffffffffffffdebab4a1584250bffc2fc84d95decf04\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = cbf1da9e0ba9377374e69e1c0e600cfc343d35f613e6d9093d38e975c38fe3b8be3fa66b6ce7808aa3e45949f944649fd0f6378171eae4396ea15dc240d1abf46668dbc8f5f20ef2b3f38f00e2031788\nresult = valid\ntag = 2383ab0b799205699b510aa709bf31f1\n\n# tcId = 143\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = 8f4c51bb42233a7276a2c0912a88f3cbc5ffffffffffffffffffffffffffffff66d6f56905d45806f30828a993869a03c5ffffffffffffffffffffffffffffff66d6f56905d45806f30828a993869a03\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 8f278694c4e9daebd58d3e5b966e8b68423d35f613e6d9093d38e975c38fe3b80653e7a331718833acc3b9adff1c3198a6f6378171eae4396ea15dc240d1abf4de049a00a864064bbcd46fe4e45b428f\nresult = valid\ntag = 8bfbab17a9e0b8748b510ae7d9fd2305\n\n# tcId = 144\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = d5ffffffffffffffffffffffffffffff1de01d03a4fb692b0f135717da3c93039cffffffffffffffffffffffffffffff14bc017957dcfa2cc0dbb81df583cb019cffffffffffffffffffffffffffffff14bc017957dcfa2cc0dbb81df583cb01\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = d59428d079351f665cd001354319875c9a22d70a48e24fddcdd4419de64c8f44fc7aed35cb5a2fcaa0346efb9365546477b5c907d9c9e1ea51851a204aad9f0a242d9096524fa1b2b023b8b2882227733f91f8e7c7b1962564619c5e7e9bf613\nresult = valid\ntag = 49bc6e9fc51c4d503036644d842773d2\n\n# tcId = 145\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = dbfffffffffffffffffffffffffffffff217ae3349b6b5bb4e092fa6ff9ec700a0ffffffffffffffffffffffffffffff031292ac886a33c0fbd190bcce75fc03a0ffffffffffffffffffffffffffffff031292ac886a33c0fbd190bcce75fc03\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = db9428d079351f665cd001354319875c75d5643aa5af934d8cce392cc3eedb47c07aed35cb5a2fcaa0346efb93655464601b5ad2067f28066a8f3281715ba808182d9096524fa1b2b023b8b288222773283f6b3218075fc95f6bb4ff456dc111\nresult = valid\ntag = 63da6ea251f039532c36645d38b76fd7\n\n# tcId = 146\n# edge case intermediate sums in poly1305\naad = ffffffff\nct = 93ffffffffffffffffffffffffffffffe58af369ae0fc2f5290b7c7f659c9704f7ffffffffffffffffffffffffffffffbbc10b84948b5c8c2f0c72113ea9bd04f7ffffffffffffffffffffffffffffffbbc10b84948b5c8c2f0c72113ea9bd04\niv = 0000000000000000064c2d52\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = 939428d079351f665cd001354319875c624839604216e403ebcc6af559ec8b43977aed35cb5a2fcaa0346efb93655464d8c8c3fa1a9e474abe52d02c8187e90f4f2d9096524fa1b2b023b8b28822277390ecf21a04e630858bb65652b5b18016\nresult = valid\ntag = 73eb2724b5c405f04d00d0f15840a1c1\n\n[ivSize = 64]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 147\n# invalid nonce size\naad = \nct = \niv = 5f5f5f5f5f5f5f5f\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 80]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 148\n# invalid nonce size\naad = \nct = \niv = 5f5f5f5f5f5f5f5f5f5f\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 88]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 149\n# invalid nonce size\naad = \nct = \niv = 5f5f5f5f5f5f5f5f5f5f5f\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 112]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 150\n# invalid nonce size\naad = \nct = \niv = 5f5f5f5f5f5f5f5f5f5f5f5f5f5f\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = \nresult = invalid\ntag = \n\n[ivSize = 128]\n[keySize = 256]\n[tagSize = 128]\n\n# tcId = 151\n# invalid nonce size\naad = \nct = \niv = 5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f\nkey = 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f\nmsg = \nresult ",
+    "= invalid\ntag = \n\n",
+};
+static const size_t kLen56 = 65554;
+
+static const char *kData57[] = {
+    "# Imported from Wycheproof's dsa_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: DSA\n# Generator version: 0.4\n\n[key.g = 0835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d]\n[key.keySize = 1024]\n[key.p = 0b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f]\n[key.q = 0b90b38ba0a50a43ec6898d3f9b68049777f489b1]\n[key.type = DSAPublicKey]\n[key.y = 173931dda31eff32f24b383091bf77eacdc6efd557624911d8e9b9debf0f256d0cffac5567b33f6eaae9d3275bbed7ef9f5f94c4003c959e49a1ed3f58c31b21baccc0ed8840b46145f121b8906d072129bae01f071947997e8ef760d2d9ea21d08a5eb7e89390b21a85664713c549e25feda6e9e6c31970866bdfbc8fa981f6]\n[keyDer = 308201b63082012b06072a8648ce3804013082011e02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b10281800835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d03818400028180173931dda31eff32f24b383091bf77eacdc6efd557624911d8e9b9debf0f256d0cffac5567b33f6eaae9d3275bbed7ef9f5f94c4003c959e49a1ed3f58c31b21baccc0ed8840b46145f121b8906d072129bae01f071947997e8ef760d2d9ea21d08a5eb7e89390b21a85664713c549e25feda6e9e6c31970866bdfbc8fa981f6]\n[sha = SHA-1]\n\n# tcId = 1\n# Legacy:ASN encoding of r misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 302c0214aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n# ASN encoded integers with a leading hex-digit in the range 8 .. F are\n# negative. If the first hex-digit of a positive integer is 8 .. F then a\n# leading 0 must be added. Some libraries forgot to do this an therefore\n# generated invalid DSA signatures. Some providers, accept such legacy\n# signatures for compatibility.\n\n# tcId = 2\n# valid\nmsg = 313233343030\nresult = valid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 3\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 30812d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 4\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 302e02811500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 5\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a028114496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 6\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 7\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 302f0282001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 8\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a02820014496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 9\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 10\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 11\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 302d021600aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 12\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 302d021400aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 13\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0215496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 14\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0213496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 15\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3085010000002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 16\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30320285010000001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 17\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a02850100000014496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 18\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 19\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3036028901000000000000001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 20\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3036021500aa6a258fbf7d90e15614676d377df8b10e38db4a0289010000000000000014496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 21\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 22\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 303102847fffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 23\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a02847fffffff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 24\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 25\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30310284ffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 26\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a0284ffffffff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 27\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 28\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30320285ffffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 29\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a0285ffffffffff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 30\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 31\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30350288ffffffffffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 32\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a0288ffffffffffffffff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 33\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30ff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67",
+    "d3532d1f991203bc3523b964c3b\n\n# tcId = 34\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 302d02ff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 35\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a02ff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 36\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 37\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 302d028000aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 38\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0280496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 39\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 40\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 41\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f0000021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 42\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 43\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 44\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0500\n\n# tcId = 45\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 302f021700aa6a258fbf7d90e15614676d377df8b10e38db4a05000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 46\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0216496d5220b5f67d3532d1f991203bc3523b964c3b0500\n\n# tcId = 47\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3032498177302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 48\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30312500302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 49\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 302f302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0004deadbeef\n\n# tcId = 50\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3032221a498177021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 51\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 303122192500021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 52\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30352217021500aa6a258fbf7d90e15614676d377df8b10e38db4a0004deadbeef0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 53\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a22194981770214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 54\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a221825000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 55\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a22160214496d5220b5f67d3532d1f991203bc3523b964c3b0004deadbeef\n\n# tcId = 56\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3035aa00bb00cd00302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 57\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3033aa02aabb302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 58\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3035221daa00bb00cd00021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 59\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3033221baa02aabb021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 60\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a221caa00bb00cd000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 61\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3033021500aa6a258fbf7d90e15614676d377df8b10e38db4a221aaa02aabb0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 62\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 63\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30312280021500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 64\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a22800214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 65\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080312d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 66\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30312280031500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 67\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a22800314496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 68\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 69\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2e2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 70\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2f2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 71\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 312d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 72\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 322d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 73\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = ff2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 74\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 75\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d011500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 76\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d031500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 77\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d041500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 78\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302dff1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 79\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0014496d5220b5f67d3532d1f991203bc3523b964c3",
+    "b\n\n# tcId = 80\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0114496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 81\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0314496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 82\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0414496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 83\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4aff14496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 84\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 85\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3031300102302c1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 86\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 303122190201000214aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 87\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a221802014902136d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 88\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c\n\n# tcId = 89\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 302c1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 90\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 91\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b00\n\n# tcId = 92\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b05000000\n\n# tcId = 93\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b060811220000\n\n# tcId = 94\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000fe02beef\n\n# tcId = 95\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0002beef\n\n# tcId = 96\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f3000021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 97\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b3000\n\n# tcId = 98\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 302f302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 99\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 3017021500aa6a258fbf7d90e15614676d377df8b10e38db4a\n\n# tcId = 100\n# repeat element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 3043021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 101\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 30160214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 102\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021700aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 103\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0216496d5220b5f67d3532d1f991203bc3523b964c3b0000\n\n# tcId = 104\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f0217000000aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 105\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a02160000496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 106\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 301805000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 107\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3019021500aa6a258fbf7d90e15614676d377df8b10e38db4a0500\n\n# tcId = 108\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 301802000214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 109\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 3019021500aa6a258fbf7d90e15614676d377df8b10e38db4a0200\n\n# tcId = 110\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021502aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 111\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a02144b6d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 112\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38dbca0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 113\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964cbb\n\n# tcId = 114\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 302c021400aa6a258fbf7d90e15614676d377df8b10e38db0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 115\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 302c0214aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 116\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0213496d5220b5f67d3532d1f991203bc3523b964c\n\n# tcId = 117\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a02136d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 118\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 302e0216ff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 119\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a0215ff496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 120\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 30190901800214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 121\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 301a021500aa6a258fbf7d90e15614676d377df8b10e38db4a090180\n\n# tcId = 122\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302d02150163755e49c9ce35201c9df4acd2e5fd48862d64fb0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 123\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302c0214f15eecd5b52ceca28f8ada2d9c15f419964451990214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 124\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302d0215ff5595da7040826f1ea9eb9892c882074ef1c724b60214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 125\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302c02140ea1132a4ad3135d707525d263ea0be669bbae670214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 126\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302d0215fe9c8aa1b63631cadfe3620b532d1a02b779d29b050214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId =",
+    " 127\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302d021501aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 128\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302c02145595da7040826f1ea9eb9892c882074ef1c724b60214496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 129\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a02150102788adac0472173f95b86d0bba3c7e9b38ad5ec\n\n# tcId = 130\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a021490621966aba5d8f66c486c5184d3bebac3a1c28a\n\n# tcId = 131\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214b692addf4a0982cacd2e066edfc43cadc469b3c5\n\n# tcId = 132\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a02146f9de699545a270993b793ae7b2c41453c5e3d76\n\n# tcId = 133\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a0215fefd8775253fb8de8c06a4792f445c38164c752a14\n\n# tcId = 134\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a021501496d5220b5f67d3532d1f991203bc3523b964c3b\n\n# tcId = 135\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 313233343030\nresult = invalid\nsig = 302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a021500b692addf4a0982cacd2e066edfc43cadc469b3c5\n\n# tcId = 136\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0201000215ff46f4c745f5af5bc1397672c06497fb68880b764f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 137\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 138\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 139\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30060201000201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 140\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a020100021500b90b38ba0a50a43ec6898d3f9b68049777f489b1\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 141\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a020100021500b90b38ba0a50a43ec6898d3f9b68049777f489b2\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 142\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0201000215010000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 143\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30818702010002818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 144\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3008020100090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 145\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0201010215ff46f4c745f5af5bc1397672c06497fb68880b764f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 146\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 147\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 148\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30060201010201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 149\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a020101021500b90b38ba0a50a43ec6898d3f9b68049777f489b1\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 150\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a020101021500b90b38ba0a50a43ec6898d3f9b68049777f489b2\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 151\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0201010215010000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 152\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30818702010102818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68b",
+    "b11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 153\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3008020101090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 154\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0201ff0215ff46f4c745f5af5bc1397672c06497fb68880b764f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 155\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 156\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 157\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff0201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 158\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0201ff021500b90b38ba0a50a43ec6898d3f9b68049777f489b1\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 159\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0201ff021500b90b38ba0a50a43ec6898d3f9b68049777f489b2\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 160\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0201ff0215010000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 161\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3081870201ff02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 162\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30080201ff090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 163\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b10215ff46f4c745f5af5bc1397672c06497fb68880b764f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 164\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b1020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 165\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b1020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 166\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b10201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 167\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b1021500b90b38ba0a50a43ec6898d3f9b68049777f489b1\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 168\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b1021500b90b38ba0a50a43ec6898d3f9b68049777f489b2\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 169\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b10215010000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 170\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30819b021500b90b38ba0a50a43ec6898d3f9b68049777f489b102818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 171\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301c021500b90b38ba0a50a43ec6898d3f9b68049777f489b1090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 172\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b20215ff46f4c745f5af5bc1397672c06497fb68880b764f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. A",
+    "s a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 173\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b2020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 174\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b2020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 175\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b20201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 176\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b2021500b90b38ba0a50a43ec6898d3f9b68049777f489b1\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 177\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b2021500b90b38ba0a50a43ec6898d3f9b68049777f489b2\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 178\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b20215010000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 179\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30819b021500b90b38ba0a50a43ec6898d3f9b68049777f489b202818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 180\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301c021500b90b38ba0a50a43ec6898d3f9b68049777f489b2090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 181\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e02150100000000000000000000000000000000000000000215ff46f4c745f5af5bc1397672c06497fb68880b764f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 182\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0215010000000000000000000000000000000000000000020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 183\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a0215010000000000000000000000000000000000000000020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 184\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301a02150100000000000000000000000000000000000000000201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 185\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e0215010000000000000000000000000000000000000000021500b90b38ba0a50a43ec6898d3f9b68049777f489b1\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 186\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e0215010000000000000000000000000000000000000000021500b90b38ba0a50a43ec6898d3f9b68049777f489b2\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 187\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 302e02150100000000000000000000000000000000000000000215010000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 188\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30819b021501000000000000000000000000000000000000000002818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 189\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301c0215010000000000000000000000000000000000000000090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 190\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f0215ff46f4c745f5af5bc1397672c06497fb68880b764f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 191\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30818702818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd",
+    "6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 192\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30818702818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 193\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30818702818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f0201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 194\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b1\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 195\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b2\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 196\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f0215010000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 197\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3082010802818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 198\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 30818902818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 199\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301c090380fe010215ff46f4c745f5af5bc1397672c06497fb68880b764f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 200\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3008090380fe01020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 201\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3008090380fe01020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 202\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 3008090380fe010201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 203\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301c090380fe01021500b90b38ba0a50a43ec6898d3f9b68049777f489b1\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 204\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301c090380fe01021500b90b38ba0a50a43ec6898d3f9b68049777f489b2\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 205\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 301c090380fe010215010000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 206\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 308189090380fe0102818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 207\n# Signatures with special case values for r and s.\nmsg = 313233343030\nresult = invalid\nsig = 300a090380fe01090380fe01\n# Some implementations of DSA do not properly check for boundaries. In",
+    " some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 208\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 302c02140e23ff8588683fd9455d185090a9d9199f646bcb0214631ced1a4f6a308bfee3b999f1c2bbe7dcc922dc\n\n# tcId = 209\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 302c0214313eedf8d478f95321cfdeb5fe439ef8716a60cb021407998d19305abe635be5af240bd7e0ec7216a5ce\n\n# tcId = 210\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 302d02150092bda94e3d769675132d9d6a17944808899f8c42021416c7bb874e2e59219cb0d52b4fd470fcc8dcdff3\n\n# tcId = 211\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 302d021500976b29bc6023065b0ee1b5362a4cd2f5529a43c902141db2ad4c3e92cf2bc9267f926ac2e71dacfa5928\n\n# tcId = 212\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 302c02144afbd1a5d8fb9d117c7efd3e7b3564f37305a80302144e13c38000458a528ff2b667265740e36438bd99\n\n[key.g = 16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde]\n[key.keySize = 2048]\n[key.p = 08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667]\n[key.q = 0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d]\n[key.type = DSAPublicKey]\n[key.y = 1e77f842b1ae0fcd9929d394161d41e14614ff7507a9a31f4a1f14d22e2a627a1f4e596624883f1a5b168e9425146f22d5f6ee28757414714bb994ba1129f015d6e04a717edf9b530a5d5cab94f14631e8b4cf79aeb358cc741845553841e8ac461630e804a62f43676ba6794af66899c377b869ea612a7b9fe6611aa96be52eb8b62c979117bbbcca8a7ec1e1ffab1c7dfcfc7048700d3ae3858136e897701d7c2921b5dfef1d1f897f50d96ca1b5c2edc58cada18919e35642f0807eebfa00c99a32f4d095c3188f78ed54711be0325c4b532aeccd6540a567c327225440ea15319bde06510479a1861799e25b57decc73c036d75a0702bd373ca231349931]\n[keyDer = 308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde0382010500028201001e77f842b1ae0fcd9929d394161d41e14614ff7507a9a31f4a1f14d22e2a627a1f4e596624883f1a5b168e9425146f22d5f6ee28757414714bb994ba1129f015d6e04a717edf9b530a5d5cab94f14631e8b4cf79aeb358cc741845553841e8ac461630e804a62f43676ba6794af66899c377b869ea612a7b9fe6611aa96be52eb8b62c979117bbbcca8a7ec1e1ffab1c7dfcfc7048700d3ae3858136e897701d7c2921b5dfef1d1f897f50d96ca1b5c2edc58cada18919e35642f0807eebfa00c99a32f4d095c3188f78ed54711be0325c4b532aeccd6540a567c327225440ea15319bde06510479a1861799e25b57decc73c036d75a0702bd373ca231349931]\n[sha = SHA-224]\n\n# tcId = 213\n# Legacy:ASN encoding of s misses leading 0\nmsg = 48656c6c6f\nresult = acceptable\nsig = 303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021cade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n# ASN encoded integers with a leading hex-digit in the range 8 .. F are\n# negative. If the first hex-digit of a positive integer is 8 .. F then a\n# leading 0 must be added. Some libraries forgot to do this an therefore\n# generated invalid DSA signatures. Some providers, accept such legacy\n# signatures for compatibility.\n\n# tcId = 214\n# valid\nmsg = 48656c6c6f\nresult = valid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 215\n# long form encoding of length\nmsg = 48656c6c6f\nresult = invalid\nsig = 30813d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 216\n# long form encoding of length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e02811c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 217\n# long form encoding of length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd02811d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 218\n# length contains leading 0\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082003d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 219\n# length contains leading 0\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f0282001c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 220\n# length contains leading 0\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0282001d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 221\n# wrong length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 222\n# wrong length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 223\n# wrong length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021d1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 224\n# wrong length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021b1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 225\n# wrong length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021e00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 226\n# wrong length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021c00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 227\n# uint32 overflow in length\nmsg = 48656c6c6f\nresult = invalid\nsig = 3085010000003d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 228\n# uint32 overflow in length\nmsg = 48656c6c6f\nresult = invalid\nsig = 30420285010000001c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 229\n# uint32 overflow in length\nmsg = 48656c6c6f\nresult = invalid\nsig = 3042021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0285010000001d00ade65988d237d30f9ef41dd424a4e1c8f16",
+    "967cf3365813fe8786236\n\n# tcId = 230\n# uint64 overflow in length\nmsg = 48656c6c6f\nresult = invalid\nsig = 308901000000000000003d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 231\n# uint64 overflow in length\nmsg = 48656c6c6f\nresult = invalid\nsig = 3046028901000000000000001c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 232\n# uint64 overflow in length\nmsg = 48656c6c6f\nresult = invalid\nsig = 3046021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd028901000000000000001d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 233\n# length = 2**31 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 30847fffffff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 234\n# length = 2**31 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 304102847fffffff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 235\n# length = 2**31 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd02847fffffff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 236\n# length = 2**32 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 3084ffffffff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 237\n# length = 2**32 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 30410284ffffffff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 238\n# length = 2**32 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0284ffffffff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 239\n# length = 2**40 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 3085ffffffffff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 240\n# length = 2**40 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 30420285ffffffffff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 241\n# length = 2**40 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 3042021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0285ffffffffff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 242\n# length = 2**64 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 3088ffffffffffffffff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 243\n# length = 2**64 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 30450288ffffffffffffffff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 244\n# length = 2**64 - 1\nmsg = 48656c6c6f\nresult = invalid\nsig = 3045021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0288ffffffffffffffff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 245\n# incorrect length\nmsg = 48656c6c6f\nresult = invalid\nsig = 30ff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 246\n# incorrect length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d02ff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 247\n# incorrect length\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd02ff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 248\n# indefinite length without termination\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 249\n# indefinite length without termination\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d02801e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 250\n# indefinite length without termination\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd028000ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 251\n# removing sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = \n\n# tcId = 252\n# appending 0's to sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000\n\n# tcId = 253\n# prepending 0's to sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f0000021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 254\n# appending unused 0's\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000\n\n# tcId = 255\n# appending unused 0's\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0000021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 256\n# appending null value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360500\n\n# tcId = 257\n# appending null value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021e1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0500021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 258\n# appending null value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021f00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360500\n\n# tcId = 259\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 3042498177303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 260\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 30412500303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 261\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360004deadbeef\n\n# tcId = 262\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 30422221498177021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 263\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 304122202500021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 264\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 3045221e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0004deadbeef021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 265\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 3042021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2222498177021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 266\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd22212500021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 267\n# including garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 3045021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd221f021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360004deadbeef\n\n# tcId = 268\n# including undefined tags\nmsg = 48656c6c6f\nresult = invalid\nsig = 3045aa00bb00cd00303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+    "\n\n# tcId = 269\n# including undefined tags\nmsg = 48656c6c6f\nresult = invalid\nsig = 3043aa02aabb303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 270\n# including undefined tags\nmsg = 48656c6c6f\nresult = invalid\nsig = 30452224aa00bb00cd00021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 271\n# including undefined tags\nmsg = 48656c6c6f\nresult = invalid\nsig = 30432222aa02aabb021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 272\n# including undefined tags\nmsg = 48656c6c6f\nresult = invalid\nsig = 3045021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2225aa00bb00cd00021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 273\n# including undefined tags\nmsg = 48656c6c6f\nresult = invalid\nsig = 3043021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2223aa02aabb021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 274\n# using composition with indefinite length\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000\n\n# tcId = 275\n# using composition with indefinite length\nmsg = 48656c6c6f\nresult = invalid\nsig = 30412280021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0000021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 276\n# using composition with indefinite length\nmsg = 48656c6c6f\nresult = invalid\nsig = 3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2280021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000\n\n# tcId = 277\n# using composition with wrong tag\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080313d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000\n\n# tcId = 278\n# using composition with wrong tag\nmsg = 48656c6c6f\nresult = invalid\nsig = 30412280031c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0000021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 279\n# using composition with wrong tag\nmsg = 48656c6c6f\nresult = invalid\nsig = 3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2280031d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000\n\n# tcId = 280\n# Replacing sequence with NULL\nmsg = 48656c6c6f\nresult = invalid\nsig = 0500\n\n# tcId = 281\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 2e3d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 282\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 2f3d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 283\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 313d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 284\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 323d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 285\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = ff3d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 286\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d001c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 287\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d011c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 288\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d031c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 289\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d041c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 290\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303dff1c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 291\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd001d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 292\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd011d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 293\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd031d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 294\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd041d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 295\n# changing tag value\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cdff1d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 296\n# dropping value of sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 3000\n\n# tcId = 297\n# using composition\nmsg = 48656c6c6f\nresult = invalid\nsig = 3041300102303c1c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 298\n# using composition\nmsg = 48656c6c6f\nresult = invalid\nsig = 3041222002011e021b41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 299\n# using composition\nmsg = 48656c6c6f\nresult = invalid\nsig = 3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2221020100021cade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 300\n# truncate sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862\n\n# tcId = 301\n# truncate sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c1c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 302\n# indefinite length\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000\n\n# tcId = 303\n# indefinite length with truncated delimiter\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe878623600\n\n# tcId = 304\n# indefinite length with additional element\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe878623605000000\n\n# tcId = 305\n# indefinite length with truncated element\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236060811220000\n\n# tcId = 306\n# indefinite length with garbage\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000fe02beef\n\n# tcId = 307\n# indefinite length with nonempty EOC\nmsg = 48656c6c6f\nresult = invalid\nsig = 3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360002beef\n\n# tcId = 308\n# prepend empty sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f3000021c1e41b479ad576905b960fe14eadb91b0ccf3",
+    "4843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 309\n# append empty sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862363000\n\n# tcId = 310\n# sequence of sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 311\n# truncated sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 301e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd\n\n# tcId = 312\n# repeat element in sequence\nmsg = 48656c6c6f\nresult = invalid\nsig = 305c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 313\n# removing integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 301f021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 314\n# appending 0's to integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021e1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0000021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 315\n# appending 0's to integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021f00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000\n\n# tcId = 316\n# prepending 0's to integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021e00001e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 317\n# prepending 0's to integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021f000000ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 318\n# Replacing integer with NULL\nmsg = 48656c6c6f\nresult = invalid\nsig = 30210500021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 319\n# Replacing integer with NULL\nmsg = 48656c6c6f\nresult = invalid\nsig = 3020021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0500\n\n# tcId = 320\n# dropping value of integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 30210200021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 321\n# dropping value of integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 3020021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0200\n\n# tcId = 322\n# modify first byte of integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1c41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 323\n# modify first byte of integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d02ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 324\n# modify last byte of integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c94d021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 325\n# modify last byte of integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862b6\n\n# tcId = 326\n# truncate integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021b1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 327\n# truncate integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021b41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 328\n# truncate integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021c00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862\n\n# tcId = 329\n# truncate integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021cade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 330\n# leading ff in integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021dff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 331\n# leading ff in integer\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021eff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 332\n# infinity\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022090180021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 333\n# infinity\nmsg = 48656c6c6f\nresult = invalid\nsig = 3021021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd090180\n\n# tcId = 334\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00d9384b2032d060e59848f87cb4535936bc25fa77959e96d7f88e332a021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 335\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021dff634b1dd327de7125da7903ad2163ca2addc096101fd395567ee36070021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 336\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021ce1be4b8652a896fa469f01eb15246e4f330cb7bc2546e9e8c4473633021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 337\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d009cb4e22cd8218eda2586fc52de9c35d5223f69efe02c6aa9811c9f90021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 338\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021dff26c7b4dfcd2f9f1a67b707834baca6c943da05886a6169280771ccd6021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 339\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d011e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 340\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00e1be4b8652a896fa469f01eb15246e4f330cb7bc2546e9e8c4473633021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 341\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d0168dcf02f57b0caef7ddc183bee1ca94ee09c1a02ee4b0200a54dcb93\n\n# tcId = 342\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021cf2efc2e24cbedb2fc00c236c5b2d1a430236b59b7880007f2ba2f8d9\n\n# tcId = 343\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021dff5219a6772dc82cf0610be22bdb5b1e370e969830cc9a7ec017879dca\n\n# tcId = 344\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021c0d103d1db34124d03ff3dc93a4d2e5bcfdc94a64877fff80d45d0727\n\n# tcId = 345\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021dfe97230fd0a84f35108223e7c411e356b11f63e5fd11b4fdff5ab2346d\n\n# tcId = 346\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d01ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236\n\n# tcId = 347\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 48656c6c6f\nresult = invalid\nsig = 303c021c1e41b479ad576905b96",
+    "0fe14eadb91b0ccf34843dab916173bb8c9cd021c5219a6772dc82cf0610be22bdb5b1e370e969830cc9a7ec017879dca\n\n# tcId = 348\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022020100021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 349\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3006020100020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 350\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3006020100020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 351\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30060201000201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 352\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 353\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 354\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022020100021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 355\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082010802010002820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 356\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3008020100090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 357\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022020101021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 358\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3006020101020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 359\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3006020101020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 360\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30060201010201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 361\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 362\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 363\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022020101021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 364\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082010802010102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 365\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3008020101090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 366\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30220201ff021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 367\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30060201ff020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modul",
+    "ar inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 368\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30060201ff020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 369\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30060201ff0201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 370\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 371\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 372\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30220201ff021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 373\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 308201080201ff02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 374\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30080201ff090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 375\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 376\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 377\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 378\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 379\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 380\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 381\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 382\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 383\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 384\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 385\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such",
+    " as r=1, s=0 lead to forgeries.\n\n# tcId = 386\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 387\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e0201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 388\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 389\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 390\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 391\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 392\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 393\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d0100000000000000000000000000000000000000000000000000000000021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 394\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d0100000000000000000000000000000000000000000000000000000000020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 395\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d0100000000000000000000000000000000000000000000000000000000020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 396\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3022021d01000000000000000000000000000000000000000000000000000000000201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 397\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 398\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 399\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 303e021d0100000000000000000000000000000000000000000000000000000000021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 400\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 30820124021d010000000000000000000000000000000000000000000000000000000002820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 401\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3024021d0100000000000000000000000000000000000000000000000000000000090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 402\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f",
+    "27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 403\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 404\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 405\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd6670201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 406\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 407\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 408\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 409\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082020a02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd66702820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 410\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082010a02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 411\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3024090380fe01021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases t",
+    "he modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 412\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3008090380fe01020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 413\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3008090380fe01020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 414\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3008090380fe010201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 415\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 416\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 417\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3024090380fe01021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 418\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 3082010a090380fe0102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 419\n# Signatures with special case values for r and s.\nmsg = 48656c6c6f\nresult = invalid\nsig = 300a090380fe01090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 420\n# random signature\nmsg = 48656c6c6f\nresult = valid\nsig = 303b021c6e3d431498bb8911b97308e9e8d05cedd927e1576074f5b407ed47fb021b265cb60340e52374c6b03a99fc1db5d97ffff31d89a7d0847bc57b\n\n# tcId = 421\n# random signature\nmsg = 48656c6c6f\nresult = valid\nsig = 303d021d00a7b626ca8fe3aadb70736367cbf221099af40e3683aa7f889568d18d021c0ea3c9660f7e84fb794db3ae473e9bafc84e3d1999073b3b444c31ba\n\n# tcId = 422\n# random signature\nmsg = 48656c6c6f\nresult = valid\nsig = 303d021d0090d3707463fe1fd72514653e54b61e504bf4c32f5ee58928be423c7b021c18f867d66ab6c14e0d4fd144da061cac5e33ee62fc8573b0617eec11\n\n# tcId = 423\n# random signature\nmsg = 48656c6c6f\nresult = valid\nsig = 303d021c032d0712481f5be239cb0464b89d97fb4ca540089661bf1b930b927d021d00b7b2854013fcc17f3514ba83393a5998c905a90a0c3d0ef3a51562d5\n\n# tcId = 424\n# random signature\nmsg = 48656c6c6f\nresult = valid\nsig = 303d021d00a11784b27530077677bdb15d78b75f508624099ca06036c2c24f7e20021c3a3c429f5c1411d952f1280c8ef0d582326a39447b934eee17c7b4ea\n\n[key.g = 16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde]\n[key.keySize = 2048]\n[key.p = 08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667]\n[key.q = 0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d]\n[key.type = DSAPublicKey]\n[key.y = 1e77f842b1ae0fcd9929d394161d41e14614ff7507a9a31f4a1f14d22e2a627a1f4e596624883f1a5b168e9425146f22d5f6ee28757414714bb994ba1129f015d6e04a717edf9b530a5d5cab94f14631e8b4cf79aeb358cc741845553841e8ac461630e804a62f43676ba6794af66899c377b869ea612a7b9fe6611aa96be52eb8b62c979117bbbcca8a7ec1e1ffab1c7dfcfc7048700d3ae3858136e897701d7c2921b5dfef1d1f897f50d96ca1b5c2edc58cada18919e35642f0807eebfa00c99a32f4d095c3188f78ed54711be0325c4b532aeccd6540a567c327225440ea15319bde06510479a1861799e25b57decc73c036d75a0702bd373ca231349931]\n[keyDer = 308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde0382010500028201001e77f842b1ae0fcd9929d394161d41e14614ff7507a9a31f4a1f14d22e2a627a1f4e596624883f1a5b168e9425146f22d5f6ee28757414714bb994ba1129f015d6e04a717edf9b530a5d5cab94f14631e8b4cf79aeb358cc741845553841e8ac461630e804a62f43676ba6794af66899c377b869ea612a7b9fe6611aa96be52eb8b62c979117bbbcca8a7ec1e1ffab1c7dfcfc7048700d3ae3858136e897701d7c2921b5dfef1d1f897f50d96ca1b5c2edc58cada18919e35642f0807eebfa00c99a32f4d095c3188f78ed54711be0325c4b532aeccd6540a567c327225440ea15319bde06510479a1861799e25b57decc73c036d75a0702bd373ca231349931]\n[sha = SHA-256]\n\n# tcId = 425\n# Legacy:ASN encoding of r misses leading 0\nmsg = 54657374\nresult = acceptable\nsig = 303c021c9b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n# ASN encoded integers with a leading hex-digit in the range 8 .. F are\n# nega",
+    "tive. If the first hex-digit of a positive integer is 8 .. F then a\n# leading 0 must be added. Some libraries forgot to do this an therefore\n# generated invalid DSA signatures. Some providers, accept such legacy\n# signatures for compatibility.\n\n# tcId = 426\n# valid\nmsg = 54657374\nresult = valid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 427\n# long form encoding of length\nmsg = 54657374\nresult = invalid\nsig = 30813d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 428\n# long form encoding of length\nmsg = 54657374\nresult = invalid\nsig = 303e02811d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 429\n# long form encoding of length\nmsg = 54657374\nresult = invalid\nsig = 303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302811c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 430\n# length contains leading 0\nmsg = 54657374\nresult = invalid\nsig = 3082003d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 431\n# length contains leading 0\nmsg = 54657374\nresult = invalid\nsig = 303f0282001d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 432\n# length contains leading 0\nmsg = 54657374\nresult = invalid\nsig = 303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930282001c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 433\n# wrong length\nmsg = 54657374\nresult = invalid\nsig = 303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 434\n# wrong length\nmsg = 54657374\nresult = invalid\nsig = 303c021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 435\n# wrong length\nmsg = 54657374\nresult = invalid\nsig = 303d021e009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 436\n# wrong length\nmsg = 54657374\nresult = invalid\nsig = 303d021c009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 437\n# wrong length\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021d5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 438\n# wrong length\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021b5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 439\n# uint32 overflow in length\nmsg = 54657374\nresult = invalid\nsig = 3085010000003d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 440\n# uint32 overflow in length\nmsg = 54657374\nresult = invalid\nsig = 30420285010000001d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 441\n# uint32 overflow in length\nmsg = 54657374\nresult = invalid\nsig = 3042021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930285010000001c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 442\n# uint64 overflow in length\nmsg = 54657374\nresult = invalid\nsig = 308901000000000000003d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 443\n# uint64 overflow in length\nmsg = 54657374\nresult = invalid\nsig = 3046028901000000000000001d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 444\n# uint64 overflow in length\nmsg = 54657374\nresult = invalid\nsig = 3046021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93028901000000000000001c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 445\n# length = 2**31 - 1\nmsg = 54657374\nresult = invalid\nsig = 30847fffffff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 446\n# length = 2**31 - 1\nmsg = 54657374\nresult = invalid\nsig = 304102847fffffff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 447\n# length = 2**31 - 1\nmsg = 54657374\nresult = invalid\nsig = 3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302847fffffff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 448\n# length = 2**32 - 1\nmsg = 54657374\nresult = invalid\nsig = 3084ffffffff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 449\n# length = 2**32 - 1\nmsg = 54657374\nresult = invalid\nsig = 30410284ffffffff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 450\n# length = 2**32 - 1\nmsg = 54657374\nresult = invalid\nsig = 3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930284ffffffff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 451\n# length = 2**40 - 1\nmsg = 54657374\nresult = invalid\nsig = 3085ffffffffff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 452\n# length = 2**40 - 1\nmsg = 54657374\nresult = invalid\nsig = 30420285ffffffffff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 453\n# length = 2**40 - 1\nmsg = 54657374\nresult = invalid\nsig = 3042021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930285ffffffffff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 454\n# length = 2**64 - 1\nmsg = 54657374\nresult = invalid\nsig = 3088ffffffffffffffff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 455\n# length = 2**64 - 1\nmsg = 54657374\nresult = invalid\nsig = 30450288ffffffffffffffff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 456\n# length = 2**64 - 1\nmsg = 54657374\nresult = invalid\nsig = 3045021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930288ffffffffffffffff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 457\n# incorrect length\nmsg = 54657374\nresult = invalid\nsig = 30ff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 458\n# incorrect length\nmsg = 54657374\nresult = invalid\nsig = 303d02ff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 459\n# incorrect length\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302ff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 460\n# indefinite length without termination\nmsg = 54657374\nresult = invalid\nsig = 3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 461\n# indefinite length without termination\nmsg = 54657374\nresult = invalid\nsig = 303d0280009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 462\n# indefinite length without termination\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302805fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 463\n# removing sequence\nmsg = 54657374\nresult = invalid\nsig = \n\n# tcId = 464\n# appending 0's to sequence\nmsg = 54657374\nresult = invalid\nsig = 303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8",
+    "234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000\n\n# tcId = 465\n# prepending 0's to sequence\nmsg = 54657374\nresult = invalid\nsig = 303f0000021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 466\n# appending unused 0's\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000\n\n# tcId = 467\n# appending unused 0's\nmsg = 54657374\nresult = invalid\nsig = 303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930000021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 468\n# appending null value\nmsg = 54657374\nresult = invalid\nsig = 303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160500\n\n# tcId = 469\n# appending null value\nmsg = 54657374\nresult = invalid\nsig = 303f021f009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930500021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 470\n# appending null value\nmsg = 54657374\nresult = invalid\nsig = 303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021e5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160500\n\n# tcId = 471\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 3042498177303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 472\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 30412500303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 473\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 303f303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160004deadbeef\n\n# tcId = 474\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 30422222498177021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 475\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 304122212500021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 476\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 3045221f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930004deadbeef021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 477\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 3042021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932221498177021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 478\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9322202500021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 479\n# including garbage\nmsg = 54657374\nresult = invalid\nsig = 3045021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93221e021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160004deadbeef\n\n# tcId = 480\n# including undefined tags\nmsg = 54657374\nresult = invalid\nsig = 3045aa00bb00cd00303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 481\n# including undefined tags\nmsg = 54657374\nresult = invalid\nsig = 3043aa02aabb303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 482\n# including undefined tags\nmsg = 54657374\nresult = invalid\nsig = 30452225aa00bb00cd00021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 483\n# including undefined tags\nmsg = 54657374\nresult = invalid\nsig = 30432223aa02aabb021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 484\n# including undefined tags\nmsg = 54657374\nresult = invalid\nsig = 3045021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932224aa00bb00cd00021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 485\n# including undefined tags\nmsg = 54657374\nresult = invalid\nsig = 3043021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932222aa02aabb021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 486\n# using composition with indefinite length\nmsg = 54657374\nresult = invalid\nsig = 3080303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000\n\n# tcId = 487\n# using composition with indefinite length\nmsg = 54657374\nresult = invalid\nsig = 30412280021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930000021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 488\n# using composition with indefinite length\nmsg = 54657374\nresult = invalid\nsig = 3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932280021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000\n\n# tcId = 489\n# using composition with wrong tag\nmsg = 54657374\nresult = invalid\nsig = 3080313d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000\n\n# tcId = 490\n# using composition with wrong tag\nmsg = 54657374\nresult = invalid\nsig = 30412280031d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930000021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 491\n# using composition with wrong tag\nmsg = 54657374\nresult = invalid\nsig = 3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932280031c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000\n\n# tcId = 492\n# Replacing sequence with NULL\nmsg = 54657374\nresult = invalid\nsig = 0500\n\n# tcId = 493\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 2e3d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 494\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 2f3d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 495\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 313d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 496\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 323d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 497\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = ff3d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 498\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303d001d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 499\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303d011d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 500\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303d031d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 501\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303d041d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 502\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303dff1d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 503\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93001c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 504\n# changing tag value\nm",
+    "sg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93011c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 505\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93031c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 506\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93041c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 507\n# changing tag value\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93ff1c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 508\n# dropping value of sequence\nmsg = 54657374\nresult = invalid\nsig = 3000\n\n# tcId = 509\n# using composition\nmsg = 54657374\nresult = invalid\nsig = 3041300102303c1d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 510\n# using composition\nmsg = 54657374\nresult = invalid\nsig = 30412221020100021c9b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 511\n# using composition\nmsg = 54657374\nresult = invalid\nsig = 3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93222002015f021be8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 512\n# truncate sequence\nmsg = 54657374\nresult = invalid\nsig = 303c021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1\n\n# tcId = 513\n# truncate sequence\nmsg = 54657374\nresult = invalid\nsig = 303c1d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 514\n# indefinite length\nmsg = 54657374\nresult = invalid\nsig = 3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000\n\n# tcId = 515\n# indefinite length with truncated delimiter\nmsg = 54657374\nresult = invalid\nsig = 3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b11600\n\n# tcId = 516\n# indefinite length with additional element\nmsg = 54657374\nresult = invalid\nsig = 3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b11605000000\n\n# tcId = 517\n# indefinite length with truncated element\nmsg = 54657374\nresult = invalid\nsig = 3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116060811220000\n\n# tcId = 518\n# indefinite length with garbage\nmsg = 54657374\nresult = invalid\nsig = 3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000fe02beef\n\n# tcId = 519\n# indefinite length with nonempty EOC\nmsg = 54657374\nresult = invalid\nsig = 3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160002beef\n\n# tcId = 520\n# prepend empty sequence\nmsg = 54657374\nresult = invalid\nsig = 303f3000021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 521\n# append empty sequence\nmsg = 54657374\nresult = invalid\nsig = 303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1163000\n\n# tcId = 522\n# sequence of sequence\nmsg = 54657374\nresult = invalid\nsig = 303f303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 523\n# truncated sequence\nmsg = 54657374\nresult = invalid\nsig = 301f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93\n\n# tcId = 524\n# repeat element in sequence\nmsg = 54657374\nresult = invalid\nsig = 305b021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 525\n# removing integer\nmsg = 54657374\nresult = invalid\nsig = 301e021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 526\n# appending 0's to integer\nmsg = 54657374\nresult = invalid\nsig = 303f021f009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930000021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 527\n# appending 0's to integer\nmsg = 54657374\nresult = invalid\nsig = 303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021e5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000\n\n# tcId = 528\n# prepending 0's to integer\nmsg = 54657374\nresult = invalid\nsig = 303f021f0000009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 529\n# prepending 0's to integer\nmsg = 54657374\nresult = invalid\nsig = 303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021e00005fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 530\n# Replacing integer with NULL\nmsg = 54657374\nresult = invalid\nsig = 30200500021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 531\n# Replacing integer with NULL\nmsg = 54657374\nresult = invalid\nsig = 3021021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930500\n\n# tcId = 532\n# dropping value of integer\nmsg = 54657374\nresult = invalid\nsig = 30200200021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 533\n# dropping value of integer\nmsg = 54657374\nresult = invalid\nsig = 3021021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930200\n\n# tcId = 534\n# modify first byte of integer\nmsg = 54657374\nresult = invalid\nsig = 303d021d029b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 535\n# modify first byte of integer\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5de8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 536\n# modify last byte of integer\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee13021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 537\n# modify last byte of integer\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b196\n\n# tcId = 538\n# truncate integer\nmsg = 54657374\nresult = invalid\nsig = 303c021c009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 539\n# truncate integer\nmsg = 54657374\nresult = invalid\nsig = 303c021c9b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 540\n# truncate integer\nmsg = 54657374\nresult = invalid\nsig = 303c021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021b5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1\n\n# tcId = 541\n# truncate integer\nmsg = 54657374\nresult = invalid\nsig = 303c021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021be8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 542\n# leading ff in integer\nmsg = 54657374\nresult = invalid\nsig = 303e021eff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 543\n# leading ff in integer\nmsg = 54657374\nresult = invalid\nsig = 303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021dff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 544\n# infinity\nmsg = 54657374\nresult = invalid\nsig = 3021090180021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 545\n# infinity\nmsg = 54657374\nresult = invalid\nsig = 3022021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93090180\n\n# tcId = 546\n# Modified r or s, e.g. by adding or subtracting the grou",
+    "p order\nmsg = 54657374\nresult = invalid\nsig = 303d021d0156667b48514d3e5d546ca89ff45ada90474113ed248b873430ab57f0021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 547\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303c021ce0794dfb465b4e9d969cb3d0616b4b8468dbaf85aec085b2b7008536021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 548\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303d021dff64901b5e342bb9828a7b51c7d51cecf5a7f19e469659f98c8c2a116d021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 549\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303c021c1f86b204b9a4b16269634c2f9e94b47b9724507a513f7a4d48ff7aca021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 550\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303d021dfea99984b7aeb2c1a2ab9357600ba5256fb8beec12db7478cbcf54a810021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 551\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303d021d019b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 552\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303c021c64901b5e342bb9828a7b51c7d51cecf5a7f19e469659f98c8c2a116d021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 553\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021d011adeb9ed974f878dc2fc26f4bf86ffda5f7abe6c26ebabf9b8181a73\n\n# tcId = 554\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021ca4f18ca08c5d97ce052c32252c9770ce81155a04b120aa783e6d47b9\n\n# tcId = 555\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021ca017dcb8ee2970521bebd37309f0c7ab8fb7f3c793f9d4c704bd4eea\n\n# tcId = 556\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5b0e735f73a26831fad3cddad3688f317eeaa5fb4edf5587c192b847\n\n# tcId = 557\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021dfee521461268b078723d03d90b40790025a0854193d914540647e7e58d\n\n# tcId = 558\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021d015fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116\n\n# tcId = 559\n# Modified r or s, e.g. by adding or subtracting the group order\nmsg = 54657374\nresult = invalid\nsig = 303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021d00a017dcb8ee2970521bebd37309f0c7ab8fb7f3c793f9d4c704bd4eea\n\n# tcId = 560\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022020100021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 561\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3006020100020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 562\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3006020100020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 563\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30060201000201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 564\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 565\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 566\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022020100021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 567\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082010802010002820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 568\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3008020100090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 569\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022020101021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 570\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3006020101020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 571\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3006020101020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 572\n# Signatures with special case values for r and s.\nmsg ",
+    "= 54657374\nresult = invalid\nsig = 30060201010201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 573\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 574\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 575\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022020101021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 576\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082010802010102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 577\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3008020101090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 578\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30220201ff021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 579\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30060201ff020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 580\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30060201ff020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 581\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30060201ff0201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 582\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 583\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 584\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30220201ff021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 585\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 308201080201ff02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 586\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30080201ff090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 587\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 588\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 589\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 590\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 591\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementatio",
+    "ns of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 592\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 593\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 594\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 595\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 596\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 597\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 598\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 599\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e0201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 600\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 601\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 602\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 603\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 604\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 605\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d0100000000000000000000000000000000000000000000000000000000021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 606\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d0100000000000000000000000000000000000000000000000000000000020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 607\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d0100000000000000000000000000000000000000000000000000000000020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 608\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3022021d01000000000000000000000000000000000000000000000000000000000201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 l",
+    "ead to forgeries.\n\n# tcId = 609\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 610\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 611\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 303e021d0100000000000000000000000000000000000000000000000000000000021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 612\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 30820124021d010000000000000000000000000000000000000000000000000000000002820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 613\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024021d0100000000000000000000000000000000000000000000000000000000090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 614\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 615\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 616\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 617\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd6670201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 618\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 619\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 620\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa",
+    "27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 621\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082020a02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd66702820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 622\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082010a02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 623\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024090380fe01021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 624\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3008090380fe01020100\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 625\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3008090380fe01020101\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 626\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3008090380fe010201ff\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 627\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 628\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 629\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3024090380fe01021d0100000000000000000000000000000000000000000000000000000000\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 630\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 3082010a090380fe0102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 631\n# Signatures with special case values for r and s.\nmsg = 54657374\nresult = invalid\nsig = 300a090380fe01090380fe01\n# Some implementations of DSA do not properly check for boundaries. In some\n# cases the modular inverse of 0 is simply 0. As a result there are\n# implementations where values such as r=1, s=0 lead to forgeries.\n\n# tcId = 632\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303e021d009a77c2ecaa462bc2a103083725ad3a829484f471e4aee6202ee86cdb021d009dfbeb5221b3625945dd5e4cc6fee5262ea7894198e8c9da1cd76fb1\n\n# tcId = 633\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303d021c29a77fe0e704eccc142f5c56672fed3f44f06941e5232b3f356ed2a9021d00970b5c6e7cb7ecb361c0e1645d54f6e7e9440ef5b5af0bd4e4790656\n\n# tcId = 634\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303c021c19b3f92f6c22e6906b446bca454f31a59aa7714001cbb29bfbcb9f46021c7b609e7b9ab85c569b44bb48ff6b5f6d4bbca4d96ff2dad3577610b3\n\n# tcId = 635\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303d021d009f8e58385c8d24feca68f3ed3634118f2a72a6001505ffa3ed0d8d14021c51f3e61627da82df148dc323d03e4d02bf7fd6de64af6cab83ca7a2d\n\n# tcId = 636\n# random signature\nmsg = 54657374\nresult = valid\nsig = 303c021c77ee5cb172ea5d1f23e28195584c056cc19185e68341ee8cc5af4d45021c17d341bb596d6def1e04c361c780af7491b7bb45f7040085f3df1076\n\n[key.g = 0835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d]\n[key.keySize = 1024]\n[key.p = 0b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f]\n[key.q = 0b90b38ba0a50a43ec6898d3f9b68",
+    "049777f489b1]\n[key.type = DSAPublicKey]\n[key.y = 713e9f8108a6a7075485a37ce1a3b040cce563a0445614fe099fb1bffd68acb36f9e04d8ad17ace3c136da66f730eb7ff18936424ffa4e5ae5b1e7dac375d8d164697254b8b7e848f5e79da25c79df5c0727d5da3498405cd0f4e46d136c351d703cc4bf0d3f4fbb165392888684964a93ad30fa179488cad4a6655dd4fa9754]\n[keyDer = 308201b63082012b06072a8648ce3804013082011e02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b10281800835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d03818400028180713e9f8108a6a7075485a37ce1a3b040cce563a0445614fe099fb1bffd68acb36f9e04d8ad17ace3c136da66f730eb7ff18936424ffa4e5ae5b1e7dac375d8d164697254b8b7e848f5e79da25c79df5c0727d5da3498405cd0f4e46d136c351d703cc4bf0d3f4fbb165392888684964a93ad30fa179488cad4a6655dd4fa9754]\n[sha = SHA-1]\n\n# tcId = 637\n# r,s = 1,1\nmsg = 54657374\nresult = valid\nsig = 3006020101020101\n\n# tcId = 638\n# r,s = 1,5\nmsg = 54657374\nresult = valid\nsig = 3006020101020105\n\n# tcId = 639\n# u2 small\nmsg = 54657374\nresult = valid\nsig = 3019020101021425023e8b9ba9ba72f481e90cb8ae67517e641b8a\n\n# tcId = 640\n# s == q-1\nmsg = 54657374\nresult = valid\nsig = 301a020101021500b90b38ba0a50a43ec6898d3f9b68049777f489b0\n\n[key.g = 0835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d]\n[key.keySize = 1024]\n[key.p = 0b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f]\n[key.q = 0b90b38ba0a50a43ec6898d3f9b68049777f489b1]\n[key.type = DSAPublicKey]\n[key.y = 61fe5b61f6d555ada7dc0ebac3459fccd8dfbad18ba94dbea52437cd7fb431df404d4738c594e720a6d786275acd02259ca613a08a2de118d0150d2ccae602102aca0cd03666a53f67c0b9943df5046c15baeaf496a9f018b7c939de1509de71ce47dd6f44c57f4e01e569be46932773190c154470cefbd1f4af82d28e4b31]\n[keyDer = 308201b43082012b06072a8648ce3804013082011e02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b10281800835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d03818200027f61fe5b61f6d555ada7dc0ebac3459fccd8dfbad18ba94dbea52437cd7fb431df404d4738c594e720a6d786275acd02259ca613a08a2de118d0150d2ccae602102aca0cd03666a53f67c0b9943df5046c15baeaf496a9f018b7c939de1509de71ce47dd6f44c57f4e01e569be46932773190c154470cefbd1f4af82d28e4b31]\n[sha = SHA-1]\n\n# tcId = 641\n# s == 1\nmsg = 54657374\nresult = valid\nsig = 3019021462ba827381396dc44facc66c344f91788f11c6fc020101\n\n[key.g = 16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde]\n[key.keySize = 2048]\n[key.p = 08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667]\n[key.q = 0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d]\n[key.type = DSAPublicKey]\n[key.y = 6978b68d31334ee5bc7b3e91ab6c2336fab45c64836bd92cb5337b734db9e8e44f889f8869829f4fe174dc9344c164a0ba5b0126259ba8a43f607564fa4a1d0d49645e1d5886a1fc485e2fe91e56eae330da05e17b0b3d018c290285b249bc409e7af54300fc7c3eb34911457e2371931ad9302e8450cd95df3d561ea0ad94d0a2eabcafe0dd6728fb280029b556d9f4fa7c0f46a7804329936708e97e11fc22b2a50761a890c65b5fea2a1a4172f6be9eaa60e738cdf60c015142e2e562bb62a11e810ccdf0bf633307382f2d9a9769b115dfcdab4bacae73feca289db209dce34cbe126e8c7f9d9e4f8f711349a608d567b48c050e9dfb32bc184ecaa4f0f0]\n[keyDer = 308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde0382010500028201006978b68d31334ee5bc7b3e91ab6c2336fab45c64836bd92cb5337b734db9e8e44f889f8869829f4fe174dc9344c164a0ba5b0126259ba8a43f607564fa4a1d0d49645e1d5886a1fc485e2fe91e56eae330da05e17b0b3d018c290285b249bc409e7af54300fc7c3eb34911457e2371931ad9302e8450cd95df3d561ea0ad94d0a2eabcafe0dd6728fb280029b556d9f4fa7c0f46a7804329936708e97e11fc22b2a50761a890c65b5fea2a1a4172f6be9eaa60e738cdf60c015142e2e562bb62a11e810ccdf0bf633307382f2d9a9769b115dfcdab4bacae73feca289db209dce34cbe126e8c7f9d9e4f8f711349a608d567b48c050e9dfb32bc184ecaa4f0f0]\n[sha = SHA-224]\n\n# tcId = 642\n# r,s = 1,1\nmsg = 54657374\nresult = valid\nsig = 3006020101020101\n\n# tcId = 643\n# r,s = 1,5\nmsg = 54657374\nresult = valid\nsig = 3006020101020105\n\n# tcId = 644\n# u2 small\nmsg = 54657374\nresult = valid\nsig = 3022020101021d009592121ed12d93197f1ffb863ac63937f28ef4f62f1e009a30aabab1\n\n# tcId = 645\n# s == q-1\nmsg = 54657374\nresult = valid\nsig = 3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c\n\n[key.g = 16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde]\n[key.keySize = 2048]\n[key.p = 08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9f",
+    "fa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667]\n[key.q = 0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d]\n[key.type = DSAPublicKey]\n[key.y = 2a64953bde40789f80ed8227192286115b92d09d5de96904e803ec4ecfbd73e0f08e82910febf19fa3cdc55ff20eb970d9c712f44785c0fd592c17fb43f4625357a4ac8a1a628f72040ae5360839c7c1f6b214e7a15530fe22887139ea0f05a9daf9d95bd6b7467abf9107c9fbe31e36330276eeccce3d59635206d60ca256f9af60627626b0594984b5a075c42c42067fa8c330f258bcf145df27a97da8ee419b54e3ab296c7ce9ef6a0113389b3cac7885b44b3722d27cad60e4e5a924a1ed0342cea9e99256f6bc1308d4af2c0af9379b1cf2119ce113c085705f5519ccc1ba8562a2236190d3f0c0a10f01466ad79a48127c28433f6b34e24a539af60f3d]\n[keyDer = 308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde0382010500028201002a64953bde40789f80ed8227192286115b92d09d5de96904e803ec4ecfbd73e0f08e82910febf19fa3cdc55ff20eb970d9c712f44785c0fd592c17fb43f4625357a4ac8a1a628f72040ae5360839c7c1f6b214e7a15530fe22887139ea0f05a9daf9d95bd6b7467abf9107c9fbe31e36330276eeccce3d59635206d60ca256f9af60627626b0594984b5a075c42c42067fa8c330f258bcf145df27a97da8ee419b54e3ab296c7ce9ef6a0113389b3cac7885b44b3722d27cad60e4e5a924a1ed0342cea9e99256f6bc1308d4af2c0af9379b1cf2119ce113c085705f5519ccc1ba8562a2236190d3f0c0a10f01466ad79a48127c28433f6b34e24a539af60f3d]\n[sha = SHA-224]\n\n# tcId = 646\n# s == 1\nmsg = 54657374\nresult = valid\nsig = 3021021c5a252f4fc55618747fd94b13c9bee62bb958d85777cb07dd90710d24020101\n\n[key.g = 16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde]\n[key.keySize = 2048]\n[key.p = 08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667]\n[key.q = 0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d]\n[key.type = DSAPublicKey]\n[key.y = 0848177b9bcff136c52caef2a4a9bcb64dbefbac69e18aae499696b5ec7b270e90478b413bb8ad8f8eee8ad32107d7ba492c36b007f9ef30ebe1ee484d0ea7cb0ff4afaa8c705ad5e16576975414f1bc0efed25c2190a3ed0068bffa1f03bf6f21056c9bb383350851997cbc89cf8729b394527f08ab93ce9b360aa055a47177e82a4ce6fe76c8dffddbd6ee20fa08d0085d3983edd2c8d9a366ad2245b4ed28d6754769f5f3a798be4be19cf469399865d464e3f640438bce03c962c2344d0d550542aed3db55c153833bea44b4146878ba347c8614436c6aac4fd1a60f25c62b3f869a7d55cab4b7122d5e9af4322a3fc8214fa55dc1ee021459fb2c4595827]\n[keyDer = 308203433082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde03820106000282010100848177b9bcff136c52caef2a4a9bcb64dbefbac69e18aae499696b5ec7b270e90478b413bb8ad8f8eee8ad32107d7ba492c36b007f9ef30ebe1ee484d0ea7cb0ff4afaa8c705ad5e16576975414f1bc0efed25c2190a3ed0068bffa1f03bf6f21056c9bb383350851997cbc89cf8729b394527f08ab93ce9b360aa055a47177e82a4ce6fe76c8dffddbd6ee20fa08d0085d3983edd2c8d9a366ad2245b4ed28d6754769f5f3a798be4be19cf469399865d464e3f640438bce03c962c2344d0d550542aed3db55c153833bea44b4146878ba347c8614436c6aac4fd1a60f25c62b3f869a7d55cab4b7122d5e9af4322a3fc8214fa55dc1ee021459fb2c4595827]\n[sha = SHA-256]\n\n# tcId = 647\n# r,s = 1,1\nmsg = 54657374\nresult = valid\nsig = 3006020101020101\n\n# tcId = 648\n# r,s = 1,5\nmsg = 54657374\nresult = valid\nsig = 3006020101020105\n\n# tcId = 649\n# u2 small\nmsg = 54657374\nresult = valid\nsig = 3022020101021d009592121ed12d93197f1ffb863ac63937f28ef4f62f1e009a30aabab1\n\n# tcId = 650\n# s == q-1\nmsg = 54657374\nresult = valid\nsig = 3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c\n\n[key.g = 16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde]\n[key.keySize = 2048]\n[key.p = 08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667]\n[key.q = 0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d]\n[key.type = DSAPublicKey]\n[key.y = 629374929537e2c3b09f30d881554ca7357f89e25105474dbbce06e4001efd61481a457aa0d7d7e565e90b7a3d9c688005fb404bf3b6d3e61e402300beee7c58ceeaf00b112ddfeef3cbc2020ba2206dd4ef0563d7fa52c321b4ee6280eb8585041d03cadb9244dff21dc90417bbe6f06b91c2ca6484437c3846926b18ee22275081b60726e7a26a29a947eabd035ede83d65927b3ceb0d4d8c2f34e94a3de0f57e4ea99af059657529f6954b1ac9bb4484ca76b4083e1cf4264eff028662137761e4d7f35b1eda3cf516856f25553840e43ae38379d234b06c891822132081d19f0d5db9f23b4bbd5f5667dd78f3dd7f1fe5f25ca48515f6335ce1c9fd0a64b]\n[keyDer = 3082",
+    "03423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde038201050002820100629374929537e2c3b09f30d881554ca7357f89e25105474dbbce06e4001efd61481a457aa0d7d7e565e90b7a3d9c688005fb404bf3b6d3e61e402300beee7c58ceeaf00b112ddfeef3cbc2020ba2206dd4ef0563d7fa52c321b4ee6280eb8585041d03cadb9244dff21dc90417bbe6f06b91c2ca6484437c3846926b18ee22275081b60726e7a26a29a947eabd035ede83d65927b3ceb0d4d8c2f34e94a3de0f57e4ea99af059657529f6954b1ac9bb4484ca76b4083e1cf4264eff028662137761e4d7f35b1eda3cf516856f25553840e43ae38379d234b06c891822132081d19f0d5db9f23b4bbd5f5667dd78f3dd7f1fe5f25ca48515f6335ce1c9fd0a64b]\n[sha = SHA-256]\n\n# tcId = 651\n# s == 1\nmsg = 54657374\nresult = valid\nsig = 3021021c5a252f4fc55618747fd94b13c9bee62bb958d85777cb07dd90710d24020101\n\n",
+};
+static const size_t kLen57 = 214813;
+
+static const char *kData58[] = {
+    "# Imported from Wycheproof's ecdh_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDH\n# Generator version: 0.4\n\n[curve = secp224r1]\n\n# tcId = 1\n# normal case\ncurve = secp224r1\nprivate = 565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328\npublic = 304e301006072a8648ce3d020106052b81040021033a00047d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc719b01d050dfbe653e72f39491be87fb1a2742daa6e0a2aada98bb1aca\nresult = valid\nshared = b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f\n\n# tcId = 2\n# compressed public key\ncurve = secp224r1\nprivate = 565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328\npublic = 3032301006072a8648ce3d020106052b81040021031e00027d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc71\nresult = acceptable\nshared = b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f\n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 3\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a00045763fa2ae16367ad23d471cc9a52466f0d81d864e5640cefe384114594d9fecfbed4f254505ac8b41d2532055a07f0241c4818b552cbb636\nresult = valid\nshared = 00000000000000000000000100000000000000000000000000000001\n\n# tcId = 4\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004142c1fd80fa2121a59aa898144084ec033f7a56a34eee0b499e29ae51c6d8c1bbb1ef2a76d565899fe44ffc1207d530d7f598fb77f4bb76b\nresult = valid\nshared = 00000000000000ffffffffffffff0000000000000100000000000000\n\n# tcId = 5\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ed6f793e10c80d12d871cf8988399c4898a9bf9ffd8f27399f63de25f0051cdf4eec7f368f922cfcd948893ceca0c92e540cc4367a99a66a\nresult = valid\nshared = 00000000ffffffffffffffff00000000000000010000000000000000\n\n# tcId = 6\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a000408fcfc1a63c82860be12e4137433dfc40be9acdd245f9a8c4e56be61a385fc09f808383383f4b1d0d5365b6e5dcfacdc19bc7bcfed221274\nresult = valid\nshared = 0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff\n\n# tcId = 7\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004d883ed77f1861e8712800d31df67888fe39f150c79a27aa88caeda6b180f3f623e2ff3ab5370cf8179165b085af3dd4502850c0104caed9a\nresult = valid\nshared = 0003fffffff00000003fffffff00000003fffffff000000040000000\n\n# tcId = 8\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a00042b8b279b85ee3f3d2c0abeb36fdfc5aad6157d652d26489381a32cd73224bd757ef794acc92b0b3b9e7990618bb343a9a09bdb9d3616eff6\nresult = valid\nshared = 01fffffffc00000007fffffff00000001fffffffc000000080000001\n\n# tcId = 9\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004a281ad992b363597ac93ff0de8ab1f7e51a6672dcbb58f9d739ba430ce0192874038daefc3130eec65811c7255da70fea65c1003f6892faa\nresult = valid\nshared = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n# tcId = 10\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004be3e22133f51203f631b81dde8c020cdea5daa1f99cfc05c88fad2dc0f243798d6e72d1de9e3cdca4144e0a6c0f2a584d07589006972c197\nresult = valid\nshared = fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008001\n\n# tcId = 11\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004af14547c20afbd91bfe64ea03d45a76a71241f23520ef897ff91eff1b54ca6ca8c25fd73852ec6654617434eff7f0225684d4dea7a4f8a97\nresult = valid\nshared = ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff\n\n# tcId = 12\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004b1e484925018729926acda56ff3e2f6c1e7e8f162b178d8e8afb45564fceaa6da5d998fe26b6b26a055169063a5ab6908852ca8b54e2de6c\nresult = valid\nshared = fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff\n\n# tcId = 13\n# edge cases for shared secret\ncurve = secp224r1\nprivate = 0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6\npublic = 304e301006072a8648ce3d020106052b81040021033a0004937eb09fb145c8829cb7df20a4cbeed396791373de277871d6c5f9cc3b5b4fd56464a71fc4a2a6af3bd251952bffa829489e68a8d06f96b6\nresult = valid\nshared = ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\n\n# tcId = 14\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004000000000000000000000001000000000000000000000000000000012ea2f4917bdfdb008306cc10a18e2557633ba861001829dcbfb96fba\nresult = valid\nshared = be1ded8cb7ff8a585181f96d681e31b332fe27dcae922dca2310300d\n\n# tcId = 15\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a000400000000000000ffffffffffffff000000000000010000000000000073ca5f8f104997a2399e0c7f25e72a75ec29fc4542533d3fea89a33a\nresult = valid\nshared = a2e86a260e13515918a0cafdd87855f231b5624c560f976159e06a75\n\n# tcId = 16\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a000400000000ffffffffffffffff000000000000000100000000000000006fe6805f59b19b0dd389452a1d4a420bfeb6c369cf6fed5b12e6e654\nresult = valid\nshared = 31ef7c8d10404a0046994f313a70574b027e87f9028eca242c1b5bf5\n\n# tcId = 17\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a00040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff77c5cfa4e2c384938d48bd8dd98f54c86b279f1df8c0a1f6692439c9\nresult = valid\nshared = d1976a8ef5f54f24f5a269ad504fdca849fc9c28587ba294ef267396\n\n# tcId = 18\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a00040003fffffff00000003fffffff00000003fffffff00000004000000001f0828136016bb97445461bc59f2175d8d23557d6b9381f26136e3d\nresult = valid\nshared = ce7890d108ddb2e5474e6417fcf7a9f2b3bd018816062f4835260dc8\n\n# tcId = 19\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a000401fffffffc00000007fffffff00000001fffffffc0000000800000012d8acca6f199d4a94b933ba1aa713a7debde8ac57b928f596ae66a66\nresult = valid\nshared = 30b6ff6e8051dae51e4fe34b2d9a0b1879153e007eb0b5bdf1791a9c\n\n# tcId = 20\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a00047fffffffffffffffffffffffffffffffffffffffffffffffffffffff7d8dbca36c56bcaae92e3475f799294f30768038e816a7d5f7f07d77\nresult = valid\nshared = 73bd63bd384a0faafb75cfed3e95d3892cbacf0db10f282c3b644771\n\n# tcId = 21\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800174f1ff5ea7fbc72b92f61e06556c26bab84c0b082dd6400ca1c1eb6d\nresult = valid\nshared = 85b079c62e1f5b0fd6841dfa16026e15b641f65e13a14042567166bb",
+    "\n\n# tcId = 22\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0126fdd5fccd0b5aa7fd5bb5b1308584b30556248cec80208a2fe962\nresult = valid\nshared = 8a834ff40e3fc9f9d412a481e18537ea799536c5520c6c7baaf12166\n\n# tcId = 23\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff20cfa23077acc9fbcb71339c65880cd0b966b8a9497e65abed17f0b5\nresult = valid\nshared = a0887269766e6efcbc81d2b38f2d4638663f12377468a23421044188\n\n# tcId = 24\n# edge cases for ephemeral key\ncurve = secp224r1\nprivate = 2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969\npublic = 304e301006072a8648ce3d020106052b81040021033a0004ffffffff00000000ffffffff00000000ffffffff00000000ffffffff1c05ac2d4f10b69877c3243d51f887277b7bf735c326ab2f0d70da8c\nresult = valid\nshared = c65d1911bc076a74588d8793ce7a0dcabf5793460cd2ebb02754a1be\n\n# tcId = 25\n# edge case private key\ncurve = secp224r1\nprivate = 3\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = e71f2157bfe37697ea5193d4732dcc6e5412fa9d38387eacd391c1c6\n\n# tcId = 26\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffff\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = fa2664717c7fa0161ec2c669b2c0986cdc20456a6e5406302bb53c77\n\n# tcId = 27\n# edge case private key\ncurve = secp224r1\nprivate = 1000000000000000000000000000000000000000000000000000000\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = af6e5ad34497bae0745f53ad78ce8b285d79f400d5c6e6a071f8e6bd\n\n# tcId = 28\n# edge case private key\ncurve = secp224r1\nprivate = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffff\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = 12fd302ff8c13c55a9c111f8bb6b0a13ecf88299c0ae3032ce2bcaff\n\n# tcId = 29\n# edge case private key\ncurve = secp224r1\nprivate = 080000000000000000000000000000000000000000000000000000000\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = 73f1a395b842f1a6752ae417e2c3dc90cafc4476d1d861b7e68ad030\n\n# tcId = 30\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffff16a2e0b8f03d13dd29455c5c2a3d\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = b329c20ddb7c78ee4e622bb23a984c0d273ba34b6269f3d9e8f89f8e\n\n# tcId = 31\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffff16a2e0b8f03e13cd29455c5c2a3d\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = 6f48345209b290ffc5abbe754a201479e5d667a209468080d06197b4\n\n# tcId = 32\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffff16a2e0b8f03e13d529455c5c2a3d\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = 9f6e30c1c9dad42a153aacd4b49a8e5c721d085cd07b5d5aec244fc1\n\n# tcId = 33\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29445c5c2a3d\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = 8cadfb19a80949e61bd5b829ad0e76d18a5bb2eeb9ed7fe2b901cecd\n\n# tcId = 34\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29b7\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = 475fd96e0eb8cb8f100a5d7fe043a7a6851d1d611da2643a3c6ae708\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 35\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a37\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = 41ef931d669d1f57d8bb95a01a92321da74be8c6cbc3bbe0b2e73ebd\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 36\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = e71f2157bfe37697ea5193d4732dcc6e5412fa9d38387eacd391c1c6\n\n# tcId = 37\n# edge case private key\ncurve = secp224r1\nprivate = 0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b\npublic = 304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504\nresult = valid\nshared = 11ff15126411299cbd49e2b7542e69e91ef132e2551a16ecfebb23a3\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 38\n# public point not on curve\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 304e301006072a8648ce3d020106052b81040021033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5d\nresult = invalid\nshared = \n\n# tcId = 39\n# public point = (0,0)\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = invalid\nshared = \n\n# tcId = 40\n# order = -26959946667150639794667015087019625940457807714424391721682722368061\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021dff0000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = invalid\nshared = \n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# The public key does not use a named curv",
+    "e. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 41\n# order = 0\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34020100020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = invalid\nshared = \n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 42\n# order = 1\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34020101020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = acceptable\nshared = 9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 43\n# order = 6277101735386680763835789423207665314073163949517624387909\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 3082010f3081d006072a8648ce3d02013081c4020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021900ffffffffffffffffffffffffffff16a2e0b8f03e13dd2945020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = acceptable\nshared = 9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 44\n# generator = (0,0)\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb40439040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = acceptable\nshared = 9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 45\n# generator not on curve\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e36021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = acceptable\nshared = 9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of",
+    " the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 46\n# cofactor = -1\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = invalid\nshared = \n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 47\n# cofactor = 0\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = invalid\nshared = \n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 48\n# cofactor = 2\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020102033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = acceptable\nshared = 9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 49\n# cofactor =\n# 26959946667150639794667015087019625940457807714424391721682722368061\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 3082012f3081f006072a8648ce3d02013081e4020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = invalid\nshared = \n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 50\n# cofactor = None\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201103081d106072a8648ce3d02013081c5020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = acceptable\nshared = 9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 51\n# modified prime\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00c123da0a46a971da9468161e61a5c71a02e6c9bdb3392f4016fb457b303c041c3edc25f5b9568e256b97e9e19e5a38e4fd1936424cc6d0bfe904ba83041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904000000000000000000285145f31ae4d40000000000000000000003387edad63d1a600740ce66b6f04d67ed06ea1a75c16294336ed05b3fa3021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004000000000000000000285145f31ae4d40000000000000000000003387edad63d1a600740ce66b6f04d67ed06ea1a75c16294336ed05b3fa3\nresult = invalid\nshared = \n# The modulus of the public key has been modified. The public point of the\n# public key has been chosen so that it is both a point on both the curve of the\n# modified public key and the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 52\n# using secp256r1\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9",
+    "dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39\nresult = invalid\nshared = \n\n# tcId = 53\n# using secp256k1\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838\nresult = invalid\nshared = \n\n# tcId = 54\n# a = 0\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 3081f83081b906072a8648ce3d02013081ad020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff0000000000000000000000013021040100041cd0d5e347a38ce5b6e1f47edddd8a223bca45d2015de76ec835a4df57043904a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b\nresult = acceptable\nshared = 9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 55\n# public key of order 3\ncurve = secp224r1\nprivate = 0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2\npublic = 308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041c5f016b6ef7c87f09477c524fd38cddb24f4e259de4ad4a1f46ddea0e041c1d95579037de3d9d658893716efe3a3569ce699b5d20356e8f83b31e0439049d1a9a4c437596755a6277bd634e4e5a793c5007be2ac3523205e0c5c554f8662ec70ce451c617dda9d184131d1825f5b58c4f8012c48529021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a00049d1a9a4c437596755a6277bd634e4e5a793c5007be2ac3523205e0c53aab0799d138f31bae39e822562e7bebe2e7da0a4a73b07fed3b7ad8\nresult = invalid\nshared = \n# The vector contains a weak public key. The curve is not a named curve, the\n# public key point has order 3 and has been chosen to be on the same curve as\n# the private key. This test vector is used to check ECC implementations for\n# missing steps in the verification of the public key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 56\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004ea36cf70fab75684eabe6569ce623db0deaa8c95f61c8be50b8b9f3eb7d4b9ec48d9e4814f4cb1c286589eaaa990d3f3238b2d6d6be964abfad964824b653376\nresult = invalid\nshared = \n\n# tcId = 57\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 3076301006072a8648ce3d020106052b81040022036200044b2470ad3d13269c10a17d222ebdffbd61fb04488db1b1d7caef8d4988b7bb8ba6d81857a05b255232b9e37a30e328bb9d9c42d86096f2bcee3d258cfe208d2fd03cbd5ccc6a3bb8ce4b0efa5b059b4afbd0377aa6e274721a57efe8ee85d86a\nresult = invalid\nshared = \n\n# tcId = 58\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 30819b301006072a8648ce3d020106052b810400230381860004012841a2260f0f1f424865fef275374779bf0355720223f8ec6a9ba767b1603b492f58a6bba1705d882257bc6be1935de4411c5f1fdad44ec65ba8b97ce0e73e1ac90006937832a602147e37c1a42ca2a63629ffc9a35b31bfacb38c6242b42916125f7446b45c718f797259bc3011cb71e868560b331cf7d01139a0643443f9fd7306c1\nresult = invalid\nshared = \n\n# tcId = 59\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 3056301006072a8648ce3d020106052b8104000a03420004c2199fecf75648c0e952dff143821fa4012b28f90435ce6ee54653687f969a76092a3844e17d478a594f43b28cc10a5c553b4f64906121031c3a79299c70dbd6\nresult = invalid\nshared = \n\n# tcId = 60\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 3052301406072a8648ce3d020106092b2403030208010105033a00046caa3d6d86f792df7b29e41eb4203150f60f4fca10f57d0b2454abfb201f9f7e6dcbb92bdcfb9240dc86bcaeaf157c77bca22b2ec86ee8d6\nresult = invalid\nshared = \n\n# tcId = 61\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 305a301406072a8648ce3d020106092b2403030208010107034200042750180012c3ba7489517d428e4826784e50b50ac42ef7991c61a396c03a52da5e74908ae8a89627a7c15e554b105b0ebaeebcfed10e3ea60223d0a8bc3b36ab\nresult = invalid\nshared = \n\n# tcId = 62\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 306a301406072a8648ce3d020106092b2403030208010109035200045b523d3a8f20f6a569c6951e0b8de48d89e7549a184e8506820421c3e404473692cd248d7480843b911d87a87e401112fce0d3d2c36978cf6dd7f1d93bfaebe0827d4bf4006006d3202e842126fe1b68\nresult = invalid\nshared = \n\n# tcId = 63\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 307a301406072a8648ce3d020106092b240303020801010b03620004449607c76c6dc7334c269a0ebab5beec83b6c263377ce06ef5c276f45a9916eff85f50438f5f32ced0210a6c414fe5e242c7c1070823f5395b35965bda6758acf84725f11ea836dda7d391fee91342026645241853224a437a6fb74e4cdc871f\nresult = invalid\nshared = \n\n# tcId = 64\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 30819b301406072a8648ce3d020106092b240303020801010d038182000463e7a491240848e4f53ea5fb857d428c493053193e4b0b4f995ac8bf4c56276a507870131a384aa7e236c64cd7a049a1b37e40ad00c3b8a920dcbad6531616356ce1b6e6d96a7d1b693e25e5abd83ab560a3d764bcd49ec98a1b49421163bd5fc5a625f44c91eb4c2984d5a2e51e816ebdee8fbe08364bb14b7ac876990e64d9\nresult = invalid\nshared = \n\n# tcId = 65\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 3052301406072a8648ce3d020106092b2403030208010106033a00047c592ecb8908355d1ebf8d59b3619275dbe3666209b72ced6a3c88740456ce61d6a84e0542d7cd10dd8804afb8c784d5dffd9480d8cfdc95\nresult = invalid\nshared = \n\n# tcId = 66\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 305a301406072a8648ce3d020106092b240303020801010803420004746226a3e005c37ede51828d3375ef91ebd0ff719a380af69d7dfd131b42a3e8917d4a4d573872935a74d1040f1c47d25d6b26f4156cccdcdc11833b9cde433a\nresult = invalid\nshared = \n\n# tcId = 67\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 306a301406072a8648ce3d020106092b240303020801010a035200043298b36825c7bd90ab5157b913d40bbfd732a0de0557e02a2c65a0c223e9a65d62c32462040dd6fe578103023c831caff122c1ed4b8ff7373fa2f08d11c9f4c7f85f81802262ffed9bb82cb6d",
+    "92eed2d\nresult = invalid\nshared = \n\n# tcId = 68\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 307a301406072a8648ce3d020106092b240303020801010c036200043af2849b981f7e5e6ab936e6abb4f206c1fd5561998df8008bfe98d84173c9f2301cdbd5bffc569c0b5a57ce2a8f4d640f1816475fc6043baa8e5a3453bf327b54cb29c7e54a5f31348969aa94615094dbcd1a8e5c2d630465e45fc556c02194\nresult = invalid\nshared = \n\n# tcId = 69\n# Private key and public key are not on the same curve\ncurve = secp224r1\nprivate = 2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc\npublic = 30819b301406072a8648ce3d020106092b240303020801010e038182000453d2506047e72af6d98558e1633ecb7e6a05c37861cd3289455cf41bfbf1703f2e9a83052b8eca7d84cba2f001abd8b978f68b69ed6bd874755c44d347fe302c5760b2078c56b24ebd0dcd99f26b8f8a23044b3767a3d2a306587687a7b00668974674edbf18c3db2f3473a97ee77065fdcdd1a9aa053716a4c504f3d18b9170\nresult = invalid\nshared = \n\n# tcId = 70\n# invalid public key\ncurve = secp224r1\nprivate = 0fc28a0ca0f8e36b0d4f71421845135a22aef543b9fddf8c775b2d18f\npublic = 3032301006072a8648ce3d020106052b81040021031e00020ca753db5ddeca474241f8d2dafc0844343fd0e37eded2f0192d51b2\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n[curve = secp256r1]\n\n# tcId = 71\n# normal case\ncurve = secp256r1\nprivate = 612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000462d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf\nresult = valid\nshared = 53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285\n\n# tcId = 72\n# compressed public key\ncurve = secp256r1\nprivate = 612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346\npublic = 3039301306072a8648ce3d020106082a8648ce3d0301070322000362d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26\nresult = acceptable\nshared = 53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285\n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 73\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000458fd4168a87795603e2b04390285bdca6e57de6027fe211dd9d25e2212d29e62080d36bd224d7405509295eed02a17150e03b314f96da37445b0d1d29377d12c\nresult = valid\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 74\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200040f6d20c04261ecc3e92846acad48dc8ec5ee35ae0883f0d2ea71216906ee1c47c042689a996dd12830ae459382e94aac56b717af2e2080215f9e41949b1f52be\nresult = valid\nshared = 00000000000000000000000000000000ffffffffffffffffffffffffffffffff\n\n# tcId = 75\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400c7defeb1a16236738e9a1123ba621bc8e9a3f2485b3f8ffde7f9ce98f5a8a1cb338c3912b1792f60c2b06ec5231e2d84b0e596e9b76d419ce105ece3791dbc\nresult = valid\nshared = 0000000000000000ffffffffffffffff00000000000000010000000000000001\n\n# tcId = 76\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004e9b98fb2c0ac045f8c76125ffd99eb8a5157be1d7db3e85d655ec1d8210288cf218df24fd2c2746be59df41262ef3a97d986744b2836748a7486230a319ffec0\nresult = valid\nshared = 00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000\n\n# tcId = 77\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004e9484e58f3331b66ffed6d90cb1c78065fa28cfba5c7dd4352013d3252ee4277bd7503b045a38b4b247b32c59593580f39e6abfa376c3dca20cf7f9cfb659e13\nresult = valid\nshared = 000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff\n\n# tcId = 78\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004767d7fbb84aa6a4db1079372644e42ecb2fec200c178822392cb8b950ffdd0c91c86853cafd09b52ba2f287f0ebaa26415a3cfabaf92c6a617a19988563d9dea\nresult = valid\nshared = 0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001\n\n# tcId = 79\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004f3cb6754b7e2a86d064dfb9f903185aaa4c92b481c2c1a1ff276303bbc4183e49c318599b0984c3563df339311fe143a7d921ee75b755a52c6f804f897b809f7\nresult = valid\nshared = 7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff\n\n# tcId = 80\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cce13fbdc96a946dfb8c6d9ed762dbd1731630455689f57a437fee124dd54cecaef78026c653030cf2f314a67064236b0a354defebc5e90c94124e9bf5c4fc24\nresult = valid\nshared = 8000000000000000000000000000000000000000000000000000000000000004\n\n# tcId = 81\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200047633dfd0ad06765097bc11bd5022b200df31f28c4ff0625421221ac7eeb6e6f4cb9c67693609ddd6f92343a5a1c635408240f4f8e27120c12554c7ff8c76e2fe\nresult = valid\nshared = 8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000\n\n# tcId = 82\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004a386ace573f87558a68ead2a20088e3fe928bdae9e109446f93a078c15741f0421261e6db2bf12106e4c6bf85b9581b4c0302a526222f90abc5a549206b11011\nresult = valid\nshared = ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff\n\n# tcId = 83\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200048e7b50f7d8c44d5d3496c43141a502f4a43f153d03ad43eda8e39597f1d477b8647f3da67969b7f989ff4addc393515af40c82085ce1f2ee195412c6f583774f\nresult = valid\nshared = ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff\n\n# tcId = 84\n# edge cases for shared secret\ncurve = secp256r1\nprivate = 0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004c827fb930fd51d926086191b502af83abb5f717debc8de29897a3934b2571ca05990c0597b0b7a2e42febd56b13235d1d408d76ed2c93b3facf514d902f6910a\nresult = valid\nshared = ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff\n\n# tcId = 85\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4\nresult = valid\nshared = cfe4077c8730b1c9384581d36bff5542bc417c9eff5c2afcb98cc8829b2ce848\n\n# tcId = 86\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000ffffffffffffffffffffffffffffffff4f2b92b4c596a5a47f8b041d2dea6043021ac77b9a80b1343ac9d778f4f8f733\nresult = valid\nshared = 49ae50fe096a6cd26698b78356b2c8adf1f6a3490f14e364629f7a0639442509\n\n# tcId = 87\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077",
+    "f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000ffffffffffffffff0000000000000001000000000000000138120be6ab31edfa34768c4387d2f84fb4b0be8a9a985864a1575f4436bb37b0\nresult = valid\nshared = 5a1334572b2a711ead8b4653eb310cd8d9fd114399379a8f6b872e3b8fdda2d9\n\n# tcId = 88\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000ffffffff00000000ffffffff00000000ffffffff0000000100000000462c0466e41802238d6c925ecbefc747cfe505ea196af9a2d11b62850fce946e\nresult = valid\nshared = c73755133b6b9b4b2a00631cbc7940ecbe6ec08f20448071422e3362f2556888\n\n# tcId = 89\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff1582fa32e2d4a89dfcfb3d0b149f667dba3329490f4d64ee2ad586c0c9e8c508\nresult = valid\nshared = 06fa1059935e47a9fd667e13f469614eb257cc9a7e3fc599bfb92780d59b146d\n\n# tcId = 90\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001684c8a9586ed6f9cbe447058a7da2108bab1e5e0a60d1f73e4e2e713f0a3dfe0\nresult = valid\nshared = f237df4c10bd3e357971bb2b16b293566b7e355bdc8141d6c92cabc682983c45\n\n# tcId = 91\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff2e2213caf03033e0fd0f7951154f6e6c3a9244a72faca65e9ce9eeb5c8e1cea9\nresult = valid\nshared = 55d0a203e22ffb523c8d2705060cee9d28308b51f184beefc518cff690bad346\n\n# tcId = 92\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000480000000000000000000000000000000000000000000000000000000000000042be8789db81bb4870a9e60c5c18c80c83de464277281f1af1e640843a1a3148e\nresult = valid\nshared = 2518d846e577d95e9e7bc766cde7997cb887fb266d3a6cb598a839fd54aa2f4f\n\n# tcId = 93\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200048000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000722540f8a471c379083c600b58fde4d95c7dcad5095f4219fc5e9bdde3c5cd39\nresult = valid\nshared = bdb49f4bdf42ac64504e9ce677b3ec5c0a03828c5b3efad726005692d35c0f26\n\n# tcId = 94\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff5df80fc6cae26b6c1952fbd00ed174ee1209d069335f5b48588e29e80b9191ad\nresult = valid\nshared = f503ac65637e0f17cb4408961cb882c875e4c6ef7a548d2d52d8c2f681838c55\n\n# tcId = 95\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff2c63650e6a5d332e2987dd09a79008e8faabbd37e49cb016bfb92c8cd0f5da77\nresult = valid\nshared = e3c18e7d7377dc540bc45c08d389bdbe255fa80ca8faf1ef6b94d52049987d21\n\n# tcId = 96\n# edge cases for ephemeral key\ncurve = secp256r1\nprivate = 55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff7a116c964a4cd60668bf89cffe157714a3ce21b93b3ca607c8a5b93ac54ffc0a\nresult = valid\nshared = 516d6d329b095a7c7e93b4023d4d05020c1445ef1ddcb3347b3a27d7d7f57265\n\n# tcId = 97\n# edge case private key\ncurve = secp256r1\nprivate = 3\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca\n\n# tcId = 98\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = a329a7d80424ea2d6c904393808e510dfbb28155092f1bac284dceda1f13afe5\n\n# tcId = 99\n# edge case private key\ncurve = secp256r1\nprivate = 100000000000000000000000000000000000000000000000000000000000000\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = bd26d0293e8851c51ebe0d426345683ae94026aca545282a4759faa85fde6687\n\n# tcId = 100\n# edge case private key\ncurve = secp256r1\nprivate = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = ea9350b2490a2010c7abf43fb1a38be729a2de375ea7a6ac34ff58cc87e51b6c\n\n# tcId = 101\n# edge case private key\ncurve = secp256r1\nprivate = 08000000000000000000000000000000000000000000000000000000000000000\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 34eed3f6673d340b6f716913f6dfa36b5ac85fa667791e2d6a217b0c0b7ba807\n\n# tcId = 102\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e83f3b9cac2fc632551\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 1354ce6692c9df7b6fc3119d47c56338afbedccb62faa546c0fe6ed4959e41c3\n\n# tcId = 103\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3a9cac2fc632551\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = fe7496c30d534995f0bf428b5471c21585aaafc81733916f0165597a55d12cb4\n\n# tcId = 104\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b1cac2fc632551\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 348bf8042e4edf1d03c8b36ab815156e77c201b764ed4562cfe2ee90638ffef5\n\n# tcId = 105\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac1fc632551\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 6e4ec5479a7c20a537501700484f6f433a8a8fe53c288f7a25c8e8c92d39e8dc\n\n# tcId = 106\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f3\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = f7407d61fdf581be4f564621d590ca9b7ba37f31396150f9922f1501da8c83ef\n# The private key has a special value. Implementations using addition\n# subtractio",
+    "n chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 107\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632533\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 82236fd272208693e0574555ca465c6cc512163486084fa57f5e1bd2e2ccc0b3\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 108\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632543\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 06537149664dba1a9924654cb7f787ed224851b0df25ef53fcf54f8f26cd5f3f\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 109\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254b\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = f2b38539bce995d443c7bfeeefadc9e42cc2c89c60bf4e86eac95d51987bd112\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 110\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca\n\n# tcId = 111\n# edge case private key\ncurve = secp256r1\nprivate = 0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b\nresult = valid\nshared = 027b013a6f166db655d69d643c127ef8ace175311e667dff2520f5b5c75b7659\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 112\n# CVE-2017-8932\ncurve = secp256r1\nprivate = 2a265f8bcbdcaf94d58519141e578124cb40d64a501fba9c11847b28965bc737\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004023819813ac969847059028ea88a1f30dfbcde03fc791d3a252c6b41211882eaf93e4ae433cc12cf2a43fc0ef26400c0e125508224cdb649380f25479148a4ad\nresult = valid\nshared = 4d4de80f1534850d261075997e3049321a0864082d24a917863366c0724f5ae3\n\n# tcId = 113\n# CVE-2017-8932\ncurve = secp256r1\nprivate = 313f72ff9fe811bf573176231b286a3bdb6f1b14e05c40146590727a71c3bccd\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cc11887b2d66cbae8f4d306627192522932146b42f01d3c6f92bd5c8ba739b06a2f08a029cd06b46183085bae9248b0ed15b70280c7ef13a457f5af382426031\nresult = valid\nshared = 831c3f6b5f762d2f461901577af41354ac5f228c2591f84f8a6e51e2e3f17991\n\n# tcId = 114\n# public point not on curve\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764c\nresult = invalid\nshared = \n\n# tcId = 115\n# public point = (0,0)\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = invalid\nshared = \n\n# tcId = 116\n# order =\n# -115792089210356248762697446949407573529996955224135760342422259061068512044369\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f50221ff00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = invalid\nshared = \n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 117\n# order = 0\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5020100020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = invalid\nshared = \n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 118\n# order = 1\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5020101020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = acceptable\nshared = d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered",
+    " from this.\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 119\n# order = 26959946660873538060741835960514744168612397095220107664918121663170\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 3082012f3081e806072a8648ce3d02013081dc020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5021d00ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = acceptable\nshared = d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 120\n# generator = (0,0)\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b04410400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = acceptable\nshared = d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 121\n# generator not on curve\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f7022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = acceptable\nshared = d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 122\n# cofactor = -1\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = invalid\nshared = \n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 123\n# cofactor = 0\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = invalid\nshared = \n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# ge",
+    "nerator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 124\n# cofactor = 2\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020102034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = acceptable\nshared = d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 125\n# cofactor =\n# 115792089210356248762697446949407573529996955224135760342422259061068512044369\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201553082010d06072a8648ce3d020130820100020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = invalid\nshared = \n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 126\n# cofactor = None\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201303081e906072a8648ce3d02013081dd020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = acceptable\nshared = d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 127\n# modified prime\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100fd091059a6893635f900e9449d63f572b2aebc4cff7b4e5e33f1b200e8bbc1453044042002f6efa55976c9cb06ff16bb629c0a8d4d5143b40084b1a1cc0e4dff17443eb704205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441040000000000000000000006597fa94b1fd90000000000000000000000000000021b8c7dd77f9a95627922eceefea73f028f1ec95ba9b8fa95a3ad24bdf9fff414022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200040000000000000000000006597fa94b1fd90000000000000000000000000000021b8c7dd77f9a95627922eceefea73f028f1ec95ba9b8fa95a3ad24bdf9fff414\nresult = invalid\nshared = \n# The modulus of the public key has been modified. The public point of the\n# public key has been chosen so that it is both a point on both the curve of the\n# modified public key and the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 128\n# using secp224r1\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf\nresult = invalid\nshared = \n\n# tcId = 129\n# using secp256k1\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838\nresult = invalid\nshared = \n\n# tcId = 130\n# a = 0\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201143081cd06072a8648ce3d02013081c1020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff302504010004201b95c2f46065dbf0f3ff09153e4748ed71595e0774ba8e25c364ff1e6be039b70441041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a\nresult = acceptable\nshared = d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding",
+    ", the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 131\n# public key of order 3\ncurve = secp256r1\nprivate = 4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c\npublic = 308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420e3435a62422acfac83186b528c3c7106bc47f9bddfb4baa77765fb05ad2d75aa04206f9039d823ca56b22f7335d612f6e5b974e3b6dc099a9529dd3222ba971f92f4044104d1a62cae3b48c380bd5003fe1b46a37de15841c34d0b3bc99aa24f33a242016ef3512324ec1eae01073f9ab5ca214d0562906852b3e2c8c9ee3579199818e7e8022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255102010103420004d1a62cae3b48c380bd5003fe1b46a37de15841c34d0b3bc99aa24f33a242016e0caedcda13e151fff8c0654a35deb2fa9d6f97ae4c1d373611ca86e667e71817\nresult = invalid\nshared = \n# The vector contains a weak public key. The curve is not a named curve, the\n# public key point has order 3 and has been chosen to be on the same curve as\n# the private key. This test vector is used to check ECC implementations for\n# missing steps in the verification of the public key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 132\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 304e301006072a8648ce3d020106052b81040021033a00042af270d2a6030e3dd38cc46e7d719f176c2ca4eb04d7e8b84290c8edbcaed964ebe226b2d7ce17251622804c0d3b7adce020a3cdc97cac6c\nresult = invalid\nshared = \n\n# tcId = 133\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 3076301006072a8648ce3d020106052b81040022036200041f17901e731b06f349b6e9d7d17d45e8a2b46115a47485be16197932db87b39405b5c941b36fd61b9ef7dd20878e129e55a2277099c601dcdb3747f80ad6e166116378e1ebce2c95744a0986128cfeeaac7f90b71787d9a1cfe417cd4c8f6af5\nresult = invalid\nshared = \n\n# tcId = 134\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400ed76e5888428fad409ff203ab298b0f24827c091939ae0f9b1245d865ac5fbcd2749f9ae6c90fa8e29414d1bc7dc7b3c4aca904cd824484421cc66fe6af43bdfd200c1f790a0b3ae994937f91b6bdb9778b08c83ecadb8cba22a78c37bf565dac164f18e719be0ef890ee5cbf20e17fcfc9a5585e5416470b9862f82fb769339994f4e\nresult = invalid\nshared = \n\n# tcId = 135\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 3056301006072a8648ce3d020106052b8104000a034200048028d16082b07696d4aa4aab9d6b1f1463435ac097900631108f9888e13da67c4841fd8dd3ced6e7ad8c6fc656621c2f93d3db0eb29d48d1423154519865dbc1\nresult = invalid\nshared = \n\n# tcId = 136\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 3052301406072a8648ce3d020106092b2403030208010105033a0004a6bae3d155c1f9ca263928c986ede69acefd0dd9b3a19d2b9f4b0a3a66bea5d167318dcc028945fc1b40c60ce716ba2d414a743c6b856a6f\nresult = invalid\nshared = \n\n# tcId = 137\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 305a301406072a8648ce3d020106092b2403030208010107034200045d3ddbbb9bc071d8b59855c74bdf3541ae4cb6c1a24ec439034df7abde16a346523edf6a67896b304cb2cd2a083eec2b16935bbc910e85ec6eae38b50230bf70\nresult = invalid\nshared = \n\n# tcId = 138\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 306a301406072a8648ce3d020106092b240303020801010903520004a43c6ef2500723d54c1fc88f8844d83445ca5a0f585c10b8eb3f022d47d0e84862b7f5cbf97d352d4348ca730f600f2258d1d192da223f6ba83a7cc0d6da598d55c2b77824d326c8df000b8fff156d2c\nresult = invalid\nshared = \n\n# tcId = 139\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 307a301406072a8648ce3d020106092b240303020801010b036200042391c062833d1e6d89ec256cf4a3989534c1ead5e1e14ffae933a53f962857e4713087e1b3d65ac79634c71577af24698b5ce959183835551f7b08aef7853378c299930b360813fd58d5e4da8b37d5a7473e891ee11cb02881bd848b364fb7d5\nresult = invalid\nshared = \n\n# tcId = 140\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 30819b301406072a8648ce3d020106092b240303020801010d038182000484beae85096640953c1fd6ebbc32697263d53f89943cbaf14432061aea8c0318acbd9389ab1d2e904fa0e081d08cfabb614ed9bca618211142d94623c14b476a25e47abf98fd3b1da1417dfc2e2cfc8424b16ea14dd45e1422be7d4e0a5cc7f4d4ab5f198cdbaaa3f642ec6361842cbe869382ee78cd596ff5e740d9ec2c3ad6\nresult = invalid\nshared = \n\n# tcId = 141\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 3052301406072a8648ce3d020106092b2403030208010106033a00042b0a1a858ffc44e7752940731d378f96570837e279ea3948fe00cff8b5f89adb4e2fe6f8781ba6426364f4590b34dd79fc80629de4a86084\nresult = invalid\nshared = \n\n# tcId = 142\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 305a301406072a8648ce3d020106092b2403030208010108034200043037c01b4a5ac53742e3f5528dffb0f010ab6ebeb08d792b32e19e9006ca331a024b67698d7cf4b575ccd9389441d5c640b77c63771cef1bd85675361c6602a4\nresult = invalid\nshared = \n\n# tcId = 143\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 306a301406072a8648ce3d020106092b240303020801010a035200040f0fd972a495a140124a4019291a20f5b39fb755c126bf268643bb3091eca44f2a3cda1dead6ab1f4fe08a4b3872423f71e5bf96b1c20bc0ca73b7e2c134cc14a5f77bc838ebcf01084da3bf15663536\nresult = invalid\nshared = \n\n# tcId = 144\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 307a301406072a8648ce3d020106092b240303020801010c0362000403b65faf5a6bf74bd5c166278a4b566c6c705ac6363e61f3b0699e116d3c5b19e8b7021b75b005f78a8cea8de34c49397f9b3b2bfc8706eb8163c802371eff7dfc825c40aa84dd9d1c4b34615ee5ae28c6c05d58d2a8ccc3786382b712d3bcda\nresult = invalid\nshared = \n\n# tcId = 145\n# Private key and public key are not on the same curve\ncurve = secp256r1\nprivate = 0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297\npublic = 30819b301406072a8648ce3d020106092b240303020801010e03818200047504d660943a69ab043378e44c034896534a346e0e95f35fcaad3503b490856bfb20a753ecabc6d7bfeec28d057f919923b7d3c086953eb16c5bd287b59788db72dbb7c273854294c927ea7eca205aae2f0830e5faaddad8316231bfc3572c85c33cb7054e04c8936e3ce059c907e59f40593444e590b31820bc1f514ed0ec8a\nresult = invalid\nshared = \n\n# tcId = 146\n# invalid public key\ncurve = secp256r1\nprivate = 6f953faff3599e6c762d7f4cabfeed092de2add1df1bc5748c6cbb725cf35458\npublic = 3039301306072a8648ce3d020106082a8648ce3d03010703220002fd4bf61763b46581fd9174d623516cf3c81edd40e29ffa2777fb6cb0ae3ce535\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 147\n# public key is a low order point on twist\ncurve = secp256r1\nprivate = 0d27edf0ff5b6b6b465753e7158370332c153",
+    "b468a1be087ad0f490bdb99e5f02\npublic = 3039301306072a8648ce3d020106082a8648ce3d03010703220003efdde3b32872a9effcf3b94cbf73aa7b39f9683ece9121b9852167f4e3da609b\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 148\n# public key is a low order point on twist\ncurve = secp256r1\nprivate = 0d27edf0ff5b6b6b465753e7158370332c153b468a1be087ad0f490bdb99e5f03\npublic = 3039301306072a8648ce3d020106082a8648ce3d03010703220002efdde3b32872a9effcf3b94cbf73aa7b39f9683ece9121b9852167f4e3da609b\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 149\n# public key is a low order point on twist\ncurve = secp256r1\nprivate = 095ead84540c2d027aa3130ff1b47888cc1ed67e8dda46156e71ce0991791e835\npublic = 3039301306072a8648ce3d020106082a8648ce3d03010703220002c49524b2adfd8f5f972ef554652836e2efb2d306c6d3b0689234cec93ae73db5\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 150\n# public key is a low order point on twist\ncurve = secp256r1\nprivate = 0a8681ef67fb1f189647d95e8db00c52ceef6d41a85ba0a5bd74c44e8e62c8aa4\npublic = 3039301306072a8648ce3d020106082a8648ce3d0301070322000318f9bae7747cd844e98525b7ccd0daf6e1d20a818b2175a9a91e4eae5343bc98\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 151\n# public key is a low order point on twist\ncurve = secp256r1\nprivate = 0a8681ef67fb1f189647d95e8db00c52ceef6d41a85ba0a5bd74c44e8e62c8aa5\npublic = 3039301306072a8648ce3d020106082a8648ce3d0301070322000218f9bae7747cd844e98525b7ccd0daf6e1d20a818b2175a9a91e4eae5343bc98\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 152\n# public key is a low order point on twist\ncurve = secp256r1\nprivate = 095ead84540c2d027aa3130ff1b47888cc1ed67e8dda46156e71ce0991791e834\npublic = 3039301306072a8648ce3d020106082a8648ce3d03010703220003c49524b2adfd8f5f972ef554652836e2efb2d306c6d3b0689234cec93ae73db5\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n[curve = secp384r1]\n\n# tcId = 153\n# normal case\ncurve = secp384r1\nprivate = 766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81\npublic = 3076301006072a8648ce3d020106052b8104002203620004790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796d9b954baa8a75e82df711b3b56eadff6b0f668c3b26b4b1aeb308a1fcc1c680d329a6705025f1c98a0b5e5bfcb163caa\nresult = valid\nshared = 6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135\n\n# tcId = 154\n# compressed public key\ncurve = secp384r1\nprivate = 766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81\npublic = 3046301006072a8648ce3d020106052b8104002203320002790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796\nresult = acceptable\nshared = 6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135\n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 155\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004490e96d17f4c6ceccd45def408cea33e9704a5f1b01a3de2eaaa3409fd160d78d395d6b3b003d71fd1f590fad95bf1c9d8665efc2070d059aa847125c2f707435955535c7c5df6d6c079ec806dce6b6849d337140db7ca50616f9456de1323c4\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 156\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200040161328909675213e32098d35a6b8308a8d500cca39dcee5e804e73bdb8deaf06fe417291fd9793b231ef5fe86945444a97a01f3ae3a8310c4af49b592cb291ef70ee5bc7f5534d3c23dc9eefde2304842c7737ae937ccf9bd215c28103e9fe2\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 157\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200041478ab6e032b9545eda9ac2c264e57a11f08acbc76d16a0ab77b04dbdaf20f215c4183437b32afc471eaa603d14c7c5d8a4c84ee0e895bec5c37f0a1ca075e106ff6bf38801b5c697409d39675231108d33c4a5ea65aaa8c03e939c95d96c4c4\nresult = valid\nshared = 0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001\n\n# tcId = 158\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004f63208e34e7e90bb5fb036432467a89981444010663b8533b47bfa94bd2bc16f38aa516b930a4726e3876d3091bfb72ec783ed4da0cac06320817dc8bc64f59ccf06f48abc4386a150913fa95743a7b4601190e1c6ee8f8bf6354b254ecace45\nresult = valid\nshared = 00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\n\n# tcId = 159\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004033271ef42d92ad47b273b09ea2f45401161baa52696590d0e175ff2d1c0dfa3fea40e4266d446546c05e480d57fabec7889f16a8bcc176602f6d46561614a2f4284abe697b7cb9ce79f7e2e71b155cb1f155ce925d16391a680eda23152e6e1\nresult = valid\nshared = 0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff\n\n# tcId = 160\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004737e8437e18683de2455b68945bba31daec3e754d72f0a0776d3192b2f9298bb95ca1464baa6687aabb679f804cf6ec6c2b4d47d61a60404df63b1e9ac0954b3419bbc2ad52a0409aeeb82f4703758588059165b20367dcb4b235b0caf71d727\nresult = valid\nshared = 007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000\n\n# tcId = 161\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200042664624307c02ef487030a632162c515f841d15ea3152d98ff2364232d7aab39343d5f703a4d5a31092aa7356c3a2f671c1cd603addfd8b5477552a3b32a18edaf3e33bec22ee2167f9da729636002a7974eaeb5ff082b2aabf8c7056b84c3ab\nresult = valid\nshared = 7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000002\n\n# tcId = 162\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004665f1f320b6ab1c1b52d144e52d87a154c2b4489838c9119de622c2d1b52b65b0a3955e44e0d4859175360c0f63dee813f14f69972f18caed7916c94a4d20ec344591e7536a4a7a4d8c9832818c96d60b1a81fabe64ea02c5f647e361bf5b60f\nresult = valid\nshared = 800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 163\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b810400220362000491357ca87dbb08e85d7b1acecfd1e086078a82d19f81474da389364a39fe2543eb934b440173c38e61a1d9407855b5d89ef0d9e920764b6d7765b084cf9541dacc43d1dabaa390b0fb856097b0c00a8556f4e3848568ab4ae790c3d346ca01b6\nresult = val",
+    "id\nshared = fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff\n\n# tcId = 164\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004d5a833bae33b2d10fdff6db7c5477adb614b191c70d97c6f130a14e93931cc1dc058053fee54a264a00fdd16d3166fdc42992276b79925bafcd183b03ed18235350980abfe67b814c6c11074c38f74cd4e734ad58cdb49d9fcd2181d1b8f1119\nresult = valid\nshared = fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000\n\n# tcId = 165\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b810400220362000467547cda7fbe8f16be5a4477cbb02979f1af72fc0f39302773552fbcf4667a8e23abc0e12856ee6234deeca5f22ae0503a4df7c068e7432417260cb9fe0d68b9c7fcf7e16a2ada05687d8f8900b84723103edbff0a42b27517da2760b7d38843\nresult = valid\nshared = ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff\n\n# tcId = 166\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b81040022036200041363e3b99008e09bb3f085949b9b6ea26a318f496de568a96630fdb9d4c72c2814df3087a1741f32f24989b428167f93c653cb3ae8c3ecfaec57efd54bb8ce9d79c7bf6cc70fb1114f939be8f1a99bf1e42b97431124ef9fa33450faa4e76839\nresult = valid\nshared = ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000001\n\n# tcId = 167\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004ba2be8d7147e2417c2ec80b24b4c1aa94464ffd0aae1fa2e078b3afbc77c144489ca9d064acbb7a9cfa6196d0f467b7e65ee1ca1eb1351ff9968f553dfe2e4c59ff8ba34c22a42b3baa13a9a1adc7f13abd40f1fd25d46bc5330852b9371966a\nresult = valid\nshared = ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff\n\n# tcId = 168\n# edge cases for shared secret\ncurve = secp384r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7\npublic = 3076301006072a8648ce3d020106052b8104002203620004d69850ccbacc4736ea200ff2f8488f26247945a2ab48dd3708f494b293d8cba83417f48974881c7fb03854089bbf66cc1c773ec03cb8cd5f007ec3b03bdd05a409b352103f0decf25b41673ab8ca3d04334babee01219f15701f2bca22d40b37\nresult = valid\nshared = fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe\n\n# tcId = 169\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e\nresult = valid\nshared = 6092a1757ddd43a04e185ff9472a0d18c7f7a7dc802f7e059e0c69ae16c802651719406e04de27652ff83da4a780ef2f\n\n# tcId = 170\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3\nresult = valid\nshared = 89c804cb81443386b185bcd9e2e6c35ee6177c3b90298985c4e81a89d520cceb17d729540e56ecc343c26bf314f2d052\n\n# tcId = 171\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001141b9ee5310ea8170131b604484a6d677ed42576045b7143c026710ae92b277afbbea0c4458c220d561e69404dc7d888\nresult = valid\nshared = 102080c047881d19aefb01c29c82a4fb328a8ea6e6d6c914af73100507c8ee499799aaa646de0ea8c2727c0b5ed2439b\n\n# tcId = 172\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b810400220362000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff70370385413d3eff6fa3407ba24f682c2b01b51445dbdf5ef7b0dd0979f17e713e09081571f1e94dfb66bf282002f39f\nresult = valid\nshared = f689f6e475b4e15162521acab4637a3cdb9cb42aa92f9114b0ee300ddae89d5eafff3463a1f5004a2a1bd4aeffa47b78\n\n# tcId = 173\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff112e191f1f78bbc54b6cc4f0b1e59ae8c6ff1a07f5128e41dfa2828e1b6538d4fa2ca2394c6aab3449dcb3fc4eb44c09\nresult = valid\nshared = f3486244119b3632fd55be9e6951eb5d9c8c62f6a27042f94b924155ecfd4ff8744ba3d25bcf85a7b925bd28a12b897f\n\n# tcId = 174\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000028a4c8da5a05112fe6025ef41908969de20d05d9668e5c852ef2d492172ddc2a0a622fc488164fcc1a076b872942af2\nresult = valid\nshared = 8171b7c80d4c90bb58ae54393921ab9c5c0b3196f045e9fe5c8b168f0e5f6a77e1aa34ecedc5481ce55ab34c14e0f2e8\n\n# tcId = 175\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200047fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000024480ab33cb4bf7cb79c024eeade3fd641e2f3003698400e8986a7343a5da59a3b26eea4b4176e53239371437d834a1a7\nresult = valid\nshared = 1911a0ee6aebe263fdcf3db073f2598cdafabec2123a2f24a28c3d9151c871f32d6dc2f31d25af9c498fd68da23e5bef\n\n# tcId = 176\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b81040022036200048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020797da4c0751ced16de80d16ab7c654a5dc27d092626d0865a192a1c5ea7c1b88c9fcab057946741e41cc28c80ec0b9a\nresult = valid\nshared = 15900643e2e0583976974b05f83c7a96611425f7c4a6eb51916ab958a037fd9cc172bdcfff4540a2ff3ce64e6505557e\n\n# tcId = 177\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff6c70898ae6fb31fa2f086562af2d10486ba4c6fd5e41dfe4aa61598b4707a3bc276a62feb1b98557e3b17c025f7adf4e\nresult = valid\nshared = 88a544a769d5c34a051416bd509dfac911863f604c83ea844bf0e4c5c272dec86d057a88b152a9274701938c705900c3\n\n# tcId = 178\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000000eb1592858b6e6e3a199c0f3e7c5f0b4a92915936efb8bc0407680eb7274be7422156ce8cfc8b505b2d902c39992380f\nresult = valid\nshared = b7db26b286e7527cb1f454782fe541862ff0f8d7eed960e22855deb7ac2a",
+    "69611668c777c53bb74c2bcd40edfbf7944d\n\n# tcId = 179\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff4987abae412809c2fa48fd23b1bdf9e622f5a606c44117215ffa61b18ef46e54a7fbbf11f9a6ba59c991b4ae501fedce\nresult = valid\nshared = b1e8aab1aa633d98dc6b768594e1e3edb801a9ef483f287c83e19744d2ad343ad3debdc4dc178213ad6876b52284f552\n\n# tcId = 180\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000001000000000000013691fe493d4d28bf8ee1dfec812d6c306eae0842919eda6dc525f0d49ac2d26a992251912139a2936849f9d6fa949a68\nresult = valid\nshared = b0de006f80f6f89e4eea6e46dfe305153005612d1e903171ec2886230971961b5202a9f3187bdac413ac24c836adf7a0\n\n# tcId = 181\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff615842aa06b06f78f0a66f7bea88d4b6ee59653eeaa00dc5e0a2b658f969b71af90c9b4e96bd3ca33846955bdccbd359\nresult = valid\nshared = ca8cfa42c5e374914c14d6402b1a99208e47e02ec49818913694ea0822a2cc6c310259a8f3ab7559b9974bc4c2fa337e\n\n# tcId = 182\n# edge cases for ephemeral key\ncurve = secp384r1\nprivate = 2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97\npublic = 3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3\nresult = valid\nshared = edf040bace18d90bf9ce720df2a3b31d76d95b7ed9530a159ac0b24e82a871033eada40552f9e606f7115e6a78927511\n\n# tcId = 183\n# edge case private key\ncurve = secp384r1\nprivate = 3\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9\n\n# tcId = 184\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = db1d8ef1117282870db8113aa4f58723c756ce598686eb8ea531aa4d39abb1b982b1e7bb2648a6c268d2d351204db8d5\n\n# tcId = 185\n# edge case private key\ncurve = secp384r1\nprivate = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = e98062df47ef884c9411e16466af84ad271d586008b1fbc50aeb3b36836a35a770dd42e0db84d39b26f4dcd2dc03d90b\n\n# tcId = 186\n# edge case private key\ncurve = secp384r1\nprivate = 7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 898aae0ebf1cb49fb6b1234d60f59006325421049a8a320820e1ad6af6593cdc2229a08c500aa55ca05999d12829db9c\n\n# tcId = 187\n# edge case private key\ncurve = secp384r1\nprivate = 0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 83f862f496ab8af12b82a8a0c047d836bdfa36281324b3a1eb2e9c1d46699d81cb125cbe4b93939fd84e1ae86d8a83cb\n\n# tcId = 188\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a779ecec196accc52973\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 9a26894887a0342ca559a74a4d4a8e1d6b2084f02e1c65b3097121a9a9af047d8810fb945dc25bbf02222b3b625f1e0a\n\n# tcId = 189\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecdc196accc52973\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 8a8d9dc194a26910cbdae7908d185b6ad04b620c94c5ee331e584ed804e495bebc2290a2d7006a06e65b9bcace86c6f6\n\n# tcId = 190\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aece4196accc52973\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = d57f6aa12d3f07e8958499f249e52cfbe5be58482e146c5414dbbf984fc5333710350e2ce96b33beb7678381f40f1dcb\n\n# tcId = 191\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec1969ccc52973\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 188e8041d9a5f0b6cfdad315ada4823beda0146774fad65b500e6ef94376ebf8af7a40ff6f6b45019a09dde7d7fb5552\n\n# tcId = 192\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52959\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 2ecf9dc47e8b07ae61ddbd1680ead02698e9e8469f78d5a28328e48d0c9d7a2ac787e50cba58cc44a32fb1235d2d7027\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 193\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52969\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 06ee9f55079d3d3c18c683ba33e0d2521be97c4fbf7917bf3b6287d58ffcde2df88842e3f5530b39549ac20974b1b60e\n# The private k",
+    "ey has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 194\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9\n\n# tcId = 195\n# edge case private key\ncurve = secp384r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971\npublic = 3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e\nresult = valid\nshared = 024c5281487216058270cd1cfe259e948310e4adc263a9edaa4da0bc3f5f8ce8ffc88ae41b2c050bf6dd9c8c66857237\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 196\n# public point not on curve\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 3076301006072a8648ce3d020106052b81040022036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c8\nresult = invalid\nshared = \n\n# tcId = 197\n# public point = (0,0)\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = invalid\nshared = \n\n# tcId = 198\n# order =\n# -39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f0231ff000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = invalid\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 199\n# order = 0\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f020100020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = invalid\nshared = \n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 200\n# order = 1\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f020101020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = acceptable\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 201\n# order =\n# 9173994463960286046443283581208347763186259956673124494950032159599396260248791326163093631191247821216106\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b13082014906072a8648ce3d02013082013c020101303c06072a8648ce3d010102",
+    "3100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f022d00ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196a020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = acceptable\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 202\n# generator = (0,0)\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = acceptable\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 203\n# generator not on curve\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e61023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = acceptable\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 204\n# cofactor = -1\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = invalid\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 205\n# cofactor = 0\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8",
+    "c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = invalid\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 206\n# cofactor = 2\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020102036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = acceptable\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 207\n# cofactor =\n# 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201e53082017d06072a8648ce3d020130820170020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = invalid\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 208\n# cofactor = None\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b23082014a06072a8648ce3d02013082013d020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = acceptable\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 209\n# modified prime\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100f47e533e4e43e4bf04e901db0eea6efba14bbcdc3b1c5753a7c141487e4f43784e57a72310202323361f44760c8368bf306404300b81acc1b1bc1b40fb16fe24f11591045eb44323c4e3a8ac583ebeb781b0bc86b1a858dbefdfdcdcc9e0bb8af37c973d0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef04610400000000000000000000000000000000fffffffffffd38000000000000000000000000000000000000000000000001cf3646298bba2f24e84189cf0d1e75188fc4fcf5b0844281822e789e3d534b159f4c419342260197625ad924a2c72c4d0f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201010362000400000000000000000000000000000000fffffffffffd38000000000000000000000000000000000000000000000001cf3646298bba2f24e84189cf0d1e75188fc4fcf5b0844281822e789e3d534b159f4c419342260197625ad924a2c72c4d0f\nresult = invalid\nshared = 5df0762488bc0a7be1121508949382861f781c331676048c2d45d245be6f476c872113e6710bc746c3d06970510193ce\n# The modulus of the public key has been modified. The public point of the\n# public key has been chosen so that it is both a point on both the curve of the\n# modified public key and the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named ",
+    "curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 210\n# using secp224r1\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf\nresult = invalid\nshared = \n\n# tcId = 211\n# using secp256r1\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39\nresult = invalid\nshared = \n\n# tcId = 212\n# using secp256k1\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838\nresult = invalid\nshared = \n\n# tcId = 213\n# a = 0\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201863082011e06072a8648ce3d020130820111020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff303504010004304fcc45ccf5e23ee407b9291d2e85523962a2a79a50da3facca04b7267ad316db202cb07c24905740d201ded3028881090461042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6\nresult = acceptable\nshared = 455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 214\n# public key of order 3\ncurve = secp384r1\nprivate = 0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2\npublic = 308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430cba7f9015366e8e6bba0f30bcd1ab0a279e92e2ceb5fe5bbfee62db1fe23a64639709b7e5efcd539d6f2882e40713f3304309c564d918760892977fab2a7c507ca1337cd282c27e832eb3d0dc8ab1b03c5bdb72351d7a3fb388eac1f6fdfe2faaac8046104f610585fa59340e1df571af1e2d8cd3d6bbcf0fde2c272444b2a1ec58f71b7aed0cf709ee9c6777304c3149ef788719c07f9f6ffa32808b6371504fd55a5b02c3a571bc6aba9915f80c902b753d9abbefc8f510e7a9908466b795508188cb28c023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5297302010103620004f610585fa59340e1df571af1e2d8cd3d6bbcf0fde2c272444b2a1ec58f71b7aed0cf709ee9c6777304c3149ef788719cf80609005cd7f749c8eafb02aa5a4fd3c5a8e43954566ea07f36fd48ac2654400370aef08566f7b99486aaf8e7734d73\nresult = invalid\nshared = 1565d888a631c08afaeda6da8d1aea4c916aa0a157abb44dff9f8181948e434d8b4f3366d29a34b2e3a3cb419675ac13\n# The vector contains a weak public key. The curve is not a named curve, the\n# public key point has order 3 and has been chosen to be on the same curve as\n# the private key. This test vector is used to check ECC implementations for\n# missing steps in the verification of the public key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 215\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 304e301006072a8648ce3d020106052b81040021033a00040710b0c6f4675459f3df2bdf7ca02819f8086198d15c69b8abda37639e6031caca8a0121894d2491d8b3dce093703c70705bc5dbc8fa17c8\nresult = invalid\nshared = \n\n# tcId = 216\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 3059301306072a8648ce3d020106082a8648ce3d030107034200045fa4fa0b235c21e5c9f3baea9303bf86eccb7d31d0b998e141bc54b5dc43b23eef7fc5cf56308ed595eee99ade6aaf74d591c3d00aa1b438abc59c9607c22c36\nresult = invalid\nshared = \n\n# tcId = 217\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 30819b301006072a8648ce3d020106052b810400230381860004005bce61fe27c440fedbad47d88bccf645db9c1d30daa086e592e8b6a0a173b87991b619801907b420fa558c7953ab97badd9c6c1d85859d9ebef7441a088ff57ed5008d7638de703faabeb5a78e83e8fcd4eb786144a75d79bd4cc8cfa8be66612d756c7b65c67f72c6acbade6f0d59e9752e845205b2a560d4f8d6a9e84bf812f94d18\nresult = invalid\nshared = \n\n# tcId = 218\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 3056301006072a8648ce3d020106052b8104000a03420004a69ced11a8bf7a907bfa47cba3368f2498b465a2407c90649c8da224d2a85bf445ad2df3d0113e72aedccf92ba6b8529ed6faa154bc27aba25f49371981e3b38\nresult = invalid\nshared = \n\n# tcId = 219\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 3052301406072a8648ce3d020106092b2403030208010105033a0004a9b0f90e49a57fbe508847bf16e4a7b565dfe870a50164bc2862fe6e4d54bd8b109939f7dbbf800522722b9c0b309ace3884abb69c927ad0\nresult = invalid\nshared = \n\n# tcId = 220\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 305a301406072a8648ce3d020106092b240303020801010703420004512fe17172db1125a49f9dbb85e387869adf015e4899c06f66ef870d72092d4d195e1d21b4a4647bf734468bee802ddad5449202eba1041df2fd8cde04697237\nresult = invalid\nshared = \n\n# tcId = 221\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 306a301406072a8648ce3d020106092b240303020801010903520004c391dc7a817d47a3961ea1857895e101c0f5a8767d3a9c7cad49f7af8029f24c67309373cedd0831ccc0a0f45d344f3ab5923d2452507a980301a283848ae31574a57db51ce5e61d35aee483f1bb8e66\nresult = invalid\nshared = \n\n# tcId = 222\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a",
+    "4\npublic = 307a301406072a8648ce3d020106092b240303020801010b0362000419d3c811c04c5c0990d0258386195b2e29fdaba58d3f12b0bac8d3d53828c66c7a35e3d1eb0bdf2c08f23d0e4ab6a3246e456bf0fb863d03423dbe431baf799657c7816a619662fe5b900b754107ba5cc06b1d62c9a927891efee1a1fd404d7e\nresult = invalid\nshared = \n\n# tcId = 223\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 30819b301406072a8648ce3d020106092b240303020801010d0381820004216eb619457f1168ac873f5b560a75df80749f2bdf9abac31d6580e521ad70368013c3db74f663263b61eb12d4dcd597ad6c77cef6a5d6d2240b1e244d76403f693fb317ffc602a7ac313991b0a62f7bf469bbc95b3ff35003d972eb8ebcc8d4833e6c24ad52d49c1ce6244c7889ab67a8818232e192944542763fc667e5799d\nresult = invalid\nshared = \n\n# tcId = 224\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 3052301406072a8648ce3d020106092b2403030208010106033a0004691b24004380a599770214d0c60ab37cfc804cfaa7aedd11cbf0a05467ebec5e33322cda707b848086fd740244f62cdeb867fc057207fde2\nresult = invalid\nshared = \n\n# tcId = 225\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 305a301406072a8648ce3d020106092b24030302080101080342000422bf69f3a81dfa1ed8a97301943626e20377b78f7e7d714b880deb5a4a9c63a11591c2e47b777488990771855768b9a4050d61bf02d84cc6aa40447a07507285\nresult = invalid\nshared = \n\n# tcId = 226\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 306a301406072a8648ce3d020106092b240303020801010a0352000476568300e2b4c68861589b4966e67bc414811e4011260cb8be5f884869fa179ca8af40f80009e0a58b17ac3e551a772e76683c32e6e09112572542d7c1fe3d49abb56da56d669186e2623dc797129dc0\nresult = invalid\nshared = \n\n# tcId = 227\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 307a301406072a8648ce3d020106092b240303020801010c036200043345dffded3c33f7dcc19bb8997a39f2d6230abcb765d6142c30bf320c1fadff535feafd8505eb3e614db71826c1e258077a1e6057add7474f6d35dce68417812e7b919b1c673032b28c45d0a9251c43a2a73ab152f64ff8eba4eab312fa73bd\nresult = invalid\nshared = \n\n# tcId = 228\n# Private key and public key are not on the same curve\ncurve = secp384r1\nprivate = 0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4\npublic = 30819b301406072a8648ce3d020106092b240303020801010e0381820004a3677c646cd887685940c28076f55cda7469032845f2cb2af51c61492dc435aaa5b771d8e1528417cdeb89b5f629e06b234e21236b9edf46c7025177ee65a8e940f670d10c722cea355bd3a5c8847a38324b9a06a50a95da4e70bb492cd00194a8830975dd1e115e19315575ff841b30fd4a3f8a44725dfe280d0af57fc80cc3\nresult = invalid\nshared = \n\n# tcId = 229\n# invalid public key\ncurve = secp384r1\nprivate = 2b9e57572da6cf4fb58cb94eab8df19383a136f219f2a515776a8bf48e1538dd1d811946c16d9f0184c9ce5cdf1dac51\npublic = 3046301006072a8648ce3d020106052b81040022033200024424530ea70bace90601f8d5869e4179a6cd689b6a18fdfec50cecf17cb836d24820211ada67815b42c2c2606303f69e\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n[curve = secp521r1]\n\n# tcId = 230\n# normal case\ncurve = secp521r1\nprivate = 1939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce00e04ad19cf9fd4722b0c824c069f70c3c0e7ebc5288940dfa92422152ae4a4f79183ced375afb54db1409ddf338b85bb6dbfc5950163346bb63a90a70c5aba098f7\nresult = valid\nshared = 01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87\n\n# tcId = 231\n# compressed public key\ncurve = secp521r1\nprivate = 1939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd\npublic = 3058301006072a8648ce3d020106052b81040023034400030064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce\nresult = acceptable\nshared = 01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87\n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 232\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004014c643329691ba27459a40dfe7c4ce17b3ea14d0cd7aa47b01f1315404db51436fbbfe6de0842e0f7e1265f6ff3aca28750677d3370b2fb2a6ef497356f4b95811201051b14178639a09a41465c72d3743436ee1c191ff7388a40140b34d5317de5911ea03cdbb0329fdeb446695a3b92d437271a9f3c318b02dec4d473908158140e97\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 233\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040029cd32125c23a41af24fd4b729da0faacbc35516ef0ba59096602571693cd282e26d67e18ef4643d0f6f158d7370d3394ca9a8de7938032ac178c6fd34e3702b8d008649834e2b41be3a8b7510bfe570f4c67075943cd0cbb9d9e1d1da52618b5b96d6aec9b650daf1ca6624c13e5116302b9c79c8c4d3d351915d1e8e1ab6ad76098e\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 234\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040032c6f06ce6a15ea064464d35aa368d299c9a9e1e368f694aefb603876248f898f223ce0217bef37d61eb09b27c93187cf8e61ba7b14e3c9bee692b06ac6d95f836019fd19f8480e21c63211d48d45f96f6365cf55f958e1a0fe7ea6b6b9ff230a87b70bb1b14d3a5fb6669a91641c6acf4570c1d3a9e709913b7fe6b35ff81c394d6a7\nresult = valid\nshared = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 235\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004006ddf9b10965d5fc129e96f7a37667ccf66cc44384772906fedb21f9de4629e01aaa09ac7c9866112064bbc9bd58ebc123ab2fe19d8fed1a056d27bfef0630509c7001c441311ef20a16346332ea42d5c65788d68f6817b0267fcab11ea9c948ed108115dda8e823a380b601460742d3772d6424c67b240da24772ff0d2ccd9a1e0cea6\nresult = valid\nshared = 000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000000\n\n# tcId = 236\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004007a8c547268c948b626da636cf54428ea2ab23861d499a84ad7be1cf691b92872a06e26c6dba08ca9ed386f83d396156d5fa023f57d5ea6440ec7401dad2c08ad70018c3815b1b9a2e42555419a6c19043fa2b0ddcc4b5a6e372fee9fcb227d85bad704687e7e1a818b612d5c046cd75972f7a2dd5c9a200ac5582cd59fec47ac",
+    "525ecf\nresult = valid\nshared = 00003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff\n\n# tcId = 237\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040029153cf062f88f303e5d6f9aac968bd901076d5994ea7f831833b1e69b67e9e9fe20cf9c5623e00e0b9e3592fca2a03324b5df7c93186aff697aca864600d44ecc002801a62e2f4106f34106da23dc93d50e3e975a1d47510021835290649b7a4125109f656b6b0b5bd00b24d84ea1ba4e1ed49e61c526fb1011005131caee7ee0501e\nresult = valid\nshared = 010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 238\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400a61eb994e28722c59b3c6007dfdf8b37893f6350f461b26a00e1a45104314aae9989da87e4facb2c4ef721185b7d96d9a45a28a102756501a1acc5d329a21bbf73010e8d0e12f5a9a40e0d59c90ce73043d39730aeadd3788e31d7c2bb62a1166161994664afa658ce2e60a13f45f27f914307c8d6f8d4ed16ab041b8f69908a62782f\nresult = valid\nshared = 010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff\n\n# tcId = 239\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004011dd497b30c73709906b164a9a79dc7f2a98c0148ed63016bb95243834fbcdf8eb74b0ff652d54f59f31aef51da6e8974d363655b1da138dc4de0f2a8d800f475ae0057bd4b84607400d863ffbf45a3cf58999ee24ba05e93eca7b0e4ae760eb1733559a45d15579d3370d716ffa3ec4bfdae418e32fb06138dfca213720a938577610e\nresult = valid\nshared = 01ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000000\n\n# tcId = 240\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401283eb93fa369fe7012b647d21e0a97cf9950e5fbed819ef56158f20c8a9473a418eccbca4dc2b47f4cb6d322f917005859bf221e84ac9827cab82a801c627fb1ec0075c480cbafb352fcaf93baf23a1405fd81febe09729a908d1077e177dd8993d94b251a0d52652da3edb6fdf864e80cd51540e73d0b5107e3433576dcaa4e18db43\nresult = valid\nshared = 01ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff\n\n# tcId = 241\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400173beefe35ee868d497ff6601628f65ce18a1591f7e4a3a406622f3f508e2da68f101ed02febc38418c6ddfc26a5ec9848c42792463b1e945f9e167db34bdf2d660053070647aba7cd60eb295ab81a268a3903f393c5d28bbc5e022351c377cd84f02c19deb36442372cae1332e92f95ba60b6c852e0de0718e89d24e43cd479c9fb11\nresult = valid\nshared = 01ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff\n\n# tcId = 242\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004009829cd5432687739ab6ae10af8ea73d2cb53b81ebb06b5961b7badc1676b3ef7b00454f7cde56774a01312d574a9193c1a5fe5336fbe62623ad9bf81143789f9f90012f955697ed578207197bf9aac3896521615dbacc8dc665d4f1715b08439f49c2aa6ed337023ffccc5075a85944936826db92f919737ca3afeadba1847084bdef7\nresult = valid\nshared = 01ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000\n\n# tcId = 243\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040126e3c959cd41120bb83693b1d6a034b385137c1bb3213b776122fed96056e329885718a73bee639c0ba4b68818682f498ce5496925002bd7652516405fcc4fecad0073a9c6e3b0c694bf7cc8ccbbd09800e81e3548ba44a0c2381cef0b07bf702a19054bb5d717a1b79294609cbdafd4e2018064f7b2c4c204d818eb7ce521c3268ce5\nresult = valid\nshared = 01ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000001\n\n# tcId = 244\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040153dc481ab3c5dc8decd24ceaee1bec77f59f21f7f31c19538af047d281ac9e2567933fd3d21096b185d4098919571931bb9b0be7197995e2fbaf21c8a10007ade001ad69f08fcae164390be826256b50fae47502ce0e9ca46af0c490cb4033c886f88661a99ff2bd3c9c8e7da30faf2b4c769edc5831810ac05054c97e41063f496e1f\nresult = valid\nshared = 01ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff\n\n# tcId = 245\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401f586611c87150288c3e86116c5db94a26718978829d701ddac05e9b0ce22dee4b18e95f60cba783ed3384da373deaefc57b8265d3a34eeb458bf24b9d82be32819008456e0f1d80492ef0078cc246d32fc7c7fb6720b4d458b51b2098d35746752b0ef0345bd0d342dfee6dd2f12ed12b34bd95d058c2811fd479d2dde32180e6c9ef2\nresult = valid\nshared = 01ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000002\n\n# tcId = 246\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b810400230381860004015edc87fd499a73eabffd14d2b6a70a8fb69b6a39d0d9c4dda2337b53cc72e49a9e3d5a2d9e8930cfa11852dac33443227fba6684bd74732e6879884b6ef9dae98f010eeb8d2e3360ea9726628085268af3f2a05ad41235d0a892098bd661b636f7ef0a820282906eda3f1ff1980b98fb5937228e9edcd6332e3641216c7307e7f3f452\nresult = valid\nshared = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd\n\n# tcId = 247\n# edge cases for shared secret\ncurve = secp521r1\nprivate = 0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040131b43002f7e687eec1ecf6a253c2ccc9e48f04d86fccd18fee0d2d22191f1ea539c40d521970b4709dc03986f647e0e8bb3340cf8a3e643a3541035437cf25f01500b27a55ac45f0296f8c9656bcfd52b5cea9f4115c06e4c64319609847d45e92418400e7868672c0d3e6e5e6e004a7190476ed77cfc33ad19a4bd2c615ad9950f374\nresult = valid\nshared = 01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\n\n# tcId = 248\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d20ec9fea6b577c10d26ca1bb446f40b299e648b1ad508aad068896fee3f",
+    "8e614bc63054d5772bf01a65d412e0bcaa8e965d2f5d332d7f39f846d440ae001f4f87\nresult = valid\nshared = 0053bf137fee8922769f8d0fe279caa4dac9c6054ad0460995588a845d0a959e24bc0fc2391a2b92f7bd400f50a11a9db37f07bef7fa8dad2a903fcf534abc8736f7\n\n# tcId = 249\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b8104002303818600040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564\nresult = valid\nshared = 01c95ac417c90a520149b29105cdab36f528a23efb5621520dbdafea95a7d43499c4c8be02cd1c2de000da18104fa84a1e9ece6386f0e0efa5234a24595d7c4c96f4\n\n# tcId = 250\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf\nresult = valid\nshared = 01b47ec41e3a5abd9dd9808fc04d9078cbed72b9eba98d3c1ded70a29938f0efd5a27a7113ff721f122cb17411de307a355c685074f5766b6d1a033d2fa188c945b6\n\n# tcId = 251\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b810400230381860004000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff000000000000010000000000000000f33ffc45da3eac1baab727ab8fd355cfa134c42047d55262651654fb50df7e9a5a75f179c8c86c4388213b5687dc43dfebb37f30128703c44ccd5c3284833b8717\nresult = valid\nshared = 0168df272d53e3161926168c4aeab5f355b8d2a6689cfd567f2b6eb2011a18c775ac2a21f8dd497f6957217020b3b1afcb7021f24fccc2523be76a2bff44596e5a14\n\n# tcId = 252\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00cd2839d857b4699f5c8e8a0194786e26a862f086b4ba80746ae5225ed3aa68f96b7aaec55225830bb98f52d75221141897ba49d7a31ebbf0b6d7d31352e5266190\nresult = valid\nshared = 013db1b9241b23d33860d32dec37a79e4546a41afdfdd9c438d04e1f8b566ac8d9d3f572c293e96943722a4ee290e113fffaa82a61867d9ca28d349982354c9b256f\n\n# tcId = 253\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b810400230381860004010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813d9829119f42ffa95fea8ba9e81e4cd6a6ca97fb0778e12e5f5dfe35201dd4cca8eca0d2e395555997041381e6ac1f18ddf4c74e0b6e9041cfdca1d1c103091\nresult = valid\nshared = 01d2bbe9f754584ebbc7c7ad74136d1c8a144948948aa8be49989dd9b4c514db2e2ab1e0713ad1699f632dd2cea53da218ed549f030a113e282fd9e3be462d9aba84\n\n# tcId = 254\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b810400230381860004010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00878ad597d290db2cf660594aeed0f9b7c8dd68451d2d1b2cbc816b1ec4f35465b3964aff2edf1255163f5fca580132f85cade2887a017e7cd0b37196ad85221107\nresult = valid\nshared = 000f37a2e2caef54fff4126c0fa96e7c47f0cad74626ef91e589e12d2e1e8c221be7295be9dc2712b87bb0aa0f5880b738bc1242f2ba773bf9eb2a54e3c1ca4758d7\n\n# tcId = 255\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000010000000000000000000000000000000000b5e1191b449fa1ebdbd677daa48f90e2d1d6c058c877087cafd9364d99dbb283c68402e6e6c5f5411b2ed42824d8b280ceb910aba6847883a7e3780e2132af41c1\nresult = valid\nshared = 017aeb254d9c8c8ee06215ff33811357da73bf7f6dd6d7f8f176d62c065a88a9005f680c630e9f2763585ea2ee76b6e4ab45e673f814ebfa95947c0c63fb24fa6e9b\n\n# tcId = 256\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00207513d615656a1cc7505c18aa21b08e2b1d5a841de0816cc29c004efdb2d902ac1a7bb05e20722b576b64a3ddf4d2486421ac706bf4a424f252386368a5340fb6\nresult = valid\nshared = 0061bed42248a37b4625ef04c4f9c7ef69ee3c6f9503378351fcab1b8ce1343206997eec1b88449eb6f7355711ea1a818a486ee30a24126241a7e2289267cf5dd61f\n\n# tcId = 257\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff001fe800c50e54012b75a33e4be7d07c8d60f29680a395e951a6a31c5096b0ea928fc2cbf327dd784dc0a7ca46ea73992b758b5641364b4aba39e93798a4d925a008\nresult = valid\nshared = 001067d9104e296ef42b944587de11b10df05d2d959ed44cac9e7ef1c7a05d90819c43bc79c7397918f957cc98db931763bbeb1bdfc35865e8a359a013f13d60c433\n\n# tcId = 258\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000008dd18a1f5e482140be79bb65a21ad60c8987e532c84345f0135affd46ec71ef02b1ca3ad56f301d955fa306c122d441d6fedcf8b855ef256350bf69d23a7207ad9\nresult = valid\nshared = 00b779d83035cf7bb0bb04c7b2f46d08f6791f0d1542c9bcce7250e772b12ad8e38fce1d2b063a06f0fa3a1b072dd976f5f8542979903075162f1f5c6ba3b76cc45d\n\n# tcId = 259\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000100566203dd325a081c4441f001f780365874fd3d0c9bc47227481afe76a93ae1bfde63af972203abfe22c63b80e83f7cc2184c3cb8cfd0152c54324c4759fd1f9a50\nresult = valid\nshared = 01afe5d23733728b79c743933b9ba7dfec5ed19b7737e393908a1d000918aa795d1ce0ad533983d018f927b35d2af6463356573f387febd75911a49486202ca69d3a\n\n# tcId = 260\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007f",
+    "ff00b11c668fbd549f36889f7b63434051da26f15705839136b1b14a09152d7a182ea7806c35478a32d3aa3c9c1627a61519ebec71b36fa77449025b8829e27f307834\nresult = valid\nshared = 019612aeb386febb1a28096fe5b2f682dead02389785225b80a27df439510d08349a193839525f248b7f9bcabfd3dc8da8cc1724022299b7b5e72399d89464b82e44\n\n# tcId = 261\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000008000000200aa75efc0a8daac1d73f32c9c552414bccf44af8e74331b47439e7dcc49a135b3ee61e9f69717d89b4bba3567a195aeda13fbec634bf2984b5ec6b6f80f5978ed5a\nresult = valid\nshared = 00570673f87adcef49c1f011e8b9f1e11f7fd3b3c93114d08d3f515aa4a895a6c701c523063bdc13ad1db0a54f6e7b476fe10db2070441befc58c8cff3c08ef76e59\n\n# tcId = 262\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564\nresult = valid\nshared = 0016aaf228b0aec190d4e4e5b8138ff9cc46d705da1bf002901c6ab420f59314d5b641712b14ef3e4fb125652c47888676804fb5575b741a8408c5625bfccff4fdda\n\n# tcId = 263\n# edge cases for ephemeral key\ncurve = secp521r1\nprivate = 12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf\nresult = valid\nshared = 00a5d6dfda2b269f4ab895a41c3b71b6ba10d5c9f0d9b3e730275345e4721594abfd39464c227716ded8ef3e60bb1ca0b551716e3f6eebb48d5ce8e0ab58cb1b73c9\n\n# tcId = 264\n# edge case private key\ncurve = secp521r1\nprivate = 3\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df\n\n# tcId = 265\n# edge case private key\ncurve = secp521r1\nprivate = 1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 00347c51f587c726070bdeb9173d0a547427ead3f2c8de62d9ecc3013285f645d220931520bcef85d08cfb6786045745fbfbfb1924c44a89d06676131a965677272a\n\n# tcId = 266\n# edge case private key\ncurve = secp521r1\nprivate = 200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 01c41dc4437c2f2b94a940711b3a691723397a1f83d6bc0c67ddc7a657160925c7f85bb4eb3842b60b2610ddb7c0b8676267710e58359a8750843c6d8e25d48d1cd9\n\n# tcId = 267\n# edge case private key\ncurve = secp521r1\nprivate = 0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 006a239cdb7a783840658d5f314bfe5c51e806a4bf1236f8421265bcc503c673eb16c5c2b38b5717fa04ee7dbcdeb15c871711507abb7557a8a8c7b3250141e854d5\n\n# tcId = 268\n# edge case private key\ncurve = secp521r1\nprivate = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 0112dbf9713aadd478e4f2ebcb058f05b512b1959c7da1994f851f373ce8c341d39c6843373f6fe559905953e1147640159437953c571961c09bad157a8e1a5bf476\n\n# tcId = 269\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47adbb6fb71e91386409\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 003eca2210c8623105085aa284d119f3d716730595c6291aa89bf32a95e8a5fdc64f3d76e92494a43a9dced12d05b6dca4ffe649b32ac12cb0202e702dc83a2cb277\n\n# tcId = 270\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb5fb71e91386409\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 01c4cae9fbfdd45de51d8525e8447a7553c35cf358f1346f1d79666887bb749a3ba0de62e1866b47a447d53b6f1ca5a33ec94507e2cfb65544f5a1195fc6b4dc5810\n\n# tcId = 271\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb67b71e91386409\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 008073b4796e748f3d0de5e85b22aed463f1a6aecdb336bc287b50d139e3591ef5f86b78c3f6051467755f059f295d758075347d657aaae02383838bb96071eacbd4\n\n# tcId = 272\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71d91386409\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresu",
+    "lt = valid\nshared = 01f11ff8983792d4a790d0de4b56d078b9033ad6318a440e8119342937cc48a39375150ab2cf98273b0fe35d5a3af5d84322a685e89f2cb378a99b9b7bac87e44952\n\n# tcId = 273\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138631b\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 00286cefaaf38ca4c6657eb9b187d8614d51775fd71c1a79b4c0ef1a0d4ce72b6f5b2bc854a4e78283530942a3f4fd2a8586d5ea51513c89d3d29de5de06321e118e\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 274\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138639b\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 014790de14c481f1336fcb7d33a8bf8e23eb594cc48608e9edfe0e326e106b67e7eaa3f04ec9985599178f632a5ee6419e11217060e9fcd5958a43882bf8cd3be6ba\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 275\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863db\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 01ae775dbc4096a3aea7977b1a0af4b2830ecf9ca927a6247fba4cccb46b3f71d0e7abb8dda72d1c1ee7bb5b875b4773cc8df40f732819c4147da330775d1742ea35\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 276\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fb\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 01979fb05e068a12a3f20cfdfb9eaee9f22b356edcc7655383ed38124b86814f86a6f2216a34f3fc2299d403ee42408f95d08c5c6cd11db72cbf299a4a3c2545be25\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 277\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386403\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 0197ebe26798bf67f06ff0282773af75115531f41d94c093d87481b76bef707bc222f2d6672f84a00fa20c5ed27027ab4006b68d93ee2151016c9ddbe014346272e2\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 278\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df\n\n# tcId = 279\n# edge case private key\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407\npublic = 30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314\nresult = valid\nshared = 01c168314cdc85757ade34a52a9e5379ffa5968f084b7e404939a8033a0fc698e26211754b9b2c04cf8a1420abe6e986ef1a238bbb91dd402b72e0ed50a876f1a83e\n# The private key has a special value. Implementations using addition\n# subtraction chains for the point multiplication may get the point at infinity\n# as an intermediate result. See CVE_2017_10176\n\n# tcId = 280\n# CVE-2017-10176: Issue with elliptic curve addition\ncurve = secp521r1\nprivate = 1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f7\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650\nresult = valid\nshared = 01bc33425e72a12779eacb2edcc5b63d1281f7e86dbc7bf99a7abd0cfe367de4666d6edbb8525bffe5222f0702c3096dec0884ce572f5a15c423fdf44d01dd99c61d\n# This test vector leads to an EC point multiplication where an intermediate\n# result can be the point at infinity, if addition-subtraction chains are used\n# to speed up the point multiplication.\n\n# tcId = 281\n# public point not on curve\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30819b301006072a8648ce3d020106052b81040023038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fe1\nresult = invalid\nshared = \n\n# tcId = 282\n# public point = (0,0)\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nresult = invalid\nshared = \n\n# tcId = 283\n# order =\n# -6864797660130609714981900799081393217269435300",
+    "143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd166500242fe000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = invalid\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 284\n# order = 0\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 308202043082017706072a8648ce3d02013082016a020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650020100020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = invalid\nshared = \n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 285\n# order = 1\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 308202043082017706072a8648ce3d02013082016a020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650020101020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = acceptable\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# The order of the public key has been modified. If this order is used in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 286\n# order =\n# 1598335257761788022467377781654101148543282249044465229239888363328190330275719844327554513312228302828260696579553960150541916632196023208175974174\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820241308201b406072a8648ce3d0201308201a7020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650023e01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = acceptable\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# The order of the public key has been modified. If this order is use",
+    "d in a\n# cryptographic primitive instead of the correct order then private keys may\n# leak. E.g. ECDHC in BC 1.52 suffered from this.\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 287\n# generator = (0,0)\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f0004818504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = acceptable\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 288\n# generator not on curve\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16652024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = acceptable\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 289\n# cofactor = -1\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201ff038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = invalid\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 290\n# cofactor = 0\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e",
+    "937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020100038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = invalid\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 291\n# cofactor = 2\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020102038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = acceptable\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 292\n# cofactor =\n# 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820286308201f906072a8648ce3d0201308201ec020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = invalid\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 293\n# cofactor = None\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820242308201b506072a8648ce3d0201308201a8020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = acceptable\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 294\n# modified prim",
+    "e\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820244308201b706072a8648ce3d0201308201aa020101304d06072a8648ce3d0101024201e99d17d498f3c68ed8e50430ec4f36c14dbeeaf7652e985636bf0548ffb981e9e011607fd0059cd4fe51e882f19a3839ebe7f1d7376cb761431b214ed76970cc0130818604411662e82b670c3971271afbcf13b0c93eb24115089ad167a9c940fab700467e161fee9f802ffa632b01ae177d0e65c7c614180e28c893489ebce4deb128968f33fb044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f0004818504000000000000000000000000000000000000000000000a14517cc6b91f8000000000000000000000000000000000000000000000000000000000000000000000032c006b0f530bec5bed532357d436727699f0e3c5b9366f1a435be640b97cd43d937655b1f157c7d0c7df25011fef7c3ab7d8e556e6125b59b847fcdd89a4051796a797024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201010381860004000000000000000000000000000000000000000000000a14517cc6b91f8000000000000000000000000000000000000000000000000000000000000000000000032c006b0f530bec5bed532357d436727699f0e3c5b9366f1a435be640b97cd43d937655b1f157c7d0c7df25011fef7c3ab7d8e556e6125b59b847fcdd89a4051796a797\nresult = invalid\nshared = 00ebef6771455911ee573c183e990f7086650f9bafdb722c896751bd2c0f87959c78a39382d10fdfb46fd3515c8feb590943dd79778b13adbc7f670ba2a009753483\n# The modulus of the public key has been modified. The public point of the\n# public key has been chosen so that it is both a point on both the curve of the\n# modified public key and the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 295\n# using secp224r1\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf\nresult = invalid\nshared = \n\n# tcId = 296\n# using secp256r1\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39\nresult = invalid\nshared = \n\n# tcId = 297\n# using secp256k1\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838\nresult = invalid\nshared = \n\n# tcId = 298\n# a = 0\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 308202033082017606072a8648ce3d020130820169020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3046040100044109a88e6f050cfefa0b49fac45689b6b93ad4fa3b65db7d2f4cb31b67fe056a100066dd80dc5f785d27f82e3369eb22ab2c5729a9e5d9906a1dc31e02f84026484a0481850400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf\nresult = acceptable\nshared = 00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de\n# A parameter that is typically not used for ECDH has been modified. Sometimes\n# libraries ignore small differences between public and private key. For\n# example, a library might ignore an incorrect cofactor in the public key. We\n# consider ignoring such changes as acceptable as long as these differences do\n# not change the outcome of the ECDH computation, i.e. as long as the\n# computation is done on the curve from the private key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 299\n# public key of order 3\ncurve = secp521r1\nprivate = 1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7\npublic = 30820246308201b906072a8648ce3d0201308201ac020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308188044201b2ac25ed3b202bee00aaaeb8521977f025a9123df3eaa422077dbb7bd05d7ad92f456d1f8c73d070e1dbd4e250951eb525b8fca24f330b5b2724de0f0cc159e1ca0442014c822bd9cc28dc26c31385e52f86855f59c8b4f278915b23c7c002e73372016a8e6dac70a1d07eb309bb83efcbbeefe92cdee4d3d9c7218ca663298389e52c8acc04818504017d26208a6b9b4ccbc6bdeb8fdda68f6cabba6876b2fb96fab4efc899fd851be71b3491f45432ecb992fcb950416a733e3da561a7621fc4fca2deb3d83f9073bbdc019017d42efa595d03524e404362b124986e50878635d5382d39c793d4f980f3b48ce2ea0702667dee3a92f374920e04f8544e48b451051d68c69ec67098722cc6fc024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201010381860004017d26208a6b9b4ccbc6bdeb8fdda68f6cabba6876b2fb96fab4efc899fd851be71b3491f45432ecb992fcb950416a733e3da561a7621fc4fca2deb3d83f9073bbdc006fe82bd105a6a2fcadb1bfbc9d4edb6791af7879ca2ac7d2c6386c2b067f0c4b731d15f8fd998211c56d0c8b6df1fb07abb1b74baefae2973961398f678dd33903\nresult = invalid\nshared = 0173a7def25e016ec3326d4c881dd62a1f33bfcf88d77ccbadc1b49044d9d179342840cf2ac6c09e41c9b1e7b6127f70e294c5fa8ffa132a222767f09a7f350eb300\n# The vector contains a weak public key. The curve is not a named curve, the\n# public key point has order 3 and has been chosen to be on the same curve as\n# the private key. This test vector is used to check ECC implementations for\n# missing steps in the verification of the public key.\n# The public key does not use a named curve. RFC 3279 allows to encode such\n# curves by explicitly encoding, the parameters of the curve equation, modulus,\n# generator, order and cofactor. However, many crypto libraries only support\n# named curves. Modifying some of the EC parameters and encoding the\n# corresponding public key as an unnamed curve is a potential attack vector.\n\n# tcId = 300\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 304e301006072a8648ce3d020106052b81040021033a0004af6dd5b71a8c1cf921e36854ae091aaa589d337e740e8579f816eb9e36b03eec5cf956d0fdd2fc1687335507fc1c4a5717d3b5b8ea8340d1\nresult = invalid\nshared = \n\n# tcId = 301\n# Private key and public key are not on the same curve\ncurv",
+    "e = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 3059301306072a8648ce3d020106082a8648ce3d0301070342000453366db79b320781936df61bb55d4499949d813ee5abaa5dda70da4f97f68228ccc69d7cd0b7266cfc28d0dcafdf3e83738cc611acb08f8b896c4ecf82dd65ae\nresult = invalid\nshared = \n\n# tcId = 302\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 3076301006072a8648ce3d020106052b8104002203620004aa45c13ce3cfea8538422712903edc0ce56df74ede0776e843555a786f9738de1943dffd729addfd4772169751d7765a45b5bb540a47d198f4c8c7c21e67560c1e12f70b64520109bb8858a3f8d6bb4012003431db0778633313fdb9464c47ec\nresult = invalid\nshared = \n\n# tcId = 303\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 3056301006072a8648ce3d020106052b8104000a0342000475e01a1555380be188d69aac340a4675e4a6f73d63976a1075249827d8ecc2a31e65ed1eb591954e33a38f68ef8aa6c930229d8755e53257602b3eaa87de6f02\nresult = invalid\nshared = \n\n# tcId = 304\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 3052301406072a8648ce3d020106092b2403030208010105033a0004905a06d5bc093697155aaff67305976a769b904d8db9573c4be361626def2ffe1d5ec14462c02e5ffb24fb3edb2b6c77a5cfee2492db757b\nresult = invalid\nshared = \n\n# tcId = 305\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 305a301406072a8648ce3d020106092b2403030208010107034200042b87df1b6a5cbc4c4a184b7eec9b6c0483f7b80e6477b29649630c37481876bb0e3423f7a00d469320b7e60c88370979064efb9ceb8b387aa87a7c6941ccd9ed\nresult = invalid\nshared = \n\n# tcId = 306\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 306a301406072a8648ce3d020106092b24030302080101090352000470df62394ee036eefbc8ef11a9a5f3a8af659016f29e7125e52cfda0a74e52c7b21d18ac4375f5e4164c5338fa2f545a3fb2022f0e0686d5b4882958f72b1bb626e37093e3f19673968c237823327fd6\nresult = invalid\nshared = \n\n# tcId = 307\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 307a301406072a8648ce3d020106092b240303020801010b03620004808dc7b1c6d3ec470a7fe5d6144c9c3a8c92b116103aa2edbfce0b2c827312eebcd1350d09a739eac901af341487861b195270f671e0a758deb23222db4fe7983d42a785b35fd158344cd6483c4da5b409e77d0a284dfa9c3e0d91a4d275fce9\nresult = invalid\nshared = \n\n# tcId = 308\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 30819b301406072a8648ce3d020106092b240303020801010d0381820004aa11b560dc1e572f2374e5869210304d66d95b1d8ce40940157f5f5b4a7dc8a340f7c305d6bea289f5c430eb888e2a03528336aaf4680d9d153cd162e2229df330425025df2625b147568927f6acf704e4936f8989ff9d44f33ee22196e70dfd8711e8934d8d42abb4b67afcfee213c3ad5e5c83fcf4283d253d6c5c0e581970\nresult = invalid\nshared = \n\n# tcId = 309\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 3052301406072a8648ce3d020106092b2403030208010106033a00048d7a746de095728a8d83219e587040cb6e794d088ab6eab426638202579850b0f235edcf4eb8adcb51bf41878f6b71a1f2d4101022964340\nresult = invalid\nshared = \n\n# tcId = 310\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 305a301406072a8648ce3d020106092b24030302080101080342000424ad316bf41e4102dd7ae16311b64464df2d13ea68a11dd27a4445ed900962180ff8c627ed73f0c667863ee3a671e6ed1fa2781b51a229ee2cd21fbf69437d60\nresult = invalid\nshared = \n\n# tcId = 311\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 306a301406072a8648ce3d020106092b240303020801010a03520004548ce4997cc618800d3834dd4b3346e4559be066ab5d0cecd7123c4de940c168fecd3bae067fe3fc7aee875c9da0a86932f0779f42344470860c22dbc6f305eab792fc0874157e175c7d3c4d3bf54c4b\nresult = invalid\nshared = \n\n# tcId = 312\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 307a301406072a8648ce3d020106092b240303020801010c036200044fc2b35e3019a57a8ca6efe2ec1f72072c599a78c2725f7cfc2d9edf220b5f6abdb0c0d8d160182de451e26bcbb4e8c18726263e21ce56fb4bafaa1f186c745e2c8392ef8c5a1c03f5462ebbbcde0ffcc31e9a0b3e898ddb9c1c79e420fd7a35\nresult = invalid\nshared = \n\n# tcId = 313\n# Private key and public key are not on the same curve\ncurve = secp521r1\nprivate = 2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657\npublic = 30819b301406072a8648ce3d020106092b240303020801010e03818200047122f743122681ac73b0d611af86847d8bec654cf99e7eaf5d4f684e4078a8e61dc6d07e831ad02cd40d41dbdb6b0e877d960b78a5ac34c1e6ce7c483503d6de2eaddeffbfb3f144d29d13535a05815934186707146e45f64476bbdbc8645be973270a4c5e35d70ffd5eab2f08d1fb04762bc8aa80e999da14f744be9ff8c923\nresult = invalid\nshared = \n\n# tcId = 314\n# invalid public key\ncurve = secp521r1\nprivate = 1c1fb2cac9087a3397814b198a80e2ea5b437aac1b41e8a2bd8fef8700e4812aa817320e6e1e3865bd2cf75e43a78be5c27ff1c4b5f5019333cb37d0c9c4ff3ec61\npublic = 3058301006072a8648ce3d020106052b810400230344000200429cb431c18f5f4e4e502f74214e6ac5ec2c3f86b830bac24de95feae142ca7d9aa8aa5b34f55af4b2848f2e6ba6df4c3ecd401a1d7b2a8287a332b202196fadbb\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 315\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 6619644155c449758f65e2dfe7ba89dee1e090c1d68b6342f43cb1ac000090a7f0408138c1de217990bb015cd1d95f1d884cf659f7324f2fe21eeba63ea988aacd\npublic = 3058301006072a8648ce3d020106052b81040023034400020108cbf3c9bf8e42135d87127556831076d84d5e549e645afda8a099249231b59b6c508dee4e91c9a543e90ebc82613f86cb1290e29102a0f2fdeb57bf4193fb4639\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 316\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 0a257d97aa4e5195e2919c147c1639bb0da0cce479a036489006b7b8e7e885096066e5adc8fe7c45940c5a6b94d5065b966a45f099a0cecfe9cce1b3e99dca479f2\npublic = 3058301006072a8648ce3d020106052b8104002303440003011f2dca6b686e2141c11822e2d5439261583ce98cd6c4041c6d1be9e17dee33ea4a65c3e8cca6de50a30a39c788a585f1188bef0680a9c0264b3c8dcf494d0eb948\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 317\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 0a257d97aa4e5195e2919c147c1639bb0da0cce479a036489006b7b8e7e885096066e5adc8fe7c45940c5a6b94d5065b966a45f099a0cecfe9cce1b3e99dca479f3\npublic = 3058301006072a8648ce3d020106052b8104002303440002011f2dca6b686e2141c11822e2d5439261583ce98cd6c4041c6d1be9e17dee33ea4a65c3e8cca6de50a30a39c788a585",
+    "f1188bef0680a9c0264b3c8dcf494d0eb948\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 318\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 6619644155c449758f65e2dfe7ba89dee1e090c1d68b6342f43cb1ac000090a7f0408138c1de217990bb015cd1d95f1d884cf659f7324f2fe21eeba63ea988aacc\npublic = 3058301006072a8648ce3d020106052b81040023034400030108cbf3c9bf8e42135d87127556831076d84d5e549e645afda8a099249231b59b6c508dee4e91c9a543e90ebc82613f86cb1290e29102a0f2fdeb57bf4193fb4639\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 319\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 2a35258787f91ad0bd3432c3022e4d3ed349c8768a7e7caa1836022fc0c89a9073f6ce14d0990d5b7bb413061c7160e7bd566a5c89f14901b2cc19f1ad531f41e2\npublic = 3058301006072a8648ce3d020106052b81040023034400020009cc73141cf1843d2b2c95dc5cbc4d615c6da4814c1c7208615d8e78c7a8666aba1852faaa45a45d32bd0fde6ea78f262a96bf1e02949cea48c33c695103683048\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 320\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 1afe5c77a626161fb2c25964c7895b9fff787099db83f077f05a4bfa320fb61f9315bb44d3fb9dd72225d9d993a18df82ac53fb4a5f86b23cb650e5e4778066f677\npublic = 3058301006072a8648ce3d020106052b81040023034400030047b9cf28e04b38796858545d60d6133fbdc20ede086e5d95111c982b8c276628235e536c075637a97c0a6c30d02b83b19e578203473eea16dfdeaeccb1dc0d9b19\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 321\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 24ae709e1644e3087b52470c565268becbdbf97de59916763507d109c2e5b7c21727c64e9b560aa248d7bc9fe0ac95720d507263b7b2859b056ea165301cd599d5\npublic = 3058301006072a8648ce3d020106052b810400230344000300c18410f5727ee0101a52ef95c0ac455cbc65bf9967f0a2c419aa0a291cabad569f2337e102d0a9128f4212dbf9fa9e5a8f14ca7f28e82977281facdd9ca7a92c78\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 322\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 24ae709e1644e3087b52470c565268becbdbf97de59916763507d109c2e5b7c21727c64e9b560aa248d7bc9fe0ac95720d507263b7b2859b056ea165301cd599d6\npublic = 3058301006072a8648ce3d020106052b810400230344000200c18410f5727ee0101a52ef95c0ac455cbc65bf9967f0a2c419aa0a291cabad569f2337e102d0a9128f4212dbf9fa9e5a8f14ca7f28e82977281facdd9ca7a92c78\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 323\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 1afe5c77a626161fb2c25964c7895b9fff787099db83f077f05a4bfa320fb61f9315bb44d3fb9dd72225d9d993a18df82ac53fb4a5f86b23cb650e5e4778066f678\npublic = 3058301006072a8648ce3d020106052b81040023034400020047b9cf28e04b38796858545d60d6133fbdc20ede086e5d95111c982b8c276628235e536c075637a97c0a6c30d02b83b19e578203473eea16dfdeaeccb1dc0d9b19\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n# tcId = 324\n# public key is a low order point on twist\ncurve = secp521r1\nprivate = 2a35258787f91ad0bd3432c3022e4d3ed349c8768a7e7caa1836022fc0c89a9073f6ce14d0990d5b7bb413061c7160e7bd566a5c89f14901b2cc19f1ad531f41e1\npublic = 3058301006072a8648ce3d020106052b81040023034400030009cc73141cf1843d2b2c95dc5cbc4d615c6da4814c1c7208615d8e78c7a8666aba1852faaa45a45d32bd0fde6ea78f262a96bf1e02949cea48c33c695103683048\nresult = invalid\nshared = \n# The point in the public key is compressed. Not every library supports points\n# in compressed format.\n\n",
+};
+static const size_t kLen58 = 233298;
+
+static const char *kData59[] = {
+    "# Imported from Wycheproof's ecdsa_secp224r1_sha224_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7]\n[key.wy = 0eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[sha = SHA-224]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c2840bf24f6f66be287066b7cbf38788e1b7770b18fd1aa6a26d7c6dc\n\n# tcId = 2\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c533d488bd8c4b459bc1bb67c7c96f5fcfc70996660c068d7fca3d605021c31893ff9dd72c79f3a62fdc5d82f7c05b75b8807c3f6830e861697fb\n\n# tcId = 3\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303d021c40d10e9cb11ac916d0c388a6feef764e2c22309f93a9f539c73725a2021d00904be66c40a6d256f3e99555c502b933f8625351e9bf7955fe173e75\n\n# tcId = 4\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c426f5e9c494c3669a6d0df24f5523d6dcda666a6ab8eb7def60a40bf021c1c342732ba0cc317dd4ffbbd20ce163607f9009a1a67518b0dff0cee\n\n# tcId = 5\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303d021d00abf10842ebbfdcd2c3bf18e1acc17c04bcc488e65542af2de38cb712021c5f37ff71604b38b5d66087a36ffdf371b0d4e2d9d4a22c2e9c80fafc\n\n# tcId = 6\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303d021c7827f94e5abd228d2bf7bd42bb8cbd1a3529ff26b295f4fbfa159b4c021d00b5a984cbd21ed6d230d22e4688745cfe0da94f9c0bccfb249ae6a4ef\n\n# tcId = 7\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n# Some implementations of ECDSA and DSA incorrectly encode r and s by not\n# including leading zeros in the ASN encoding of integers when necessary. Hence,\n# some implementations (e.g. jdk) allow signatures with incorrect ASN encodings\n# assuming that the signature is otherwise valid.\n\n# tcId = 8\n# valid\nmsg = 313233343030\nresult = valid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 9\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 30813d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 10\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 303e02811c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 11\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02811d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 12\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 13\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303f0282001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 14\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0282001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 15\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 16\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 17\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303d021d70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 18\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303d021b70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 19\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021e00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 20\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 21\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3085010000003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 22\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30420285010000001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 23\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0285010000001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 24\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 25\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3046028901000000000000001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 26\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3046021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a028901000000000000001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 27\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 28\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304102847fffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 29\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02847fffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 30\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 31\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30410284ffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 32\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0284ffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 33\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 34\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30420285ffffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 35\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0285ffffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 36",
+    "\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 37\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30450288ffffffffffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 38\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0288ffffffffffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 39\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30ff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 40\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 303d02ff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 41\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02ff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 42\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 43\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303d028070049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 44\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a028000d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 45\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 46\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 47\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f0000021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 48\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 49\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 50\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610500\n\n# tcId = 51\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 303f021e70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 52\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610500\n\n# tcId = 53\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3042498177303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 54\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30412500303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 55\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 303f303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610004deadbeef\n\n# tcId = 56\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30422221498177021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 57\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304122202500021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 58\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3045221e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0004deadbeef021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 59\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2222498177021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 60\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a22212500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 61\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a221f021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610004deadbeef\n\n# tcId = 62\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3045aa00bb00cd00303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 63\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3043aa02aabb303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 64\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30452224aa00bb00cd00021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 65\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30432222aa02aabb021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 66\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2225aa00bb00cd00021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 67\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3043021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2223aa02aabb021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 68\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 69\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30412280021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 70\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2280021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 71\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080313d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 72\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30412280031c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 73\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2280031d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 74\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tc",
+    "Id = 75\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2e3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 76\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2f3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 77\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 313d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 78\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 323d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 79\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = ff3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 80\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 81\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d011c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 82\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d031c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 83\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d041c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 84\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303dff1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 85\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 86\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a011d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 87\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a031d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 88\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a041d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 89\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480aff1d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 90\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 91\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3041300102303c1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 92\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 30412220020170021b049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 93\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2221020100021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 94\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463\n\n# tcId = 95\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 303c1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 96\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 97\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb3584636100\n\n# tcId = 98\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb3584636105000000\n\n# tcId = 99\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361060811220000\n\n# tcId = 100\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000fe02beef\n\n# tcId = 101\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610002beef\n\n# tcId = 102\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f3000021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 103\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463613000\n\n# tcId = 104\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303f303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 105\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 301e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a\n\n# tcId = 106\n# repeat element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 305c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 107\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 301f021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 108\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021e70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 109\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000\n\n# tcId = 110\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021e000070049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 111\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f000000d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 112\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30210500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 113\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0500\n\n# tcId = 114\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 30210200021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 115\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0200\n\n",
+    "# tcId = 116\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c72049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 117\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d02d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 118\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a488a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 119\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463e1\n\n# tcId = 120\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021b70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a48021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 121\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021b049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 122\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463\n\n# tcId = 123\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 124\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021dff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 125\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021eff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 126\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3022090180021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 127\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3021021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a090180\n\n# tcId = 128\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303e021d0170049af31f8348673d56cece2b26fc2a84bbe2e2a2e84aeced767247021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 129\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303e021dff70049af31f8348673d56cece2b28cee4c34a02667b2df86234be1dcd021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 130\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c8ffb650ce07cb798c2a93131d4d81a785bfd0d5b70f4de586ee5b7f6021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 131\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303e021d008ffb650ce07cb798c2a93131d4d7311b3cb5fd9984d2079dcb41e233021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 132\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303e021dfe8ffb650ce07cb798c2a93131d4d903d57b441d1d5d17b51312898db9021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 133\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303e021d0170049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 134\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303e021d008ffb650ce07cb798c2a93131d4d81a785bfd0d5b70f4de586ee5b7f6021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 135\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d01d7bf40db0909941d78f9948340c5b4b7a5fa6fca97e8a82091e08d9e\n\n# tcId = 136\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c78771e4888f4e702e5595d9283924\n\n# tcId = 137\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021dff2840bf24f6f66be287066b7cbf3961eb3abe80737bf48124ca7b9c9f\n\n# tcId = 138\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021dfe2840bf24f6f66be287066b7cbf3a4b485a059035681757df6e1f7262\n\n# tcId = 139\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d01d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361\n\n# tcId = 140\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c2840bf24f6f66be287066b7cbf3961eb3abe80737bf48124ca7b9c9f\n\n# tcId = 141\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 142\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 143\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 144\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 145\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 146\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 147\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 148\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 149\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020100090380fe01\n# Edge cas",
+    "e values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 150\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 151\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 152\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201010201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 153\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 154\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 155\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 156\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 157\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 158\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020101090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 159\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 160\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 161\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 162\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 163\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 164\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 165\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 166\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 167\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30080201ff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 168\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 169\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 170\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 171\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 172\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 173\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 174\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 175\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ",
+    "ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 176\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 177\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 178\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 179\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 180\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 181\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 182\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 183\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 184\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 185\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 186\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 187\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 188\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 189\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 190\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 191\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 192\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 193\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 194\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 195\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 196\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 197\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000010201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 198\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 199\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff0000000",
+    "00000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 200\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 201\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 202\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 203\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffffffff000000000000000000000001090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 204\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 205\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 206\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000020201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 207\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 208\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 209\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 210\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 211\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 212\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffffffff000000000000000000000002090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 213\n# Edge case for Shamir multiplication\nmsg = 3137353738\nresult = valid\nsig = 303c021c326bc06353f7f9c9f77b8f4b55464e8619944e7879402cca572e041a021c3116e1a38e4ab2008eca032fb2d185e5c21a232eaf4507ae56177fd2\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 08bf7e792f7c86877f1fd0552e42d80653b59e3a29e762a22810daac7]\n[key.wy = 0eec615bbad04b58dc2a7956090b8040bb5055325bba0aa8b3a5caa6f]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00048bf7e792f7c86877f1fd0552e42d80653b59e3a29e762a22810daac7eec615bbad04b58dc2a7956090b8040bb5055325bba0aa8b3a5caa6f]\n[sha = SHA-224]\n\n# tcId = 214\n# k*G has a large x-coordinate\nmsg = 313233343030\nresult = valid\nsig = 3030020f00e95c1f470fc1ec22d6baa3a3d5c1021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a\n\n# tcId = 215\n# r too large\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00fffffffffffffffffffffffffffffffefffffffffffffffffffffffe021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 2646ff36d9697aaaed0d641117f94f60e138bab8e9912b558ae0a818]\n[key.wy = 0ca48e45a33550c1b5bd20a00e4d9df3033c03222e87bd96a8197f2dd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00042646ff36d9697aaaed0d641117f94f60e138bab8e9912b558ae0a818ca48e45a33550c1b5bd20a00e4d9df3033c03222e87bd96a8197f2dd]\n[sha = SHA-224]\n\n# tcId = 216\n# r,s are large\nmsg = 313233343030\nresult = valid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0ea3ea2873b6fc099bfd779b0a2c23c2c4354e2fec4536f3b8e420988]\n[key.wy = 0f97e1c7646b4eb3de616752f415ab3a6f696d1d674fb4b6732252382]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ea3ea2873b6fc099bfd779b0a2c23c2c4354e2fec4536f3b8e420988f97e1c7646b4eb3de616752f415ab3a6f696d1d674fb4b6732252382]\n[sha = SHA-224]\n\n# tcId = 217\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c3d5052691b8dc89debad360466f2a39e82e8ae2aefb77c3c92ad7cd1\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 092ae54e38b4e9c6ae9943193747c4c8acc6c96f422515288e9698a13]\n[key.wy = 0e8f3a759a1a8273c53f4b4b18bfcf78d9bb988adb3b005002dbe434c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000492ae54e38b4e9c6ae9943193747c4c8acc6c96f422515288e9698a13e8f3a759a1a8273c53f4b4b18bfcf78d9bb988adb3b005002dbe434c]\n[sha = SHA-224]\n\n# tcId = 218\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 303d021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021d00bf19ab4d3ebf5a1a49d765909308daa88c2b7be3969db552ea30562b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b157315cc1aaeae64eb5b38452884195fdfe8a15fb5618284f48afe5]\n[key.wy = 0e1fbbaad729477a45f3752b7f72ad2f9cd7dce4158a8e21b8127e8a7]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b157315cc1aaeae64eb5b38452884195fdfe8a15fb5618284f48afe5e1fbbaad729477a45f3752b7f72ad2f9cd7dce4158a8e21b8127e8a7]\n[sha = SHA-224]\n\n# tcId = 219\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020103020101\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPu",
+    "blicKey]\n[key.wx = 087d9d964044b5b16801f32de9f3f9066194e8bf80affa3cb0d4ddb1d]\n[key.wy = 0b5eb9b6594e6d1bcacd0fd9d67c408f789dfb95feb79a6e2fb9c4cee]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000487d9d964044b5b16801f32de9f3f9066194e8bf80affa3cb0d4ddb1db5eb9b6594e6d1bcacd0fd9d67c408f789dfb95feb79a6e2fb9c4cee]\n[sha = SHA-224]\n\n# tcId = 220\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020103020103\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 461b435af09ede35e74dac21f9af7b1b9998213039f8785d4a4905f5]\n[key.wy = 18b89bde69de34a482638461d09386e7193ca90ca5b3038e2a3885d1]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004461b435af09ede35e74dac21f9af7b1b9998213039f8785d4a4905f518b89bde69de34a482638461d09386e7193ca90ca5b3038e2a3885d1]\n[sha = SHA-224]\n\n# tcId = 221\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020103020104\n\n# tcId = 222\n# r is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a40020104\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 08093af8db04b3dd2e7c3c59bb64a832c2fb8e8e141bae7ba1534950a]\n[key.wy = 10c5e87aecbd1fcdfc36cd18d41b3238b2ac613eb7c9de988d881816]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00048093af8db04b3dd2e7c3c59bb64a832c2fb8e8e141bae7ba1534950a10c5e87aecbd1fcdfc36cd18d41b3238b2ac613eb7c9de988d881816]\n[sha = SHA-224]\n\n# tcId = 223\n# s is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3022020103021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c6f00c4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0c6d71f4ba0933f1269f7d6df83fd0c9c67254f101dcc126dc15faa3e]\n[key.wy = 3c45dc9fedc71c9f2b0dd1b12b656241f5e335066f3f925bdbcfe98f]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004c6d71f4ba0933f1269f7d6df83fd0c9c67254f101dcc126dc15faa3e3c45dc9fedc71c9f2b0dd1b12b656241f5e335066f3f925bdbcfe98f]\n[sha = SHA-224]\n\n# tcId = 224\n# small r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 302302020100021d00c993264c993264c993264c99326411d2e55b3214a8d67528812a55ab\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0beb9d8dcba48146b9032688ecea947a231e7d0e6ce17d76b56ed6348]\n[key.wy = 35503f3b4af414870ef03383784b1d846b3e07b8e9fc2d6190a3bfda]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004beb9d8dcba48146b9032688ecea947a231e7d0e6ce17d76b56ed634835503f3b4af414870ef03383784b1d846b3e07b8e9fc2d6190a3bfda]\n[sha = SHA-224]\n\n# tcId = 225\n# smallish r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 302702072d9b4d347952cc021c3e85d56474b5c55fbe86608442a84b2bf093b7d75f53a47250e1c70c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 1955ba3f90e7a739471a5d182b594c9747eb49d5356203f3bb8b939c]\n[key.wy = 0807d88ce3a0885bfa5b5b7f6e9beb18285e7130524b6c1498b3269ee]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00041955ba3f90e7a739471a5d182b594c9747eb49d5356203f3bb8b939c807d88ce3a0885bfa5b5b7f6e9beb18285e7130524b6c1498b3269ee]\n[sha = SHA-224]\n\n# tcId = 226\n# 100-bit r and small s^-1\nmsg = 313233343030\nresult = valid\nsig = 302d020d1033e67e37b32b445580bf4efb021c02fd02fd02fd02fd02fd02fd02fd0043a4fd2da317247308c74dc6b8\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 5cb9e5a5071f2b37aa3a5e5f389f54f996b0bc8a132ecb6885318fbf]\n[key.wy = 4ec5f8b93d8bf2a3b64fa7cac316392562c46567963c43a69f7a37fd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00045cb9e5a5071f2b37aa3a5e5f389f54f996b0bc8a132ecb6885318fbf4ec5f8b93d8bf2a3b64fa7cac316392562c46567963c43a69f7a37fd]\n[sha = SHA-224]\n\n# tcId = 227\n# small r and 100 bit s^-1\nmsg = 313233343030\nresult = valid\nsig = 302302020100021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 7b34ef8723a4309c0fa8a7ec3a783477652a82892370f6763314fe7b]\n[key.wy = 0dee663853071e35fd3c76f991d7843c5e168ca659b93bd6015518fba]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00047b34ef8723a4309c0fa8a7ec3a783477652a82892370f6763314fe7bdee663853071e35fd3c76f991d7843c5e168ca659b93bd6015518fba]\n[sha = SHA-224]\n\n# tcId = 228\n# 100-bit r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 302e020d062522bbd3ecbe7c39e93e7c24021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 3f26a9c13979cf5d090ea25dc966398022ceec31504abc4b10f7676]\n[key.wy = 7d577dcf47e10e384c6b9a229a455a9fd33e54fe7960b8b0160aef16]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000403f26a9c13979cf5d090ea25dc966398022ceec31504abc4b10f76767d577dcf47e10e384c6b9a229a455a9fd33e54fe7960b8b0160aef16]\n[sha = SHA-224]\n\n# tcId = 229\n# r and s^-1 are close to n\nmsg = 313233343030\nresult = valid\nsig = 303d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29bd021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b671296dd5f690502e4b1500e4acb4c82d3aa8dfbc5868a643f86a3c]\n[key.wy = 0a46ba8c3a7b823259522291e2416232276cca8503cc8dbf941f1d93d]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b671296dd5f690502e4b1500e4acb4c82d3aa8dfbc5868a643f86a3ca46ba8c3a7b823259522291e2416232276cca8503cc8dbf941f1d93d]\n[sha = SHA-224]\n\n# tcId = 230\n# s == 1\nmsg = 313233343030\nresult = valid\nsig = 3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020101\n\n# tcId = 231\n# s == 0\nmsg = 313233343030\nresult = invalid\nsig = 3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020100\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 76e34b57a8c61df59cb0b7921cec6e5422344033f7accb7b3179e682]\n[key.wy = 0cefd0a848309d1decf98a3b9e333691b95c17821cb681137630c02e2]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000476e34b57a8c61df59cb0b7921cec6e5422344033f7accb7b3179e682cefd0a848309d1decf98a3b9e333691b95c17821cb681137630c02e2]\n[sha = SHA-224]\n\n# tcId = 232\n# point at infinity during verify\nmsg = 313233343030\nresult = invalid\nsig = 303c021c7fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e151e021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b5c09b4851a67371eee7bbf02451e5208c40de61bc1a33df2710b384]\n[key.wy = 0dcce4e5b83c32a800e8de28fa936d582cdcad185e894caac797f1d14]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b5c09b4851a67371eee7bbf02451e5208c40de61bc1a33df2710b384dcce4e5b83c32a800e8de28fa936d582cdcad185e894caac797f1d14]\n[sha = SHA-224]\n\n# tcId = 233\n# u1 == 1\nmsg = 313233343030\nresult = valid\nsig = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0941e283be31300bfd4f6a12b876fd3267352551cc49e9eef73f76538]\n[key.wy = 0c115e5fe3b92f643c6cef1c58f3f8657574d1f64957d4880995cde83]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004941e283be31300bfd4f6a12b876fd3267352551cc49e9eef73f76538c115e5fe3b92f643c6cef1c58f3f8657574d1f64957d4880995cde83]\n[sha = SHA-224]\n\n# tcId = 234\n# u1 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 43c9ccd08a80bca18022722b0bdcd790d82a3ef8b65c3f34204bb472]\n[key.wy = 09ee1c1f00598130b2313a3e38a3798d03dac665cff20f36ce8a2024a]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000443c9ccd08a80bca18022722b0bdcd790d82a3ef8b65c3f34204bb4729ee1c1f00598130b2313a3e38a3798d03dac665cff20f36ce8a2024a]\n[sha = SHA-224]\n\n# tcId = 235\n# u2 == 1\nmsg = 313233343030\nresult = valid\nsig = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0d958e418fad1c5ea5c923e6185e03ed5539d3f5f58dfac8bb9f10459]\n[key.wy = 6997e408c97be5fdc037a5",
+    "c004389d4b97eb1f54635e985853c1f082]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004d958e418fad1c5ea5c923e6185e03ed5539d3f5f58dfac8bb9f104596997e408c97be5fdc037a5c004389d4b97eb1f54635e985853c1f082]\n[sha = SHA-224]\n\n# tcId = 236\n# u2 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00aaaaaaaaaaaaaaaaaaaaaaaaaaaa0f17407b4ad40d3e1b8392e81c29\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0d629b434c9b5d157bd72e114fd839553f7f0e94600934a0a49e59aa4]\n[key.wy = 713a13c01775e75e2ebae75d9e29d2506184177b7dd0868693873596]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004d629b434c9b5d157bd72e114fd839553f7f0e94600934a0a49e59aa4713a13c01775e75e2ebae75d9e29d2506184177b7dd0868693873596]\n[sha = SHA-224]\n\n# tcId = 237\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d1be91557d866ad5f2945b14ec3317bc43c1338fd06af6496201cce2\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 3d2e9bb9a712bf3ad42ac30659fdbda9be9956537f9f37cd05f0ff37]\n[key.wy = 7d5982d6d9266d774942c44d9eb3501051d3b9688610131e7856ef36]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00043d2e9bb9a712bf3ad42ac30659fdbda9be9956537f9f37cd05f0ff377d5982d6d9266d774942c44d9eb3501051d3b9688610131e7856ef36]\n[sha = SHA-224]\n\n# tcId = 238\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7ac54a381d9bd3f2698359d6f658b5e4167d15a75b576e82d2efbd37\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0a0be2f10144b9b42b016f1bd9fca30e4c24aae4775596c7cdb07ae60]\n[key.wy = 0d60ff3a70f1541631f6087d3f3b3fe376d2305b50b94821106412479]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004a0be2f10144b9b42b016f1bd9fca30e4c24aae4775596c7cdb07ae60d60ff3a70f1541631f6087d3f3b3fe376d2305b50b94821106412479]\n[sha = SHA-224]\n\n# tcId = 239\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c4fbb063e82402e16fe14edda4d7986b0b88344a1f53b0e2684ee7e31\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 4d74397a586c8ac5e326bed03720bde7037e4a07aee7209f70493cab]\n[key.wy = 106778bfd081d17ab6dcb8fd8a454962941c26ecc19cda9fb77719db]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00044d74397a586c8ac5e326bed03720bde7037e4a07aee7209f70493cab106778bfd081d17ab6dcb8fd8a454962941c26ecc19cda9fb77719db]\n[sha = SHA-224]\n\n# tcId = 240\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d3be5f50d726f99b8ac44bff876bfe78dd7ae630d227ef0ba87ae39b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 08c2f149b1738243f81a6f12135395a2ba2718863622e66e33efc241f]\n[key.wy = 5638cf6ae9cfb39578cf3a719702052e5e9e940216c5136dcb6ef085]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00048c2f149b1738243f81a6f12135395a2ba2718863622e66e33efc241f5638cf6ae9cfb39578cf3a719702052e5e9e940216c5136dcb6ef085]\n[sha = SHA-224]\n\n# tcId = 241\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00e5f50d726f99b8ac44bff876cbf710e47f9087d1afdfb1dab6d6daf1\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0ad5227e48afaa165e7b97ef8210687556e10643fda8a377aaf4f5bf4]\n[key.wy = 12e86d4ae55f4460aba6a932f307ee78efdc136e9a3df6313100bf4f]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ad5227e48afaa165e7b97ef8210687556e10643fda8a377aaf4f5bf412e86d4ae55f4460aba6a932f307ee78efdc136e9a3df6313100bf4f]\n[sha = SHA-224]\n\n# tcId = 242\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00cbea1ae4df337158897ff0ed97ef0b261e681f654be23a7011518ba5\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 3fb94a3165ecdef43fa27907ed075caf52c25420ac7bc7bb90408992]\n[key.wy = 23c4d7b4775b591ae223dd4da9ceaabd73b9743ddab8b40576e393f]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00043fb94a3165ecdef43fa27907ed075caf52c25420ac7bc7bb90408992023c4d7b4775b591ae223dd4da9ceaabd73b9743ddab8b40576e393f]\n[sha = SHA-224]\n\n# tcId = 243\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d726f99b8ac44bff876cbf7e28422aa07ec3cb1d9472bd704f4029f0\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0e45fcf0a7f4dc2a308dc7868251423fbf71a205a9546850a01a732fc]\n[key.wy = 09a73ca4d41175076f2f362b276ecb0ccdb6e0bb30c4a1b35c2e3ed82]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004e45fcf0a7f4dc2a308dc7868251423fbf71a205a9546850a01a732fc9a73ca4d41175076f2f362b276ecb0ccdb6e0bb30c4a1b35c2e3ed82]\n[sha = SHA-224]\n\n# tcId = 244\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d009720b755413cca9506b5d27589e58ac4bed856762ba7ae20ab5b43cc\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 3c59e13982fd9c1a45991b1e9d79e939a52a62ca479764f1477e2813]\n[key.wy = 1b004c9bffd7f00c05e3168c625cc93ab7a0f1ba8d6fa26a4d5162cb]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00043c59e13982fd9c1a45991b1e9d79e939a52a62ca479764f1477e28131b004c9bffd7f00c05e3168c625cc93ab7a0f1ba8d6fa26a4d5162cb]\n[sha = SHA-224]\n\n# tcId = 245\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2e416eaa8279952a0d6ba4eb13cbfee69cf7bcae437232fbfa5a5d5b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0c6b8ff152d7a1b7a99ce3483bdeaaf5bd2ce64dc6b0f89cf3544b87c]\n[key.wy = 53ab6cf9cb510dc1440ab4e412a167f4c69365fcfc97f31d5ba4581]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004c6b8ff152d7a1b7a99ce3483bdeaaf5bd2ce64dc6b0f89cf3544b87c053ab6cf9cb510dc1440ab4e412a167f4c69365fcfc97f31d5ba4581]\n[sha = SHA-224]\n\n# tcId = 246\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00c56225ffc3b65fbf142177609db189ab5bd013246f19e11ca5b5a127\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 7c0772fb6553c0ec0dd1f73b5db380764d9f2f7afb4eac1e774dacd5]\n[key.wy = 6e2e5de0db63bf03cf9675eae6d2dfe5424e79ab394951c9b60ad5df]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00047c0772fb6553c0ec0dd1f73b5db380764d9f2f7afb4eac1e774dacd56e2e5de0db63bf03cf9675eae6d2dfe5424e79ab394951c9b60ad5df]\n[sha = SHA-224]\n\n# tcId = 247\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00a7dd831f4120170b7f0a76ed26bc4ea9cc9e1a70048c1bb5f0a55437\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 4108e0ccd47cba09fb7ed4d9f3455823780965157861c1bf8f93d34b]\n[key.wy = 46d6fdb71e9e89adaae71376b13fd17644b11eed00d498783da0ba1a]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00044108e0ccd47cba09fb7ed4d9f3455823780965157861c1bf8f93d34b46d6fdb71e9e89adaae71376b13fd17644b11eed00d498783da0ba1a]\n[sha = SHA-224]\n\n# tcId = 248\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffffb2364ae85014b149b86c741eb8be\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 2f2da40a1b72f67ba63613a243119c41c7252839cf106e86b5d8e6e3]\n[key.wy = 5a1e0e2fc49b4f316f0c0e7236785749eb34ce923c23aef330af8733]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00042f2da40a1b72f67ba63613a243119c41c7252839cf106e86b5d8e6e35a1e0e2fc49b4f316f0c0e7236785749eb34ce923c23aef330af8733]\n[sha = SHA-224]\n\n# tcId = 249\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00855f5b2dc8e46ec428a593f73219cf65dae793e8346e30cc3701309c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.typ",
+    "e = ECPublicKey]\n[key.wx = 7dc09710f4f586af05b08f0c9dcd48b1308733c97767fc286d1c7283]\n[key.wy = 4353a704c7950b8f4a11394bc8db06adccf19d8ed95c7f214a173137]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00047dc09710f4f586af05b08f0c9dcd48b1308733c97767fc286d1c72834353a704c7950b8f4a11394bc8db06adccf19d8ed95c7f214a173137]\n[sha = SHA-224]\n\n# tcId = 250\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2db5f61aea817276af2064e104c7a30e32034cb526dd0aacfa56566f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0dbb439e2c3e9d1822b94ccc7d98c9fcb668e65dd6a759ad2dfdcd328]\n[key.wy = 082663234e6da512d7d7d5fe79156ad0e19ffc62d618e3cf48276106d]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004dbb439e2c3e9d1822b94ccc7d98c9fcb668e65dd6a759ad2dfdcd32882663234e6da512d7d7d5fe79156ad0e19ffc62d618e3cf48276106d]\n[sha = SHA-224]\n\n# tcId = 251\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0084a6c7513e5f48c07fffffffffff8713f3cba1293e4f3e95597fe6bd\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0e012dc20cca5bd2adfaa27f57419596ce09ed0f18a9148e30a0f6ed2]\n[key.wy = 55beca1b5e3e2485ef9537ae48a67b72dbcf6d7b33372023a5c443e8]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004e012dc20cca5bd2adfaa27f57419596ce09ed0f18a9148e30a0f6ed255beca1b5e3e2485ef9537ae48a67b72dbcf6d7b33372023a5c443e8]\n[sha = SHA-224]\n\n# tcId = 252\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c7513e5f48c07ffffffffffffff9d21fd1b31544cb13ca86a75b25e\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0c510ab34abd4855c54d62407abe6ca090c73ba49aca9de9bf117bca2]\n[key.wy = 42b3b00c272c22681af7c255120fac148ad73c81b47846e4ad2f5627]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004c510ab34abd4855c54d62407abe6ca090c73ba49aca9de9bf117bca242b3b00c272c22681af7c255120fac148ad73c81b47846e4ad2f5627]\n[sha = SHA-224]\n\n# tcId = 253\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d8ea27cbe9180fffffffffffffff3a43fa3662a899627950d4eb64bc\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 08a6e167536a47aaa224fec21ce077642efdb97d93ae16b9672279f4]\n[key.wy = 33fb9f1abb25f2c0c3e6008ac857ede4a89ca8d9d08b8996614969ac]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000408a6e167536a47aaa224fec21ce077642efdb97d93ae16b9672279f433fb9f1abb25f2c0c3e6008ac857ede4a89ca8d9d08b8996614969ac]\n[sha = SHA-224]\n\n# tcId = 254\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3e5f48c07fffffffffffffffffffc724968c0ecf9ed783744a7337b3\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 1a83e185fcf30e6c69cf292e497d63cc04e6fd07cb9365a74be3c39c]\n[key.wy = 6b2d56247df49cf94176c4e8efc84ec710cd0d614dd066c16f6ad3e0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00041a83e185fcf30e6c69cf292e497d63cc04e6fd07cb9365a74be3c39c6b2d56247df49cf94176c4e8efc84ec710cd0d614dd066c16f6ad3e0]\n[sha = SHA-224]\n\n# tcId = 255\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00bfffffffffffffffffffffffffff3d87bb44c833bb384d0f224ccdde\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 2d59efd841a44b83fd42e6a2984a53fa93ad242c11678f92202cccfb]\n[key.wy = 095bcaf0b2f6eb0e6d4d83e3260e037d3dc0e48ab6c4141ce6b56cad0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00042d59efd841a44b83fd42e6a2984a53fa93ad242c11678f92202cccfb95bcaf0b2f6eb0e6d4d83e3260e037d3dc0e48ab6c4141ce6b56cad0]\n[sha = SHA-224]\n\n# tcId = 256\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffff646c95d0a029629370d8e83d717f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 1161c7add6f67f995b93e19eb18bd5e73fd71d6bb10dceef0b792e9c]\n[key.wy = 08c44cef9826b4ed67508c09d07ec857a0ea49ed1a7f1fa2c74cb838]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00041161c7add6f67f995b93e19eb18bd5e73fd71d6bb10dceef0b792e9c08c44cef9826b4ed67508c09d07ec857a0ea49ed1a7f1fa2c74cb838]\n[sha = SHA-224]\n\n# tcId = 257\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e1520\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 084dc3d2ebfcf3480713baeff30ad0781bc8c4d06ab6ddd4f7f1045af]\n[key.wy = 7570537c5d71a78b1a041aca0fe35f642824abda8c3ff2e9fcf5c8cb]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000484dc3d2ebfcf3480713baeff30ad0781bc8c4d06ab6ddd4f7f1045af7570537c5d71a78b1a041aca0fe35f642824abda8c3ff2e9fcf5c8cb]\n[sha = SHA-224]\n\n# tcId = 258\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0096dafb0d7540b93b5790327082635cd8895e1e799d5d19f92b594056\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 1767574e645c550ef3d353f76d4428f9616ac288b36378857de33262]\n[key.wy = 09fe09825a57f3a0ec11189f4560272297ab6d5e095401febb60d0dc9]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00041767574e645c550ef3d353f76d4428f9616ac288b36378857de332629fe09825a57f3a0ec11189f4560272297ab6d5e095401febb60d0dc9]\n[sha = SHA-224]\n\n# tcId = 259\n# point duplication during verification\nmsg = 313233343030\nresult = valid\nsig = 303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c1ef359e4bd146f63d8155c5c2523fa3353c9820f84f28150bad3819a\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 1767574e645c550ef3d353f76d4428f9616ac288b36378857de33262]\n[key.wy = 601f67da5a80c5f13eee760ba9fd8dd585492a1f6abfe01449f2f238]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00041767574e645c550ef3d353f76d4428f9616ac288b36378857de33262601f67da5a80c5f13eee760ba9fd8dd585492a1f6abfe01449f2f238]\n[sha = SHA-224]\n\n# tcId = 260\n# duplication bug\nmsg = 313233343030\nresult = invalid\nsig = 303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c1ef359e4bd146f63d8155c5c2523fa3353c9820f84f28150bad3819a\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0e2ef8c8ccb58eba287d9279b349e7652cca3e7cda188a5f179d77142]\n[key.wy = 0f87594f3664c0faf7b59670e353a370d1d68ad89d6a1e246b4d03bee]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004e2ef8c8ccb58eba287d9279b349e7652cca3e7cda188a5f179d77142f87594f3664c0faf7b59670e353a370d1d68ad89d6a1e246b4d03bee]\n[sha = SHA-224]\n\n# tcId = 261\n# comparison with point at infinity \nmsg = 313233343030\nresult = invalid\nsig = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b8bf3ef9646abfffb84220104ec996a92cef33f9328ec4cb1ea69948]\n[key.wy = 4fea51a0de9e9d801babd42ca0924b36498bc5900fbeb9cbd5ad9c1a]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b8bf3ef9646abfffb84220104ec996a92cef33f9328ec4cb1ea699484fea51a0de9e9d801babd42ca0924b36498bc5900fbeb9cbd5ad9c1a]\n[sha = SHA-224]\n\n# tcId = 262\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 24819323b7be8ab0910f7f33bd2f7669c44b13f0",
+    "9479965e95287d13]\n[key.wy = 0b0592345beafbfdb8cf3629269bdd817728d5d5cd3c28bc6c6414a70]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000424819323b7be8ab0910f7f33bd2f7669c44b13f09479965e95287d13b0592345beafbfdb8cf3629269bdd817728d5d5cd3c28bc6c6414a70]\n[sha = SHA-224]\n\n# tcId = 263\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21]\n[key.wy = 0bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34]\n[sha = SHA-224]\n\n# tcId = 264\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n# tcId = 265\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303d021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21]\n[key.wy = 42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd]\n[sha = SHA-224]\n\n# tcId = 266\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n# tcId = 267\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303d021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466]\n[key.wy = 0ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176]\n[sha = SHA-224]\n\n# tcId = 268\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021c2770403d42b7b45e553308d1f6a480640b61cac0ae36665d6f14d34e021d0085506b0404265ededf9a89fc7c9c7a55c16c5b0d781f774de8f46fa1\n\n# tcId = 269\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d00dd0d56c27a0dc01ce0aad178f274d47bdf9dac8db1df5edbd3234e9f021c393cb201b9f3306ef587c8461e18617f8c0cb96dfad301fca8c852a5\n\n# tcId = 270\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303c021c0441d3ea1ccaf7ee9cba39cc90f117edf9183d34e8ec255bbee3af7b021c72787e0e4c55099d0582680e153ed4907d2a950c9421da4b83036091\n\n# tcId = 271\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303c021c4408ea3b626ab23a391f941f93e1f2998efb4c2dc4ab6ccbf2f79b50021c0fa5ffbafb3943ff0c4e68408247f95343c4832bc01e5cd505685ef3\n\n# tcId = 272\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d009f0659f0009e16c6a98e26f7479b7ed4268f28d9bd8806ca54a5d8e7021c43aa3fd3dfc50844e03f4ce9801d3a1023a8c4d0bd67149f437ae3a2\n\n# tcId = 273\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d00b2f4f3ca7ce467a8928ee15b2672a30aad1d03f5271e9a0e7a52e233021c3e0f281a9d56fdfac280ac1eb799d3874115e773041d1e722fc36b67\n\n# tcId = 274\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303e021d00ed63abaa150741427c9810dbaadec1bf43c0ac36968146300c0b080d021d00febd4a3944f0ea30f0e9bb13d553e839b48ef721e598aa03db7638d5\n\n# tcId = 275\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021c340814eb8a132af8e8d6bc0836c0abcd6411e8d8930cf346c41de9ae021d00c8eefdb53796bcb54c59f3193ef858ebc92cebac9f0bb38c08284b4e\n\n# tcId = 276\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d00cc75615f5415f8244fd42b518618b9734e3c5b1399507557f7834789021c7b68afe08887d34f1ce19942e4f3c5d99c20d0e15ba13adc287e5554\n\n# tcId = 277\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d00f83bb419a391163c306b3e10c3bb5a029b428d560181c80e279498f3021c317446aa67bac1e52b6069e29e90f6df1737a61229600523e32f4e23\n\n# tcId = 278\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021d00b68da722bbba7f6a58417bb5d0dd88f40316fc628b0edfcb0f02b062021c5c742e330b6febadf9a12d58ba2a7199629457ef2e9e4cecd2f09f50\n\n# tcId = 279\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021c5df6b8389e40473ac6cb14330066887779a6aafbec652c9d3f42f4db021d00ce28e7b8f4a4d5263a10c20d615b3dbaad18b58de36625a485d77adb\n\n# tcId = 280\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021d00edd07a0529340b7e3ad39a37f7f7043cc560f605f2c14d5b6e7c4f63021c03cd4525a02091490b49645464040fac40d8a70ce49042b21f1a1b8e\n\n# tcId = 281\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021d00d32e7b5ebef67e442f086595e62d7f282c26b5618e50ae386de8efa9021c554e7c860e0e1db0080cd520c7fe745b72c540074fc610dc0e280520\n\n# tcId = 282\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021d00d1edaf4c0174197bf38b78b53c6ed7d8d3f16ab50379bc9c25e40536021c438bc07b8cfc3b8aa319e9d50153ca4bb6702071bbc01b687d48bd99\n\n# tcId = 283\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303e021d008bb29b81e2b348ab4f04156269f21e9ed74eada70e505faf8ee8519a021d008b9a30f30ea26c37bfe4f879939ed442523ff8ce0a3ceda97f3314e2\n\n# tcId = 284\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021c627cf63b5c30c55368d377cee6e8da5ccc265952b36eed5f2a7ccc0b021d008f76f6b9cfec6ad1bbb3e0b27ddadc7c3b35b6fd33a8302a75b0ee55\n\n# tcId = 285\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303c021c1d6b1e116413eae3d8975144d14bbab1db23dbc2254417973f8871a4021c7dfea6372066fce663a84ced6385ae63a4c5121d3ba6856208603ddf\n\n# tcId = 286\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021c1e93ab2e3b2249bcc89c326d709ddaa568320cf8598c3ee0d69aa674021d00ee64abd080c4f31311b5c1ff081f3131a1d76e292f23e1f8602a3dff\n\n# tcId = 287\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303c021c76ab1b4c88eb4985ed345b5e3abf06ddc8c3f34c0d0e1b393a76ce85021c523ce0669a34b629b6e13a9f8b0fa6c5a6514e1267077df420ab3b88\n\n# tcId = 288\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c01ec1ff15c8a55d697a5424d674753f82f711593828368d2fbb41a17021c20d9089db7baf46b8135e17e01645e732d22d5adb20e3772da740eee\n\n# tcId = 289\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c5af925948bda1fe510456cf27ce65b6d3ad17dd6d511600fad58aacf021c2eb0a3cf8b5e0b73239eb053a5a78ab8af78397062d06f8dbda2eb17\n\n# tcId = 290\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c070fa48e5307b660cfa9e66a0ab98959ec3dcc3ac5e1b1dff1064087021c028926a511087943333f6fa336b235792b6f64ee3f5f594a7c3f6d2c\n\n# tcId = 291\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021d00bcfbb22ed79dd2ee8ae602dde144a63f9fa68f8f9b71b5994ac8f17b021c27c9c1494081d99a2708b02196eb9581b0b4147d00f3ae3089cc6d7a\n\n# tcId = 292\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021d00a914df6f841ef05491827d92e55148a5c71c687c89dccbfdfd6eddfc021c7316b41eecbff1dd0fafdeb8b717e3f91aceeb2c22cb25023ee2af0b\n\n# tcId = 293\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303e021d00a72fc403de3dab1cf179f630940cfd990702969160d7bdf5c47a12a0021d00c2b0a943e45dbd0ffe6a4e31eab8099cd940c02d415041c149f24308\n\n# tcId = 294\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021c23ae9b89bbddbc88815c39e6f5969cce536caf36547b19d286fd868d021d00df9f9b611e22facb95e599bbca556f943739d5110678883c27d89c4d\n\n# tcId = 295\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021c356c7d340cfbd7205d466872524b1585d8659c43532fad657352f420021d00bc54e0b4c6f878e6052058ef4cbadefe3b4299993df773277bc32e5c\n\n# tcId = 296\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021d0086f4ab774e4e5d8705e",
+    "aeff1f464da1774c177defcf4799656606b85021c3e03ea07272bad191989244af4230c275657c13258b77f9241caf7e6\n\n# tcId = 297\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c1bde22394310f2f3139a51406c05ef6b553cd72b3520c824eb0ba4e6021c379d85d4a88357b77fc418c1e4a2525e964415605b7a5ca5018c7662\n\n# tcId = 298\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303c021c3e46e9ba4dc089ff30fa8c0209c31b11ff49dbeec090f9f53c000c75021c6f2e3b36369416602bca83206809ed898fcf158a56c25a5474143f68\n\n# tcId = 299\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303d021c6464668eeb6f693262fa4449dfffa86d346a2d11521d196214158666021d009ba2b14539efc3c884515e5bcf794c27a00ccbff01297a45dc444693\n\n# tcId = 300\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303c021c50b504b81612583ebecc4317a24ea4f7527d246ae1bee6c0157452f8021c0df691ff8b33d71c8b96bd246328ebd3a2f91d2be2ade9a7c2643cbf\n\n# tcId = 301\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303d021d00e14a319fd627669f24ce1a51f7ec2333da3b2c3de62c3aaf2b02e76b021c7845a14342c67c2f1ccd0a8a3a34ca0f382386964cd4c07360dd7bf8\n\n# tcId = 302\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303b021c098c7a8a3b6c5659e7a013efbd8e907935d0606b6c2a868455abf489021b7730907f494e81ddceb19215fa7e9398e7aa9144ac74d9fbf8c519\n\n# tcId = 303\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303e021d009e5db35801390400d1c6d496ba9d9ff5fddb688bdad6c8144d12e3b4021d00f8a618180b6b76c9bd837a67547a826c3cf270be1f2f50af690b8285\n\n# tcId = 304\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303e021d00f1b4f951e32e2ae47b776cdb87654cb18b74106d6b81f29e4d98f3cc021d00f1ea4b08a530d55982eb4a895d28f75fc2b831d7e46fd835bf8d8a33\n\n# tcId = 305\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303c021c50e80890e6b9b25b1aae3f8ddbc48026f57ad0f117694b0377bf4b9e021c7e804b9aaeb1df008cb3ac44f54d7d9ff159ca37d7f869a642c65eb6\n\n# tcId = 306\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303e021d00bdd75697eeb16df9b85ba07a14bcd200997a64bf1ec12e6e24bbe81b021d00d6f8396d399baa426c70d9cf00f1e392281755bff240752ca544e433\n\n# tcId = 307\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303d021c36766ad3607b8b63a4d7ce4132b46c90c8b99f44afb589720efffe4d021d00ded14db5945f5f84ba235f8eb2ada604ae8a9cf92527f692bf066629\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf]\n[key.wy = 08a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000]\n[sha = SHA-224]\n\n# tcId = 308\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c77b38da37079d27b837613ac3e8248d66eabd5d637076c8e62c7991e021d00d40cd9f81efc52db4429c0c1af7c1d8a22b6c7babbe7fbd8b5b3f02f\n\n# tcId = 309\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d008c03b32c166c0c8b99d7f876acd109447efb13f6b82945e78d51a269021c657568f1a0a8bd7df5ffa43097ebb2b64435c8e3335bcaafc63f9ed5\n\n# tcId = 310\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00d199a375253d30f1d2b4493542e9934f9f1f8b0680117679f5bc4ad2021c11419ddbf02c8ad5f518f8dac33f86a85e777af51a034132e2767a6d\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1]\n[key.wy = 73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[sha = SHA-224]\n\n# tcId = 311\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d008ff82699e2e82870be9cfdd8a408bb34f8f38a83a4ac8370f18f2bc8021c7e5008fab6a0d4159200077ef9918dad6592cd8359838852c636ac05\n\n# tcId = 312\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c3f3b60b529ae0f950c517264adf2e481616bc47416742d5103589660021d00f731ebe98e58384b3a64b4696d4cc9619828ad51d7c39980749709a6\n\n# tcId = 313\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00dc11ffdc6b78754a335f168c4033916a2158d125a3f4fed9dc736661021c6dd84364717d9f4b0790f2b282f9245ecb316874eac025600397f109\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000]\n[key.wy = 0eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[sha = SHA-224]\n\n# tcId = 314\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00a59b25b786d55f26b04dfe90ee02a6bde64ed6e431dc9fbdc3ab360e021d00fc14b5ad20f39da9900e35437936c8626fccf6632e7a3d9e587e3311\n\n# tcId = 315\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c2eda1f96c1a6e3ad8a3321ce82cbb13a5b935b501abf6c06f7fd2b3f021d00e81050c3e5f53a3c7b9d0bdb9ed92a326dfeac44791ba1abe4d6e973\n\n# tcId = 316\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c60f5e093fda08fc14ac99d820a18ad1370c58150bea0aca24fc6db9d021d00c2220a0ebbf4896e68fdb5bd824f88291c1c862b916f9c4af87f8f5f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff]\n[key.wy = 41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[sha = SHA-224]\n\n# tcId = 317\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c2ead37846a5e36a490b75140bdc7b636c6e9f6d8f980f6fadb08f769021d00e1fe130ae1798c196d7be62c7a5ddb3168cf4b8d48b6b6b4dc94ab3b\n\n# tcId = 318\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00a8a4c9416d72c860573d073281cb08c86ad65313f06b15a329e82eb2021c5a6edd2f0816b7263d915d72c67d50a854e3abee5cde1b679a0cef09\n\n# tcId = 319\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c576bb86c517bfecdc930a4c8501725548d425afbb96d93f5c1e2a0e1021c77248c5ecd620c431438c50e6bee6858091b54a87f8548ae35c21027\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[sha = SHA-224]\n\n# tcId = 320\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c34e41cba628fd8787ba1a528f6015d2cae015c1c9a866e08a7133801021d0083d422ffdd99cc3c6d7096ef927f0b11988d1824e6e93840ff666ccd\n\n# tcId = 321\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c2558a42e79689244bccd5e855f6a1e42b4ff726873f30b532b89ef53021c07f9bd947785187175d848b6e2d79f7ab3bbc1087b42590b0cfb256a\n\n# tcId = 322\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00d5fe7dd5fb4fd1ea5ce66c0824f53f96ce47fd9b6c63b4d57827fd17021d00bce5bc3af705afaacb81bfa6d552d6198962fece9fba41546c602ddc\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type =",
+    " ECPublicKey]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 0ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[sha = SHA-224]\n\n# tcId = 323\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d008c1da2f07cdcbce4db8067b863468cfc728df52980229028689e57b6021c32175c1390a4b2cab6359bab9f854957d4fd7976c9c6d920c871c051\n\n# tcId = 324\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00e46d4f11b86b5a12f6fe781d1f934ef2b30e78f6f9cc86a9996e20c0021d008351974b965526034a0ccef0e7d3bc13d91798151488c91533143f7b\n\n# tcId = 325\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c305ccf0b5d0cf33dc745bb7c7964c233f6cfd8892a1c1ae9f50b2f3f021c785f6e85f5e652587c6e15d0c45c427278cf65bb1429a57d8826ca39\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0f7e4713d085112112c37cdf4601ff688da796016b71a727a]\n[key.wy = 0de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[sha = SHA-224]\n\n# tcId = 326\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c0e4fde0ac8d37536505f7b8bdc2d22c5c334b064ac5ed27bea9c179e021d00c4d6bf829dd547000d6f70b9ad9e9c1503bebcf1d95c2608942ca19d\n\n# tcId = 327\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00818afcaf491da9d08a7cc29318d5e85dce568dcca7018059f44e9b7e021d00bf32a233d5fc6ed8e2d9270b1bdad4bbd2a0f2c293d289bd91ffbcf3\n\n# tcId = 328\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c0e05ed675c673e5e70a4fdd5a47b114c5d542d4f6d7a367597d713ea021c26d70d65c48430373363987810bdcc556e02718eab214403ae008db4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725]\n[key.wy = 086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[sha = SHA-224]\n\n# tcId = 329\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00ab7a19eecf63e9668278963b65236b2768e57cae0e268cb86a0ddda1021d008829f5d3a3394f9467ba62e66ef1768e3e54f93ed23ec962bc443c2e\n\n# tcId = 330\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c17111a77cf79bead456ed86a7d8a935531440281eb8b15a885e341c0021d00fdc3958d04f037b1d4bb2cee307b5201be062e0d4e089df1c1917668\n\n# tcId = 331\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00acafa1e33345eeba0c338c2204b4cd8ba21de7ec3e1213317038e968021c0b42fbbaeda98a35da0de4c79546f3a0f7d9dec275d2cd671f93c874\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[sha = SHA-224]\n\n# tcId = 332\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00a3fe71a2a56f554e98fd10a8098c2a543c98bc6b3602ef39f2412308021c5d1d68f9a870ef2bc87484b3386549fae95811ab72bc0e3a514720da\n\n# tcId = 333\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c132f7625704756c13f2bfa449e60952f836f4904660b5b1da07e5a9f021d0082b4abafc40e8fd19b0c967f02fff152737ce01153658df445c4d7b7\n\n# tcId = 334\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00f36a8347c6fe0397a1161a364cbc4bdfb4d8b7894cbaa6edc55a4ff7021d009c9c90515da5e602d62e99f48eac414e913dd0b7cbf680c1a5399952\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 0fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[sha = SHA-224]\n\n# tcId = 335\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c2125ecc08e52e9e39e590117de2145bd879626cb87180e52e9d3ce03021d008f7e838d0e8fb80005fe3c72fca1b7cc08ed321a34487896b0c90b04\n\n# tcId = 336\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00e485747ac2f3d045e010cdadab4fd5dbd5556c0008445fb73e07cd90021d00e2133a7906aeac504852e09e6d057f29ab21368cfc4e2394be565e68\n\n# tcId = 337\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00a4de0d931ddab90e667ebc0ad800ce49e971c60543abdc46cefff926021c550816170bd87593b9fb8ad5ed9ab4ddb12403ff6fe032252833bac4\n\n",
+};
+static const size_t kLen59 = 103592;
+
+static const char *kData60[] = {
+    "# Imported from Wycheproof's ecdsa_secp224r1_sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7]\n[key.wy = 0eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5]\n[sha = SHA-256]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d009e82950ebe102f37ff3645cc7d3c1bab8864e5e03a5011eeba8150bc\n\n# tcId = 2\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303d021c684caf7bdbcd579b1d8a17591e98630040e1bda6d6d5780af206a0b9021d00c006293694f152d326ba30011d95554d09189c7735b26068c5101c0d\n\n# tcId = 3\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303e021d008f59422c1b4482269602cd7486aee41817a36c64d232fc411f3a1d09021d00d61e33aaaa743e2d10f55c302318c41d2236b2478a4f85fca09319fd\n\n# tcId = 4\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303e021d008c451662a222b7ed1d4e55744761bc47b8015e570e9b5390b56adf4e021d00acbe66d485b3c9cba373401f8e37fb4ff3c12bc6302cd7f8a6a65ebb\n\n# tcId = 5\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303e021d00d269d4150eb8ba7d590f35c6ad28e015d2f8cc4474c3b28d6d2c4af8021d00add458ae2267a4b3aba251104cc7b5d82c9aed339f4856b2e8397096\n\n# tcId = 6\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 303e021d00df70013e990003e109e47b31e517715cd40628fe461c690b5447abff021d00838b89938718900c0b572545d4c556f9c00e46b0da22ae3840cb03e6\n\n# tcId = 7\n# valid\nmsg = 313233343030\nresult = valid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 8\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 30813c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 9\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 303d02811c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 10\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402811c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 11\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 12\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303e0282001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 13\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040282001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 14\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 15\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 16\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303c021d3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 17\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303c021b3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 18\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 19\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 20\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3085010000003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 21\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30410285010000001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 22\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040285010000001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 23\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 24\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3045028901000000000000001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 25\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3045021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04028901000000000000001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 26\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 27\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304002847fffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 28\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402847fffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 29\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 30\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30400284ffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 31\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040284ffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 32\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 33\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30410285ffffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 34\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040285ffffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 35\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 36\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30440288ffffffffffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 37\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d",
+    "8b8a8a040288ffffffffffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 38\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30ff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 39\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 303c02ff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 40\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402ff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 41\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 42\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303c02803ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 43\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040280617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 44\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 45\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 46\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e0000021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 47\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 48\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 49\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810500\n\n# tcId = 50\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 303e021e3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 51\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810500\n\n# tcId = 52\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3041498177303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 53\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30402500303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 54\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 303e303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810004deadbeef\n\n# tcId = 55\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30412221498177021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 56\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304022202500021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 57\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3044221e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040004deadbeef021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 58\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042221498177021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 59\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0422202500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 60\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04221e021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810004deadbeef\n\n# tcId = 61\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3044aa00bb00cd00303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 62\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3042aa02aabb303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 63\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30442224aa00bb00cd00021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 64\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30422222aa02aabb021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 65\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042224aa00bb00cd00021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 66\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 3042021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042222aa02aabb021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 67\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 68\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30402280021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 69\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042280021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 70\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080313c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 71\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30402280031c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 72\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042280031c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 73\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 74\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2e3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 75\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2f3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 76\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 313c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 77\n# changing tag va",
+    "lue\nmsg = 313233343030\nresult = invalid\nsig = 323c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 78\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = ff3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 79\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 80\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c011c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 81\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c031c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 82\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c041c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 83\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303cff1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 84\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 85\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04011c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 86\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04031c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 87\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04041c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 88\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04ff1c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 89\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 90\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3040300102303b1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 91\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3040222002013a021bde5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 92\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042220020161021b7d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 93\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9\n\n# tcId = 94\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 303b1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 95\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 96\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad98100\n\n# tcId = 97\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad98105000000\n\n# tcId = 98\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981060811220000\n\n# tcId = 99\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000fe02beef\n\n# tcId = 100\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810002beef\n\n# tcId = 101\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e3000021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 102\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9813000\n\n# tcId = 103\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 303e303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 104\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 301e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04\n\n# tcId = 105\n# repeat element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 305a021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 106\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 301e021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 107\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021e3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 108\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000\n\n# tcId = 109\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021e00003ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 110\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e0000617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 111\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30200500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 112\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040500\n\n# tcId = 113\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 30200200021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 114\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040200\n\n# tcId = 115\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c38de5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 116\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c637d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 117\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a84021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 118\n# modify last byte of integer\nmsg = 313233343030\nresult =",
+    " invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad901\n\n# tcId = 119\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 303b021b3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 120\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 303b021bde5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 121\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9\n\n# tcId = 122\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b7d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 123\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021dff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 124\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 125\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3021090180021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 126\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3021021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04090180\n\n# tcId = 127\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021d013ade5c0624a5677ed7b6450d941fd283098d8a004fc718e2e7e6b441021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 128\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021dff3ade5c0624a5677ed7b6450d9421a53d481ba984280cc6582f2e5fc7021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 129\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303c021cc521a3f9db5a98812849baf26bdf441fd72b663dc4161062747575fc021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 130\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021d00c521a3f9db5a98812849baf26bde5ac2b7e4567bd7f339a7d0d1a039021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 131\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021dfec521a3f9db5a98812849baf26be02d7cf67275ffb038e71d18194bbf021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 132\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021d013ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 133\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021d00c521a3f9db5a98812849baf26bdf441fd72b663dc4161062747575fc021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 134\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d01617d6af141efd0c800c9ba3382c2119a390cfa9bed6a409bfe3703be\n\n# tcId = 135\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dff617d6af141efd0c800c9ba3382c3e454779b1a1fc5afee11457eaf44\n\n# tcId = 136\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c9e82950ebe102f37ff3645cc7d3d0508a7abf5a22672e8a95e25267f\n\n# tcId = 137\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dfe9e82950ebe102f37ff3645cc7d3dee65c6f305641295bf6401c8fc42\n\n# tcId = 138\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d01617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981\n\n# tcId = 139\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d009e82950ebe102f37ff3645cc7d3d0508a7abf5a22672e8a95e25267f\n\n# tcId = 140\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 141\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 142\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 143\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 144\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 145\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 146\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 147\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 148\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020100090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 149\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 150\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 151\n# Signature with special case values for r and s\nmsg = 313233343030\n",
+    "result = invalid\nsig = 30060201010201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 152\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 153\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 154\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 155\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 156\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 157\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020101090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 158\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 159\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 160\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 161\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 162\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 163\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 164\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 165\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 166\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30080201ff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 167\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 168\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 169\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 170\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 171\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 172\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 173\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 174\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 175\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 176\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 177\n# Signatur",
+    "e with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 178\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 179\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 180\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 181\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 182\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 183\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 184\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 185\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 186\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 187\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 188\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 189\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 190\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 191\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 192\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 193\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 194\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 195\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 196\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000010201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 197\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 198\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 199\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 200\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffff",
+    "ffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 201\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 202\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffffffff000000000000000000000001090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 203\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 204\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 205\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000020201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 206\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 207\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 208\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 209\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000001\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 210\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000002\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 211\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3024021d00ffffffffffffffffffffffffffffffff000000000000000000000002090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 212\n# Edge case for Shamir multiplication\nmsg = 3839313737\nresult = valid\nsig = 303d021c326bc06353f7f9c9f77b8f4b55464e8619944e7879402cca572e041a021d0096ad91f02a3bc40c118abd416ed5c6203ed7ced0330860d7b88c10ab\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 093b4c28f032d00f80e77491edc158359909ee9e30a7327b74219e5e2]\n[key.wy = 482c19ae35cb28afc9b95ca1ed7ad91c812d5fcceb4beddbf1a16d92]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000493b4c28f032d00f80e77491edc158359909ee9e30a7327b74219e5e2482c19ae35cb28afc9b95ca1ed7ad91c812d5fcceb4beddbf1a16d92]\n[sha = SHA-256]\n\n# tcId = 213\n# k*G has a large x-coordinate\nmsg = 313233343030\nresult = valid\nsig = 3030020f00e95c1f470fc1ec22d6baa3a3d5c1021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a\n\n# tcId = 214\n# r too large\nmsg = 313233343030\nresult = invalid\nsig = 303e021d00fffffffffffffffffffffffffffffffefffffffffffffffffffffffe021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0da927f4ba88b639bf5334221d2f54d8ef9ccc1a1125fad18c7bfb789]\n[key.wy = 0ac51ae53de6d834a9db3947b8dd4c6ac2b084b85496bfa72d86b6948]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004da927f4ba88b639bf5334221d2f54d8ef9ccc1a1125fad18c7bfb789ac51ae53de6d834a9db3947b8dd4c6ac2b084b85496bfa72d86b6948]\n[sha = SHA-256]\n\n# tcId = 215\n# r,s are large\nmsg = 313233343030\nresult = valid\nsig = 303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 20888e1c0f5694c4c0363b36482beb6e1e6649b3d3b26f127febb6fc]\n[key.wy = 0de00c2f3d8e4a7e8a0bafd417c96d3e81c975946a2f3686aa39d35f1]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000420888e1c0f5694c4c0363b36482beb6e1e6649b3d3b26f127febb6fcde00c2f3d8e4a7e8a0bafd417c96d3e81c975946a2f3686aa39d35f1]\n[sha = SHA-256]\n\n# tcId = 216\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c3d5052691b8dc89debad360466f2a39e82e8ae2aefb77c3c92ad7cd1\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 09545c86f032c5df255a4490bb0b83eca201181792ad74246874db229]\n[key.wy = 405264c283063327b70f4c2be5ab4d2e9407b866e121d6145d124c04]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00049545c86f032c5df255a4490bb0b83eca201181792ad74246874db229405264c283063327b70f4c2be5ab4d2e9407b866e121d6145d124c04]\n[sha = SHA-256]\n\n# tcId = 217\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 303d021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021d00bf19ab4d3ebf5a1a49d765909308daa88c2b7be3969db552ea30562b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 579d53f39d5109bd440e3e3e7efd603740963348ff9c72c03b0fe6b8]\n[key.wy = 0df02f133ecd60b072a0812adc752708f2be9d8c9ad5953d8c7bf3965]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004579d53f39d5109bd440e3e3e7efd603740963348ff9c72c03b0fe6b8df02f133ecd60b072a0812adc752708f2be9d8c9ad5953d8c7bf3965]\n[sha = SHA-256]\n\n# tcId = 218\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020103020101\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0d2a14c8106d89f3536faebdafcd4680f65ab4bf2243164ca1464b628]\n[key.wy = 0acaf2bee52e6231d3c980f52f8e189a41c3e3a05e591195ec864217a]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004d2a14c8106d89f3536faebdafcd4680f65ab4bf2243164ca1464b628acaf2bee52e6231d3c980f52f8e189a41c3e3a05e591195ec864217a]\n[sha = SHA-256]\n\n# tcId = 219\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020103020103\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0e892479153ad13ea5ca45d4c323ebf1fc3cd0cdf787c34306a3f79a4]\n[key.wy = 326ca9645f2b517608dc1f08b7a84cfc61e6ff68d14f27d2043c7ef5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004e892479153ad13ea5ca45d4c323ebf1fc3cd0cdf787c34306a3f7",
+    "9a4326ca9645f2b517608dc1f08b7a84cfc61e6ff68d14f27d2043c7ef5]\n[sha = SHA-256]\n\n# tcId = 220\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020103020104\n\n# tcId = 221\n# r is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a40020104\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 2b0eac35c0b294f6d435dcaffa8633b0123005465c30080adbcc103a]\n[key.wy = 0d465a63bfb71d4aee09328697fe1088753646d8369b8dc103217c219]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00042b0eac35c0b294f6d435dcaffa8633b0123005465c30080adbcc103ad465a63bfb71d4aee09328697fe1088753646d8369b8dc103217c219]\n[sha = SHA-256]\n\n# tcId = 222\n# s is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3022020103021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c6f00c4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0d156e01e33becede8f4fb4ae9521d751e7f8eb795ca00857db2fd7af]\n[key.wy = 0d73a450ec60e6a9218a8431870687e0968944f6dc5ffeb30e4693b7c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004d156e01e33becede8f4fb4ae9521d751e7f8eb795ca00857db2fd7afd73a450ec60e6a9218a8431870687e0968944f6dc5ffeb30e4693b7c]\n[sha = SHA-256]\n\n# tcId = 223\n# small r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 302302020100021d00c993264c993264c993264c99326411d2e55b3214a8d67528812a55ab\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0f293a8a2b4aff0bed95c663b364afe69778d38dd7e7a304f7d3c74e6]\n[key.wy = 17dfd09e7803c4439a6c075cb579cde652d03f7559ff58846312fa4c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004f293a8a2b4aff0bed95c663b364afe69778d38dd7e7a304f7d3c74e617dfd09e7803c4439a6c075cb579cde652d03f7559ff58846312fa4c]\n[sha = SHA-256]\n\n# tcId = 224\n# smallish r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 302702072d9b4d347952cc021c3e85d56474b5c55fbe86608442a84b2bf093b7d75f53a47250e1c70c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0d4ddf003b298cbaa7d2edc584b28b474a76162ed4b5b0f6222c54317]\n[key.wy = 0d4e4fe030f178fb4aa4a6d7f61265ecd7ef13c313606b8d341a8b954]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004d4ddf003b298cbaa7d2edc584b28b474a76162ed4b5b0f6222c54317d4e4fe030f178fb4aa4a6d7f61265ecd7ef13c313606b8d341a8b954]\n[sha = SHA-256]\n\n# tcId = 225\n# 100-bit r and small s^-1\nmsg = 313233343030\nresult = valid\nsig = 302d020d1033e67e37b32b445580bf4efb021c02fd02fd02fd02fd02fd02fd02fd0043a4fd2da317247308c74dc6b8\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 08a5bf0028f1e3eb6841dee7b8f873f68b0c560e592e3182074f51ce8]\n[key.wy = 09668c32224b65b6849713d35e3acf1786862e65b5a664b47a098caa0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00048a5bf0028f1e3eb6841dee7b8f873f68b0c560e592e3182074f51ce89668c32224b65b6849713d35e3acf1786862e65b5a664b47a098caa0]\n[sha = SHA-256]\n\n# tcId = 226\n# small r and 100 bit s^-1\nmsg = 313233343030\nresult = valid\nsig = 302302020100021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b53e569b18e9361567e5713ee69ecbe7949911b0257546a24c3dd137]\n[key.wy = 0f29a83334cff1c44d8c0c33b6dadb8568c024fa1fbb694cd9e705f5a]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b53e569b18e9361567e5713ee69ecbe7949911b0257546a24c3dd137f29a83334cff1c44d8c0c33b6dadb8568c024fa1fbb694cd9e705f5a]\n[sha = SHA-256]\n\n# tcId = 227\n# 100-bit r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 302e020d062522bbd3ecbe7c39e93e7c24021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 77f3ebf52725c809acbb19adf093126a2a3a065ca654c22099c97812]\n[key.wy = 09f1948d23c5158ec2adff455eb2fedf1075d4ec22d660977424a10f7]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000477f3ebf52725c809acbb19adf093126a2a3a065ca654c22099c978129f1948d23c5158ec2adff455eb2fedf1075d4ec22d660977424a10f7]\n[sha = SHA-256]\n\n# tcId = 228\n# r and s^-1 are close to n\nmsg = 313233343030\nresult = valid\nsig = 303d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29bd021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0a7f7b99e5cdc6fec8928eff773ccdf3b68b19d43cdb41809e19c60f3]\n[key.wy = 1736b7a0c12a9c2d706671912915142b3e05c89ef3ad497bd6c34699]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004a7f7b99e5cdc6fec8928eff773ccdf3b68b19d43cdb41809e19c60f31736b7a0c12a9c2d706671912915142b3e05c89ef3ad497bd6c34699]\n[sha = SHA-256]\n\n# tcId = 229\n# s == 1\nmsg = 313233343030\nresult = valid\nsig = 3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020101\n\n# tcId = 230\n# s == 0\nmsg = 313233343030\nresult = invalid\nsig = 3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020100\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 09cf00010b4ad86636f6cc70fb58c3b995c0d12e46fc58e24b0d28f69]\n[key.wy = 21c8a8a320cc450ccb15ebd71617f4ed25db4d3413fbdf157d31dbb6]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00049cf00010b4ad86636f6cc70fb58c3b995c0d12e46fc58e24b0d28f6921c8a8a320cc450ccb15ebd71617f4ed25db4d3413fbdf157d31dbb6]\n[sha = SHA-256]\n\n# tcId = 231\n# point at infinity during verify\nmsg = 313233343030\nresult = invalid\nsig = 303c021c7fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e151e021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 10518eb7a926b5f7b65be801ec9b2abf76adce25c6152e452a3512c8]\n[key.wy = 3f322b9ab57ea8352ad29beb99ef356b713432fcc4aef31f903045d9]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000410518eb7a926b5f7b65be801ec9b2abf76adce25c6152e452a3512c83f322b9ab57ea8352ad29beb99ef356b713432fcc4aef31f903045d9]\n[sha = SHA-256]\n\n# tcId = 232\n# u1 == 1\nmsg = 313233343030\nresult = valid\nsig = 303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 08a5dfedc9dd1cb9a439c88b3dd472b2e66173f7866855db6bb6c12fd]\n[key.wy = 3badfbb8a4c6fd80e66510957927c78a2aa02ecef62816d0356b49c3]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00048a5dfedc9dd1cb9a439c88b3dd472b2e66173f7866855db6bb6c12fd3badfbb8a4c6fd80e66510957927c78a2aa02ecef62816d0356b49c3]\n[sha = SHA-256]\n\n# tcId = 233\n# u1 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 083a59fc3df295e84c290b32d0b550a06f99456fc2298e4a68c4f2bff]\n[key.wy = 1b34f483db30db3a51d8288732c107d8b1a858cd54c3936e1b5c11a4]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000483a59fc3df295e84c290b32d0b550a06f99456fc2298e4a68c4f2bff1b34f483db30db3a51d8288732c107d8b1a858cd54c3936e1b5c11a4]\n[sha = SHA-256]\n\n# tcId = 234\n# u2 == 1\nmsg = 313233343030\nresult = valid\nsig = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 58bada578a205d6e170722c8ed6c7715011fe33d7eba869ed1d448a7]\n[key.wy = 5be4730c1d2d2ef881e02f028a241b7d7d3b0d0b4a9c0565fcb49977]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000458bada578a205d6e170722c8ed6c7715011fe33d7eba869ed1d448a75be4730c1d2d2ef881e02f028a241b7d7d3b0d0b4a9c0565fcb49977]\n[sha = SHA-256]\n\n# tcId = 235\n# u2 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00aaaaaaaaaaaaaaaaaaaaaaaaaaaa0f17407b4ad40d3e1b8392e81c29\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 7fcc799b919fe9789ce01dd9202731cb7d815158bc6cb8468760247c]\n[key.wy = 0f9d2957e0dd5e4c40124bd5e0dd1be41c038fce2cd1dc814e0af37d]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00047fcc799b919fe9789ce01dd9202731cb7d815158bc6cb846876024",
+    "7c0f9d2957e0dd5e4c40124bd5e0dd1be41c038fce2cd1dc814e0af37d]\n[sha = SHA-256]\n\n# tcId = 236\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0093c8c651653430cb4f1675fc86b5e82ca04ff2ab1501674476aac169\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 3ddd68f69d0bfd47ad19370fa3dc72eb258268c2b5f3768852151674]\n[key.wy = 0fbe0e155d94d2373a01a5e70f1a105259e7b8b1d2fdf4dba3cf4c780]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00043ddd68f69d0bfd47ad19370fa3dc72eb258268c2b5f3768852151674fbe0e155d94d2373a01a5e70f1a105259e7b8b1d2fdf4dba3cf4c780]\n[sha = SHA-256]\n\n# tcId = 237\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d009df50acc33b3625a2d5940dd13dbb97d1f7dd56afff8b7de7545127c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 1cb1f564c29ebf60a342b3bc33c8945cb279c6c1a012255c874e1c37]\n[key.wy = 0b75191ab3b2bb730914ebfa14080410970b71eaf4fe01e2d48be9891]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00041cb1f564c29ebf60a342b3bc33c8945cb279c6c1a012255c874e1c37b75191ab3b2bb730914ebfa14080410970b71eaf4fe01e2d48be9891]\n[sha = SHA-256]\n\n# tcId = 238\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00dce8c223f235699d1f5d2dcde4809d013390b59129f783239525c08f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 44e309eb686e7af7f1e2cc17fd56542b38910b3b7908ea54fb038d36]\n[key.wy = 477e829d4c8332e5b29f344ad27a21c18dab24a31ce7985b63a21304]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000444e309eb686e7af7f1e2cc17fd56542b38910b3b7908ea54fb038d36477e829d4c8332e5b29f344ad27a21c18dab24a31ce7985b63a21304]\n[sha = SHA-256]\n\n# tcId = 239\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c074aae944ee7a7d544a5ad0bd06366f872d2250ba3018a63d2a7f2e6\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0c728064542cb5142f5eefe638124dcd7a1ad0b3555842a47dd5108e1]\n[key.wy = 10129dd878ebd47313276cec86f521ea9585cd105b3dc421141993b8]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004c728064542cb5142f5eefe638124dcd7a1ad0b3555842a47dd5108e110129dd878ebd47313276cec86f521ea9585cd105b3dc421141993b8]\n[sha = SHA-256]\n\n# tcId = 240\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00aae944ee7a7d544a5ad0bd0636d9455f4e83de0f186f89bca56b3c5c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0c46c1ad3d3d0df8e9c0f525c21ce8d81ef9d66297f442d6309966722]\n[key.wy = 0cfa2253aa31a98d8966b85969bf9c819c019292ef6a53ac1db2a108]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004c46c1ad3d3d0df8e9c0f525c21ce8d81ef9d66297f442d63099667220cfa2253aa31a98d8966b85969bf9c819c019292ef6a53ac1db2a108]\n[sha = SHA-256]\n\n# tcId = 241\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c55d289dcf4faa894b5a17a0c6db3741bbc4ecbe01d01ea33ee7a4e7b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b7b2e48c1e60e20925f4d9b6be600dd83786a936c9bfab00639c33ca]\n[key.wy = 0a967cbc65070739a3379da80d54843a18d9c11a29a32234a0b303c12]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b7b2e48c1e60e20925f4d9b6be600dd83786a936c9bfab00639c33caa967cbc65070739a3379da80d54843a18d9c11a29a32234a0b303c12]\n[sha = SHA-256]\n\n# tcId = 242\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c4ee7a7d544a5ad0bd0636d9e12bc561ce04faaf1312bba3a15601ebc\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0f4a3d4598875af7f2741bbd67b1733b6541bc5325b3bcb4d3267c27e]\n[key.wy = 0c30bf322f58a45c6c2aa2ced55f175d1cbf72a7c5bfc464d74f666c0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004f4a3d4598875af7f2741bbd67b1733b6541bc5325b3bcb4d3267c27ec30bf322f58a45c6c2aa2ced55f175d1cbf72a7c5bfc464d74f666c0]\n[sha = SHA-256]\n\n# tcId = 243\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c361b9cd74d65e79a5874c501bca4973b20347ec97f6de10072d8b46a\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 56d1e5c1d664f6ce2fc1fcb937a7ce231a29486abf36c73f77a2bd11]\n[key.wy = 6cb282c9d7c6fc05f399c183e880ea362edf043cd28ffac9f94f2141]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000456d1e5c1d664f6ce2fc1fcb937a7ce231a29486abf36c73f77a2bd116cb282c9d7c6fc05f399c183e880ea362edf043cd28ffac9f94f2141]\n[sha = SHA-256]\n\n# tcId = 244\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c3739ae9acbcf34b0e98a0379492e764068fd92fedbc200e5b168d4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 30bce8c6b7f1bbba040b8d121d85d55167ac99b2e2cf1cfac8b018b5]\n[key.wy = 0f1c384c35be0ae309a5cb55aba982343d2125f2d4a559d8c545359cd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000430bce8c6b7f1bbba040b8d121d85d55167ac99b2e2cf1cfac8b018b5f1c384c35be0ae309a5cb55aba982343d2125f2d4a559d8c545359cd]\n[sha = SHA-256]\n\n# tcId = 245\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00a252d685e831b6cf095e4f0535edc5b1609d7c5c7e49a301588a1d3e\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0e87e538a978cf187908beb27a4a247d496a8421dab1fe79f8744d2b5]\n[key.wy = 539b9f8fe8bddcf7c97c44c55a4fc22f4d78f6a961447a5b613b5c49]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004e87e538a978cf187908beb27a4a247d496a8421dab1fe79f8744d2b5539b9f8fe8bddcf7c97c44c55a4fc22f4d78f6a961447a5b613b5c49]\n[sha = SHA-256]\n\n# tcId = 246\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00ee746111f91ab4ce8fae96e6f23fd9d20a24d2e79eea563478c0f566\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 113a2cc57c8ee7de11bc45e14546c72a29725b9a7218114ac31f0281]\n[key.wy = 6c765b9a46b0215312a3292f5979c98d37b35883baa156281b1bae8c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004113a2cc57c8ee7de11bc45e14546c72a29725b9a7218114ac31f02816c765b9a46b0215312a3292f5979c98d37b35883baa156281b1bae8c]\n[sha = SHA-256]\n\n# tcId = 247\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffffb2364ae85014b149b86c741eb8be\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 23dd9c3f1a4b478b01fa2c5e997d0482073b32918de44be583dcf74a]\n[key.wy = 0d661a5ed579a2f09d2ff56d6b80f26568d93a237ca6444b0cadc7951]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000423dd9c3f1a4b478b01fa2c5e997d0482073b32918de44be583dcf74ad661a5ed579a2f09d2ff56d6b80f26568d93a237ca6444b0cadc7951]\n[sha = SHA-256]\n\n# tcId = 248\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00855f5b2dc8e46ec428a593f73219cf65dae793e8346e30cc3701309c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0bbce4b17d45d24a1c80bc8eca98c359d5e1e458058a00b950643256d]\n[key.wy = 0fe09e092318e39303dca03688e4ecf300300784312d617e5088c584c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004bbce4b17d45d24a1c80bc8eca98c359d5e1e458058a00b950643256dfe09e092318e39303dca03688e4ecf300300784312d617e5088c584c]\n[sha = SHA-256]\n\n# tcId = 249\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2db5f61aea817276af2064e104c7a30e32034cb526dd0aacfa56566f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 35f58446c1bdbeaa56660a897ebf965f2d18820c7cd0630f04a4953]\n[key.wy = 47bdfaea60091f405e09929cb2c0e2f6eed53e0871b7fe0c",
+    "d5a15d85]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004035f58446c1bdbeaa56660a897ebf965f2d18820c7cd0630f04a495347bdfaea60091f405e09929cb2c0e2f6eed53e0871b7fe0cd5a15d85]\n[sha = SHA-256]\n\n# tcId = 250\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0084a6c7513e5f48c07fffffffffff8713f3cba1293e4f3e95597fe6bd\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0911c0033eac46332691cb7920c4950eed57354761e1081a1ea9f1279]\n[key.wy = 508ebf7cfd3eab5dabdee1be14ce8296b1fc20acfaac16f7824c6002]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004911c0033eac46332691cb7920c4950eed57354761e1081a1ea9f1279508ebf7cfd3eab5dabdee1be14ce8296b1fc20acfaac16f7824c6002]\n[sha = SHA-256]\n\n# tcId = 251\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c7513e5f48c07ffffffffffffff9d21fd1b31544cb13ca86a75b25e\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 62b2abb70bb9c7efdfb57181f433b64751f108130dce180d6992e7d3]\n[key.wy = 124b3aa8a53e5eedf72aa67e6edcc71f19e36e6ad1d099a59ffd9555]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000462b2abb70bb9c7efdfb57181f433b64751f108130dce180d6992e7d3124b3aa8a53e5eedf72aa67e6edcc71f19e36e6ad1d099a59ffd9555]\n[sha = SHA-256]\n\n# tcId = 252\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d8ea27cbe9180fffffffffffffff3a43fa3662a899627950d4eb64bc\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0f759330e7992752aae6a85f7bb0599784bea53e288ff7ee8d53d5e6]\n[key.wy = 0defe617362380e92f9a23c4fdcc34e09713aab9cc44119418f6f2fd1]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00040f759330e7992752aae6a85f7bb0599784bea53e288ff7ee8d53d5e6defe617362380e92f9a23c4fdcc34e09713aab9cc44119418f6f2fd1]\n[sha = SHA-256]\n\n# tcId = 253\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3e5f48c07fffffffffffffffffffc724968c0ecf9ed783744a7337b3\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 08f2eda42742ab31f5d4cf666892d1d623efd3b26f7df9aa70296e80d]\n[key.wy = 3beaf235cfea41fadb98c533a8fdeb5841d69ee65f6e71914711f138]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00048f2eda42742ab31f5d4cf666892d1d623efd3b26f7df9aa70296e80d3beaf235cfea41fadb98c533a8fdeb5841d69ee65f6e71914711f138]\n[sha = SHA-256]\n\n# tcId = 254\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00bfffffffffffffffffffffffffff3d87bb44c833bb384d0f224ccdde\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 2bcf4371b319a691ed0e2e0c4a55a8a9b987dec86b863621e97b9c09]\n[key.wy = 5b8660a74cc964a6af0311edc6b1cd980f9c7bf3a6c9b7f9132a0b2f]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00042bcf4371b319a691ed0e2e0c4a55a8a9b987dec86b863621e97b9c095b8660a74cc964a6af0311edc6b1cd980f9c7bf3a6c9b7f9132a0b2f]\n[sha = SHA-256]\n\n# tcId = 255\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffff646c95d0a029629370d8e83d717f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0a6f252568f6fbd1ae045e602344359c0c216911723748f9a3e7fadec]\n[key.wy = 3b76efc75ba030bfe7de2ded686991e6183d40241a05b479693c7015]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004a6f252568f6fbd1ae045e602344359c0c216911723748f9a3e7fadec3b76efc75ba030bfe7de2ded686991e6183d40241a05b479693c7015]\n[sha = SHA-256]\n\n# tcId = 256\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e1520\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0a74c1c3a31c7d493ab2c0af89cf5e688621ca9466d2ba1d8761c3fe8]\n[key.wy = 2ba0d08f4c9f76856c2b7138c8f1e780b6959992b16ccdfd925f4b3a]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004a74c1c3a31c7d493ab2c0af89cf5e688621ca9466d2ba1d8761c3fe82ba0d08f4c9f76856c2b7138c8f1e780b6959992b16ccdfd925f4b3a]\n[sha = SHA-256]\n\n# tcId = 257\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0096dafb0d7540b93b5790327082635cd8895e1e799d5d19f92b594056\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 34ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f2]\n[key.wy = 080562acc9b49f2d7fcc89421d2a5db2ea8dd0361fb48d897d4612627]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004034ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f280562acc9b49f2d7fcc89421d2a5db2ea8dd0361fb48d897d4612627]\n[sha = SHA-256]\n\n# tcId = 258\n# point duplication during verification\nmsg = 313233343030\nresult = valid\nsig = 303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c3f552f1c2b01651edf5902650fe9ab046f71999ac928edc0087bdb13\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 34ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f2]\n[key.wy = 7fa9d53364b60d2803376bde2d5a24d05722fc9e04b727682b9ed9da]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004034ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f27fa9d53364b60d2803376bde2d5a24d05722fc9e04b727682b9ed9da]\n[sha = SHA-256]\n\n# tcId = 259\n# duplication bug\nmsg = 313233343030\nresult = invalid\nsig = 303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c3f552f1c2b01651edf5902650fe9ab046f71999ac928edc0087bdb13\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 3672ba9718e60d00eab4295c819ea366a778dd6fd621fa9665259cb6]\n[key.wy = 7ae5e847eeaea674beeb636379e968f79265502e414a1d444f04ae79]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00043672ba9718e60d00eab4295c819ea366a778dd6fd621fa9665259cb67ae5e847eeaea674beeb636379e968f79265502e414a1d444f04ae79]\n[sha = SHA-256]\n\n# tcId = 260\n# comparison with point at infinity \nmsg = 313233343030\nresult = invalid\nsig = 303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 33eeefbfc77229136e56b575144863ed90b4c0f8a9e315816d6de648]\n[key.wy = 51749dd11480c141fb5a1946313163c0141265b68a26216bcb9936a]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000433eeefbfc77229136e56b575144863ed90b4c0f8a9e315816d6de648051749dd11480c141fb5a1946313163c0141265b68a26216bcb9936a]\n[sha = SHA-256]\n\n# tcId = 261\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0c520b18003b356094147ee2f9df1178572bed837bd89443b25ebceb8]\n[key.wy = 0e2e93a998fbbabe82192ea4c85651cf09a95ab0dc2e3d975ee7be98]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004c520b18003b356094147ee2f9df1178572bed837bd89443b25ebceb80e2e93a998fbbabe82192ea4c85651cf09a95ab0dc2e3d975ee7be98]\n[sha = SHA-256]\n\n# tcId = 262\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21]\n[key.wy = 0bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00",
+    "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34]\n[sha = SHA-256]\n\n# tcId = 263\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303d021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n# tcId = 264\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303c021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21]\n[key.wy = 42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd]\n[sha = SHA-256]\n\n# tcId = 265\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303d021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n# tcId = 266\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 303c021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f021c249249249249249249249249249227ce201a6b76951f982e7ae89851\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466]\n[key.wy = 0ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a00044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176]\n[sha = SHA-256]\n\n# tcId = 267\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021c0364e7d96832614a80216e730c353534d4bffd2c26649c0b4b0e2628021d008f40064b412fe38c5ba9cf664e6172ed48e6e79f0fe5e31a54985dfc\n\n# tcId = 268\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303e021d00b41091a5d3fbacfb8cf5633536cbe1d9fcf21e6d68cc9778490e058d021d00fb62cf967601d20f34f43cb138f57b7e0ba1f0b900faf0ea2bb1fc14\n\n# tcId = 269\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d00d0f1072fd6283d4d60ee043f6c78b6e3ca9c1cce4caaf9ae4874b2c9021c49e7aa1cc6e8c7833bd67a8880329b96ece3d4fda1c0fcaf53daadac\n\n# tcId = 270\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d009124453ca4b811d8a50834a092ef6a32ce6db98e72a66a140fe33b9f021c20cd9182f7d9d42e1e67ea77b92190afaaa4ff664cfc684e0f384eb1\n\n# tcId = 271\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303e021d00c8db428f70740b9a2769e50ef6c8897a58f2b805d3630556a23025e1021d00a1eaa6d5b7f44109f839a66ee6463f16c2ca7ca0fb20ea4eb992ac10\n\n# tcId = 272\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303e021d00f3142ef7e66d0434c9d2db4187183504d7ab2692d5a8c92e4dc08883021d00b8f43460ff89694721da3d8dfa21d9cf09eccc4ec97ad8216719b3c4\n\n# tcId = 273\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021c5b1c9ef283f70dbacae11eaa63f13e6b5a33dbcdb329c3ceeab98848021d00f70ebe657369f642c61d643bdf52d49b07a68d80279561958c3102d9\n\n# tcId = 274\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d00d4340200c221c443f6763120ecafca40a327dd6e40dae29641b11205021c3c9b65e174695e62117579f4ca5903044320e48d6ccec91446426325\n\n# tcId = 275\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021c53df2654f17e3c002c7f464e9aff8c3dcaa1b8f0122c8a4b86e9c4e5021d00cae45907fa41b790c7e90f0669ae3e76ff0a3de0b585998e81df34c1\n\n# tcId = 276\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 303d021d00bea17b9096e2bc7e041cdef9ec91f42b827ee8c8228d65d9bf7a9711021c13e245afc9277f7e32714fd7b3d95872aa689b219ac0acf050c1d9ec\n\n# tcId = 277\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021d00f4b68df62b9238363ccc1bbee00deb3fb2693f7894178e14eeac596a021c7f51c9451adacd2bcbc721f7df0643d7cd18a6b52064b507e1912f23\n\n# tcId = 278\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021c6f66f0f4d6fe7620666bb98e24769a58af83693d42cd7769b3caeabf021d00818ad21034973894236d27a9bcd736eb9ac631caeb196ed4c97ce7f5\n\n# tcId = 279\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303c021c30d85a8bd9d7750d036da6cd2e8d590d23d54d60a07fb32e1c170402021c420de69e400c572c36ce3b35e40a4b47bedfbe3a7af58f8ceb4066ed\n\n# tcId = 280\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021d00e01302d4273341f11ef9788ac1e525a45f2659d7a8a64885aec54ae1021c3a886ab91681c019476753253fdda416731aad946b91886214fe0650\n\n# tcId = 281\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303c021c3afd7abd885aae32de3ef49cb331155334bb4309e4eda73ac4aee400021c1d51e8a79b85335560dfb118a8f4cf16ee3641a782d3ee5e455a63b6\n\n# tcId = 282\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021c07c73dae6b6f894bf1aeb340eaf06cbdf5556887aeed306ca87bb4a7021d00f0e98ce504608ac63b30b7d581a9ee44a5b439736a20661a0d0656a8\n\n# tcId = 283\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021c3d8216344b7480e25230dd4608b7ca09a63ae352f9961c2a3088676f021d00e71d2d7e78aae7f826b1d30a06f89f8fbe8702e639d85cf15b3ecb06\n\n# tcId = 284\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021c24e768c333808f0f0eb05b3ddf95d5530f8670334e742ff4ad783ef9021d00f4da768f939e12c7cecc90c45cfff173ea1fc4237290b17d2acbf8a9\n\n# tcId = 285\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303d021d00b1d7988d9bcd4f7a7b643e391f5b37d9f56a6ca4ab81c9a5a2b72d14021c518da4c39db722cdae6d1a8f0268ded4e4522926b672b4bd14ef8564\n\n# tcId = 286\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 303c021c6374f85c920dace4b5828384b05696d0bd7cc0992f804a8059247538021c01b8f519efc35f104cc83be9280c44b4345cafcda02b944744a931c7\n\n# tcId = 287\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021d00b2970cdec29c70294a18bbc49985efa33acc0af509c326a3977a35e8021c0cea3ed8ebaaf6ee6aef6049a23cbc39f61fcf8fc6be4bab13385579\n\n# tcId = 288\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021d00bc9052305d076c009f0250d888d0fae950bbdf53e42fc5b35850d4c5021c400a143f82c3b045ce46742aca8a1af966cc4b04e10fe96090374d36\n\n# tcId = 289\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c7a57cfac41911d334dde984ef64bacf978fb04c77ffe00892e611fad021c52a3f891c2877d433b6b5799ca6f774941370654e17811b2fc401974\n\n# tcId = 290\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c2092d6e7a86055b119e1f6f97b21ac3789e78804d0e25ff2945ad240021c3099207c5088715cb79437724b84018459553e82e6a72e6791cc2b02\n\n# tcId = 291\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303e021d0089b1dfa081bc9200d86bcf63c75e80fab8b8b11270768fa0ed07d45e021d008c2299775762dd15aefb1a18d9adac8dc756f4619e5fc3c526922100\n\n# tcId = 292\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021d00b16307867551b63b168131371c2eb6e8fab7d1ecfec6fde744e0ec51021c2f3ad86ba61343dc7d33908f83feb28a5b63aba08e3e990bdd441ab1\n\n# tcId = 293\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303e021d00b712f2b41da5c8265797d52b946fb79ecfe70544f83be0badbe4b71c021d00b02018a67a61d7df4d04aef55bafabd50e56840733b99b781185667f\n\n# tcId = 294\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303d021d008972a6fc414736cfc4a57704dc2d76857738366a4175acb71eb3aa59021c0bfdc4fd4b6d9e6afb62b9f5e41c8cbac2790dd9fa06a72df6e0d0d8\n\n# tcId = 295\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303e021d00da7640586f3f0aae5fb1c3e32da59b3322c24d6303d1d006d50f74b5021d00c5462bf20238cdd4e534494629561aa111480d08b48557e69fc17f3e\n\n# tcId = 296\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 303c021c05c302ce36d5b7ba053cc9c9c26095e887df0f7e190396e13e487905021c52cb970da954ac97f3c507399451dcf28a4d37871b66b46f99c58531\n\n# tcId = 297\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303d021c7e7b0eb7da8c68a7072b11404ee95a5c407fbfe3d69646802e28ae77021d00d409a2f6bbaae59bb60fc0a092b12fa4e67dc8d088cf19a833322fd6\n\n# tcId = 298\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303d021c0d81b5454f87f6000460dc7819b6fc712c042645340e0f4196f046e9021d00aa2efd27ccc7b942bcf",
+    "ebce7e735125227e2bdadcb943efa88f1f42e\n\n# tcId = 299\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303c021c09b59a8f079529fad06c514abaf356537f9bc2eedfefc595aace6c48021c721310942b44535e02f455015143fffe3dae9e5193a4ef1eeff94686\n\n# tcId = 300\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303d021d0092f268abc43239955edad0766503714b4e156ec436df34b1da00b2c2021c580cab7733f22244b5c74ceae56e048b260c2d1e8b96b15997145ba4\n\n# tcId = 301\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303c021c514ef0e344b5cb8de93212d0493192437f86090ecc284dae54f74a60021c42e510fc18cd8c39113d4153dc2fc59dd2efaf22bd9330119458820a\n\n# tcId = 302\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303e021d008a16dcf2e449678047e967a2c281c6500b6cdfddf631d784ff60fb68021d00b16ac240544d86b9b40e4baf4d53f1ee33fdf8161830ccad4d2f354e\n\n# tcId = 303\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303c021c6f84179e3ea956abbf31daebace7b443c7a0e9f9641fa8fe4f4f9be9021c39df090fbe36b37c2aab1cbd61d7a5138c4b709e70606bcf99ff16ae\n\n# tcId = 304\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303d021d00c0f2d12d910cf6bc0c4d09443a6da8247649e1724f95bddd711e2f64021c766bf054f829d02db13c6aa8536e00e5e30e5313a868e0a7851fcdcc\n\n# tcId = 305\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303e021d00ca3d5f3822b905db4786b88e0ca370555825971d1a4b7fcc37bb1ed0021d00a3c21935732cd227a4f592c91cdd2509c078984b38a37cf530338364\n\n# tcId = 306\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 303d021d00e1e6139431452e5cb96dc75677cbb3f1892b98e8fa2ba3f62ed8ea1a021c735daa1083e15eefad9357f76f83198448daffea42d34946d6c48b1f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf]\n[key.wy = 08a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000]\n[sha = SHA-256]\n\n# tcId = 307\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c519bf185ff4635271961fa491be257231deeea9c53a6ede3b4a89ed1021c486bdad484a6a3134e1471cf56a9df0fac50f773b3e37d6f327617d7\n\n# tcId = 308\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c09fd644898b7cb5d018b52234e7b4ef2b54789afd0ce9c434e9e5515021d00f19309532164ea2053cae55df7bdcbab536c83ea7bfe6fe10d60c1ab\n\n# tcId = 309\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00ec919d4e283ccf1f71a9e3c0f781a36758d3f38b1b78a87a74288e80021c4c4663044a73c79bd88f0dc245ab1a32f89f06f40a704b31e9fabc51\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1]\n[key.wy = 73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff]\n[sha = SHA-256]\n\n# tcId = 310\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00c51760478447217597ecc6f4001bd45088d53c90f53103608bf88aea021d00a201253aa903f9781e8992101d7171d2dd3a5d48c44d8e1d544cd6d7\n\n# tcId = 311\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c76be0112674ec29128823e1af7512e6143872fef30a64e2f1799bd56021c187e503e1a48c27b549fe0a4ce5e581e242c8663fc9efb02d6f2b193\n\n# tcId = 312\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c36245ef126b5b51e459f84eaaad5a495061f0471dc8c23f1c5f16282021c39e31d72a06ba8e14fcf95778e07bc16a2628e39449da8857d506edc\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000]\n[key.wy = 0eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0]\n[sha = SHA-256]\n\n# tcId = 313\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c258682975df8bca7f203f771ebeb478ef637360c860fc386cfb21745021c7663e70188047e41469a2a35c8c330dd900f2340ba82aafd22962a96\n\n# tcId = 314\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d0085c98614f36c0d66f8d87834cae978611b7b4eebf59a46bea1b89ae9021d00d1a18e378dda840e06b60f6279bf0a2231d9fa2d8d2c31e88bc1bdd7\n\n# tcId = 315\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00ca7b7432ba41ff2112e1116fffde89bbd68f5ce67fe5513d16c8e6f7021d00e421b7599e0180798acc2006451603cda2db1d582741116e6033ce5f\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff]\n[key.wy = 41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd]\n[sha = SHA-256]\n\n# tcId = 316\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c19397fe5d3ecabf80fc624c1bf379564387517c185087dc97d605069021c33b5773e9aaf6c34cb612cfc81efd3bf9c22224e8c4fa1bfccf5c501\n\n# tcId = 317\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c70f24f5c164164bfbb8459aa12a981aa312dbcf00204326ebaaabdc8021d00f5cebee8caedae8662c43501665084b45d2f494fb70d603043543dc4\n\n# tcId = 318\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c0bf2d86ecaa8b56aca5e8f8ebcb45081d078a14555b75f5be8e9b132021d009a55b3ce4734849966b5034ccd9b19f76407ee0241c3f58e7b8fc89a\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5]\n[sha = SHA-256]\n\n# tcId = 319\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00bfc5dc4434cd09369610687d38d2d418b63fd475dea246a456b25a3a021d00b171dfa6cf722f20816370a868785da842b37bac31d7b78e6751fc50\n\n# tcId = 320\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d008fdbe8da646c5642d767c7dbeb3872b1edab6e37365805f0e94ce0a9021d00bcf35ab81222883dd3526cb0cf93138f4687cd0b10c2b0a126385161\n\n# tcId = 321\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00e23a11275848fd4f8b6f4ac4fc305eae981d3b7dc453e5a980c46422021c1a875693f24a03ea1614c4c3bbd0dd7221429f22b337ea7d98348ca4\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a]\n[key.wy = 0ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c]\n[sha = SHA-256]\n\n# tcId = 322\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c76645164ff9af3a1a9205fda2eef326d2bffc795dcc4829547fe01dd021d00b65bba503719314b27734dd06b1395d540af8396029b78b84e0149eb\n\n# tcId = 323\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c32fa0ca7e07f1f86ac350734994e1f31b6da9c82f93dced2b983c29c021c",
+    "7b7891282206a45711bdfcb2a102b5d289df84ff5778548603574004\n\n# tcId = 324\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c2d5492478ca64e5111dfd8521867b6477b7e78227849ad090b855694021d00a532f5a2fa3594af81cd5928b81b4057da717be5fb42a3a86c68190d\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0f7e4713d085112112c37cdf4601ff688da796016b71a727a]\n[key.wy = 0de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1]\n[sha = SHA-256]\n\n# tcId = 325\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c191eee5daf55cd499e8539cb2cff797cfec5d566d2027bf9f8d64693021d00dadfeae8131f64d96b94fd340197caa2bc04818554812feef3343070\n\n# tcId = 326\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00e0e2c08180b8a207ee9105a7d379fa112368e8370fa09dfde4a45c45021d00c717bc0860e016e7ce48f8fe6a299b36906a6055adad93b416ce8838\n\n# tcId = 327\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c1b919ef93532292743bb2e1b7b4894fd847c6e5de52a08e1b0f2dcfb021d00c2d30d6b7594d8dbd261491ae1d58779505b075b64e5564dc97a418b\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725]\n[key.wy = 086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e]\n[sha = SHA-256]\n\n# tcId = 328\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00e75db49ed33ff2885ea6100cc95b8fe1b9242ea4248db07bcac2e020021c796c866142ae8eb75bb0499c668c6fe45497692fbcc66b37c2e4624f\n\n# tcId = 329\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c1f81cd924362ec825890307b9b3936e0d8f728a7c84bdb43c5cf0433021c39d3e46a03040ad41ac026b18e0629f6145e3dc8d1e6bbe200c8482b\n\n# tcId = 330\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c00fda613aa67ca42673ad4309f3f0f05b2569f3dee63f4aa9cc54cf3021c1e5a64b68a37e5b201c918303dc7a40439aaeacf019c5892a8f6d0ce\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc]\n[sha = SHA-256]\n\n# tcId = 331\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303e021d00b932b3f7e6467e1ec7a561f31160248c7f224550a8508788634b53ce021d00a0c5312acf9e801aff6d6fc98550cfa712bbf65937165a36f2c32dc9\n\n# tcId = 332\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d00e509593fb09245ee8226ce72786b0cc352be555a7486be628f4fd00c021c0b7abde0061b1e07bf13319150a4ff6a464abab636ab4e297b0d7633\n\n# tcId = 333\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c6e54f941204d4639b863c98a65b7bee318d51ab1900a8f345eac6f07021c0da5054829214ecde5e10579b36a2fe6426c24b064ed77c38590f25c\n\n[key.curve = secp224r1]\n[key.keySize = 224]\n[key.type = ECPublicKey]\n[key.wx = 0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1]\n[key.wy = 0fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[keyDer = 304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945]\n[sha = SHA-256]\n\n# tcId = 334\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021d0085ea4ab3ffdc992330c0ca8152faf991386bce82877dbb239ba654f6021c0806c6baf0ebea4c1aaa190e7d4325d46d1f7789d550632b70b5fc9b\n\n# tcId = 335\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303d021c44d53debb646b73485402eab2d099081b97b1243c025b624f0dd67ea021d00e5de789a7d4b77eac6d7bba41658e6e4dc347dabed2f9680c04a6f55\n\n# tcId = 336\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 303c021c1526eb2f657ebea9af4ca184b975c02372c88e24e835f3f5774c0e12021c1f1ecce38ee52372cb201907794de17b6d6c1afa13c316c51cb07bc7\n\n",
+};
+static const size_t kLen60 = 102850;
+
+static const char *kData61[] = {
+    "# Imported from Wycheproof's ecdsa_secp256r1_sha256_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.4\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838]\n[key.wy = 0c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e]\n[sha = SHA-256]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76\n\n# tcId = 2\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 3046022100e43dc0edacf7345544d7c28547949164bf882dedcc9db1be918caa02a5f7f7ca022100eb313df522aa9e6dbc0cd45d1ea6edaebd858dca4780a940014363ff7600118d\n\n# tcId = 3\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 304502204d1b36126feee49ec974650f8d1a335f8d210e60949642348ad71e476a35cdfe022100a890b9ddbb3f2089ea69fd117fb349ed054c0f0830f671c1a639ed88eec0bc75\n\n# tcId = 4\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 304502200e285057b2f96995a3e6a6511cc4a83a791491610ae3f3571d8ab1080b726cc4022100d8b8325f25fb663eda57d958cc174fa8c36d19d2ccb76d5ac4488d776fcf0b8d\n\n# tcId = 5\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 3046022100caf80e1656e0a20237b7c39c8bffdf1831efef84a0b5bd7d404fec77b20efecd022100e8352a15bf01544331281f2f71fd913003acabbc6ab0f47cdc58c8d7bc8a6cd5\n\n# tcId = 6\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 304502206160cb08f98f68d6c62b45babea51bd439d9003a40acb38295f63929bf26027e0221008f6b86c954822054da763c5dc9e5ce22e08814904e438311fa4ff2d79e9f9795\n\n# tcId = 7\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n# Some implementations of ECDSA and DSA incorrectly encode r and s by not\n# including leading zeros in the ASN encoding of integers when necessary. Hence,\n# some implementations (e.g. jdk) allow signatures with incorrect ASN encodings\n# assuming that the signature is otherwise valid.\n\n# tcId = 8\n# valid\nmsg = 313233343030\nresult = valid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 9\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 30814502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 10\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 30460281202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 11\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802812100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 12\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 13\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3047028200202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 14\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 15\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 16\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 17\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 304502212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 18\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3045021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 19\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 20\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 21\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3085010000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 22\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 304a028501000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 23\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285010000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 24\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 25\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 304e02890100000000000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 26\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 304e02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028901000000000000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 27\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 28\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902847fffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 29\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802847fffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 30\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 31\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30490284ffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 32\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180284ffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 33\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff0220",
+    "2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 34\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304a0285ffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 35\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285ffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 36\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 37\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304d0288ffffffffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 38\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180288ffffffffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 39\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30ff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 40\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 304502ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 41\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 42\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 43\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 304502802ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 44\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 45\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 46\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 47\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 48\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 49\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 50\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500\n\n# tcId = 51\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 52\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500\n\n# tcId = 53\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a498177304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 54\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30492500304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 55\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef\n\n# tcId = 56\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a222549817702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 57\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30492224250002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 58\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304d222202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180004deadbeef022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 59\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182226498177022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 60\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822252500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 61\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182223022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef\n\n# tcId = 62\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304daa00bb00cd00304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 63\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304baa02aabb304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 64\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304d2228aa00bb00cd0002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 65\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304b2226aa02aabb02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 66\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182229aa00bb00cd00022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 67\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 304b02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182227aa02aabb022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 68\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 69\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3049228002202ba3a8be6b",
+    "94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 70\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 71\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3080314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 72\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3049228003202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 73\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 74\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 75\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2e4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 76\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2f4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 77\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 78\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 324502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 79\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = ff4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 80\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304500202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 81\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304501202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 82\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304503202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 83\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304504202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 84\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3045ff202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 85\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 86\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18012100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 87\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 88\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18042100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 89\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18ff2100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 90\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 91\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 30493001023044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 92\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3049222402012b021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 93\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822250201000220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 94\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847\n\n# tcId = 95\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 3044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 96\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 97\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db00\n\n# tcId = 98\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db05000000\n\n# tcId = 99\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db060811220000\n\n# tcId = 100\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000fe02beef\n\n# tcId = 101\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0002beef\n\n# tcId = 102\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047300002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 103\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db3000\n\n# tcId = 104\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 105\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 302202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18\n\n# tcId = 106\n# repeat element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 306802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847d",
+    "b022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 107\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 3023022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 108\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 109\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000\n\n# tcId = 110\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3047022200002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 111\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180223000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 112\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30250500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 113\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500\n\n# tcId = 114\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 30250200022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 115\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180200\n\n# tcId = 116\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3045022029a3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 117\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022102b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 118\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e98022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 119\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b491568475b\n\n# tcId = 120\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3044021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 121\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3044021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 122\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847\n\n# tcId = 123\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 124\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 30460221ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 125\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180222ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 126\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3026090180022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 127\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18090180\n\n# tcId = 128\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30460221012ba3a8bd6b94d5ed80a6d9d1190a436ebccc0833490686deac8635bcb9bf5369022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 129\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30460221ff2ba3a8bf6b94d5eb80a6d9d1190a436f42fe12d7fad749d4c512a036c0f908c7022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 130\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30450220d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 131\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3046022100d45c5740946b2a147f59262ee6f5bc90bd01ed280528b62b3aed5fc93f06f739022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 132\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30460221fed45c5742946b2a127f59262ee6f5bc914333f7ccb6f979215379ca434640ac97022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 133\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30460221012ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 134\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3046022100d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 135\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f478a2bbd0a6c384ee1493b1f518276e0e4a5375928d6fcd160c11cb6d2c\n\n# tcId = 136\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f47aa2bbd0a4c384ee1493b1f518ada018ef05465583885980861905228a\n\n# tcId = 137\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221ff4cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825\n\n# tcId = 138\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221fe4cd60b875d442f593c7b11eb6c4e0ae7d891f1b5ac8a6d729032e9f3ee3492d4\n\n# tcId = 139\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db\n\n# tcId = 140\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825\n\n# tcId = 141\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 142\n# Signature with special case values for r and s\nmsg = 3132333",
+    "43030\nresult = invalid\nsig = 3006020100020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 143\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 144\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 145\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 146\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 147\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 148\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 149\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020100090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 150\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 151\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 152\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201010201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 153\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 154\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 155\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 156\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 157\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 158\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020101090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 159\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 160\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 161\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 162\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 163\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 164\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 165\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 166\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 167\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30080201ff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 168\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 169\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000",
+    "ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 170\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 171\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 172\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 173\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 174\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 175\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 176\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 177\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 178\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 179\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 180\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 181\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 182\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 183\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 184\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 185\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 186\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 187\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 188\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 189\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 190\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 191\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not che",
+    "ck boundaries and computes s^(-1)==0.\n\n# tcId = 192\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 193\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 194\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 195\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 196\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 197\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 198\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 199\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 200\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 201\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 202\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 203\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 204\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 205\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 206\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 207\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 208\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 209\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 210\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 211\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 212\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3028022100ffffffff00000001000000000000000000000001000000000000000000000000090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 213\n# Edge case for Shamir multiplication\nmsg = 3639383139\nresult = valid\nsig = 3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02206af015971cc30be6d1a206d4e013e0997772a2f91d73286ffd683b9bb2cf4f1b\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103]\n[key.wy = 0c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030",
+    "107034200040ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e]\n[sha = SHA-256]\n\n# tcId = 214\n# k*G has a large x-coordinate\nmsg = 313233343030\nresult = valid\nsig = 303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\n\n# tcId = 215\n# r too large\nmsg = 313233343030\nresult = invalid\nsig = 3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c582204554]\n[key.wy = 19235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c58220455419235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45]\n[sha = SHA-256]\n\n# tcId = 216\n# r,s are large\nmsg = 313233343030\nresult = valid\nsig = 3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 080984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c56]\n[key.wy = 11feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000480984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c5611feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95]\n[sha = SHA-256]\n\n# tcId = 217\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 4201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c05]\n[key.wy = 095c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200044201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c0595c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e]\n[sha = SHA-256]\n\n# tcId = 218\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac957]\n[key.wy = 5d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac9575d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b]\n[sha = SHA-256]\n\n# tcId = 219\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020105020101\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 6627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b1572]\n[key.wy = 6170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200046627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b15726170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5]\n[sha = SHA-256]\n\n# tcId = 220\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020105020103\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 5a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bf]\n[key.wy = 0ef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200045a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bfef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813]\n[sha = SHA-256]\n\n# tcId = 221\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020105020105\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c737]\n[key.wy = 70af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c73770af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1]\n[sha = SHA-256]\n\n# tcId = 222\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020105020106\n\n# tcId = 223\n# r is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556020106\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 4be4178097002f0deab68f0d9a130e0ed33a6795d02a20796db83444b037e139]\n[key.wy = 20f13051e0eecdcfce4dacea0f50d1f247caa669f193c1b4075b51ae296d2d56]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200044be4178097002f0deab68f0d9a130e0ed33a6795d02a20796db83444b037e13920f13051e0eecdcfce4dacea0f50d1f247caa669f193c1b4075b51ae296d2d56]\n[sha = SHA-256]\n\n# tcId = 224\n# s is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3026020105022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9]\n[key.wy = 0971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1]\n[sha = SHA-256]\n\n# tcId = 225\n# small r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 4838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05f]\n[key.wy = 0fa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200044838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05ffa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b]\n[sha = SHA-256]\n\n# tcId = 226\n# smallish r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 7393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64]\n[key.wy = 0e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200047393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526]\n[sha = SHA-256]\n\n# tcId = 227\n# 100-bit r and small s^-1\nmsg = 313233343030\nresult = valid\nsig = 3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 5ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5]\n[key.wy = 0fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200045ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b]\n[sha = SHA-256]\n\n# tcId = 228\n# small r and 100 bit s^-1\nmsg = 313233343030\nresult = valid\nsig = 302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 1d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509]\n[key.wy = 0dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200041d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60",
+    "a4f2c9d040d8c9]\n[sha = SHA-256]\n\n# tcId = 229\n# 100-bit r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99]\n[key.wy = 0915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e]\n[sha = SHA-256]\n\n# tcId = 230\n# r and s^-1 are close to n\nmsg = 313233343030\nresult = valid\nsig = 3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 08aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e19373874]\n[key.wy = 5bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200048aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e1937387405bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d]\n[sha = SHA-256]\n\n# tcId = 231\n# s == 1\nmsg = 313233343030\nresult = valid\nsig = 30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101\n\n# tcId = 232\n# s == 0\nmsg = 313233343030\nresult = invalid\nsig = 30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f287]\n[key.wy = 1b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f2871b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47]\n[sha = SHA-256]\n\n# tcId = 233\n# point at infinity during verify\nmsg = 313233343030\nresult = invalid\nsig = 304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 69da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b8]\n[key.wy = 66d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000469da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b866d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002]\n[sha = SHA-256]\n\n# tcId = 234\n# u1 == 1\nmsg = 313233343030\nresult = valid\nsig = 30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff32]\n[key.wy = 33e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff3233e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1]\n[sha = SHA-256]\n\n# tcId = 235\n# u1 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 3623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab785]\n[key.wy = 08db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200043623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab7858db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe]\n[sha = SHA-256]\n\n# tcId = 236\n# u2 == 1\nmsg = 313233343030\nresult = valid\nsig = 30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1]\n[key.wy = 0e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9]\n[sha = SHA-256]\n\n# tcId = 237\n# u2 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff77350]\n[key.wy = 4f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff773504f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206]\n[sha = SHA-256]\n\n# tcId = 238\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e91e1ba60fdedb76a46bcb51dc0b8b4b7e019f0a28721885fa5d3a8196623397\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f]\n[key.wy = 1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff]\n[sha = SHA-256]\n\n# tcId = 239\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100fdea5843ffeb73af94313ba4831b53fe24f799e525b1e8e8c87b59b95b430ad9\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9]\n[key.wy = 0986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd]\n[sha = SHA-256]\n\n# tcId = 240\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022003ffcabf2f1b4d2a65190db1680d62bb994e41c5251cd73b3c3dfc5e5bafc035\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c32]\n[key.wy = 6337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c326337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add]\n[sha = SHA-256]\n\n# tcId = 241\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204dfbc401f971cd304b33dfdb17d0fed0fe4c1a88ae648e0d2847f74977534989\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b7]\n[key.wy = 3877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b73877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd]\n[sha = SHA-256]\n\n# tcId = 242\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bc4024761cd2ffd43dfdb17d0fed112b988977055cd3a8e54971eba9cda5ca71\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 5eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc",
+    "1a5ff6033e]\n[key.wy = 5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200045eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71]\n[sha = SHA-256]\n\n# tcId = 243\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220788048ed39a5ffa77bfb62fa1fda2257742bf35d128fb3459f2a0c909ee86f91\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 5caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47a]\n[key.wy = 0deb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200045caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47adeb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9]\n[sha = SHA-256]\n\n# tcId = 244\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220476d9131fd381bd917d0fed112bc9e0a5924b5ed5b11167edd8b23582b3cb15e\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b098]\n[key.wy = 6237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b0986237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf]\n[sha = SHA-256]\n\n# tcId = 245\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008374253e3e21bd154448d0a8f640fe46fafa8b19ce78d538f6cc0a19662d3601\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 3fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced]\n[key.wy = 3ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200043fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced03ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4]\n[sha = SHA-256]\n\n# tcId = 246\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220357cfd3be4d01d413c5b9ede36cba5452c11ee7fe14879e749ae6a2d897a52d6\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 09cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114]\n[key.wy = 0b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200049cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544]\n[sha = SHA-256]\n\n# tcId = 247\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022029798c5c0ee287d4a5e8e6b799fd86b8df5225298e6ffc807cd2f2bc27a0a6d8\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a]\n[key.wy = 4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f]\n[sha = SHA-256]\n\n# tcId = 248\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02200b70f22c781092452dca1a5711fa3a5a1f72add1bf52c2ff7cae4820b30078dd\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88]\n[key.wy = 0cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509]\n[sha = SHA-256]\n\n# tcId = 249\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022016e1e458f021248a5b9434ae23f474b43ee55ba37ea585fef95c90416600f1ba\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 083a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8]\n[key.wy = 0c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000483a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e]\n[sha = SHA-256]\n\n# tcId = 250\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202252d6856831b6cf895e4f0535eeaf0e5e5809753df848fe760ad86219016a97\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7]\n[key.wy = 0bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff]\n[sha = SHA-256]\n\n# tcId = 251\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210081ffe55f178da695b28c86d8b406b15dab1a9e39661a3ae017fbe390ac0972c3\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 67e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460]\n[key.wy = 0a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000467e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0]\n[sha = SHA-256]\n\n# tcId = 252\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 2eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf]\n[key.wy = 0805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200042eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0]\n[sha = SHA-256]\n\n# tcId = 253\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 084db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f35]\n[key.wy = 6d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000484db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f356d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe]\n[sha = SHA-256]\n\n# tcId = 254\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 091b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad663]\n[key.wy = 49aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000491b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad66349aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd]\n[sha = SHA-256]\n\n# tcId = 255\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffff",
+    "ffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834d]\n[key.wy = 0f97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834df97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432]\n[sha = SHA-256]\n\n# tcId = 256\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc88]\n[key.wy = 5ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc885ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72]\n[sha = SHA-256]\n\n# tcId = 257\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cd]\n[key.wy = 0e6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200040a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cde6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489]\n[sha = SHA-256]\n\n# tcId = 258\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e8]\n[key.wy = 68612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e868612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93]\n[sha = SHA-256]\n\n# tcId = 259\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb276]\n[key.wy = 09ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb2769ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75]\n[sha = SHA-256]\n\n# tcId = 260\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 092f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8]\n[key.wy = 33dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000492f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8033dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697]\n[sha = SHA-256]\n\n# tcId = 261\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09e]\n[key.wy = 0ff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09eff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2]\n[sha = SHA-256]\n\n# tcId = 262\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 08651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224]\n[key.wy = 0e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200048651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28]\n[sha = SHA-256]\n\n# tcId = 263\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 6d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6d]\n[key.wy = 0ef6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200046d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6def6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37]\n[sha = SHA-256]\n\n# tcId = 264\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e1542]\n[key.wy = 08911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200040ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e15428911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3]\n[sha = SHA-256]\n\n# tcId = 265\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 5b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963]\n[key.wy = 0838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9]\n[sha = SHA-256]\n\n# tcId = 266\n# point duplication during verification\nmsg = 313233343030\nresult = valid\nsig = 304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 5b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963]\n[key.wy = 7c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc469637c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616]\n[sha = SHA-256]\n\n# tcId = 267\n# duplication bug\nmsg = 313233343030\nresult = invalid\nsig = 304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector",
+    " that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 6adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a6]\n[key.wy = 47e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200046adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a647e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9]\n[sha = SHA-256]\n\n# tcId = 268\n# point with x-coordinate 0\nmsg = 313233343030\nresult = invalid\nsig = 30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 2fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f3820]\n[key.wy = 65f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200042fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f382065f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de]\n[sha = SHA-256]\n\n# tcId = 269\n# point with x-coordinate 0\nmsg = 313233343030\nresult = invalid\nsig = 3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d250]\n[key.wy = 45d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d25045d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7]\n[sha = SHA-256]\n\n# tcId = 270\n# comparison with point at infinity \nmsg = 313233343030\nresult = invalid\nsig = 30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 4fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5]\n[key.wy = 0d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200044fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280]\n[sha = SHA-256]\n\n# tcId = 271\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 5e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca21]\n[key.wy = 5de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200045e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca215de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de]\n[sha = SHA-256]\n\n# tcId = 272\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296]\n[key.wy = 4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5]\n[sha = SHA-256]\n\n# tcId = 273\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2\n\n# tcId = 274\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296]\n[key.wy = 0b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a]\n[sha = SHA-256]\n\n# tcId = 275\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2\n\n# tcId = 276\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 4aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5]\n[key.wy = 087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d]\n[sha = SHA-256]\n\n# tcId = 277\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3045022100b292a619339f6e567a305c951c0dcbcc42d16e47f219f9e98e76e09d8770b34a02200177e60492c5a8242f76f07bfe3661bde59ec2a17ce5bd2dab2abebdf89a62e2\n\n# tcId = 278\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3045022100e502de07f887e60119f9668cec69d2760839e6e74b9e6ff8cb7fa8d5a24f66c802207605e8b6afdbef06db7f89d06e2add2cf064eb4054d5ff0b101d815e813a8c08\n\n# tcId = 279\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3044022030fbfb3d662f0f07e8d51c6c3ebbc3ae9cf17b985db10e38116f1ba584cccf4102206fcc086c907209fe3d3d3a3724af44ce3d5af9345ac8864de18ad2b2f9617819\n\n# tcId = 280\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 304602210097dde41357ef913cb8b9cd8e8c8c858831ec69298c739cd7fb14edcafc519d4e022100c8e032ad4432814ba4ddf3e25004594fa8c5137e39fd360ca36aedabaa934db3\n\n# tcId = 281\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3044022047bf21626d4b879fc51774251d7e3a380104e2c8170f13d32e86358c63d6b50102203f9c9d81b5e20b94766a62efdee7f3edfada68ab4d74487a24978fb574358830\n\n# tcId = 282\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3045022100d7908fbd16c6a3ffd7c315bfc2f87d8d42bda8fac5d6024069b5df6b101420e0022066a4771722eef9f166f037629c0d210010727dd114049fe2159ffa228fc11798\n\n# tcId = 283\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3046022100d48907279f401ee511d2e78d15f4c17539c93373d72bb66cff066a9114801a6d022100c7b709d88a367836a66cdb4b3bd4e0b2a76c97e551505c2969c98b6709600733\n\n# tcId = 284\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 30450220743d6d5a99bcf2f7e011d6cac86a73582014419d3803c8d61128b23e4683cf96022100fa1270b7406b13cdbea376cb502f01f388f97dc5b660c9f3ba92c40233ae853f\n\n# tcId = 285\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 304502201c8e26e3a84892b12d6946fa39aa15ee8989f32c647db31c48c7276718907734022100e486719b597f52356d20afc98af82301d3ed33e2c3ec61c23601de687c432893\n\n# tcId = 286\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3046022100f8f074bad4cc63ce49b1a7101f5f1e5dd7e8d28e1654e3052e9dea4e8830a247022100d232383e83d2b4e0c12ee6127dd8cc3fcfcdff971571b07e18ea0d59d1bd75e9\n\n# tcId = 287\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30450220530bd6b0c9af2d69ba897f6b5fb59695cfbf33afe66dbadcf5b8d2a2a6538e23022100d85e489cb7a161fd55ededcedbf4cc0c0987e3e3f0f242cae934c72caa3f43e9\n\n# tcId = 288\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 304502202a95faa048e78949b27dd4f2a69bf26f809d565cca4fd0205aac95382e19df1c022100c7de7183db22fb7015697d8f15874529c1c37b3506b32e2969c6345ba6431eea\n\n# tcId = 289\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3046022100ef18b2f9d187e6d6ebd0fe0ff63ebbee44e4e8c3812fb53f7399a2db757965fc022100ff2f438009b409c18f",
+    "b908851115a00f3ac250428c0485cb8e8066e27608dc2a\n\n# tcId = 290\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3045022100d1ba6053e65dd564d24a99aeabb181529f48ed9564bfcf8d9b7950d05dfbf1f702204b4d69402ba634983534a599f49c47d4fef03ace4446a7934124e7b4cd212be2\n\n# tcId = 291\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3045022100d8df1a77d439e1a68621712e5cf65ecc503398f7a87a6b53fbd1d7251d1a62bd02203276f956f733314b20eb399f2027702463e203cd8f15f1dbe41fe157dcaac618\n\n# tcId = 292\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30440220771b9696276b14cf4e0342272f65be8ddf3d603036b03d13a82f522c0446843c022062e7b425f0e2d8a6a207e8324014a6d4d569d80e0fe5509ba1cd1581446d5a2b\n\n# tcId = 293\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3046022100f052476d9a28b34372a358481c650f2aee5c91b88fa307ad39719c11d2ae2b79022100d5da4b0f6bab8923ec17533d455ed259d379fe265956b7106f2c44c4f56a70ed\n\n# tcId = 294\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3046022100a6a63a03be4a3505ba28907fb2b028268387b657ae561fb5bf9c011a330a8dae022100bacb589b58eeb74b7ab85b1abdaf50f59ed03ea4a73dde66470b86dc34e25768\n\n# tcId = 295\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3046022100f547541d72fad13c84399a2e74e00c2f2b6ee9c24b48bb06c00c321786273c07022100d28d340d5e507b1fd87011bc8a21b388f7a4ea6acbc67916667e278dd52c5c1b\n\n# tcId = 296\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 304402205b64337764e6b896219a3502e4ea632fc03afe12c27ad0501640f46f7a6e62950220100cd011a79cbcba991f0994e4e406de9a390d8ede12d4a116f39072d8373463\n\n# tcId = 297\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3046022100a8ea150cb80125d7381c4c1f1da8e9de2711f9917060406a73d7904519e51388022100f3ab9fa68bd47973a73b2d40480c2ba50c22c9d76ec217257288293285449b86\n\n# tcId = 298\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 304402206d5091f9497241fb2a99137f56734d70797c1620fa58f292f3ddc1c21980768a02207d4681372addeec97da13d3834429a49cf94c68cc6d8380fcc1fb897caeaa4d7\n\n# tcId = 299\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30440220111af92aa721abe4492468a6ad410f85351c3f71f6f076c5160eac1665bf08a002205d9f4658ec427e54fd64ccc367f50d48c7e5c2822299e258f443cc7890d25db9\n\n# tcId = 300\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3046022100ecd42e0caddf730e79911ea0725402d3e4519e93299217cfff7f27eb06383bcb022100b9002348257e8aa55de6326e8588d1e5ac7803e912dca2b6aac1c0b6c6ce887d\n\n# tcId = 301\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3046022100dd7ff4894d875b82698e738cd6af3e06df3dfe519c63c83bda6cb780003212680221008ae21af20504ca943014f87bc06eff0c72222900e7b78e49e7107d1d27f78d7a\n\n# tcId = 302\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 304502202c4ffe7eba452ab8147fbd117091b6a6aed2c022b51a0559f45a210149827585022100f8f713031c6747382a930183f508cb5ba3dee9918623ed7b9246f7792895806f\n\n# tcId = 303\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30450220036e58fdd99c73206d0b989e315d4e7445853b29756abd9be4988043ee575318022100bca3bdbd7b13d674a507755a1fb25d6b9ad533e6aea4c07da2b662bf64074c1f\n\n# tcId = 304\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3045022100e8967620ea0878093f914bc670e9fd49e5e1d120cd8296f67934806921edd1eb0220091fe9cc8158606b7a93a87b830d8bf892c8086bc3ccb364b885adc11c5a2f5b\n\n# tcId = 305\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30450221008053d20f27c43e96e7cb99f0fb5ed638f391dbb8c49228bb164e3c5c7ed98df802200f8f909a360d019c8cd8cc4936c471cb0e81eec812a7815a413f015e5020a83a\n\n# tcId = 306\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 304402201a05d145760911a0d03a3f9e04183b4fa12052ab08e8e2a61cecd685abe06ccd022015a45cdddd5b271b460fd23970e3f09bd3e428c5935a141131f7bb9cdcb31ffe\n\n# tcId = 307\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3045022100986e65933ef2ed4ee5aada139f52b70539aaf63f00a91f29c69178490d57fb7102203dafedfb8da6189d372308cbf1489bbbdabf0c0217d1c0ff0f701aaa7a694b9c\n\n# tcId = 308\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 304502200a1ba2c8595e428eb8efe4d0d527b57a9d65a18f2adb74a8d42b079cca3ded47022100a9b1d33b3b0498f08a46b3602d216cddd909b46a4531bb0c8eda027c813701ea\n\n# tcId = 309\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3044022051a2d733ccc576739d202cac29631dd4a4c2b7bca274a88bed819b4fa74bc13a02203332485952b2bafdd23bb4bdd5b182c17d68fa989fb297e522f58267f579858b\n\n# tcId = 310\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 30450221008523fa05039757ff31734c5a97512e16d36a2b44cfeaf698bf99a3da10192ce102201a4a46d618146dbd6f8b96bde830c1cd6b3c40b3c3f076b0525327b81421703c\n\n# tcId = 311\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 30450221008b7c16aead127ff236229edf3b3d685389d833a6706f8baaf8d18c42c8e0fcb402207c007ac920eb885009bb826dacf204affc995b8b1da3088ab8233372e77bfcb9\n\n# tcId = 312\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3046022100eb05151d10844480bb1da9bbd5fadeb94653979ce6473e1eae877c04b5dc136b022100f5626ba78e4936461be857439da72310f0159c53076ed7602b802b5c79296db6\n\n# tcId = 313\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3046022100b1ef5e5b2ed946f33e3f14a755af39520397d425aa184e24c3a1ab2071bd28ad022100f06c9370a8fd969f14fe9fb10d18e593c1469e5716c7264880dd35a8589c4747\n\n# tcId = 314\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 304502206da6c71eb7d8a2435999c8f6b7a1de30f2a863a2f07a8aad4d321d52cc619679022100ab1abe0cbd07504de3fd9ac64bed3bf89fb0061e251a1b1de2925e6635d523ec\n\n# tcId = 315\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 30450220450e205ad97a14760979e1d5a24f2277c88382810b73c94ea53fa0d768ee18d1022100ba73359c371c5ff36c338bcd9761096647e0437db6a01b95df8cfa15ffc29bf4\n\n# tcId = 316\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 304502201814378a581d4584664c2e24d695edeec6ce96971887a35a67df515e8788d44c022100c96da4442349d041183bba91d8f2b0279501c85b7b31f993c82268b6703c7b3f\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000]\n[key.wy = 0ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685]\n[sha = SHA-256]\n\n# tcId = 317\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100d434e262a49eab7781e353a3565e482550dd0fd5defa013c7f29745eff3569f10221009b0c0a93f267fb6052fd8077be769c2b98953195d7bc10de844218305c6ba17a\n\n# tcId = 318\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 304402200fe774355c04d060f76d79fd7a772e421463489221bf0a33add0be9b1979110b0220500dcba1c69a8fbd43fa4f57f743ce124ca8b91a1f325f3fac6181175df55737\n\n# tcId = 319\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3045022100bb40bf217bed3fb3950c7d39f03d36dc8e3b2cd79693f125bfd06595ee1135e30220541bf3532351ebb032710bdb6a1bf1bfc89a1e291ac692b3fa4780745bb55677\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935]\n[key.wy = 084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000]\n[sha = SHA-256]\n\n# tcId = 320\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 30440220664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a022059f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd\n\n# tcId = 321\n# y-coordinate ",
+    "of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 304502204cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b430221009638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3\n\n# tcId = 322\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04022100a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935]\n[key.wy = 7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff]\n[sha = SHA-256]\n\n# tcId = 323\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 304402201158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf34668300220228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519\n\n# tcId = 324\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3045022100b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d02203e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336\n\n# tcId = 325\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86022100ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff]\n[key.wy = 0a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e]\n[sha = SHA-256]\n\n# tcId = 326\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 3045022100d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b402203dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929\n\n# tcId = 327\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 304402205eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af7802202c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5\n\n# tcId = 328\n# x-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 304602210096843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28022100f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5]\n[key.wy = 5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73]\n[sha = SHA-256]\n\n# tcId = 329\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30440220766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f60220402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41\n\n# tcId = 330\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9022100edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba\n\n# tcId = 331\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84022100feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 3fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e]\n[key.wy = 1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71]\n[sha = SHA-256]\n\n# tcId = 332\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7022100b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3\n\n# tcId = 333\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 304402206b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f702205939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a\n\n# tcId = 334\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361022100f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015]\n[key.wy = 1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2]\n[sha = SHA-256]\n\n# tcId = 335\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3044022031230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb0702200f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff\n\n# tcId = 336\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743022100cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0\n\n# tcId = 337\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 304502207e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859450221009450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa\n\n[key.curve = secp256r1]\n[key.keySize = 256]\n[key.type = ECPublicKey]\n[key.wx = 0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015]\n[key.wy = 0fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d]\n[keyDer = 3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d]\n[sha = SHA-256]\n\n# tcId = 338\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3046022100d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35602210089c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224\n\n# tcId = 339\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30440220341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b34022072b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469\n\n# tcId = 340\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3045022070bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67022100aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9\n\n",
+};
+static const size_t kLen61 = 113980;
+
+static const char *kData62[] = {
+    "# Imported from Wycheproof's ecdsa_secp384r1_sha384_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.4\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa]\n[key.wy = 4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[sha = SHA-384]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702301840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca03995ca30240e09513805bf6209b58ac7aa9cff54eecd82b9f1\n\n# tcId = 2\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 3064023077391f04a7b47a003a9b68ae641d6022093a5fa29464b1826228cbffc35a3a655f9712d478dec2f72dd3c02ce31c075a02305e8daba38b616460ec0e4b6477ce0266aa2f62b0cdb224907a8f999abfa68b48657677b018a29767c0926a1640fd9b0a\n\n# tcId = 3\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 3065023100c46c6312342ad3b2d260d33a0cc41d13378daf8570d7b937980761ea0cc18c9948b40fcd790bb2021afaa8cb4fc76ff502307a7547ed765905268768027bc59f1edf367e4088b779c2618f4c1e6f0f56154351aac80cd59d4907ef2f93155c16523d\n\n# tcId = 4\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 30660231009584b8a737f417dfeef0eb1a8f727e14b231ec372eb0520a2357b44478bd076e7a3e4e8bac670bfd3419296c9d854da1023100beca69a1c97e08af8e9a5cb76d9c46c6ee022b670962dc1e59850e6a9266d216aa816225d8ebcb7c4de88ceb3c1bae3d\n\n# tcId = 5\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 30650230700041c0719c076f07280dec96763c88efdb903660d57182c9c7753b0334abb2e4dd2726f63ce1a8acd0eb67a492161f0231008028097fd011fea390fba8f50c36e5676867325d0bce627c3ddc3581ed3ba7ff1e76f5ece6304c172e9144756f47b2b8\n\n# tcId = 6\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 30650230409616ba406241c624514057defe1c868e655bca413af7aa0fb3d80c4969df41d9bb5d3a733b400705453a965e80d46d023100da24d79fdb11e4612faf34b8b64af8067492d6510c4eddb1310e578d1f49a43e427dcd188b259f9012791718776253ab\n\n# tcId = 7\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n# Some implementations of ECDSA and DSA incorrectly encode r and s by not\n# including leading zeros in the ASN encoding of integers when necessary. Hence,\n# some implementations (e.g. jdk) allow signatures with incorrect ASN encodings\n# assuming that the signature is otherwise valid.\n\n# tcId = 8\n# valid\nmsg = 313233343030\nresult = valid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 9\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 308165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 10\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 306602813012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 11\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702813100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 12\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30820065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 13\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30670282003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 14\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70282003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 15\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 16\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 17\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3065023112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 18\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3065022f12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 19\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023200e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 20\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 21\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30850100000065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 22\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 306a0285010000003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 23\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70285010000003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 24\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3089010000000000000065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 25\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 306e028901000000000000003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd0",
+    "4fecc47bff426f82\n\n# tcId = 26\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 306e023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7028901000000000000003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 27\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 28\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306902847fffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 29\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702847fffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 30\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 31\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30690284ffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 32\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70284ffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 33\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 34\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306a0285ffffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 35\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70285ffffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 36\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 37\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306d0288ffffffffffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 38\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70288ffffffffffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 39\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30ff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 40\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 306502ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 41\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702ff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 42\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 43\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3065028012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 44\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7028000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 45\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 46\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 47\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 30670000023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 48\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 49\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 50\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820500\n\n# tcId = 51\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 3067023212b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 52\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023300e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820500\n\n# tcId = 53\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a4981773065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 54\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306925003065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e",
+    "7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 55\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30673065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820004deadbeef\n\n# tcId = 56\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a2235498177023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 57\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306922342500023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 58\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306d2232023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70004deadbeef023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 59\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72236498177023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 60\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d722352500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 61\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72233023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820004deadbeef\n\n# tcId = 62\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306daa00bb00cd003065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 63\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306baa02aabb3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 64\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306d2238aa00bb00cd00023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 65\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306b2236aa02aabb023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 66\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72239aa00bb00cd00023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 67\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306b023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72237aa02aabb023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 68\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30803065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 69\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30692280023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 70\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72280023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 71\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30803165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 72\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30692280033012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 73\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72280033100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 74\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 75\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2e65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 76\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2f65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 77\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 78\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3265023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 79\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = ff65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 80\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 81\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065013012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 82\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065033012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 8",
+    "3\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065043012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 84\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065ff3012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 85\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 86\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7013100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 87\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7033100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 88\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7043100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 89\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7ff3100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 90\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 91\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 306930010230643012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 92\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 30692234020112022fb30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 93\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d722350201000230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 94\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f\n\n# tcId = 95\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 30643012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 96\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 97\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f8200\n\n# tcId = 98\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f8205000000\n\n# tcId = 99\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82060811220000\n\n# tcId = 100\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000fe02beef\n\n# tcId = 101\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820002beef\n\n# tcId = 102\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 30673000023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 103\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f823000\n\n# tcId = 104\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30673065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 105\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 3032023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7\n\n# tcId = 106\n# repeat element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 308198023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 107\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 3033023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 108\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3067023212b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 109\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023300e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000\n\n# tcId = 110\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 30670232000012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 111\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70233000000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 112\n# Replacing integer with NULL\nmsg =",
+    " 313233343030\nresult = invalid\nsig = 30350500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 113\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3034023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70500\n\n# tcId = 114\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 30350200023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 115\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 3034023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70200\n\n# tcId = 116\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023010b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 117\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023102e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 118\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c54857023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 119\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f02\n\n# tcId = 120\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3064022f12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 121\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3064022fb30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 122\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f\n\n# tcId = 123\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 124\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 30660231ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 125\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70232ff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 126\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3036090180023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 127\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3035023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7090180\n\n# tcId = 128\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 306602310112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19a25617aad7485e6312a8589714f647acf7a94cffbe8a724a023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 129\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30660231ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe1a138f7ca6eeda02a462743d328394f8b71dd11a2a25001f64023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 130\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30650230ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e6250d35d71ceecf7c4571b51b33ba5fcdf542cc6b0e3ab729023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 131\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e5ec7083591125fd5b9d8bc2cd7c6b0748e22ee5d5daffe09c023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 132\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30660231feed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e65da9e85528b7a19ced57a768eb09b8530856b30041758db6023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 133\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 306602310112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 134\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e6250d35d71ceecf7c4571b51b33ba5fcdf542cc6b0e3ab729023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 135\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023101e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc5f8fc6adfda650a86aa74b95adbd6874b3cd8dde6cc0798f5\n\n# tcId = 136\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc66a35cfdbf1f6aec7fa409df64a7538556300ab11327d460f\n\n# tcId = 137\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70231ff1840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca039ce66e2a219d22358ada554576cda202fb0133b8400bd907e\n\n# tcId = 138\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70231fe1840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca03a07039520259af579558b46a5242978b4c327221933f8670b\n\n# tcId = 139\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023101e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82\n\n# tcId = 140\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083b",
+    "a8e4ae4cc45a0320abd3394f1c548d702301840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca039ce66e2a219d22358ada554576cda202fb0133b8400bd907e\n\n# tcId = 141\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 142\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 143\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 144\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 145\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 146\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 147\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 148\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 149\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020100090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 150\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 151\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 152\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201010201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 153\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 154\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 155\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 156\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 157\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 158\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020101090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 159\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 160\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 161\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 162\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 163\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 164\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 165\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 166\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100ffffffffffff",
+    "fffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 167\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30080201ff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 168\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 169\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 170\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 171\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 172\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 173\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 174\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 175\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 176\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 177\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 178\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 179\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529720201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 180\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 181\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 182\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 183\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 184\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 185\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 186\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020100\n# Edge case values such as r=1 and s=0 can lead to ",
+    "forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 187\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 188\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529740201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 189\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 190\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 191\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 192\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 193\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 194\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 195\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 196\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 197\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 198\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 199\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 200\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 201\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 202\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 203\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 204\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 205\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 206\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001000000000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does",
+    " not check boundaries and computes s^(-1)==0.\n\n# tcId = 207\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 208\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 209\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 210\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 211\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 212\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 213\n# Edge case for Shamir multiplication\nmsg = 3133323237\nresult = valid\nsig = 3066023100ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf565684023100bd770d3ee4beadbabe7ca46e8c4702783435228d46e2dd360e322fe61c86926fa49c8116ec940f72ac8c30d9beb3e12f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 4bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85d]\n[key.wy = 0d30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200044bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85dd30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2]\n[sha = SHA-384]\n\n# tcId = 214\n# k*G has a large x-coordinate\nmsg = 313233343030\nresult = valid\nsig = 304d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\n\n# tcId = 215\n# r too large\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 3623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6]\n[key.wy = 768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200043623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576]\n[sha = SHA-384]\n\n# tcId = 216\n# r,s are large\nmsg = 313233343030\nresult = valid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd5]\n[key.wy = 08456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd58456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720]\n[sha = SHA-384]\n\n# tcId = 217\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a9]\n[key.wy = 092a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a992a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1]\n[sha = SHA-384]\n\n# tcId = 218\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd322511]\n[key.wy = 71312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd32251171312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f]\n[sha = SHA-384]\n\n# tcId = 219\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020102020101\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 44ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591c]\n[key.wy = 0d027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000444ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591cd027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107]\n[sha = SHA-384]\n\n# tcId = 220\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020102020102\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390]\n[key.wy = 0e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d]\n[keyDer = 3",
+    "076301006072a8648ce3d020106052b8104002203620004e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d]\n[sha = SHA-384]\n\n# tcId = 221\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020102020103\n\n# tcId = 222\n# r is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975020103\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 5e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab]\n[key.wy = 088a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000405e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab88a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f]\n[sha = SHA-384]\n\n# tcId = 223\n# s is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3036020102023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1]\n[key.wy = 0ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200040bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d]\n[sha = SHA-384]\n\n# tcId = 224\n# small r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 3036020201000230489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 58f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566]\n[key.wy = 497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000458f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a]\n[sha = SHA-384]\n\n# tcId = 225\n# smallish r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 303c02072d9b4d347952cd023100ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12]\n[key.wy = 0998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8]\n[sha = SHA-384]\n\n# tcId = 226\n# 100-bit r and small s^-1\nmsg = 313233343030\nresult = valid\nsig = 3041020d1033e67e37b32b445580bf4efb02302ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 1b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51]\n[key.wy = 0c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200041b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3]\n[sha = SHA-384]\n\n# tcId = 227\n# small r and 100 bit s^-1\nmsg = 313233343030\nresult = valid\nsig = 303602020100023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 1734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403]\n[key.wy = 0ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200041734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765]\n[sha = SHA-384]\n\n# tcId = 228\n# 100-bit r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 3041020d062522bbd3ecbe7c39e93e7c24023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 52ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c7]\n[key.wy = 087a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000452ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c787a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4]\n[sha = SHA-384]\n\n# tcId = 229\n# r and s^-1 are close to n\nmsg = 313233343030\nresult = valid\nsig = 3065023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c44]\n[key.wy = 3adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c443adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764]\n[sha = SHA-384]\n\n# tcId = 230\n# s == 1\nmsg = 313233343030\nresult = valid\nsig = 3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020101\n\n# tcId = 231\n# s == 0\nmsg = 313233343030\nresult = invalid\nsig = 3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020100\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bdda]\n[key.wy = 0c4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bddac4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028]\n[sha = SHA-384]\n\n# tcId = 232\n# point at infinity during verify\nmsg = 313233343030\nresult = invalid\nsig = 306402307fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 3ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383]\n[key.wy = 0d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200043ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d973",
+    "96362]\n[sha = SHA-384]\n\n# tcId = 233\n# u1 == 1\nmsg = 313233343030\nresult = valid\nsig = 3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 4150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4]\n[key.wy = 0eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200044150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2]\n[sha = SHA-384]\n\n# tcId = 234\n# u1 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec63260230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea5\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992f]\n[key.wy = 0f34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992ff34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099]\n[sha = SHA-384]\n\n# tcId = 235\n# u2 == 1\nmsg = 313233343030\nresult = valid\nsig = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c09]\n[key.wy = 0a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c090a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9]\n[sha = SHA-384]\n\n# tcId = 236\n# u2 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 3d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c1]\n[key.wy = 39aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200043d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c139aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac]\n[sha = SHA-384]\n\n# tcId = 237\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0230533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd00]\n[key.wy = 1ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd001ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50]\n[sha = SHA-384]\n\n# tcId = 238\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d49a253986bbaa8ce9c3d3808313d39c3b950a478372edc009bc0566b73be7b05dad0737e16960257cc16db6ec6c620f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 088738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab252]\n[key.wy = 09388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000488738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab2529388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262]\n[sha = SHA-384]\n\n# tcId = 239\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0230285090b0d6a6820bbba394efbee5c24a2281e825d2f6c55fb7a85b8251db00f75ab07cc993ceaf664f3c116baf34b021\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36]\n[key.wy = 0b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5]\n[sha = SHA-384]\n\n# tcId = 240\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b39af4a81ee4ae79064ed80f27e1432e84845f15ece399f2a43d2505a0a8c72c5731f4fd967420b1000e3f75502ed7b7\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e]\n[key.wy = 1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555]\n[sha = SHA-384]\n\n# tcId = 241\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100af4a81ee4ae79064ed80f27e1432e84845f15ece399f2cbf28df829ccd30f5ef62ec23957b837d73fe4e156edccd4465\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 1578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c]\n[key.wy = 76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200041578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b]\n[sha = SHA-384]\n\n# tcId = 242\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02305e9503dc95cf20c9db01e4fc2865d0908be2bd9c733e597e8a5bb7b7a62abdff6dbe3978ae56536d0fb01172ecd55f57\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 33ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab]\n[key.wy = 1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000433ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a9",
+    "1290c2ff5a635389d07149571dab1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3]\n[sha = SHA-384]\n\n# tcId = 243\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02301ee4ae79064ed80f27e1432e84845f15ece399f2cbf4fa31a3ae8edab84dc3330a39f70938e3912bd59753de5aed3088\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 40771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33dda]\n[key.wy = 0e5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004040771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33ddae5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3]\n[sha = SHA-384]\n\n# tcId = 244\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bb51cd3ba8eb201f53ddb4e34e08c0ff7dff9378106784d798d5a3440bd6dc34be3a0eaef8776619a0c97fefb15720b3\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 098d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b7923]\n[key.wy = 099a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000498d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b792399a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd]\n[sha = SHA-384]\n\n# tcId = 245\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100e707e267ea635384a6da09823149f5cb7acbb29e910d2630c5fb5afbc42aa8436349b214a3b8fb9481ec999e005091f8\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5]\n[key.wy = 0f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9]\n[sha = SHA-384]\n\n# tcId = 246\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100acc4f2afb7f5c10f818175074ef688a643fc5365e38129f86d5e2517feb81b2cd2b8dc4f7821bfd032edc4c0234085d9\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 082f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d31]\n[key.wy = 08a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000482f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d318a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c]\n[sha = SHA-384]\n\n# tcId = 247\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02310083276c0793f0a19742422f8af671ccf965fa7d18d541bef4c05b90e303f891d39008439e0fda4bfad5ee9a6ace7e340c\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f99]\n[key.wy = 090f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f9990f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d]\n[sha = SHA-384]\n\n# tcId = 248\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100942848586b534105ddd1ca77df72e1251140f412e97b62afbf85d4822309176b5965453dee3fab709e14156b3dfcecca\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fed]\n[key.wy = 0e85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fede85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178]\n[sha = SHA-384]\n\n# tcId = 249\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 14249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a]\n[key.wy = 28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000414249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b]\n[sha = SHA-384]\n\n# tcId = 250\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023079b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 50a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6c]\n[key.wy = 0bdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000450a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6cbdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc]\n[sha = SHA-384]\n\n# tcId = 251\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 4d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd]\n[key.wy = 680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200044d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc]\n[sha = SHA-384]\n\n# tcId = 252\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 63d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13a]\n[key.wy = 0a9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2",
+    "aa3d9783dc74131e13756034]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000463d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13aa9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034]\n[sha = SHA-384]\n\n# tcId = 253\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c4]\n[key.wy = 09ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c49ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8]\n[sha = SHA-384]\n\n# tcId = 254\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 31f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b4782314003]\n[key.wy = 5bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000431f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b47823140035bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c]\n[sha = SHA-384]\n\n# tcId = 255\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3]\n[key.wy = 0c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139]\n[sha = SHA-384]\n\n# tcId = 256\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 6fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4]\n[key.wy = 375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200046fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426]\n[sha = SHA-384]\n\n# tcId = 257\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023073333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cd]\n[key.wy = 0ecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cdecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b]\n[sha = SHA-384]\n\n# tcId = 258\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 081e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317]\n[key.wy = 0cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000481e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc]\n[sha = SHA-384]\n\n# tcId = 259\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 41fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e7]\n[key.wy = 1c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000441fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e71c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787]\n[sha = SHA-384]\n\n# tcId = 260\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b]\n[key.wy = 572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823]\n[sha = SHA-384]\n\n# tcId = 261\n# point duplication during verification\nmsg = 313233343030\nresult = valid\nsig = 3065023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023064adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b]\n[key.wy = 0a8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86ba8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc]\n[sha = SHA-384]\n\n# tcId = 262\n# duplication bug\nmsg = 313233343030\nresult = invalid\nsig = 3065023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce6002306",
+    "4adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba]\n[key.wy = 1fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba01fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c]\n[sha = SHA-384]\n\n# tcId = 263\n# point with x-coordinate 0\nmsg = 313233343030\nresult = invalid\nsig = 3035020101023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 6e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a]\n[key.wy = 4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200046e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e]\n[sha = SHA-384]\n\n# tcId = 264\n# point with x-coordinate 0\nmsg = 313233343030\nresult = invalid\nsig = 3065023101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a]\n[key.wy = 1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd]\n[sha = SHA-384]\n\n# tcId = 265\n# comparison with point at infinity \nmsg = 313233343030\nresult = invalid\nsig = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 6761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc2736]\n[key.wy = 5c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200046761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc273605c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186]\n[sha = SHA-384]\n\n# tcId = 266\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 34d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f7]\n[key.wy = 086f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000434d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f786f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582]\n[sha = SHA-384]\n\n# tcId = 267\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7]\n[key.wy = 3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f]\n[sha = SHA-384]\n\n# tcId = 268\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n# tcId = 269\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7]\n[key.wy = 0c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0]\n[sha = SHA-384]\n\n# tcId = 270\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n# tcId = 271\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc]\n[key.wy = 09a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[sha = SHA-384]\n\n# tcId = 272\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3064023032401249714e9091f05a5e109d5c1216fdc05e98614261aa0dbd9e9cd4415dee29238afbd3b103c1e40ee5c9144aee0f02304326756fb2c4fd726360dd6479b5849478c7a9d054a833a58c1631c33b63c3441336ddf2c7fe0ed129aae6d4ddfeb753\n\n# tcId = 273\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3065023100b713d2bfbe31b816d8cd9664b96f3383ecaac5a4d1f7e1d9ae64e2b99f9bccac04749052b45d119a39f8b2c11a385b780230690dfcac264fd52f6b26207d74f9fa2bea2ca3d59e405140c94248fb2839eb42c502581b89a964c93cc2e1752dd8b145\n\n# tcId = 274\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3066023100e16bf26ea4fff5d11027bcb3ef305991171e10056986fb03643c5b3c32e88a4f83ea290931fb30f99577ac0f18b733e802310080ff5982d87f575300940c106d84de8af66e16aae7fb31debcb06dfc61fae3f5dbddf6c91211f59f4f5b69962b1f554c\n\n# tcId = 275\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3066023100c137d4933acbdce166768125db5e42d0764ccad43b0104870761086072cce89de2f3819",
+    "ca305dc3073a941ae78dbbf55023100f990907818a7c67ecfedd56629cc6fb334edafa233f08a79d21be8653f012994e7736a060428b45deec34140c496302e\n\n# tcId = 276\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3065023000f5579516d13ca92114bf230093f2462ef65e97b111051e62fbb73d06e0635a8d70e04b20f86e5e7ed211eebc653342023100e425e475ee6e27df44eeafbb268356bcd70aee82f0b971c994b49d1aae86fec12d3b7db4aaa2ff7de5b4bfb2eedcacc0\n\n# tcId = 277\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306502304e7989e8d6498df3d1b34d8f45fc922197dd023ef9f3594a7ec52dd575d24e3d93ef16e11bc77893dd341c8d1ab2c4b302310088a4178d2ba03c6acc79eda01e742dcd82fb2614cabd8bc586145c97da3d170b884678abdb2dc80b3b9bf6244e966ba1\n\n# tcId = 278\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306502302b1ff7fafd59899258d6b8c69bd3410f1d983e6b167674591d9c25387263e7e25438b30dcbd2c8ff76db8ebec2c77e2a0231008c44cf1a90610d9deefbf23c935741530f9f190dae4d7ba3d6efaef3bbb0e2d47296b65ef65241ef3b98934639fb50bd\n\n# tcId = 279\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3066023100c0583e25c9298fdcc1695f04d3fc32de300ec5470c584b85b7d3c3c2915e9de3c22516907852dd801d7f1ef1645157bb023100c01f7df3954501aee191ead82e68a408549a09fb3a839325111b195938df984c9cf1383cfb88800757bade4d585ec906\n\n# tcId = 280\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306502304131dda169326aaac2714d0ff8a98d7439d2f353ab98e40bdde29d3b20dec87daef1358adc611280384a631f38c2cf70023100d72f8e5dbd73950cb6e941a563387ed1ae707db38f0f8a80518cf3d4885a56d8ecf7f278a1b24f0a973347b4a160bcf6\n\n# tcId = 281\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3065023048e82f614523c83dfc873730d02541aab03214825d21aac689c3b851c20f9e4d563439999372fc781f4351202ddef8d1023100c54ceb0786726ce16d74d259813e6ab859e42a09639a39da77f412ab86c17a9b8b5add2bbcda564f650ca304c081be3f\n\n# tcId = 282\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3066023100d7143a836608b25599a7f28dec6635494c2992ad1e2bbeecb7ef601a9c01746e710ce0d9c48accb38a79ede5b9638f3402310080f9e165e8c61035bf8aa7b5533960e46dd0e211c904a064edb6de41f797c0eae4e327612ee3f816f4157272bb4fabc9\n\n# tcId = 283\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 306402307ff92abef367440ba54256a5fd5d679a9741d5a63fa0ef9ab34351239c67804eaff32f86d69b984096a1c0c76d36b79802301120223ea279522dbea4eb4297452fd9bdc723e0752b1fd7fdfcdb90d2a4e06ea3ac2e680e6823c57ddb5cbea22da451\n\n# tcId = 284\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3066023100dc2a42181fac07068e0d3ee845d21f38c1464199009f99f4e88b99f540436401b514cd72ecdafd0e5b3808c9a9130928023100de979bef97b779c29b80e38fb17e8a3072f84560793d936051f5fca6013e11e743b4efc10f9bd45a9a0e5dc3d71c8f6a\n\n# tcId = 285\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30640230239542d8e4ee6f48e7d10657ba3d0a9a92c66f0e10c82b5919afba50c129b2d01124ae5bdc643bfa8bb3be67814f6b6502305d5a5a89149eefd34d1f00fe8922b06e62fca3d57d1c0a8daabd3f2160706830fdb3579cf6e64ed8ee635908239e8e6d\n\n# tcId = 286\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023100929edc580377e5f1f0a6bed840a14ac1ac3fdd98f7d0cd56735583b521e9f6f2d7caabed6688fed3ffcaf0554e9aecf4023008e571b8052b5b59f2251b33b609681e7128d765b8b2b169eaccd7238f372c994c99aee46c8bf4fa039d0070b544c8d3\n\n# tcId = 287\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 306602310091df8d8c1a2f4fedad280883f1d54b43e9bbbc1a626df57f58cfa020159c3f91571939f06e6d32748fbb3a224c7c0559023100ab40e8c6b98b16afdf556b16fe50d3baffaf742e56cd552d5efa7307bff708923c4e9080dc46d1c23b15bc3036982fd3\n\n# tcId = 288\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023058a891b20baeb6430fc44e3684900d9eee4566ee90cb3a6f175e1963d9e1e706e753ab3be82e6ab438a61fece74e3788023100bcd637e78b7a944533525c9d51b045743381c778133a5ad9d95d5d0692bea05695ff1a72419ca2929a215bc769707c1e\n\n# tcId = 289\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3066023100ec4fbd25bd38a23ce5c98c6e582d0810cd918fc04be2b78df107765baefe3783a8e917bf6d6768e8f8b79f67a6b6e023023100ee8b5d4b8c8b1b26960984c3226654a829d9c28d3b050ae464c8399c936be431ad0ac22b6df23589f77cf752b965e4de\n\n# tcId = 290\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023100f2a9b27da3c72a037f3ff2fe5f4c776df8383c7955636260a66316525089bbbb1719f96bc4ed132923ec168e6f3143320230476e427ec28bc4a04c485dde1d34243f1fe283616e0b632195eb71950de75e61061ca7c522a305eaacf61294339eec11\n\n# tcId = 291\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023100938c88f4937f8cab933d7879f04a316d2b6976d8bfb6b86742a2442839806726723dbed366f4004537e759e77fe07e2102306415396d8690b380b4eb1b4d78016cf6d407259bad568bee662dd594731fabae115534cc7db00b2ec46326926646d029\n\n# tcId = 292\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30650230234503fcca578121986d96be07fbc8da5d894ed8588c6dbcdbe974b4b813b21c52d20a8928f2e2fdac14705b0705498c023100cd7b9b766b97b53d1a80fc0b760af16a11bf4a59c7c367c6c7275dfb6e18a88091eed3734bf5cf41b3dc6fecd6d3baaf\n\n# tcId = 293\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3065023100ac5559ad224e76aa6637515357c5f0ac4ffef4f7e21297f8b65d72e6b5cc547511ddb2f0c36125b6b11c0a82308c44d20230542aea18bf5fe640d5e94fc27d69176e21cd15f0f817741e982f51e7a9d5bd4f33cd8846fbd9f6cd1ae7d0cff31de2e4\n\n# tcId = 294\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3065023100d48578efe0200370eb3dba190629c584f4505b3d18dcb7176e81c94eaaba9be4b35f16b2f558cf42f6e49bb13a8c52a3023062d7450e411ce64d8349a9e90a07fc09e5521efec1b9739cc9f68d0877b4a4b4d50a5f5647ef6dc3e6a9495ccabbeae4\n\n# tcId = 295\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3064023019a87de40615da310fbc062ab5954a4a5d538f7bb18407e9c9e852fead9d03fed7c7fbd6034e1ad8c30b978bfed75a3202304e0c8a9da62e78c60c417fa8870cc879e4d5ec92b6ec8648fd6ce4e576f1e09eaad3867f5441d800e659207c8a1bba86\n\n# tcId = 296\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 306402306e6c0aed8fb6d30d7fd6064ad34316c9cfb4eb4a0c5bef44660a3b993ab199a934fc8e69cdf764abf05639cc16ef2e1d0230758560ba98b0b522327e2ae8a8ba843e4255c1742eb69174d3ce806c8a91ef330d186311c99062626a81fe38ad6d10c0\n\n# tcId = 297\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 306502305acb49557723224e81e2a58e633d38cd78dcc1c905e61e2a16ade32420e198b9cd6120fcc3a57c0c986f80658dc4c4a0023100addee5259c644f68219827a73ddeb4d46123b3afd9c5812d2c6738f7e46f69115923464b7dcf214388e37a62bf2b6e8e\n\n# tcId = 298\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 306502310083ae547fe0e176a792cb77ca7af6acdd7670f168565c7d918e8f90cbaafe59d57a425dd33d1140167446f34067fc276f0230384ce801465758c5c4b1c1684f51c36a70a844aa9b0607a4cef6e16cf59298c281cf01c712d1022d22b24cb21ebb326b\n\n# tcId = 299\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3066023100ef29e1a82a785f06532f48954482c53677d2dbf6b2b1e7d1b3869a846bde4d12e03ae0d873dc36a9ac8a00c4560760e7023100de7f161069409d8c66842ee3cd9564703565c533027f12a4ca1dd6d3f276e46d42b712789b3426a36741bbe989d2dfa2\n\n# tcId = 300\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 306602310087c8bd783eef6a4c6d7fa736f04988ff9f8c0c5dbcc217dbd1ec581d19e0f0febf5e00ae17d8c06002c8819922f3bdc4023100d678c7b67e2e915a8d082374d0f881bea2bec6ddd588835fed0dc4fc22589104330904ff877f88e43c3b4370dd7e8534\n\n# tcId = 301\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3066023100baac6d6ce7f04ae4c4c857ef84b15fa80fc65ae28094039b9650e519770725bb9a025b9ae11a01af606b05bc821fe5ec023100e4f63ca843015dbe2b5b0d416eeffde83c3551c577fae2e51439c3914e25c3bfb88926189d8bae17914d5da25fd95d4d\n\n# tcId = 302\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 306502305cad9ae1565f2588f86d821c2cc1b4d0fdf874331326568f5b0e130e4e0c0ec497f8f5f564212bd2a26ecb782cf0a18d023100bf2e9d0980fbb00696673e7fbb03e1f854b9d7596b759a17bf6e6e67a95ea6c1664f82dc449ae5ea779abd99c78e6840\n\n# tcId = 303\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 306402306c8c296baf417e4a24df7461c2de9e9cf5d571bf5385b638fddb79fb085df7649b2f92302bc2c5fd5f5e5329b66cbf59023053757b85d794471f605b02fb5ff537b745b743cab0ebd9d23719fd287c35fc76db0faae9acd714387ade4598afbcfe7f\n\n# tcId = 304\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 306502302790f0cc0c6",
+    "b246039e10903c8fc31b422ae1556828211f0d161d0faebdf2c2de291aa27eb0e4e77acdf9c26c9b93ecf023100f3ae4e3438d6ec9b2226b2fbfc91531c84ee662f373fb0758d037878e389e1d41a72e79deea65566769f1a6517a5bd3d\n\n# tcId = 305\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 306402305acf4d0f3774877235bdb1451bab6b9213afafbf0167d0344b759ba7a25585108d47a800ff16fe931fb015fa5905554f02304b23183cf53319e1520e5b27b3329494e1a2f293095b6fa5e0246ae2541348fadcbfee925b28892edda4d05eac5e5c69\n\n# tcId = 306\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 306402301bc3589fc58f43ef7d7361cf0d1f0b89214e151ebd2a9757b1af0c753b19e7459ec0d83b2c030e19e56eb010ff28ca5802303943d4aabfa9f3705bfd5d544b0347e5b41651c1b5b58ba6d1d200d868193a31ccc45d955fddbb869bd0a8c16530c61e\n\n# tcId = 307\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3064023024f9ee63092fd4ea83bddecb5f120d41b61ec39a5faf037b24c8fdd4036ab3ecc3368a60b82b735321ce91c23b5ea69a02306495015984abae9ab9335d0ea705b93cad15f1df84bc73a47ae38fd338f1a9a89bbd8a0dff83ff69e93c4f5ac5fb2032\n\n# tcId = 308\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3066023100e8ec3ba983144d851f617b28a76097335f4cdaa2d08af546f6ef13863c2293138e2d049661c671565f9fb507cfd200e40231008614ed1d49c27fce7798537a6f5ca13a25183787941aefd2282269e3a86d444742a3b546ce474d6f916a57d9ab63b6ad\n\n# tcId = 309\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 306502310080a7f5589456796f2287b8d875bca222907b9cc30f0d667e126f56bae9e758da271d10624ac2b2b7ef472614c06530de02303beaf667ddacecf76d6ca6a5fff559c0a3099a267f84f0f29eb481c3b2e719c14373c90218670f0dca5fa77bf95ad294\n\n# tcId = 310\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3066023100e3aa89289f644082c98a80aacae011381bcbc6056007b4d81a180b3681da2e3f1fc0808b018d14fbd6afd09880e6f168023100ef6f95647ba3db06a703af6836b2fea8f1a02248d55621d0fb8b6dada63926a0a93a71a75283929f67082977cb1158b6\n\n# tcId = 311\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3065023071c7c3bf3ce2d458c047f91ba180930fddf878c0f8dae3cdd9fd6d2da516c47265f9c3e3f51a33ef38b63c5a39de0f1e023100c080c819a34b8968bd36a60251d75464910039cdcc0ea8d18d681144960b8a566aecf27d23b47ce2b38e7ed0a4d27bf4\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac]\n[key.wy = 0acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[sha = SHA-384]\n\n# tcId = 312\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3065023007648b6660d01ba2520a09d298adf3b1a02c32744bd2877208f5a4162f6c984373139d800a4cdc1ffea15bce4871a0ed02310099fd367012cb9e02cde2749455e0d495c52818f3c14f6e6aad105b0925e2a7290ac4a06d9fadf4b15b578556fe332a5f\n\n# tcId = 313\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100a049dcd96c72e4f36144a51bba30417b451a305dd01c9e30a5e04df94342617dc383f17727708e3277cd7246ca44074102303970e264d85b228bf9e9b9c4947c5dd041ea8b5bde30b93aa59fedf2c428d3e2540a54e0530688acccb83ac7b29b79a2\n\n# tcId = 314\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30650230441800ea9377c27865be000ad008eb3d7502bdd105824b26d15cf3d06452969a9d0607a915a8fe989215fc4d61af6e05023100dce29faa5137f75ad77e03918c8ee6747cc7a39b0a69f8b915654cac4cf4bfd9c87cc46ae1631b5c6baebd4fc08ff8fd\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422]\n[key.wy = 0c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[sha = SHA-384]\n\n# tcId = 315\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306402303244768016457c463b74f2097f216d9670b191f76281c74bc6a1a1971d19f209bf4696468f5eb75d6326a0a43c0a65290230501e0ad985ed9f95697bd17fdbe3f9ca92e0f76426d3664e6896648d9c750bf588d0ce7d011c1a1e8d6c2e082422dc93\n\n# tcId = 316\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306402305e1af40f2480e3d97c4ae4bfd34a9f45269241356f3a46becd86a4a7c9716d73ca5aebdb3db1a7765650666683bc856b02307e7c4b473a2baaa4953785be8aa2a10006f6d36b400ab981864d69cecec046718d0404b9647454b159aa5a92d76d7955\n\n# tcId = 317\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306502306688e36a26f15bdc1c3f91367f8a7667f7bb3e30a335d6f0900e9534eb88b260cb29344c723fedfbe7ac9c5a33f4bf0d023100aa35fddf0fdc9017860b378f801cd806f3e2d754cd2fd94eb7bb36a46ce828cef87e9ebbf447068e630b87fee385ad8f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000]\n[key.wy = 0e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[sha = SHA-384]\n\n# tcId = 318\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100d4a8f3b0b4d3a5769e3a0bbc644b35f1d509355ed1fe401e170f667b661f693b32598e8c143a817a958982845042bb48023004cc07578bbd1981dbf6e8a97a354c98d41b8b6f6e8a2c2b1763c7c2a29d79e24f8476075c9aed9aec6c64dff50461ae\n\n# tcId = 319\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100c286d1928e9c79fdd3bebdf22a1dbd37c8105e8ecf41e9e3777fe341b6b8d5a89b9d986827d6d1dbb381cd8239484a220230201119ae305b9360aa9b5e5d1567e0674c09e4f025556ebf81b987466b0f421b8d31f72bbe95f3ce2aa9874a84edfd40\n\n# tcId = 320\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100d9c678550167f10c511e62acb4bd0a3f7f336bc090c94e6c6b02622439c348a2159c5f41f9b5aa4b470590d40dcd7cc202301fd5eaee295abb4081cb626745f4ad279ceb44604062830b58e6c0465c562d41f02ba588fc0db1ebbe339cdc008d7a1b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69]\n[key.wy = 0d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[sha = SHA-384]\n\n# tcId = 321\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3065023020fee7c71b6cb0d1da3641ec6622c055a3b16a1f596c64b34da1b2d0b868b66a8f0a0d0db983b3dc7e53bb7295da81970231008141a931d3579aec1cac9887d2fff9c6f12d47a27e4aab8cf262a9d14a715bca0b2057cbc3f18b6fd3d1df76f7410f16\n\n# tcId = 322\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100913eecc559b3cf7108a65d6cc3076bfdf36c6f94dcc6693d06690470f34a2e81564241e1de5f5f51421de30af467f10f0230649bd3717244e8ef3c6b0eda983f84dca5ea86d1bec15386b9c473ec43a8cd0ba558eee819f791d9ff9272b9afd59551\n\n# tcId = 323\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3064023023855c46403a97b76cbb316ec3fe7e2c422b818387604bda8c3d91121b4",
+    "f20179d9107c5f92dedc8b620d7db87fccccd023050f57343ab148e50662320c4161e44543c35bc992011ea5b1680b94382cf224ea0ec5da511e102f566cb67201f30a2ee\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336]\n[key.wy = 208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[sha = SHA-384]\n\n# tcId = 324\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100d200958d491fcebde667cd736c9dba0961c70db2ecaf573c31dd7fa41ecca32b40b5896f9a0ddf272110e3d21e84593a023100c2ecf73943b9adce596bac14fce62495ae93825c5ff6f61c247d1d8afcba52082fc96f63a26e55bccfc3779f88cfd799\n\n# tcId = 325\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 306402306ac17d71260c79f81a7566124738cb3ee5d0aa690e73a98ae9e766f1336691e500cad51ba1302366c09cc06b8f7049e0023032ca965d6d7012ec187c7cab9544334d66c2a7658ddefa67e4ad40429815518ecc87b1492ddd57333bd2300b4660a835\n\n# tcId = 326\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100e19a4646f0ed8a271fe86ba533f8be4fd81bbf4674716f668efa89a40cac51eec2a6cfbd92327d25efe91ca4ff712bc502304a86b2e8e12378e633dec2691e3b1eed4e932cc48b28e45fa3d464cc0e948c02cc9decf2bb43b25937fcf37e9ad86ef0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336]\n[key.wy = 0ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[sha = SHA-384]\n\n# tcId = 327\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3064023015aac6c0f435cb662d110db5cf686caee53c64fe2d6d600a83ebe505a0e6fc62dc5705160477c47528c8c903fa865b5d02307f94ddc01a603f9bec5d10c9f2c89fb23b3ffab6b2b68d0f04336d499085e32d22bf3ab67a49a74c743f72473172b59f\n\n# tcId = 328\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 306602310090b95a7d194b73498fba5afc95c1aea9be073162a9edc57c4d12f459f0a1730baf2f87d7d6624aea7b931ec53370fe47023100cbc1ef470e666010604c609384b872db7fa7b8a5a9f20fdefd656be2fcc75db53948102f7ab203ea1860a6a32af246a1\n\n# tcId = 329\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100dd4391ce7557cbd005e3d5d727cd264399dcc3c6501e4547505b6d57b40bbf0a7fac794dcc8d4233159dd0aa40d4e0b9023100a77fa1374fd60aa91600912200fc83c6aa447f8171ecea72ae322df32dccd68951dc5caf6c50380e400e45bf5c0e626b\n\n",
+};
+static const size_t kLen62 = 134146;
+
+static const char *kData63[] = {
+    "# Imported from Wycheproof's ecdsa_secp384r1_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.4\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa]\n[key.wy = 4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f]\n[sha = SHA-512]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202307b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19fbb197e4c4250926e30c5303a2c2d34250f17fcf5ab3181a6\n\n# tcId = 2\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 306402301d526c8b0d7b0858c58e843fd9d7c779a519f0c34aa789f36cdbb6f0820a506b3631ccc2b335f78350f7c50337d0f5190230454ccaa7aec6e4bec81886203e5a8743a67a265dd9c048f47b7b6a4d2a18e27992e727757788e0c4b22ef0c16ec0643a\n\n# tcId = 3\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 3065023100e2cc9ba64c14225cee38c83c0f060e4df6977efafde3df2abeddb0a6b55f68e29a3842c5064540f020c940c14cb066ab0230504f4d0fd25a10f866bb15c5bbfd2a56a157e01a67530d02f737f62f2cb661e5e133569d5f870ac1c629b2edd010a19e\n\n# tcId = 4\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 3066023100cd5d45c993e29a8dfab724cfd83eec1da56a101dc12ab26242c72c8196db8b07e5cba3e84d720d0120b38c25a938e4ec02310088f6d024d7a40232b81816246ca44e69ad0f2dee19312c3937028a91e843d386e649923059c28025a3017e1228b7a2eb\n\n# tcId = 5\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 30640230425ebeaf08d3a75c61e193b6fd0d27ab04cecc4f35a9cf1e1d1420795ec34bc7301216248f265d759fdc39e687bd49ff0230500819b4abc358e7139eb3c481bb73d88322e7467e617a47143989844b5d95b7c79b3192075faa7a157ca8278376b109\n\n# tcId = 6\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 306402300b1d031c018d70070d27e3b0c565c2c887206711567d35b79060c9273a03e2cc022c2711a983fee92a24d81ec1269cdb02303df76cc45d142a5ef8f1c4fae7ef1d10f267606089dc4b53aaac719835a2768e9a7a0e85649a22f0e50aae7cb52149cc\n\n# tcId = 7\n# Legacy:ASN encoding of r misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 30650230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n# Some implementations of ECDSA and DSA incorrectly encode r and s by not\n# including leading zeros in the ASN encoding of integers when necessary. Hence,\n# some implementations (e.g. jdk) allow signatures with incorrect ASN encodings\n# assuming that the signature is otherwise valid.\n\n# tcId = 8\n# Legacy:ASN encoding of s misses leading 0\nmsg = 313233343030\nresult = acceptable\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n# Some implementations of ECDSA and DSA incorrectly encode r and s by not\n# including leading zeros in the ASN encoding of integers when necessary. Hence,\n# some implementations (e.g. jdk) allow signatures with incorrect ASN encodings\n# assuming that the signature is otherwise valid.\n\n# tcId = 9\n# valid\nmsg = 313233343030\nresult = valid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 10\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 308166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 11\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 306702813100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 12\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20281310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 13\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30820066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 14\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30680282003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 15\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2028200310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 16\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 17\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 18\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3066023200814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 19\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3066023000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 20\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202320084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 21\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202300084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 22\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30850100000066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 23\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 306b0285010000003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 24\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2028501000000310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd",
+    "781c837355ddd41c752193a7cd\n\n# tcId = 25\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3089010000000000000066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 26\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 306f028901000000000000003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 27\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 306f023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202890100000000000000310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 28\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 29\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306a02847fffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 30\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202847fffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 31\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 32\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306a0284ffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 33\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20284ffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 34\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 35\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306b0285ffffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 36\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20285ffffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 37\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 38\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306e0288ffffffffffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 39\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20288ffffffffffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 40\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30ff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 41\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 306602ff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 42\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202ff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 43\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 44\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3066028000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 45\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202800084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 46\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 47\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 48\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 30680000023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 49\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 50\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 51\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0500\n\n# tcId = 52\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 3068023300814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2050002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 53\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a",
+    "70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202330084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0500\n\n# tcId = 54\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306b4981773066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 55\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a25003066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 56\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30683066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0004deadbeef\n\n# tcId = 57\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306b2236498177023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 58\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a22352500023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 59\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306e2233023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20004deadbeef02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 60\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2223649817702310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 61\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22235250002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 62\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2223302310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0004deadbeef\n\n# tcId = 63\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306eaa00bb00cd003066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 64\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306caa02aabb3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 65\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306e2239aa00bb00cd00023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 66\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306c2237aa02aabb023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 67\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22239aa00bb00cd0002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 68\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 306c023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22237aa02aabb02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 69\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30803066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 70\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 306a2280023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 71\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2228002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 72\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30803166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 73\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 306a2280033100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 74\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2228003310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 75\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 76\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2e66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 77\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2f66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 78\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 79\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3266023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 80\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = ff66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 81\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066003100814cc9a70febda342d4ada87fc39426f403d5e89",
+    "808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 82\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066013100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 83\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066033100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 84\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066043100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 85\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066ff3100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 86\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e200310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 87\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e201310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 88\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e203310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 89\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e204310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 90\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2ff310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 91\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 92\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 306a30010230653100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 93\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 306a22350201000230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 94\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22235020100023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 95\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7\n\n# tcId = 96\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 30653100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 97\n# indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 98\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd00\n\n# tcId = 99\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd05000000\n\n# tcId = 100\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd060811220000\n\n# tcId = 101\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000fe02beef\n\n# tcId = 102\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0002beef\n\n# tcId = 103\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 30683000023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 104\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd3000\n\n# tcId = 105\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30683066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 106\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 3033023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2\n\n# tcId = 107\n# repeat element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 308199023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 108\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 303302310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 109\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3068023300814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 110\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1",
+    "eca60c897bfd6728da14673854673d7d297ea944a15e202330084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000\n\n# tcId = 111\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 30680233000000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 112\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023300000084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 113\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3035050002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 114\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 3035023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20500\n\n# tcId = 115\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 3035020002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 116\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 3035023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20200\n\n# tcId = 117\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023102814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 118\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310284f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 119\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a156202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 120\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a74d\n\n# tcId = 121\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a1502310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 122\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 30650230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 123\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202300084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7\n\n# tcId = 124\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 125\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 30670232ff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 126\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20232ff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 127\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 303609018002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 128\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3036023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2090180\n\n# tcId = 129\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3066023101814cc9a70febda342d4ada87fc39426f403d5e8980842845d38217e2bcceedb5caa7aef8bc35edeec4beb155610f3f5502310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 130\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30650230814cc9a70febda342d4ada87fc39426f403d5e898084284644bb7cded46091f71a7393942ad49ef8eae67e7fc784ec6f02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 131\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30660231ff7eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9f3e1359f376840298d725eb98c7ab98c282d68156bb5ea1e02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 132\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 306502307eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9bb4483212b9f6e08e58c6c6bd52b610715198180387b139102310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 133\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30660231fe7eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7ba2c7de81d4331124a3558510743ca12113b414eaa9ef0c0ab02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 134\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3066023101814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 135\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 306502307eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9f3e1359f376840298d725eb98c7ab98c282d68156bb5ea1e02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 136\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310184f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e5fd3ad1cb7a61dc9507f6eeb2a65341ad0cac035dfee58d140\n\n# tcId = 137\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e6044e681b3bdaf6d91cf3acfc5d3d2cbdaf0e8030a54ce7e5a\n\n# tcId = 138\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20231ff7b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19ff3b630ca4e19648ed8ab2287e37c8caa222be38ade6c5833\n\n# tcId = 139\n# Modified r or s, e.g. by adding ",
+    "or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20231fe7b0a10ee2dd0dd2fab75095af240d095e446faba7a50a1a02c52e34859e236af809114d59acbe52f353fca2011a72ec0\n\n# tcId = 140\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310184f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd\n\n# tcId = 141\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202307b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19ff3b630ca4e19648ed8ab2287e37c8caa222be38ade6c5833\n\n# tcId = 142\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 143\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 144\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 145\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 146\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 147\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 148\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 149\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 150\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020100090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 151\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 152\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 153\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201010201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 154\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 155\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 156\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 157\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 158\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 159\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020101090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 160\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 161\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 162\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 163\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 164\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 165\n# Signat",
+    "ure with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 166\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 167\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 168\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30080201ff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 169\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 170\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 171\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 172\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 173\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 174\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 175\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 176\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 177\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 178\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 179\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 180\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529720201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 181\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 182\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 183\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 184\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 185\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffff",
+    "ffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 186\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 187\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 188\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 189\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529740201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 190\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 191\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 192\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 193\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 194\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 195\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 196\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 197\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 198\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 199\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 200\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 201\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 202\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 203\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 204\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 205\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000",
+    "100000000020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 206\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 207\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001000000000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 208\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 209\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 210\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 211\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 212\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 213\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 214\n# Edge case for Shamir multiplication\nmsg = 3637323636\nresult = valid\nsig = 3066023100ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf5656840231008f8a277dde5282671af958e3315e795a20e2885157b77663a67a77ef2379020c5d12be6c732fd725402cb9ee8c345284\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0ca5ee479ad6624ab5870539a56a23b3816eef7bbc67156836dfb58c425fdb7213e31770f12b43152e887d88a3afb4b18]\n[key.wy = 2aceec92b3139aca8396402a8f81bb5014e748eab2e2059f8656a883e62d78b9dc988b98332627f95232d37df26585d3]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004ca5ee479ad6624ab5870539a56a23b3816eef7bbc67156836dfb58c425fdb7213e31770f12b43152e887d88a3afb4b182aceec92b3139aca8396402a8f81bb5014e748eab2e2059f8656a883e62d78b9dc988b98332627f95232d37df26585d3]\n[sha = SHA-512]\n\n# tcId = 215\n# k*G has a large x-coordinate\nmsg = 313233343030\nresult = valid\nsig = 304d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\n\n# tcId = 216\n# r too large\nmsg = 313233343030\nresult = invalid\nsig = 3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 70e6a90b4e076bf51dfa01fa44de49b448f7afa0f3d07677f1682ca776d404b2a0feef66b005ea28ba99b6ce21d0ca12]\n[key.wy = 424f7d179951fb89156cdf04aed6db056c98592c651b5a881abc34e2401127fb81c64e90cee83269c5141f9a3c7bce78]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000470e6a90b4e076bf51dfa01fa44de49b448f7afa0f3d07677f1682ca776d404b2a0feef66b005ea28ba99b6ce21d0ca12424f7d179951fb89156cdf04aed6db056c98592c651b5a881abc34e2401127fb81c64e90cee83269c5141f9a3c7bce78]\n[sha = SHA-512]\n\n# tcId = 217\n# r,s are large\nmsg = 313233343030\nresult = valid\nsig = 3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 5a568474805fbf9acc1e5756d296696290b73d4d1c3b197f48aff03b919f0111823f90ea024af1c78e7c803e2297662d]\n[key.wy = 4c1c79edc9c694620c1f5b5cc7dd9ff89a42442747857cace26b6ebc99962ec3a68a8e4072226d6d98a2a866dd97c203]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200045a568474805fbf9acc1e5756d296696290b73d4d1c3b197f48aff03b919f0111823f90ea024af1c78e7c803e2297662d4c1c79edc9c694620c1f5b5cc7dd9ff89a42442747857cace26b6ebc99962ec3a68a8e4072226d6d98a2a866dd97c203]\n[sha = SHA-512]\n\n# tcId = 218\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 088531382963bfe4e179f0b457ecd446528b98d349edbd8e7d0f6c1673b4ae2a7629b3345a7eae2e7c48358c13bdbe038]\n[key.wy = 09375c849dd571d91f2a3bf8994f53f82261f38172806c4d725de2029e887bfe036f38d6985ea5a22c52169db6e4213da]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000488531382963bfe4e179f0b457ecd446528b98d349edbd8e7d0f6c1673b4ae2a7629b3345a7eae2e7c48358c13bdbe0389375c849dd571d91f2a3bf8994f53f82261f38172806c4d725de2029e887bfe036f38d6985ea5a22c52169db6e4213da]\n[sha = SHA-512]\n\n# tcId = 219\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 080da57d67dba48eb50eef484cf668d981e1bf30c357c3fd21a43cdc41f267c3f186bf87e3680239bac09930f144263c]\n[key.wy = 5f28777ad8bcbfc3eb0369e0f7b18392a12397a4fbe15a2a1f6e2e5b4067c82681c89c73db25eca18c6b25768429cef0]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004080da57d67dba48eb50eef484cf668d981e1bf30c357c3fd21a43cdc41f267c3f186bf87e3680239bac09930f144263c5f28777ad8bcbfc3eb0369e0f7b18392a12397a4fbe15a2a1f6e2e5b4067c82681c89c73db25eca18c6b25768429cef0]\n[sha = SHA-512]\n\n# tcId = 220\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020102020101\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0e74a096d7f6ee1be9b4160d6b79baba4d",
+    "25b4fb6fbdd38f5a9ed5cc1ac79943be71ede093e504c7dc0832daeb898a05]\n[key.wy = 0a8d005b30c894686f6ecb2bc696e25effaccd3c9e4b48122db567c0118a0b983b757c2f40082dc374f8f6117a8e76fc0]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200040e74a096d7f6ee1be9b4160d6b79baba4d25b4fb6fbdd38f5a9ed5cc1ac79943be71ede093e504c7dc0832daeb898a05a8d005b30c894686f6ecb2bc696e25effaccd3c9e4b48122db567c0118a0b983b757c2f40082dc374f8f6117a8e76fc0]\n[sha = SHA-512]\n\n# tcId = 221\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020102020102\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0a2ad0e27b40410d16077ddc5e415f109d328bf75e73a0f56876fef731285f83188b207a68690a40e76ed23e2c5e49fcf]\n[key.wy = 604f1c5d7d7df365005d40e209f4da7bb06f310d5a1660ad6236577fbb47955261f507d23b83013ffb951bd76908e76c]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004a2ad0e27b40410d16077ddc5e415f109d328bf75e73a0f56876fef731285f83188b207a68690a40e76ed23e2c5e49fcf604f1c5d7d7df365005d40e209f4da7bb06f310d5a1660ad6236577fbb47955261f507d23b83013ffb951bd76908e76c]\n[sha = SHA-512]\n\n# tcId = 222\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020102020103\n\n# tcId = 223\n# r is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975020103\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0a233025c12d20f49dc50dc802e79f03c7ce1750b9204b51325d90b5ade08f4a74ef6efb081ed3156d64a0110d60fffab]\n[key.wy = 0b924881891ee984cf51949dee96cfd7c9759b1ff00f0dbdc718d52117079d5d8bd6c86c6f532276af38b779bf2350d7f]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004a233025c12d20f49dc50dc802e79f03c7ce1750b9204b51325d90b5ade08f4a74ef6efb081ed3156d64a0110d60fffabb924881891ee984cf51949dee96cfd7c9759b1ff00f0dbdc718d52117079d5d8bd6c86c6f532276af38b779bf2350d7f]\n[sha = SHA-512]\n\n# tcId = 224\n# s is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3036020102023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 3c9bb63607cdea0585f38d9780c9ac3e9a5a58153e2aacc4bc7a1d638d12e32c4d3a90c0c114b232c6f16e23e4bebb24]\n[key.wy = 0da2ac2ccedc5494fe534a9abaea3013de0176f1b0e91bcd62154bdf3f604091a5008b2466702d0e2f93e4a4b6c601a54]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200043c9bb63607cdea0585f38d9780c9ac3e9a5a58153e2aacc4bc7a1d638d12e32c4d3a90c0c114b232c6f16e23e4bebb24da2ac2ccedc5494fe534a9abaea3013de0176f1b0e91bcd62154bdf3f604091a5008b2466702d0e2f93e4a4b6c601a54]\n[sha = SHA-512]\n\n# tcId = 225\n# small r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 3036020201000230489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 559a66ef77752fd856976f36ed315619932204599bd7ef91d1a53ac1e7c90b3969cab8143b7a53c4bf5a3fe39f649eb6]\n[key.wy = 1f00f86dd8b8556c4815b2a01c59eb6cc03c97b94b6db4318249fe489e36ac9635876b1ca2ec0999caef5e1a6a58a70d]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004559a66ef77752fd856976f36ed315619932204599bd7ef91d1a53ac1e7c90b3969cab8143b7a53c4bf5a3fe39f649eb61f00f86dd8b8556c4815b2a01c59eb6cc03c97b94b6db4318249fe489e36ac9635876b1ca2ec0999caef5e1a6a58a70d]\n[sha = SHA-512]\n\n# tcId = 226\n# smallish r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 303c02072d9b4d347952cd023100ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 548e79a17fd3a114d830ea88f218ee1ef7aa3f8dc139e0a8b9b60e25049a816ef449e8bd5dae867446495fdf20f4770]\n[key.wy = 363a1e8afefb02ebfd59df90b6d23ff7d5f706f9b26daebae1d4657ac342844ee9c2e0e9269f7efe7ab91e0303c115d]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200040548e79a17fd3a114d830ea88f218ee1ef7aa3f8dc139e0a8b9b60e25049a816ef449e8bd5dae867446495fdf20f47700363a1e8afefb02ebfd59df90b6d23ff7d5f706f9b26daebae1d4657ac342844ee9c2e0e9269f7efe7ab91e0303c115d]\n[sha = SHA-512]\n\n# tcId = 227\n# 100-bit r and small s^-1\nmsg = 313233343030\nresult = valid\nsig = 3041020d1033e67e37b32b445580bf4efb02302ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0a0eb670630f9bbbd963c5750de7bcbae4ddfd37b13fe7690eec6861a3c56c8efb87dbbf85ccd953c659d382c3d7df76a]\n[key.wy = 0fb08840635a16ac7ecf3de2dc28a77c8af9d49e5a832551e3354a2b311e52be86720d9b2fbb78d11a8aec61606a29f0d]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004a0eb670630f9bbbd963c5750de7bcbae4ddfd37b13fe7690eec6861a3c56c8efb87dbbf85ccd953c659d382c3d7df76afb08840635a16ac7ecf3de2dc28a77c8af9d49e5a832551e3354a2b311e52be86720d9b2fbb78d11a8aec61606a29f0d]\n[sha = SHA-512]\n\n# tcId = 228\n# small r and 100 bit s^-1\nmsg = 313233343030\nresult = valid\nsig = 303602020100023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 254bce3041b00468445cb9ae597bc76c1279a8506142ce2427185b1d7f753d1c0aad94156b531a2071aa61c83ec842a3]\n[key.wy = 710d6c8c96766ae8b63396133e5872805e47d9ba39113e122d676d54dbb2460b59d986bdd33be346c021e8a71bb41ba9]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004254bce3041b00468445cb9ae597bc76c1279a8506142ce2427185b1d7f753d1c0aad94156b531a2071aa61c83ec842a3710d6c8c96766ae8b63396133e5872805e47d9ba39113e122d676d54dbb2460b59d986bdd33be346c021e8a71bb41ba9]\n[sha = SHA-512]\n\n# tcId = 229\n# 100-bit r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 3041020d062522bbd3ecbe7c39e93e7c24023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 09129db4446c2c598c4f81070f70f66c37c39323e01418c095de9902e0e1b20f26bc3e011ba84c10626ffdce836690c9f]\n[key.wy = 08e4a104fec4aaa4350c238617ee50456accc49efc3b73eb9548e1600c2483f1c4bae9ddf3ff92af17afd19f86274589c]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200049129db4446c2c598c4f81070f70f66c37c39323e01418c095de9902e0e1b20f26bc3e011ba84c10626ffdce836690c9f8e4a104fec4aaa4350c238617ee50456accc49efc3b73eb9548e1600c2483f1c4bae9ddf3ff92af17afd19f86274589c]\n[sha = SHA-512]\n\n# tcId = 230\n# r and s^-1 are close to n\nmsg = 313233343030\nresult = valid\nsig = 3065023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0a701a8111cdf97ced74a00a4514b2b526be8113e7df6cf7163aaee465880d26275b833b186d80f1862dc67ff768dde43]\n[key.wy = 0e5a991f16f8f777311b17eabdc90b6ece3b5da776cfbebbc504382ca1abae1c6aa6a64d9c41110d97950514e99578ed8]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004a701a8111cdf97ced74a00a4514b2b526be8113e7df6cf7163aaee465880d26275b833b186d80f1862dc67ff768dde43e5a991f16f8f777311b17eabdc90b6ece3b5da776cfbebbc504382ca1abae1c6aa6a64d9c41110d97950514e99578ed8]\n[sha = SHA-512]\n\n# tcId = 231\n# s == 1\nmsg = 313233343030\nresult = valid\nsig = 3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020101\n\n# tcId = 232\n# s == 0\nmsg = 313233343030\nresult = invalid\nsig = 3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020100\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0b6815ba05413bcf34f4c0704af590c1998d7fcd169541e1efe1567ca1dd71a22e35ac838b20c75281582044a57b58f45]\n[key.wy = 6cdceb10612062779abadd8742c6e93ed74adf306f3b3a0f96b70dd1134b7558b64b55b200c5732c50f05aa032ae7c00]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004b6815ba05413bcf34f4c0704af590c1998d7fcd169541e1efe1567ca1dd71a22e35ac838b20c75281582044a57b58f456cdceb10612062779abadd8742c6e93ed74adf306f3b3a0f96b70dd1134b7558b64b55b200c5732c50f05aa032ae7c00]\n[sha = SHA-512]\n\n#",
+    " tcId = 233\n# point at infinity during verify\nmsg = 313233343030\nresult = invalid\nsig = 306402307fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0b4b2d5a8b50ffabd34748e94498c1d4728d084f943fbddd4b3b6ee16eaa4da91613a82c98017132c94cd6fe4b87232f1]\n[key.wy = 6d612228ed5d7d08bf0c8699677e3b8f3e718073b945a6c108d97a3b1433c79052b2655a18a3b2e621baa88198cb5f3c]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004b4b2d5a8b50ffabd34748e94498c1d4728d084f943fbddd4b3b6ee16eaa4da91613a82c98017132c94cd6fe4b87232f16d612228ed5d7d08bf0c8699677e3b8f3e718073b945a6c108d97a3b1433c79052b2655a18a3b2e621baa88198cb5f3c]\n[sha = SHA-512]\n\n# tcId = 234\n# u1 == 1\nmsg = 313233343030\nresult = valid\nsig = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0842b3d89e54d9a4b5694d9251bba20ae4854c510dc0b6ef7033e4045ba4e64b6ddcd36299aac554dbac6db3e27c98123]\n[key.wy = 0868258190297e1d6bae648a6dee2285886233afd1c3d6f196ad1db14262a579d74cf7855fffc65f5abd242b135ae87df]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004842b3d89e54d9a4b5694d9251bba20ae4854c510dc0b6ef7033e4045ba4e64b6ddcd36299aac554dbac6db3e27c98123868258190297e1d6bae648a6dee2285886233afd1c3d6f196ad1db14262a579d74cf7855fffc65f5abd242b135ae87df]\n[sha = SHA-512]\n\n# tcId = 235\n# u1 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a9\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 09ab73dcfffc820e739a3ed9c316c6f15d27a032f8aa59325f7842cf4a34198ac6ff09eb1a311ce226bf1abb49d808511]\n[key.wy = 135f4b0c2b6b195da9bbe1993e985b8607664f1a4b3d499ea1a112b6afc7e6b88357c9348b614ddfdc846a3f38bbdca]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200049ab73dcfffc820e739a3ed9c316c6f15d27a032f8aa59325f7842cf4a34198ac6ff09eb1a311ce226bf1abb49d8085110135f4b0c2b6b195da9bbe1993e985b8607664f1a4b3d499ea1a112b6afc7e6b88357c9348b614ddfdc846a3f38bbdca]\n[sha = SHA-512]\n\n# tcId = 236\n# u2 == 1\nmsg = 313233343030\nresult = valid\nsig = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 28771b137fb7d74c0ed0290416f47c8118997923c7b3b717fbbd5308a4bb0e494714bd3f1ff5e9e368887377284272eb]\n[key.wy = 0f92e5df476a2fa0906ce4fad121c641abb539ab4ef270cd8f0497cc3e6e05b18561b730670f010741238a5d07b077045]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000428771b137fb7d74c0ed0290416f47c8118997923c7b3b717fbbd5308a4bb0e494714bd3f1ff5e9e368887377284272ebf92e5df476a2fa0906ce4fad121c641abb539ab4ef270cd8f0497cc3e6e05b18561b730670f010741238a5d07b077045]\n[sha = SHA-512]\n\n# tcId = 237\n# u2 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 09d1baad217829d5f2d7db5bd085e9126232e8c49c58707cb153db1d1e20a109c90f7bcbae4f2c74d6595207cb0e5dd27]\n[key.wy = 1eea30752a1425905d0811d0f42019e5088142b41945bee03948f206f2e7c3c1081ba9a297180e36b247ee9e70832035]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200049d1baad217829d5f2d7db5bd085e9126232e8c49c58707cb153db1d1e20a109c90f7bcbae4f2c74d6595207cb0e5dd271eea30752a1425905d0811d0f42019e5088142b41945bee03948f206f2e7c3c1081ba9a297180e36b247ee9e70832035]\n[sha = SHA-512]\n\n# tcId = 238\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100c152aafea3a8612ec83a7dc9448f01941899d7041319bbd60bfdfb3c03da74c00c8fc4176128a6263268711edc6e8e90\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 08e39e1e44f782b810ea93037c344371c4fb141c8bf196ea618f3a176547139a6d02121d2794cbe6481061694db579315]\n[key.wy = 0c3184e8cd9b6c16b37699633d87f5600654b44cbcb5ab50ba872dfa001769eb765b2d1902e01d2e8af4e1fd6e9c0f30f]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200048e39e1e44f782b810ea93037c344371c4fb141c8bf196ea618f3a176547139a6d02121d2794cbe6481061694db579315c3184e8cd9b6c16b37699633d87f5600654b44cbcb5ab50ba872dfa001769eb765b2d1902e01d2e8af4e1fd6e9c0f30f]\n[sha = SHA-512]\n\n# tcId = 239\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304764eeac3e7a08daacfad7d1e1e3696042164b06f77bd78c3213ddea6f9fd449a34c97b9e560a6bf7195da41333c7565\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0b96fca0e3f6ebf7326f0a8ce8bdf226a2560c22526bf154f7b467010f3a46baca73414070db0f7ab039f345548452ae2]\n[key.wy = 6f7b744274e9bd6c791f47513e6b51eb42fea3816b3032b33a81695f04d4e775be06484cf7e6a69cba8bacbcb597b3e3]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004b96fca0e3f6ebf7326f0a8ce8bdf226a2560c22526bf154f7b467010f3a46baca73414070db0f7ab039f345548452ae26f7b744274e9bd6c791f47513e6b51eb42fea3816b3032b33a81695f04d4e775be06484cf7e6a69cba8bacbcb597b3e3]\n[sha = SHA-512]\n\n# tcId = 240\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100cb4d5c0ff0abe29b2771fe9f179a5614e2e4c3cc1134a7aad08d8ec3fd8fcd07fd34b3473ca65ead1c7bb20bcf3ea5c9\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 4fd52b11ff747b59ef609e065a462cd85b73172d20f406fdd845d4eaa3ec173e06ee58a58e1810f051b275bbaa47ccb4]\n[key.wy = 084d2382b9e72c526dc3764a11a4a962a7a4c7355e6f057fc976ab73cc384f9a29da50769809ecbf37358dd83c74fc25f]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200044fd52b11ff747b59ef609e065a462cd85b73172d20f406fdd845d4eaa3ec173e06ee58a58e1810f051b275bbaa47ccb484d2382b9e72c526dc3764a11a4a962a7a4c7355e6f057fc976ab73cc384f9a29da50769809ecbf37358dd83c74fc25f]\n[sha = SHA-512]\n\n# tcId = 241\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02306e441db253bf798dbc07ff041506dc73a75086a43252fb439dd016110475d8381f65f7f27f9e1cfc9b48f06a2dfa8eb6\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 7d123e3dbab9913d698891023e28654cba2a94dc408a0dc386e63d8d22ff0f33358a231860b7c2e4f8429e9e8c9a1c5b]\n[key.wy = 0e7c95d1875f24ecdfeffc6136cf56f800f5434490f234f14d78505c2d4aea51e2a3a6a5d1693e72c4b1dd2a8746b875a]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200047d123e3dbab9913d698891023e28654cba2a94dc408a0dc386e63d8d22ff0f33358a231860b7c2e4f8429e9e8c9a1c5be7c95d1875f24ecdfeffc6136cf56f800f5434490f234f14d78505c2d4aea51e2a3a6a5d1693e72c4b1dd2a8746b875a]\n[sha = SHA-512]\n\n# tcId = 242\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023041db253bf798dbc07ff041506dc73a75086a43252fb43b63191efcd0914b6afb4bf8c77d008dbeac04277ef4aa59c394\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 608ce23a383452f8f4dcc5c0085d6793ec518985f0276a3409a23d7b7ca7e7dcb163601aca73840c3bd470aff70250bf]\n[key.wy = 674005a0be08939339363e314dca7ea67adfb60cd530628fe35f05416da8f20d5fb3b0ccd183a21dbb41c4e195d6303d]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004608ce23a383452f8f4dcc5c0085d6793ec518985f0276a3409a23d7b7ca7e7dcb163601aca738",
+    "40c3bd470aff70250bf674005a0be08939339363e314dca7ea67adfb60cd530628fe35f05416da8f20d5fb3b0ccd183a21dbb41c4e195d6303d]\n[sha = SHA-512]\n\n# tcId = 243\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02310083b64a77ef31b780ffe082a0db8e74ea10d4864a5f6876c6323df9a12296d5f697f18efa011b7d58084efde954b38728\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 48d23de1869475a1de532399da1240bab560eb74a6c7b0871bf8ac8fb6cc17cf7b34fcd7c79fd99c76c605bdf3fcbe18]\n[key.wy = 0e15b66ab91d0a03e203c2ff914d4bedc38c1ec5dcd1d12db9b43ef6f44581632683bf785aa4326566227ece3c16be796]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000448d23de1869475a1de532399da1240bab560eb74a6c7b0871bf8ac8fb6cc17cf7b34fcd7c79fd99c76c605bdf3fcbe18e15b66ab91d0a03e203c2ff914d4bedc38c1ec5dcd1d12db9b43ef6f44581632683bf785aa4326566227ece3c16be796]\n[sha = SHA-512]\n\n# tcId = 244\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023053bf798dbc07ff041506dc73a75086a43252fb43b6327af3b42da6d3e9a72cde0b5c2de6bf072e780e94ad12dcab270a\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 5d5eb470f9c6a0bb18e8960b67011acf9f01df405ac5b4bf9f4611d6a8af1a26b11b0790e93ae2361525dde51bacac94]\n[key.wy = 0d42ce151793b80cee679c848362ec272000316590ebc91547b3b6608dfbade21e04de1548ebb45cc4721eb64a16b8318]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200045d5eb470f9c6a0bb18e8960b67011acf9f01df405ac5b4bf9f4611d6a8af1a26b11b0790e93ae2361525dde51bacac94d42ce151793b80cee679c848362ec272000316590ebc91547b3b6608dfbade21e04de1548ebb45cc4721eb64a16b8318]\n[sha = SHA-512]\n\n# tcId = 245\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023024c53b0a00cf087a9a20a2b78bc81d5b383d04ba9b55a567405239d224387344c41cceff0f68ffc930dbaa0b3d346f45\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 1da34a149ed562c8ec13e84cb067107bc28b50bfa47575d5a9948cde5a3d7357c38ea41fcfcdd1ab1a1bd9b6592b33d9]\n[key.wy = 0e14aedfd0cfffcfecbdc21276e6a2c78b8729412c48339ae538b799b7d8e61163047a64cfcec9018aa00f99ae740e3f3]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200041da34a149ed562c8ec13e84cb067107bc28b50bfa47575d5a9948cde5a3d7357c38ea41fcfcdd1ab1a1bd9b6592b33d9e14aedfd0cfffcfecbdc21276e6a2c78b8729412c48339ae538b799b7d8e61163047a64cfcec9018aa00f99ae740e3f3]\n[sha = SHA-512]\n\n# tcId = 246\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100c600ccb39bb3e2d85d880d76d1d519205f050c4b93deae0c5d63e8898ca8d7a5babbb944debe0f3c44332aae5770cb7b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 08b8675211b321f8b318ba60337cde32a6b04243979546383127a068a8749cb5e98c4231b198de62a2b069d3a94d1c7b1]\n[key.wy = 09d33468a130b4fef66a59d4aee00ca40bdbeaf044b8b22841bb4c8ba419f891b3855f4bddf8dae3577d97120b9d3fa44]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200048b8675211b321f8b318ba60337cde32a6b04243979546383127a068a8749cb5e98c4231b198de62a2b069d3a94d1c7b19d33468a130b4fef66a59d4aee00ca40bdbeaf044b8b22841bb4c8ba419f891b3855f4bddf8dae3577d97120b9d3fa44]\n[sha = SHA-512]\n\n# tcId = 247\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303ead55015c579ed137c58236bb70fe6be76628fbece64429bb655245f05cb91f4b8a499ae7880154ba83a84bf0569ae3\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 442766bdb8b2cf4fef5f65d5d86b61681ec89220c983b51f15bfe12fb0bf9780e0c38bbcc888afb3c55ee828774b86f7]\n[key.wy = 56b7f399c534c7acd46be4bc8bb38f087b0023b8f5166ab34192ca0b1cad62d663aa474c6f9286c8a054ef94ea42e3c7]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004442766bdb8b2cf4fef5f65d5d86b61681ec89220c983b51f15bfe12fb0bf9780e0c38bbcc888afb3c55ee828774b86f756b7f399c534c7acd46be4bc8bb38f087b0023b8f5166ab34192ca0b1cad62d663aa474c6f9286c8a054ef94ea42e3c7]\n[sha = SHA-512]\n\n# tcId = 248\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100de03ff820a836e39d3a8435219297da1db193d79e359663e7cc9a229e2a6ac9e9d5c75417fa455bc8e3b89274ee47d0e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 11342b314f31648931abb897c1371dd3a23e91f2405c4a81744be18e753919752208779de2d54e865eeefbb0bfb4998a]\n[key.wy = 0f533d7a4d6fc6cb5cb98915ce08d0f656e37a502e78f8c1b8baca728c2ecb05a2156f01cff16595b363cdb49c00c1aa2]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000411342b314f31648931abb897c1371dd3a23e91f2405c4a81744be18e753919752208779de2d54e865eeefbb0bfb4998af533d7a4d6fc6cb5cb98915ce08d0f656e37a502e78f8c1b8baca728c2ecb05a2156f01cff16595b363cdb49c00c1aa2]\n[sha = SHA-512]\n\n# tcId = 249\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100e5a6ae07f855f14d93b8ff4f8bcd2b0a717261e6089a53d54bf86e22f8e37d73aaa7607cc2ab831404b3e5bb4e01e79e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 3c96b49ff60ff05951b7b1aca65664f13128b714da620697ef0d90bfc01ef643baa5c608f16ca885038322a443aed3e6]\n[key.wy = 169a27f2ea7a36376ef92a900e5389a7b441fd051d693ce65250b881cfdd6487370372292c84369742b18106188b05c0]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200043c96b49ff60ff05951b7b1aca65664f13128b714da620697ef0d90bfc01ef643baa5c608f16ca885038322a443aed3e6169a27f2ea7a36376ef92a900e5389a7b441fd051d693ce65250b881cfdd6487370372292c84369742b18106188b05c0]\n[sha = SHA-512]\n\n# tcId = 250\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 388dae49ea48afb558456fdb1d0b04d4f8f1c46f14d22de25862d35069a28ae9284d7a8074546e779ad2c5f17ce9b89b]\n[key.wy = 0b353298f3c526aa0a10ed23bcb1ed9788812c8a3a6cbea82a3d9d8d465a4cca59dbd3d3d8a36098d644f1b45d36df537]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004388dae49ea48afb558456fdb1d0b04d4f8f1c46f14d22de25862d35069a28ae9284d7a8074546e779ad2c5f17ce9b89bb353298f3c526aa0a10ed23bcb1ed9788812c8a3a6cbea82a3d9d8d465a4cca59dbd3d3d8a36098d644f1b45d36df537]\n[sha = SHA-512]\n\n# tcId = 251\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023079b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0c85200ac6411423573e3ebc1b7aea95e74add5ce3b41282baa885972acc085c8365c05c539ce47e799afc353d6788ce8]\n[key.wy = 68cfce1eb2bfe009990084fb03c0919ab892313d7a12efc3514e8273685b9071892faefca4306adf7854afcebafffbf4]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004c85200ac6411423573e3ebc1b7aea95e74add5ce3b41282baa885972acc085c8365c05c539ce47e799afc353d6788ce868cfce1eb2bfe009990084fb03c0919ab892313d7a12efc3514e8273685b9071892faefca4306adf7854afcebafffbf4]\n[sha = SHA-512]\n\n# tcId = 252\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0e63ae2881ed60884ef1aef52178a297bdfedf67f4e3c1d876ad10b42c03b5e67f7f8cfaf4dfea4def7ab82fde3ed9b91]\n[key.wy = 0e2be22bc3fa46a2ed094ebd7c86a9512c8c40cd542fb539c34347ef2be4e7f1543af960fd2347354a7a1d",
+    "f71a237d51]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004e63ae2881ed60884ef1aef52178a297bdfedf67f4e3c1d876ad10b42c03b5e67f7f8cfaf4dfea4def7ab82fde3ed9b910e2be22bc3fa46a2ed094ebd7c86a9512c8c40cd542fb539c34347ef2be4e7f1543af960fd2347354a7a1df71a237d51]\n[sha = SHA-512]\n\n# tcId = 253\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0e9c415f8a72055239570c3c370cf9380cdfabb6ebdbd8058e2fc65193080707895ea1566eeb26149603f4b4d4c1e79d4]\n[key.wy = 096ae17a001424d21eae4eaa01067048bcd919625fdd7efd896d980633a0e2ca1f8c9b02c99b69a1e4fa53468a2fe244d]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004e9c415f8a72055239570c3c370cf9380cdfabb6ebdbd8058e2fc65193080707895ea1566eeb26149603f4b4d4c1e79d496ae17a001424d21eae4eaa01067048bcd919625fdd7efd896d980633a0e2ca1f8c9b02c99b69a1e4fa53468a2fe244d]\n[sha = SHA-512]\n\n# tcId = 254\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 637223a93dd63af6b348f246e7b3bcb30beaa1dcc888af8e12e5086aa00f7792fbe457463c52422d435f430ad1bb4b21]\n[key.wy = 0f9a1e01758d1e025b162d09d3df8b403226ed3b35e414c41651740d509d8cf6b5e558118607d10669902abebda3ca28d]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004637223a93dd63af6b348f246e7b3bcb30beaa1dcc888af8e12e5086aa00f7792fbe457463c52422d435f430ad1bb4b21f9a1e01758d1e025b162d09d3df8b403226ed3b35e414c41651740d509d8cf6b5e558118607d10669902abebda3ca28d]\n[sha = SHA-512]\n\n# tcId = 255\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 7f4dc23982ecc8b84f54241715c7e94e950f596ce033237639a15fefa5eb5c37cb2e562d6d5b3051ea15600e3341a565]\n[key.wy = 0fed2b55b89d2793321374887b78827ee4ca2216eac2993b1b095844db76adc560450135c072ac1a2c4167520237fbc9d]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200047f4dc23982ecc8b84f54241715c7e94e950f596ce033237639a15fefa5eb5c37cb2e562d6d5b3051ea15600e3341a565fed2b55b89d2793321374887b78827ee4ca2216eac2993b1b095844db76adc560450135c072ac1a2c4167520237fbc9d]\n[sha = SHA-512]\n\n# tcId = 256\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0a0ae8c949f63f1b6a5d024c99e0a296ecd12d196d3b1625d4a76600082a14d455aab267c68f571d89ad0619cb8e476a1]\n[key.wy = 34634336611e1fd1d728bcea588d0e1b652bbca0e52c1bfbd4387a6337ff41ce13a65c8306915d2a39897b985d909b36]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004a0ae8c949f63f1b6a5d024c99e0a296ecd12d196d3b1625d4a76600082a14d455aab267c68f571d89ad0619cb8e476a134634336611e1fd1d728bcea588d0e1b652bbca0e52c1bfbd4387a6337ff41ce13a65c8306915d2a39897b985d909b36]\n[sha = SHA-512]\n\n# tcId = 257\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 7cad1637721f5988cb7967238b1f47fd0b63f30f207a165951fc6fb74ba868e5b462628595edc80f75182e564a89c7a0]\n[key.wy = 0fc04c405938aab3d6828e72e86bc59a400719270f8ee3cb5ef929ab53287bb308b51abd2e3ffbc3d93b87471bc2e3730]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200047cad1637721f5988cb7967238b1f47fd0b63f30f207a165951fc6fb74ba868e5b462628595edc80f75182e564a89c7a0fc04c405938aab3d6828e72e86bc59a400719270f8ee3cb5ef929ab53287bb308b51abd2e3ffbc3d93b87471bc2e3730]\n[sha = SHA-512]\n\n# tcId = 258\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023073333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 2024ecde0e61262955b0301ae6b0a4fbd7771762feb2de35eed1823d2636c6e001f7bfcdbc4e65b1ea40224090411906]\n[key.wy = 0d55362a570e80a2126f01d919b608440294039be03419d518b13cca6a1595414717f1b4ddb842b2c9d4f543e683b86a0]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200042024ecde0e61262955b0301ae6b0a4fbd7771762feb2de35eed1823d2636c6e001f7bfcdbc4e65b1ea40224090411906d55362a570e80a2126f01d919b608440294039be03419d518b13cca6a1595414717f1b4ddb842b2c9d4f543e683b86a0]\n[sha = SHA-512]\n\n# tcId = 259\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 40c5f2608956380c39695c7457ddce0880b5e8fab0a9a3726d0c8535b2ff6ca15814d83ed82c0ab33aba76e05e5c0476]\n[key.wy = 0c9d15a2a0b2041237ff61c26519d1d74b141d7a4499fbdefc414a900937a8faf6ef560550c73cdb7edfe9314c480bb2b]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000440c5f2608956380c39695c7457ddce0880b5e8fab0a9a3726d0c8535b2ff6ca15814d83ed82c0ab33aba76e05e5c0476c9d15a2a0b2041237ff61c26519d1d74b141d7a4499fbdefc414a900937a8faf6ef560550c73cdb7edfe9314c480bb2b]\n[sha = SHA-512]\n\n# tcId = 260\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 74acdfd2ab763c593bca30d248f2bf26f1843acf9eb89b4dfcb8451d59683812cf3cbe9a264ea435912a8969c53d7cb8]\n[key.wy = 496dcb0a4efed69b87110fda20e68eb6feed2d5101a4955d43759f10b73e8ffc3131e0c12a765b68bd216ed1ec4f5d2f]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000474acdfd2ab763c593bca30d248f2bf26f1843acf9eb89b4dfcb8451d59683812cf3cbe9a264ea435912a8969c53d7cb8496dcb0a4efed69b87110fda20e68eb6feed2d5101a4955d43759f10b73e8ffc3131e0c12a765b68bd216ed1ec4f5d2f]\n[sha = SHA-512]\n\n# tcId = 261\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734]\n[key.wy = 0945baab27ca6383737b7dd45023f997aff5e165f0fd7d8e5c0b5f9c5e731588af2fe5bd8976a0b871c132edf21f363af]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734945baab27ca6383737b7dd45023f997aff5e165f0fd7d8e5c0b5f9c5e731588af2fe5bd8976a0b871c132edf21f363af]\n[sha = SHA-512]\n\n# tcId = 262\n# point duplication during verification\nmsg = 313233343030\nresult = valid\nsig = 3066023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023100e16043c2face20228dba6366e19ecc6db71b918bbe8a890b9dad2fcead184e071c9ac4acaee2f831a1e4cc337994f5ec\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is",
+    " a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734]\n[key.wy = 6ba4554d8359c7c8c84822bafdc0668500a1e9a0f028271a3f4a063a18cea7740d01a4266895f478e3ecd121de0c9c50]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a39917346ba4554d8359c7c8c84822bafdc0668500a1e9a0f028271a3f4a063a18cea7740d01a4266895f478e3ecd121de0c9c50]\n[sha = SHA-512]\n\n# tcId = 263\n# duplication bug\nmsg = 313233343030\nresult = invalid\nsig = 3066023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023100e16043c2face20228dba6366e19ecc6db71b918bbe8a890b9dad2fcead184e071c9ac4acaee2f831a1e4cc337994f5ec\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0820064193c71c7141fe41e711fe843a7474be6b05f50cb0be411cdf7fc78ea7ec96aeb3991ef7646bbde59152d381a32]\n[key.wy = 631c5adf93d488b45e67cc9890d8e779f63960193dc16bd1cc136b3e28cf499dfa8e7bff482a0115e6083987f7c042fc]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004820064193c71c7141fe41e711fe843a7474be6b05f50cb0be411cdf7fc78ea7ec96aeb3991ef7646bbde59152d381a32631c5adf93d488b45e67cc9890d8e779f63960193dc16bd1cc136b3e28cf499dfa8e7bff482a0115e6083987f7c042fc]\n[sha = SHA-512]\n\n# tcId = 264\n# point with x-coordinate 0\nmsg = 313233343030\nresult = invalid\nsig = 3035020101023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 52fabc58eacfd3a4828f51c413205c20888941ee45ecac076ffc23145d83542034aa01253d6ebf34eeefaa371d6cee11]\n[key.wy = 09f340712cd78155712746578f5632ded2b2e5afb43b085f81732792108e331a4b50d27f3578252ffb0daa9d78655a0ab]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000452fabc58eacfd3a4828f51c413205c20888941ee45ecac076ffc23145d83542034aa01253d6ebf34eeefaa371d6cee119f340712cd78155712746578f5632ded2b2e5afb43b085f81732792108e331a4b50d27f3578252ffb0daa9d78655a0ab]\n[sha = SHA-512]\n\n# tcId = 265\n# point with x-coordinate 0\nmsg = 313233343030\nresult = invalid\nsig = 3065023101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0a8fdb1a022d4e3a7ee29612bb110acbea27daecb827d344cb6c6a7acad61d371ddc7842147b74a18767e618712f04c1c]\n[key.wy = 64ac6daf8e08cd7b90a0c9d9123884c7a7abb4664a75b0897064c3c8956b0ca9c417237f8d5a7dd8421b0d48c9d52c7c]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004a8fdb1a022d4e3a7ee29612bb110acbea27daecb827d344cb6c6a7acad61d371ddc7842147b74a18767e618712f04c1c64ac6daf8e08cd7b90a0c9d9123884c7a7abb4664a75b0897064c3c8956b0ca9c417237f8d5a7dd8421b0d48c9d52c7c]\n[sha = SHA-512]\n\n# tcId = 266\n# comparison with point at infinity \nmsg = 313233343030\nresult = invalid\nsig = 3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0878e414a5d6a0e0d1ab3c5563c44e80c3b2ef265f27a33ed5cac109ad664c1269beae9031d8d178cbfdb1bfa7cc3cc79]\n[key.wy = 0fabbb2b6f7ce54026863b0f297a4fe3de82d5044dacafede49d5afc60bc875f4b659c06c19bb74c7c27351687f52b411]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004878e414a5d6a0e0d1ab3c5563c44e80c3b2ef265f27a33ed5cac109ad664c1269beae9031d8d178cbfdb1bfa7cc3cc79fabbb2b6f7ce54026863b0f297a4fe3de82d5044dacafede49d5afc60bc875f4b659c06c19bb74c7c27351687f52b411]\n[sha = SHA-512]\n\n# tcId = 267\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0984a1c04446a52ad6a54d64f2c6c49b61f23abe7dc6f33714896aefb0befb9a52b95b048561132c28c9850e851a6d00e]\n[key.wy = 0b4e19f9de59d30ca26801f2789a3330b081e6bf57f84f3c6107defd05a959cef5f298acea5a6b87b38e22c5409ec9f71]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004984a1c04446a52ad6a54d64f2c6c49b61f23abe7dc6f33714896aefb0befb9a52b95b048561132c28c9850e851a6d00eb4e19f9de59d30ca26801f2789a3330b081e6bf57f84f3c6107defd05a959cef5f298acea5a6b87b38e22c5409ec9f71]\n[sha = SHA-512]\n\n# tcId = 268\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7]\n[key.wy = 3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f]\n[sha = SHA-512]\n\n# tcId = 269\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3064023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n# tcId = 270\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3065023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a902302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7]\n[key.wy = 0c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0]\n[sha = SHA-512]\n\n# tcId = 271\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3064023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n# tcId = 272\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 3065023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a902302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc]\n[key.wy = 09a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[keyDer = 3076301006072a8648ce3d020106052b810400220362000429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3]\n[sha = SHA-512]\n\n# tcId = 273\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306402302290c886bbad8f53089583d543a269a727665626d6b94a3796324c62d08988f66f6",
+    "011e845811a03589e92abe1f17faf023066e2cb4380997f4e7f85022541adb22d24d1196be68a3db888b03eb3d2d40b0d9a3a6a00a1a4782ee0a00e8410ba2d86\n\n# tcId = 274\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3066023100a3f1102e92ebe46d67e47c61e54a109347ddd7dced3721bffab6847607678f1d15bc1cb5b39b43ee52b02d684bf37850023100eeebb277b55c8748c47675f5e1cf85c1634cea8ce043040de5e76b1bd72e8067a7c6bfa6813b21396348dd01ac7ab61c\n\n# tcId = 275\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3065023100f290946361f7b733316210d91fc06c1459893f5dbfcf1e086183e5d7730661ef9b3587a9b690438e92d2278779a4d3fd02307b8bdc03bd4cc0026befb1551c75cd6f6b962a80b96fa5b2bbe135cd7b37580501b931b273b298b2ae0ab1198c920e1a\n\n# tcId = 276\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306502304da0ba312f61a16a1c9878408ba142b9809a25a089d53089e852d13670fe5050898105af571e1c02c32617a7b77e16e0023100ce54b6ba8d60e21ca6e3bbbc305dc946a92b72f167c412088ab77c08273c2cabe1cd4c89d1f508ffd420e1dae2efdaad\n\n# tcId = 277\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306602310087e01c452f47c3a87bf083ed5f8db2fccf89722b56f8cd7a39fc850172f3033ec08c8dcde6015c032084aef34b3638bf023100f3676ef5f43ff23f303fddc5f59bdd0362c3953d48c383f950ef62e88f72e93138c0dbca4b933fa78f94cf3ce5da5cfc\n\n# tcId = 278\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 30650230557a8ad54ec9ea3806071f75621ed1c4bc3c9fda897066d7b3c827c1832dfc2520d6598265a89208241b852ce932e2e8023100c6629483a2a00da078aa35177833fdaa9956925dc10eca31d358c5403a0ab003858b7c08f383b44c0c658b1b18d354e9\n\n# tcId = 279\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3065023100db72e945913b3f8b421f2e87893a119e4de350fa899017efa7afa709e3c898972ffa70413d70de6dab9738ffb82a89920230767853ae338f0f0405eaf8a59302200a6bc291edd3a0355c8844c01e7aa59a0b39691d15b94827b07ebb3175584a7d58\n\n# tcId = 280\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 30650231008c1b2c1610665be24f03b47527dced5cc82d8991e13b906f22c9847b73c066934e1457afc14465761c61ca3a4cb144ed023046f7127854b68a76efa6ec4cda7929d20bff808e624fcb824d544cdf322ff21df61d737631965360a3a198a457aa33e1\n\n# tcId = 281\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306502303a8ddef86bfbf861d75ecbf8e8a3612decc043252538286b15af1a87fda64142dd1f139af7678ae7f7104e5090724e3f0231009933cd18a87341a94f1dbee88044cd8b72b394693d2503dc7cf9337aa3f6f83662c61b374a27fa45c4b3fbef9aff29fe\n\n# tcId = 282\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 306402306a28f6e429413f3f03c20f3c7841b83adade75054c2237a060787646712d09df8b7283eda1c2bfc039d0453639aab5a602306c3837367c65397024a0dc910735132219c1c1ed9e127528c3549efc6f897806416f9c41296175c61cd70d06e90e003e\n\n# tcId = 283\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30650231008071d8cf9df9efef696ebafc59f74db90c1f1ecf5ccde18858de22fe4d7df2a25cb3001695d706dfd7984b39df65a0f4023027291e6339c2a7fed7a174bb97ffe41d8cfdc20c1260c6ec85d7259f0cc7781bf2ae7a6e6fb4c08e0d75b7381bb7d9b8\n\n# tcId = 284\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023100c89ec4718c55edfdb5ba2ecf4cb12277b49e59f5f3ee3f57b8905f585ce04f79ba0032380ea35922d7ea63f064c93d2002306d212828521c0cae11ae4a8c89a996a3557e10f975b1837f401622c257e3a3cb72b38cc6bb0ee595e5c876a1646441fe\n\n# tcId = 285\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023100d01de802b92ea4ca0baa4c14cfb491ca03f2fe3905b6a8d02fac21d8f0d65fe0743776d1473195f0e2f021361db83a490230791231dc4382dcded690ee9edf8d0ccfc90704dcf1bd211a873b6d6c704e745cabd305a51f9238d0f406998e735895b8\n\n# tcId = 286\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023100b2623abbdc4e5d0cf47b4d629734fd39171cd2e1cfc231ad467f8470e0bc83fcf9e391c68409d3421d7492a7d25d72a90230167750548143e8239b73ce6f7ff2eddb14b8290fc7a92deae483c112d111d04cf4c0ae55ca65f9aa27fb36bc16b64a55\n\n# tcId = 287\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023100ad08aa6dcbcec824cb6c92d6506b1ea7b0228185a446e0cad5961a36272755845a12f8300984f3a9f55004204d17b87b023003dd40f67bfe14a875a453321d84645273420bc16c4ac3e237035740c5712f837afcc5329eeb4adcfa1ef2bcd53c09b9\n\n# tcId = 288\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3066023100a6f16b617020bcf0f31ded86fcb8001acfe856bb5267baf7cdb862d396b7619432559240e471f80f506b186eabf84bb3023100bd748eea34293676c7cb21a7aea1871aad4e06363d5ed33abebc6c9dd72160c24c0f15d807f3a435fe4c8fcbe63a6f25\n\n# tcId = 289\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3066023100f72891f7c26020b0487c60d58d0f9663d4e508045268937c23f84b023f991ce92d33fe33dc78083b53a6da02cfb10faf023100f17ea544d497229b54cd49194a6c9d68db6b4db2d0e024daaaf4d19c200d7687cad5e33c893ed59d7627418211dde679\n\n# tcId = 290\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30640230773332032272abf6efb4f91947af3503433003149807d95a6d318541835aa93cc2e41b6b8735b7a5ed4028ab6b3c4d80023068316b3263a5e34c32c338b9cf329f6b64cebe6e4d73bef9ac4b12013027cf6db87b31ed6128a47525b72a139c10752d\n\n# tcId = 291\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3066023100fa0c7636f79cd35e1af317354adb4ce9aaddc6b70a89c972ead222b48dfff4a320fc62d90ef737a642b347c752d5e468023100fafaaa2b3f7e92ea0b0f2b89088ec1adcbd3b9c7b97e8893ad9ca07e9ced7fd37b1aabab68114fe42a4abbeaa32d84ae\n\n# tcId = 292\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3065023017fbfd972e166d5a788d9af84160f6ecfcd86f5287945bc816bfc644f9849bc1608095de69533699fc465f4e4f074fb7023100d0c71ce90c5ffaef356a1d28ebe6b4e047c678c489f219e12e353a94fbd6478d2fd8bc8f363614cb532b7669943aefd8\n\n# tcId = 293\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30650230470014ccd7a1a5e5333d301c8ea528ac3b07b01944af30cec60f4bad94db108509e45ba381818b5bdfaf9daf0d372301023100e3d49d6a05a755aa871d7cb96fffb79fed7625f83f69498ba07c0d65166a67107c9a17ae6e1028e244377a44096217b2\n\n# tcId = 294\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3066023100fb766fd8f8d4142b57252b38e958fbcc802031776f5a2ed33a089b150d57f1e5b61820c9db9429b9d4a0d0dac0724779023100ab4dd8ed8989bb38a33a90e898383dc01d5e93f283700890f9c52fb18ef5c82304dfb6b719fcfcf4911ec7c5c2fc8bdb\n\n# tcId = 295\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30640230455a32ff77b60c69cef3660a8372d82b3ea3f5ae39151c481e8aceb7d0ebed159a6f2981c00e2db7b0961452b400f35c02305774e8505bfcb77f3a3d751c31d7e19b3d172228826d1d7ea177d418c58f792d36e13ebd14202197c2070e0223fd3900\n\n# tcId = 296\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 306502302ff98892d18cc048dbb9e5dafebc222300b3ae8a8364f9d2f98ffd4a336fc1ee8bcb89bfe28d9c3e8abac7d153370d760231009045438e28185061d05fdff63cd314d9fc59891bf616bf5e001d313a560d49714dd7864099a09b8032ea870d31d451b6\n\n# tcId = 297\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 30660231009cafe84002716b7aa1bc76517177e6188f031c066f41cc5e4e4429ef11b855070e91ad94299d7df1e66457336d40774902310094a341146eb31c97759199cada842bf4f9c5e205ef49663939dcce2d40db7f947b91d8e9b0c8398e2f7028cf1e529b8c\n\n# tcId = 298\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3065023100a1a5d4820fe5226f2f547b238c96eb62c299ad17bb43298fbf39607cbd908256351a41f44a62d0f20eba1001f22f7b5e02307431dc7ead3664a8aea70efb317af12947e7b49e41e660e522295a0a04c1f6a526158ead5644d82ac4cca618bf01becd\n\n# tcId = 299\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 306502302c14d1df832aa0eb10e7ce221735ad7584ac0887531b32402e3c1e57fc863be5bc5a2bb87b86165df64f3a4233e761c5023100bdfc8c3579e2417f49d5628dc8286b32663188e017d936e10d61cd3f6edb97919b109c5567b46f4708106fe671f1d5fb\n\n# tcId = 300\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3065023009a8643aee4ec1119c836373e167064a53888ef7abe5faeed250c1f9960c6c06bcd42a11f13181d3aab8246767dc5368023100bbb6dd94750e6656babd4e159e27a2fa986bc7e4441771ef87b2280f93056dc5a4a38d1c45b8bc2aa20a4b0c5945b57b\n\n# tcId = 301\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3066023100841721e96c44524e86c56d84a5aaea1ac439b060aa11d3e2a1961babd4778075f138dfc0189d3ceac0caccf5bbc1943d023100c9b0df9963daa9b2fe5d75edad22a9316af0132bbda41f7b6754425e9378fa12af0111baabcd37b43714171fcadd978b\n\n# tcId = 302\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 306402300a453df160ea5a79926517f16dba255826b87aebabd6fe9f0332100f94ca5cce86f1a528cf4e0010add0eaa7d86b84be023023a1fae44f99681c9b7b2495f",
+    "b056e206a0e8c4b60a065a576d0bac6f867ef06c402bc8e8584392a3c97accaa0a36cbc\n\n# tcId = 303\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 30640230377044d343f900175ac6833071be74964cd636417039e10e837da94b6919bffc3f5a517b945a450852af3259f5cbf108023032ea25006375c153581e80c09f53ad585c736f823c70147aba4fb47bb0a224fae4d8819adad80d4c144ecc2380954a9e\n\n# tcId = 304\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3065023002881912e33e93b3d6d4daaffbb8bdc421240934f006be89d918ef43a82ea072921f940748c59d1368511355e936c5360231008a77df61061022893e15a793a6a5e332bf4c963b2f8ccd4e1a3193ce196b09afac6740a32118adafffcab61cbc96b5df\n\n# tcId = 305\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3065023100d55902bc90b4ba98054c751746a0109edb8c2ca928585c5c847bc4abf65482ecac190541248e905e7ce5ca313341c6d8023063bd0c665fd69f43ad50417b5bfd2c669f10d12b33e119c605978069f45457beaff125e3492ffa3d166fbc6735d996c4\n\n# tcId = 306\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3065023100867551b1271ca957a4f71a645ec14be9973633efbb5d23fb7adaa234b47ad618c6dca48301d8791baf9eaa69155a8cb202301623c18f1a4cd4703756418e6d8bc4868de44f170b094700d6b73e5b9b8a461598f8d0c7041e2cef0411b16f0b5485ed\n\n# tcId = 307\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3065023100b0f8b43879c5241e40981335abbc66cce82868a2ded3d9dd40a7ed882d59ad8bda1f51f382608380917a92d99e45380602301fc0128240724d16b8cb1cc481f4b5fb972b2f7fc984e488550313443b409151c93171da08222253d0c46bb121f0c418\n\n# tcId = 308\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3065023100a04b68197390cacb812b47c28158689f11df11f61029b0cfb4989aa4faa7ee4a15c0837642c24d450ca6ea05a79b914102304a243a2491b8f54e5cdf34ee80b2571956e7df6ea0680443a2da089db84c5bd68e489e108e1064fd291c9fb23603469d\n\n# tcId = 309\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3064023047bc5ab70e4fc533f42fb58ab387f7444d2c655093e47fc988b64ba279fa03a93191eae120b7642795c50a9be44216590230347ad7008ba5f47043858e5a6bc04f05cffb91045cc9a29d6b224cd4e1f50bda10449a2d2e054581a00f1f65062223c0\n\n# tcId = 310\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3065023008fb1f88f24104bc8d0f3c5ff573d9e714fa87856255503da7a13a2cce87ae4cc383000eb3940374f2b09fcd152e8097023100e86fa46404216031e00a0df4360d49feed084eb7a88a8d1264a4842c802d60bae44b117cba233cc567360c4626913f0b\n\n# tcId = 311\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3066023100d4353b7c73abaaefdb11321f374ac8584d9d1fd72836300d8353bf9fe35f269f9225e58630a4182f16c07b00efce32e502310082e4180a271b4571835ebe0299ac13a2053500be7f31747e30318d6dd69e95a59b7f3e1fb457c6929f3e7c84ba6fdd43\n\n# tcId = 312\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 30650231009d124af0982f176a7f7ac202861a8e3eec892956f0987d8a6c141cf8073b27eeca265bd668ced4280c4a64408cdc38e9023065dd8e11cc71ba60a492fe03b35a8dcec34ff47e99bc3e258e877784ebe0ee77b1d0b67ebc9d2c4b37257fa30bdfaa87\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac]\n[key.wy = 0acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1]\n[sha = SHA-512]\n\n# tcId = 313\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100ccb13c4dc9805a9b4e06ee25ef8c7593eaff7326c432d4b12b923163cf1cbe5fe1cfd3546c1d0761d8874e83ffd2e15d023100db1b0c082ae314b539f05e8a14ad51e5db37f29cacea9b2aab63a04917d58d008cf3f7ba41d5ea280f3b6a67be3ae8f8\n\n# tcId = 314\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100c79a30e36d2126b348dd9eb2f5db6aa98f79d80214027e51bcf3cabec188a7ebaf25cb7bbe9ec6bfed135e2a3b70e9160230241338ee2ac931adea9a56e7bfe909947128d54d5122a47b00c278e684e10102740d26e89e343290a5b2fa8b401faec6\n\n# tcId = 315\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 306402300df82e4ec2960e3df614f8b49cec9a4ee1054365414241361feec9d9d9b6909d8775f222ec385a14afab46266db390c302300968485e854addba0f8354e677e955e1ef2df973d564c49f65f2562cb2a2b80d75e92f8784042955f7b8765f609ce221\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422]\n[key.wy = 0c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000]\n[sha = SHA-512]\n\n# tcId = 316\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306402301fafd83d728422e1485f1e52e5b631548647cc3c76c109c3177a73751d91a19012fa4628b218f2229fc4d55f105fe00102304474f9af7b4b0bb96fdb05ae918f799024e8d5b864e49ccd047cf97e7b9f8763cce015c11cf1f461c9027cb901055101\n\n# tcId = 317\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100e6025bb957ab197fb4c080d0a5c647e428afb0d7cc235c605ae97545494fd31a9979790bb2da6e1cf186789422b15c970231008ae9872291430d1bb371ef72360dad5afbb6fb001f403d9aaa1445f0326eb1eef775c9dfe1d7ef8bf4e744822108d27e\n\n# tcId = 318\n# y-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100877d5567c18fa568259005a89c2300d1b3825b732fa14964c1477d4b3098afd09384b97d497464adba41e9df8a74d339023100c40f0760717b4b3bae75742b6dc3dcf04cc22a449cfea19d305e0658cb705fda75163e7399e0b3125ca7d1919c13851e\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000]\n[key.wy = 0e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[keyDer = 3076301006072a8648ce3d020106052b81040022036200041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557]\n[sha = SHA-512]\n\n# tcId = 319\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100e706b0045a6f54bd175e2437b48767b0204f93d8a4d9d3d00838278137e5b670de4305c5c55e49059b8b5f6e264654c90230405741adff94afd9a88e08d0b1021911fa4cedb2466b1a8fd302a5b5d96566ada63ccb82b6c5e8452fde860c545e0a19\n\n# tcId = 320\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 306502300c57ce2bc579fbd3a759dfbf5e84c3cef2414846a2e300453e1e4c5188f24432b14ca647a733b6ad35c980a880d36145023100f12a119e22d48b82049df611f1c851fb22795056498a873c730fcb9fd8f314728de0298b9b22c348abc6de2aba97e972\n\n# tcId = 321\n# x-coordinate of the public key has many trailing 0's\nmsg = 4d657373616765\nresult = valid\nsig = 30660231009a8f80697ccf2e0617612027d861a3a3a657fb75cc82810b40dd5072d39ff37eca29008390da356137e2c9babd814198023100a86537a83c3d57da50e4b29b47dcc3717c5a1ed0fff18ade8dcce4220eac63aab60b9bfed5f1bdd241dab655a9bdd75f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69]\n[key.wy = 0d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300",
+    "e68a1eb78507df76de650e8f8ee63a5f0c5687c98]\n[sha = SHA-512]\n\n# tcId = 322\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 306602310093718f6f8542725f62de7039fc193d3fcc81d622230ccc94e9e265390b385af3a3ba50c91a9d6a5b1e07d79af2bd80b2023100d08499f3d298e8afecea122265a36dbf337259020654739783c8ec8ef783d072555b5907285ce83fc8ced9c8398c6269\n\n# tcId = 323\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100ce26e42c490dec92cf59d6b1ba75c9a1400d6e5c3fd7c47e1eeb1cded30a3a3d18c81cdfdcbad2742a97293369ce21c202310094671085d941fd27d495452a4c8559a1fe24f3225f5b8ef75faf9d3fb01372c586e23b82714359d0e47144ff5d946161\n\n# tcId = 324\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100ffc4738acf71f04a13104c328c138b331fb7202aef66f583ba543ed490d12993c18f724c81ad0f7ea18dae352e5c6480023100e67d4ccdeb68a9a731f06f77eae00175be076d92529b109a62542692c8749ddfde03bed1c119a5901a4e852f2115578f\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336]\n[key.wy = 208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4]\n[sha = SHA-512]\n\n# tcId = 325\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100e6fa8455bc14e730e4ca1eb5faf6c8180f2f231069b93a0bb17d33ad5513d93a36214f5ce82ca6bd785ccbacf7249a4c02303979b4b480f496357c25aa3fc850c67ff1c5a2aabd80b6020d2eac3dd7833cf2387d0be64df54a0e9b59f12c3bebf886\n\n# tcId = 326\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 306502301b49b037783838867fbaa57305b2aa28df1b0ec40f43140067fafdea63f87c02dfb0e6f41b760fbdf51005e90c0c3715023100e7d4eb6ee61611264ea8a668a70287e3d63489273da2b30ad0c221f1893feaea3e878c9a81c6cec865899dbda4fa79ae\n\n# tcId = 327\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 306502310091d9da3d577408189dcaae33d95ed0a0118afd460d5228fa352b6ea671b172eb413816a70621ddaf23c5e2ef79df0c110230053dadbfcd564bddbe44e0ecb4d1e608dbd35d4e83b6634cc72afb87a2d61675ee13960c243f6be70519e167b1d3ceb0\n\n[key.curve = secp384r1]\n[key.keySize = 384]\n[key.type = ECPublicKey]\n[key.wx = 0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336]\n[key.wy = 0ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[keyDer = 3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b]\n[sha = SHA-512]\n\n# tcId = 328\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3065023100af0ed6ce6419662db80f02a2b632675445c7bf8a34bbacdc81cc5dd306c657ca4c5a3fb1b05f358d8f36fda8ae238806023046b472c0badb17e089c8f9697fd0b4ce71f0f4471b235483d4c8dd3d00aa282cde990253df38ba733b2ad82a601c7508\n\n# tcId = 329\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 3066023100e2aa9468ccaaadad8b9f43a429c97f0c6a7eedcb4d4af72d639df0fe53f610b953408a8e24e8db138551770750680f7a023100d81020846d1c50ee9ae23601dd638cb71b38d37fb555268c2fa1ad8a761fa7b27afcab2fa69224d1f976699914e09de2\n\n# tcId = 330\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 306402306bf6fa7a663802c3382cc5fd02004ec71e5a031e3d9bfc0858fa994e88497a7782308bc265b8237a6bbbdd38658b36fc02303a9d5941a013bf70d99cc3ff255ce85573688dac40344b5db7144b19bf57bb2701e6850a8f819796b67f7d0b6aea7e50\n\n",
+};
+static const size_t kLen63 = 134986;
+
+static const char *kData64[] = {
+    "# Imported from Wycheproof's ecdsa_secp521r1_sha512_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: ECDSA\n# Generator version: 0.4\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 5c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508]\n[key.wy = 7878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004005c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508007878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6]\n[sha = SHA-512]\n\n# tcId = 1\n# signature malleability\nmsg = 313233343030\nresult = valid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024201d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5a27a24a1aae1e218fdccd8cd7d4990b666d4bf4902b84fdad123f941fe906d948\n\n# tcId = 2\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 30818802420081d7b378e361fe518b0afc37ffb88f0dcc62be9a9e03d23412efb8c799b803a96ccb37886a57c4f61b228ae2609cb6f14033494846f79aeb2c4fc70c9c020bc1530242010b2471c2a7ebbc5e48f03d2dbbbf89c847a44dedc7ffcddd073f1f814cb0fd1418bd524ba1ec74abef8e4a27f19eab93db20d4553a603f04a0c3719430d80e1197\n\n# tcId = 3\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 308188024200e819b543589aa13fddef2531dd1c67caa775493b2d307e8130a765f7772d5056d3a5eb6bb37979d9606c1b36862e8397d38d7aae666c558705ce13667cc832d4af02420162398631365bde51182b0b8869b2d924defff46abcbb5fd07dd90240644f623c15f5ed7ad32f6f9a2b81db7f9eb4e8b25ca53e30f1ffc21cdfed6c437b8b03fcbb\n\n# tcId = 4\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 308188024201ac089cee6fceeb3c00cf74492744b63121d94e7a3d480e59627d64afba97b8745b724ec54f9bf1d4601acdca547404771d06213e3357ebdb729bcfd70cd069fc2d024201ce834aedf2bda5e7fc97aad2df904b9f4ed7a6c26aed152e46de2eda517704fe8d2955a9c1a5790e2f86a4b3c09ac61aff8bc8dfe000cd0e016891806065e51f4a\n\n# tcId = 5\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 308186024156b7aa356f1584b4c209aa24eadb3de60775e1273bee4f0e9d247ceae97e3d6f701798e883be932cd60d95fb0e659a7f3e2a8291b757f851a0a284b28932f6cf28024127aa41b0bf9ed8202f46f7eb312574601028831cef64d9e1dc7a4e553e8d3c0d5a837baaccfe065bff0bc4e8d389fc1335edaeecc7862bec41af6ed5bb4bc8a19f\n\n# tcId = 6\n# random signature\nmsg = 313233343030\nresult = valid\nsig = 308188024200bb73df934eef063702468f828c2338cbdc4f9cb71b07334f68f44f9189322cfe0a1c499545bab1195e4b6f9368a848cbead4c77fee1aa4edd0b617a51dd075a604024201171cf378b95cd4032e42c789a315b51632be03620dae45d58f024b9f3cb90b2bdb15b3ebddb89f2f811d06482962adab8d31b2894296846e28f520efe63d725f7c\n\n# tcId = 7\n# valid\nmsg = 313233343030\nresult = valid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 8\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 3082008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 9\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 308188028200414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 10\n# length contains leading 0\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450282004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 11\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 308702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 12\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 308502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 13\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 30818602424e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 14\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 30818602404e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 15\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 16\n# wrong length\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 17\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 3085010000008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 18\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30818b028501000000414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 19\n# uint32 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450285010000004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 20\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 308901000000000000008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 21\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30818f02890100000000000000414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926",
+    "a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 22\n# uint64 overflow in length\nmsg = 313233343030\nresult = invalid\nsig = 30818f02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645028901000000000000004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 23\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30847fffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 24\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30818a02847fffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 25\n# length = 2**31 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502847fffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 26\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3084ffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 27\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30818a0284ffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 28\n# length = 2**32 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450284ffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 29\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3085ffffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 30\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30818b0285ffffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 31\n# length = 2**40 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450285ffffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 32\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 3088ffffffffffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 33\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30818e0288ffffffffffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 34\n# length = 2**64 - 1\nmsg = 313233343030\nresult = invalid\nsig = 30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450288ffffffffffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 35\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30ff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 36\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30818602ff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 37\n# incorrect length\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502ff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 38\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 39\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 30818602804e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 40\n# indefinite length without termination\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645028028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 41\n# removing sequence\nmsg = 313233343030\nresult = invalid\nsig = \n\n# tcId = 42\n# appending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 43\n# prepending 0's to sequence\nmsg = 313233343030\nresult = invalid\nsig = 308188000002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 44\n# appending unused 0's\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 45\n# appending unused 0's\nmsg = 31323334303",
+    "0\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 46\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10500\n\n# tcId = 47\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 30818802434e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 48\n# appending null value\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024328b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10500\n\n# tcId = 49\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818c49817730818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 50\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818b250030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 51\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818930818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10004deadbeef\n\n# tcId = 52\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818b224649817702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 53\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818a2245250002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 54\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818e224302414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450004deadbeef024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 55\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452246498177024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 56\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864522452500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 57\n# including garbage\nmsg = 313233343030\nresult = invalid\nsig = 30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452243024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10004deadbeef\n\n# tcId = 58\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818faa00bb00cd0030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 59\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818daa02aabb30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 60\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818e2249aa00bb00cd0002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 61\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818c2247aa02aabb02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 62\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452249aa00bb00cd00024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 63\n# including undefined tags\nmsg = 313233343030\nresult = invalid\nsig = 30818c02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452247aa02aabb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 64\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 308030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 65\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30818a228002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 66\n# using composition with indefinite length\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452280024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 67\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 308031818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a",
+    "04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 68\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30818a228003414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 69\n# using composition with wrong tag\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452280034128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 70\n# Replacing sequence with NULL\nmsg = 313233343030\nresult = invalid\nsig = 0500\n\n# tcId = 71\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2e818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 72\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 2f818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 73\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 31818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 74\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 32818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 75\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = ff818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 76\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818600414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 77\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818601414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 78\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818603414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 79\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818604414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 80\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 308186ff414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 81\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 82\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645014128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 83\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645034128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 84\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645044128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 85\n# changing tag value\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645ff4128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 86\n# dropping value of sequence\nmsg = 313233343030\nresult = invalid\nsig = 3000\n\n# tcId = 87\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 30818b300102308185414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 88\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 30818a224502014e02404223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 89\n# using composition\nmsg = 313233343030\nresult = invalid\nsig = 30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864522450201280240b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 90\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a\n\n# tcId = 91\n# truncate sequence\nmsg = 313233343030\nresult = invalid\nsig = 308185414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 92\n# indefinite length\nmsg = 313",
+    "233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 93\n# indefinite length with truncated delimiter\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac100\n\n# tcId = 94\n# indefinite length with additional element\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac105000000\n\n# tcId = 95\n# indefinite length with truncated element\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1060811220000\n\n# tcId = 96\n# indefinite length with garbage\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000fe02beef\n\n# tcId = 97\n# indefinite length with nonempty EOC\nmsg = 313233343030\nresult = invalid\nsig = 308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10002beef\n\n# tcId = 98\n# prepend empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 308188300002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 99\n# append empty sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac13000\n\n# tcId = 100\n# sequence of sequence\nmsg = 313233343030\nresult = invalid\nsig = 30818930818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 101\n# truncated sequence\nmsg = 313233343030\nresult = invalid\nsig = 304302414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645\n\n# tcId = 102\n# repeat element in sequence\nmsg = 313233343030\nresult = invalid\nsig = 3081c902414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 103\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 3081870281414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 104\n# long form encoding of length\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502814128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 105\n# removing integer\nmsg = 313233343030\nresult = invalid\nsig = 3043024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 106\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 30818802434e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 107\n# appending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024328b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000\n\n# tcId = 108\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 308188024300004e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 109\n# prepending 0's to integer\nmsg = 313233343030\nresult = invalid\nsig = 30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450243000028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 110\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 30450500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 111\n# Replacing integer with NULL\nmsg = 313233343030\nresult = invalid\nsig = 304502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450500\n\n# tcId = 112\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 30450200024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 113\n# dropping value of integer\nmsg = 313233343030\nresult = invalid\nsig = 304502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450200\n\n# tcId = 114\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 30818602414c4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 115\n# modify first byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502412ab5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 116\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f6",
+    "6fda48351de7bbfd515720b0ec5cd736f9b73bdf86c5024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 117\n# modify last byte of integer\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a41\n\n# tcId = 118\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 30818502404e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 119\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 30818502404223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 120\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a\n\n# tcId = 121\n# truncate integer\nmsg = 313233343030\nresult = invalid\nsig = 30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450240b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 122\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 3081870242ff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 123\n# leading ff in integer\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242ff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 124\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 3046090180024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 125\n# infinity\nmsg = 313233343030\nresult = invalid\nsig = 304602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645090180\n\n# tcId = 126\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3081870242024e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbe97b3367122fa4a20584c271233f3ec3b7f7b31b0faa4d340b92a6b0d5cd17ea4e024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 127\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3081870242fe4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbf4d826580ab145752e852a6e91512b78178047879e9714a4ae1bc74298aaa7223c024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 128\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3081860241b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a00410d65320718f8af465fb099025b7cae2184402aea8df4f13a328c90648c42079bb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 129\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 308187024201b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a0040b27d9a7f54eba8ad17ad5916eaed487e87fb8786168eb5b51e438bd675558ddc4024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 130\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3081870242fdb1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a0041684cc98edd05b5dfa7b3d8edcc0c13c48084ce4f055b2cbf46d594f2a32e815b2024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 131\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3081870242024e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 132\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 3081870242fe4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 133\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 308187024201b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a00410d65320718f8af465fb099025b7cae2184402aea8df4f13a328c90648c42079bb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 134\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502420228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba09a7b6ac4ecd0410b4722ca75ba197a403a0a1f9ee0e7b391b0649fda1d3969eeca\n\n# tcId = 135\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fe28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a5d85db5e551e1de70233273282b66f49992b40b6fd47b0252edc06be016f926b8\n\n# tcId = 136\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450241d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5fd61bc296eeee8b245d018b8edd8f659631962ad7a1e8b5fe56cfdd0157ce753f\n\n# tcId = 137\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fdd74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f6584953b132fbef4b8dd358a45e685bfc5f5e0611f184c6e4f9b6025e2c6961136\n\n# tcId = 138\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86",
+    "4502420228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 139\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fe28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1\n\n# tcId = 140\n# Modified r or s, e.g. by adding or subtracting the order of the group\nmsg = 313233343030\nresult = invalid\nsig = 30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024201d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5fd61bc296eeee8b245d018b8edd8f659631962ad7a1e8b5fe56cfdd0157ce753f\n\n# tcId = 141\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 142\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020100020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 143\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 144\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 145\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 146\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 147\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047020100024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 148\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470201000242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 149\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020100090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 150\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 151\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3006020101020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 152\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201010201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 153\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 154\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 155\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 156\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047020101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 157\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470201010242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 158\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3008020101090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 159\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 160\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 161\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30060201ff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 162\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 163\n# Sig",
+    "nature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 164\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 165\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470201ff024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 166\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470201ff0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 167\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30080201ff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 168\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 169\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 170\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 171\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 172\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 173\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 174\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 175\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 176\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 177\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 178\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 179\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864080201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 180\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 181\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# impleme",
+    "ntation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 182\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 183\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 184\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864080242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 185\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 186\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 187\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 188\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 189\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 190\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 191\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 192\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 193\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 194\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 195\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 196\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 197\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 198\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 199\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201ffff",
+    "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 200\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 201\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 202\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 203\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3049024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 204\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020100\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 205\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30470242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020101\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 206\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 304702420200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201ff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 207\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 208\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 209\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 210\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 211\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30818802420200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 212\n# Signature with special case values for r and s\nmsg = 313233343030\nresult = invalid\nsig = 30490242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090380fe01\n# Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA\n# implementation does not check boundaries and computes s^(-1)==0.\n\n# tcId = 213\n# Edge case for Shamir multiplication\nmsg = 39353032\nresult = valid\nsig = 308187024200b4b10646a668c385e1c4da613eb6592c0976fc4df843fc446f20673be5ac18c7d8608a943f019d96216254b09de5f20f3159402ced88ef805a4154f780e093e044024165cd4e7f2d8b752c35a62fc11a4ab745a91ca80698a226b41f156fb764b79f4d76548140eb94d2c477c0a9be3e1d4d1acbf9cf449701c10bd47c2e3698b3287934\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 491cd6c5f93b7414d6d45cfe3d264bd077fc4427a4b0afede76cac537a7ca5ee2c44564258260f7691b81fdfecebfd03ba672277875c5b311ea920e74fb3978af5]\n[key.wy = 144a353a251b4297894161bae12d16a89c33b719f904cfccc277df78cea5379198642fd549df919904dc0cf3662eeab01ef11b8e3cb49b51b853d98f042600c0997]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400491cd6c5f93b7414d6d45cfe3d264bd077fc4427a4b0afede76cac537a7ca5ee2c44564258260f7691b81fdfecebfd03ba672277875c5b311ea920e74fb3978af50144a353a251b4297894161bae12d16a89c33b719f904cfccc277df78cea5379198642fd549df919904dc0cf3662eeab01ef11b8e3cb49b51b853d98f042600c0997]\n[sha = SHA-512]\n\n# tcId = 214\n# k*G has a large x-coordinate\nmsg = 313233343030\nresult = valid\nsig = 3067022105ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf5024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\n\n# tcId = 215\n# r too large\nmsg = 313233343030\nresult = invalid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\n\n[key.curve = secp521r1]\n[key.keySize = 52",
+    "1]\n[key.type = ECPublicKey]\n[key.wx = 15f281dcdc976641ce024dca1eac8ddd7f949e3290d3b2de11c4873f3676a06ff9f704c24813bd8d63528b2e813f78b869ff38112527e79b383a3bd527badb929ff]\n[key.wy = 1502e4cc7032d3ec35b0f8d05409438a86966d623f7a2f432bf712f76dc6345405dfcfcdc36d477831d38eec64ede7f4d39aa91bffcc56ec4241cb06735b2809fbe]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004015f281dcdc976641ce024dca1eac8ddd7f949e3290d3b2de11c4873f3676a06ff9f704c24813bd8d63528b2e813f78b869ff38112527e79b383a3bd527badb929ff01502e4cc7032d3ec35b0f8d05409438a86966d623f7a2f432bf712f76dc6345405dfcfcdc36d477831d38eec64ede7f4d39aa91bffcc56ec4241cb06735b2809fbe]\n[sha = SHA-512]\n\n# tcId = 216\n# r,s are large\nmsg = 313233343030\nresult = valid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 336d5d08fe75c50946e6dddd36c550bb054d9925c8f254cfe1c3388f720b1d6500a90412b020b3db592b92ab9f68f1c693b8d1365371635e21bc43eaadf89e4e74]\n[key.wy = 1d48d60319dfd06f935fc46488c229b611eecd038804ae9f681a078dde8ed8f8e20ad9504bcf3c24a0b566b1e85b2d3ed0a1273292ff5f87bae5b3c87857e67ed81]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400336d5d08fe75c50946e6dddd36c550bb054d9925c8f254cfe1c3388f720b1d6500a90412b020b3db592b92ab9f68f1c693b8d1365371635e21bc43eaadf89e4e7401d48d60319dfd06f935fc46488c229b611eecd038804ae9f681a078dde8ed8f8e20ad9504bcf3c24a0b566b1e85b2d3ed0a1273292ff5f87bae5b3c87857e67ed81]\n[sha = SHA-512]\n\n# tcId = 217\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02420095e19fd2b755d603bf994562d9a11f63cf4eadecbdc0ecb5a394e54529e8da58a527bc6d85725043786362ab4de6cbc7d80e625ae0a98861aea1c7bf7109c91f66\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 6f8fadedbae63701072c287c633f9c0052ea1e6cd00a84342cc0f626210071576abfd0875664b0746cdaf2745effc18d94905b0fc9d2cad4ba375c0ea2298c8d1c]\n[key.wy = 150d128cb62a527ae6df3e92f1f280ea33248711ffe4b35c1b162a9508576860165e0ddc361d96fafcd2ff82776c743b9cd6845db61eb56739f5c4ef561e6c20d8c]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004006f8fadedbae63701072c287c633f9c0052ea1e6cd00a84342cc0f626210071576abfd0875664b0746cdaf2745effc18d94905b0fc9d2cad4ba375c0ea2298c8d1c0150d128cb62a527ae6df3e92f1f280ea33248711ffe4b35c1b162a9508576860165e0ddc361d96fafcd2ff82776c743b9cd6845db61eb56739f5c4ef561e6c20d8c]\n[sha = SHA-512]\n\n# tcId = 218\n# r and s^-1 have a large Hamming weight\nmsg = 313233343030\nresult = valid\nsig = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe024115837645583a37a7a665f983c5e347f65dca47647aa80fd2498a791d44d9b2850a151a6e86fce7d7bb814e724ff11b9ef726bf36c6e7548c37f82a24902876ee19\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 5e7eb6c4f481830abaad8a60ddb09891164ee418ea4cd2995062e227d33c229fb737bf330703097d6b3b69a3f09e79c9de0b402bf846dd26b5bb1191cff801355d]\n[key.wy = 1789c9afda567e61de414437b0e93a17611e6e76853762bc0aff1e2bc9e46ce1285b931651d7129b85aef2c1fab1728e7eb4449b2956dec33e6cd7c9ba125c5cd9d]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004005e7eb6c4f481830abaad8a60ddb09891164ee418ea4cd2995062e227d33c229fb737bf330703097d6b3b69a3f09e79c9de0b402bf846dd26b5bb1191cff801355d01789c9afda567e61de414437b0e93a17611e6e76853762bc0aff1e2bc9e46ce1285b931651d7129b85aef2c1fab1728e7eb4449b2956dec33e6cd7c9ba125c5cd9d]\n[sha = SHA-512]\n\n# tcId = 219\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020101020101\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0b420fb1fecdd9cc5ea7d7c7617e70538db32e6d7a0ad722c63580f1f6a1f5537eb50930b90fd6fdd9abd40015f746d2fd8adf945a75621407edb6863588e41979e]\n[key.wy = 295108a7e9d2191a287fd160bd24f498055dc9badbd61c6a89fede27b4f9d479d86a20b6dc07c90f008ebe68a0e0cc15a4a03b8cf990e4ff7ed6e3892b21c52153]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400b420fb1fecdd9cc5ea7d7c7617e70538db32e6d7a0ad722c63580f1f6a1f5537eb50930b90fd6fdd9abd40015f746d2fd8adf945a75621407edb6863588e41979e00295108a7e9d2191a287fd160bd24f498055dc9badbd61c6a89fede27b4f9d479d86a20b6dc07c90f008ebe68a0e0cc15a4a03b8cf990e4ff7ed6e3892b21c52153]\n[sha = SHA-512]\n\n# tcId = 220\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020101020102\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 32b9a17c201aec34d29b8c2764e7c7f6aeef10fb61bf9837117fad879f8c6a22a300006d2018cf42b25898ffc9a1bf507352e59e6a52e627cda160e17ea2f46005]\n[key.wy = 317a89899b7cb3a0d33eafa02b0137a0fb1b05102b22b676f35b9ff6c050ddee9f185609ffb7f5165a769e440792b75044a43e838690d13f884aaae888bf5f86f0]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040032b9a17c201aec34d29b8c2764e7c7f6aeef10fb61bf9837117fad879f8c6a22a300006d2018cf42b25898ffc9a1bf507352e59e6a52e627cda160e17ea2f4600500317a89899b7cb3a0d33eafa02b0137a0fb1b05102b22b676f35b9ff6c050ddee9f185609ffb7f5165a769e440792b75044a43e838690d13f884aaae888bf5f86f0]\n[sha = SHA-512]\n\n# tcId = 221\n# small r and s\nmsg = 313233343030\nresult = valid\nsig = 3006020101020103\n\n# tcId = 222\n# r is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020103\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 67dd456b52f82a5d4c4a71b3ea9302f62a852ddc04ad25b62fef1ddf657374fb4e80679ddf42d212f0711db32b626d8593bd70892e93ed0adb273157b6df187938]\n[key.wy = 14d2c78509f3bd6f7d0fba4a90cb456286e267f5dd9d967842a6086884d66c7b2a932833470c721a4a728cd8486d15314232d801f17e3a6fd7068bdebacdf82c0b4]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040067dd456b52f82a5d4c4a71b3ea9302f62a852ddc04ad25b62fef1ddf657374fb4e80679ddf42d212f0711db32b626d8593bd70892e93ed0adb273157b6df187938014d2c78509f3bd6f7d0fba4a90cb456286e267f5dd9d967842a6086884d66c7b2a932833470c721a4a728cd8486d15314232d801f17e3a6fd7068bdebacdf82c0b4]\n[sha = SHA-512]\n\n# tcId = 223\n# s is larger than n\nmsg = 313233343030\nresult = invalid\nsig = 3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e914b3a90\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 68d7b518214766ac734a7461d499352444377d50af42a1bbdb7f0032065ee6dc341ccf231af65250e7d13a80733abebff559891d4211d6c28cf952c9222303b53b]\n[key.wy = 0a2f3d7e14d9d8fabe1939d664e4615c6e24f5490c815c7651ccf6cc65252f88bcfd3b07fbdbaa0ba00441e590ccbcea00658f388f22c42d8a6d0f781ae5bb4d78b]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040068d7b518214766ac734a7461d499352444377d50af42a1bbdb7f0032065ee6dc341ccf231af65250e7d13a80733abebff559891d4211d6c28cf952c9222303b53b00a2f3d7e14d9d8fabe1939d664e4615c6e24f5490c815c7651ccf6cc65252f88bcfd3b07fbdbaa0ba00441e590ccbcea00658f388f22c42d8a6d0f781ae5bb4d78b]\n[sha = SHA-512]\n\n# tcId = 224\n# small r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 304802020100024201efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7ef87b4de1fc92dd757639408a50bee10764e326fdd2fa308dfde3e5243fdf4ac5ac\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 11edc3b22b20f9a188b32b1e827d6e46b2ed61b9be6f4ada0b2c95835bee2738ec4dc5313831cce5f927210a7bc2f13abc02fa90e716fc1bd2f63c429a760ed2363]\n[key.wy = 118daad88fe9b9d66e66e71ce05d74137d277a9ca81c7d7aef1e74550890564103cc0d95d30f6205c9124829192e15d66fb1f4033032a42ba606e3edca6ec065c50]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004011edc3b22b20f9a188b32b1e827d6e46b2ed61b9be6f4ada0b2c95835bee2738ec4dc5313831cce5f927210a7bc2f13abc02fa90e716fc1bd2f63c429a760ed23630118daad88fe9b9d66e66e71ce05d74137d277a9ca81c7d7aef1e7455089056410",
+    "3cc0d95d30f6205c9124829192e15d66fb1f4033032a42ba606e3edca6ec065c50]\n[sha = SHA-512]\n\n# tcId = 225\n# smallish r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 304d02072d9b4d347952cd02420100508d073413de829275e76509fd81cff49adf4c80ed2ddd4a7937d1d918796878fec24cc46570982c3fb8f5e92ccdcb3e677f07e9bd0db0b84814be1c7949b0de\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 12f8b9863a1887eca6827ad4accc2ba607f8592e5be15d9692b697a4061fcc81560c8feb2ae3851d00e06df3e0091f1f1ca5ec64761f4f8bd6d0c2cab2a12102444]\n[key.wy = 174b4e34aec517a0d2ceb2fd152ed1736bc330efca5e6d530ea170802fb6af031425903fa6a378405be5e47d1e52f62f859f537df9c0f6a4a6479a0aadafe219821]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004012f8b9863a1887eca6827ad4accc2ba607f8592e5be15d9692b697a4061fcc81560c8feb2ae3851d00e06df3e0091f1f1ca5ec64761f4f8bd6d0c2cab2a121024440174b4e34aec517a0d2ceb2fd152ed1736bc330efca5e6d530ea170802fb6af031425903fa6a378405be5e47d1e52f62f859f537df9c0f6a4a6479a0aadafe219821]\n[sha = SHA-512]\n\n# tcId = 226\n# 100-bit r and small s^-1\nmsg = 313233343030\nresult = valid\nsig = 3053020d1033e67e37b32b445580bf4eff0242013cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc3393f632affd3eaa3c8fb64507bd5996497bd588fb9e3947c097ced7546b57c8998\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 08aed779a32b9bf56ea7ab46e4b914e55c65301cdbe9ea6e7ed44f7e978c0365989a19a5e48282fb1158f481c556505d66ff414a07003ebf82fca1698c33f2884c6]\n[key.wy = 0a62426993ed5b177b6045e60b5fa1a1f8ce1ad5d70e7bc7b5af811dbf86e651f9ea02ec796ab991e1439bf07ffe2ac6052a8a0b0174d78a9441aaf4d8fc757d80f]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004008aed779a32b9bf56ea7ab46e4b914e55c65301cdbe9ea6e7ed44f7e978c0365989a19a5e48282fb1158f481c556505d66ff414a07003ebf82fca1698c33f2884c600a62426993ed5b177b6045e60b5fa1a1f8ce1ad5d70e7bc7b5af811dbf86e651f9ea02ec796ab991e1439bf07ffe2ac6052a8a0b0174d78a9441aaf4d8fc757d80f]\n[sha = SHA-512]\n\n# tcId = 227\n# small r and 100 bit s^-1\nmsg = 313233343030\nresult = valid\nsig = 30480202010002420086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 093697b0378312b38c31deae073f24a8163f086ac2116b7c37c99157cfae7970ab4201f5a7e06ec39eedbf7d87f3021ca439e3ff7c5988b84679937bab786dbe12e]\n[key.wy = 1c6987c86077c05423ac281de6d23f6a685870e12855463770eccabc9f3a1d23cb2a0c15479420b5dd40fbdc9886c463b62ee23239df3a8b861c3291d28224f6057]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040093697b0378312b38c31deae073f24a8163f086ac2116b7c37c99157cfae7970ab4201f5a7e06ec39eedbf7d87f3021ca439e3ff7c5988b84679937bab786dbe12e01c6987c86077c05423ac281de6d23f6a685870e12855463770eccabc9f3a1d23cb2a0c15479420b5dd40fbdc9886c463b62ee23239df3a8b861c3291d28224f6057]\n[sha = SHA-512]\n\n# tcId = 228\n# 100-bit r and s^-1\nmsg = 313233343030\nresult = valid\nsig = 3053020d062522bbd3ecbe7c39e93e7c2402420086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 19a9f1b7b7f574a021fedd8679a4e998b48524854eefbaae4104a3973d693e02104fa119243256e3d986f8b4966c286ab8cb1f5267c0bbd6bc182aeb57493a5d5b6]\n[key.wy = 158b97eb74862fbca41763e8d3a7beb5fccd05565b75a3a43c2b38b96eb2ccff149c23ef1ac09fc455d808ff28081e985f9e172fc62d0900585172cfbff87383595]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004019a9f1b7b7f574a021fedd8679a4e998b48524854eefbaae4104a3973d693e02104fa119243256e3d986f8b4966c286ab8cb1f5267c0bbd6bc182aeb57493a5d5b60158b97eb74862fbca41763e8d3a7beb5fccd05565b75a3a43c2b38b96eb2ccff149c23ef1ac09fc455d808ff28081e985f9e172fc62d0900585172cfbff87383595]\n[sha = SHA-512]\n\n# tcId = 229\n# r and s^-1 are close to n\nmsg = 313233343030\nresult = valid\nsig = 308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138638a0242015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5b\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1aa9f3a894b727d7a01b09c4f051b469d661de1e06915b599e211463319ac1b7ca8a6097f1be401d70a71d0b53655cdf9bef748d886e08ee7de2fa781e93ec41a26]\n[key.wy = 1ba9ea67385e19894fc9cd4b0173ab215f7b96f23bc420665d46c75447bf200ae3ac7b42bd9b857fd1c85cce8ea9c8d2345e4687dd70df59f5149510735bb9c7b64]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401aa9f3a894b727d7a01b09c4f051b469d661de1e06915b599e211463319ac1b7ca8a6097f1be401d70a71d0b53655cdf9bef748d886e08ee7de2fa781e93ec41a2601ba9ea67385e19894fc9cd4b0173ab215f7b96f23bc420665d46c75447bf200ae3ac7b42bd9b857fd1c85cce8ea9c8d2345e4687dd70df59f5149510735bb9c7b64]\n[sha = SHA-512]\n\n# tcId = 230\n# s == 1\nmsg = 313233343030\nresult = valid\nsig = 3047024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad020101\n\n# tcId = 231\n# s == 0\nmsg = 313233343030\nresult = invalid\nsig = 3047024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad020100\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 2a07f13f3e8df382145b7942fe6f91c12ff3064b314b4e3476bf3afbb982070f17f63b2de5fbe8c91a87ae632869facf17d5ce9d139b37ed557581bb9a7e4b8fa3]\n[key.wy = 24b904c5fc536ae53b323a7fd0b7b8e420302406ade84ea8a10ca7c5c934bad5489db6e3a8cc3064602cc83f309e9d247aae72afca08336bc8919e15f4be5ad77a]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004002a07f13f3e8df382145b7942fe6f91c12ff3064b314b4e3476bf3afbb982070f17f63b2de5fbe8c91a87ae632869facf17d5ce9d139b37ed557581bb9a7e4b8fa30024b904c5fc536ae53b323a7fd0b7b8e420302406ade84ea8a10ca7c5c934bad5489db6e3a8cc3064602cc83f309e9d247aae72afca08336bc8919e15f4be5ad77a]\n[sha = SHA-512]\n\n# tcId = 232\n# point at infinity during verify\nmsg = 313233343030\nresult = invalid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3204024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 60daf59638158ed9d3d7e8428501334764162f9be239e168fae9af348c30a7be1cfa4d9636c3bb621d7e0aa71446f8d4a37f2d43274a4255b226f612382f63152e]\n[key.wy = 16e48300124a636b206fad4d0355862a852623799afee941e864d96dcbf55b801cabd6249b6f567506d5a503e7d03b4764c70fc44c5365f32c3603678476d62b09d]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040060daf59638158ed9d3d7e8428501334764162f9be239e168fae9af348c30a7be1cfa4d9636c3bb621d7e0aa71446f8d4a37f2d43274a4255b226f612382f63152e016e48300124a636b206fad4d0355862a852623799afee941e864d96dcbf55b801cabd6249b6f567506d5a503e7d03b4764c70fc44c5365f32c3603678476d62b09d]\n[sha = SHA-512]\n\n# tcId = 233\n# u1 == 1\nmsg = 313233343030\nresult = valid\nsig = 308186024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 51fe6a35a85070c7c29502a87672a38153d799aef734226b64d8fd3398621701117f0af9d9afaf6dbb8ca3007255dc79b0f41ed552512cb29207b15a01cdfdfaae]\n[key.wy = 1a16c61277586356efadcb24764f21f574ef96f2caabc3f47fa66fb8719d7785824061c2d6d7a4bcb851540e62b2f00960b283eac7808d1813ef51b46e1149d3e4d]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040051fe6a35a85070c7c29502a87672a38153d799aef734226b64d8fd3398621701117f0af9d9afaf6dbb8ca3007255dc79b0f41ed552512cb29207b15a01cdfdfaae01a16c61277586356efadcb24764f21f574ef96f2caabc3f47fa66fb8719d7785824061c2d6d7a4bcb851540e62b2f00960b283eac7808d1813ef51b46e1149d3e4d]\n[sha = SHA-512]\n\n# tcId = 234\n# u1 == n - 1\nmsg = 313233343030\nresult = va",
+    "lid\nsig = 308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0b4ffc0fff087607ad26c4b23d6d31ae5f904cc064e350f47131ce2784fbb359867988a559d4386752e56277bef34e26544dedda88cc20a3411fa98834eeae869ad]\n[key.wy = 09d6e8ca99949b7b34fd06a789744ecac3356247317c4d7aa9296676dd623594f3684bc13064cab8d2db7edbca91f1c8beb542bc97978a3f31f3610a03f46a982d2]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400b4ffc0fff087607ad26c4b23d6d31ae5f904cc064e350f47131ce2784fbb359867988a559d4386752e56277bef34e26544dedda88cc20a3411fa98834eeae869ad009d6e8ca99949b7b34fd06a789744ecac3356247317c4d7aa9296676dd623594f3684bc13064cab8d2db7edbca91f1c8beb542bc97978a3f31f3610a03f46a982d2]\n[sha = SHA-512]\n\n# tcId = 235\n# u2 == 1\nmsg = 313233343030\nresult = valid\nsig = 308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0809fba320fe96ded24611b72a2a5428fe46049ff080d6e0813ab7a35897018fe6418613abd860d1eb484959059a01af7d68cba69d1c52ea64ad0f28a18a41fc78a]\n[key.wy = 1108acc5577e9e8962e2a7cea0bb37df1d0ca4050fb6cfeba41a7f868d988dbbcebc962986748fa485183f6b60f453ec8606f8c33d43767dddbbef8c412b2c37939]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400809fba320fe96ded24611b72a2a5428fe46049ff080d6e0813ab7a35897018fe6418613abd860d1eb484959059a01af7d68cba69d1c52ea64ad0f28a18a41fc78a01108acc5577e9e8962e2a7cea0bb37df1d0ca4050fb6cfeba41a7f868d988dbbcebc962986748fa485183f6b60f453ec8606f8c33d43767dddbbef8c412b2c37939]\n[sha = SHA-512]\n\n# tcId = 236\n# u2 == n - 1\nmsg = 313233343030\nresult = valid\nsig = 308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad0242015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5c\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 145130dca77d9674dfceffa851b4a2672e490e8fba8277622b0020e2fe9101e76933b0c01d248071f854e9bc523733936dc0b9930cbe154b9a402f681ee3c6cef6b]\n[key.wy = 0d0c94b2ad28556643aa3d27523048d227a1de82f8a664707e75394d21da181bec82e1afb0e627539531affa849a2409bcac83fb786c351c88bac2fb2e4322e54a]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040145130dca77d9674dfceffa851b4a2672e490e8fba8277622b0020e2fe9101e76933b0c01d248071f854e9bc523733936dc0b9930cbe154b9a402f681ee3c6cef6b000d0c94b2ad28556643aa3d27523048d227a1de82f8a664707e75394d21da181bec82e1afb0e627539531affa849a2409bcac83fb786c351c88bac2fb2e4322e54a]\n[sha = SHA-512]\n\n# tcId = 237\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201556bfd55a94e530bd972e52873ef39ac3ec34481aebdc46680dc66723ab66056275d82bff85ad29ac694530bb2f89c36ce600ad1b49761854afc69ab741ce0294a\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0ed3e09809fe5985818f90592fd06e71d2c493d9a781714c9157cbafa5ba196b987fd49ae24274c76251c70b9f7970f1f713ad274590a702f463c73a0704831ce5d]\n[key.wy = 0cac278297093bd9f9ac2d00bef3d67a01b43b28b9f829407264c738117438300c7704772976916ea102a776262ccf4222cc348c34aac683d8f00179a348323babd]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400ed3e09809fe5985818f90592fd06e71d2c493d9a781714c9157cbafa5ba196b987fd49ae24274c76251c70b9f7970f1f713ad274590a702f463c73a0704831ce5d00cac278297093bd9f9ac2d00bef3d67a01b43b28b9f829407264c738117438300c7704772976916ea102a776262ccf4222cc348c34aac683d8f00179a348323babd]\n[sha = SHA-512]\n\n# tcId = 238\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200dcf9e7f441448a125b96d72b989d9f4dac7508c7e036f6080d4758e736f5e0636b0ff503f128a98d08e0ae189921065219d2cc3aa83e3c660ca0cb85e7c11a24d0\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0ac2c5a4c79309a5132d5d7494befb3905d33fda5f80eeaf63775183aae7af108a3d97f3a441532cf6fac47f6c898329d69182e1fa07ce45997ebec3781c9ad741]\n[key.wy = 173a5b6b80a8b73d30ac97e1a4aacb773c1ad692c5ea63f68e373842782bd677864ff656cf8d1e6ec1e58e9a83856ef92677555916749fb95e800ae2e011618ca3a]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004000ac2c5a4c79309a5132d5d7494befb3905d33fda5f80eeaf63775183aae7af108a3d97f3a441532cf6fac47f6c898329d69182e1fa07ce45997ebec3781c9ad7410173a5b6b80a8b73d30ac97e1a4aacb773c1ad692c5ea63f68e373842782bd677864ff656cf8d1e6ec1e58e9a83856ef92677555916749fb95e800ae2e011618ca3a]\n[sha = SHA-512]\n\n# tcId = 239\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024166eb57733c19a7003cf8253279fce41907bc4f127153c4576dd4814f8b335a0b51560b4447f0382c69b3fe509522c891f0eec3999ad2526835f33ae22a642843af\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1eb2a353dec6b460fbda49c67f431190fff6f195639c226ef8fefcbf191d72529a12cc5485b282a52704c1fd84529a1aa0ad794f96493e299718d2618a1b83a526c]\n[key.wy = 1f704604d5b2b94a42bfc3ab93317d66a54de15258337433fc96a965d8e2d056fd1134b7989d7b3f709adc28227bdabc11fe2f359c6a6e5111ab43379ca25b66f2f]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401eb2a353dec6b460fbda49c67f431190fff6f195639c226ef8fefcbf191d72529a12cc5485b282a52704c1fd84529a1aa0ad794f96493e299718d2618a1b83a526c01f704604d5b2b94a42bfc3ab93317d66a54de15258337433fc96a965d8e2d056fd1134b7989d7b3f709adc28227bdabc11fe2f359c6a6e5111ab43379ca25b66f2f]\n[sha = SHA-512]\n\n# tcId = 240\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242017106d1131b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc79527ac09f0a3f0a8aa38285585b6afceac5ff6692842232d106d15d4df1b66aa8\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1e43dfecc7e6caad03d17b407322c878f701c5add6eb2afcd786ff3803622dfbb6baa01246e1ea059f7b78842919b2507daa9e3434efa7e8d3ae6c35499f82d0ac8]\n[key.wy = 18b0e4d6378222a07ccdb4214001f97b1a503d1aac3ab925ea64faa9c739ba04ee3480b147cb07f93edf40b6856a22f4159c3f5cd6c9e7165452907c8d02fab201e]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401e43dfecc7e6caad03d17b407322c878f701c5add6eb2afcd786ff3803622dfbb6baa01246e1ea059f7b78842919b2507daa9e3434efa7e8d3ae6c35499f82d0ac8018b0e4d6378222a07ccdb4214001f97b1a503d1aac3ab925ea64faa9c739ba04ee3480b147cb07f93edf40b6856a22f4159c3f5cd6c9e7165452907c8d02fab201e]\n[sha = SHA-512]\n\n# tcId = 241\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02416d1131b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6ab94bf496f53ea229e7fe6b456088ea32f6e2b104f5112798bb59d46a0d468f838\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 141a4d714628c192b8ace1a42854da06e0e1ddb82a07618e4efb05d7095cd1eb65425078160594715eaf59fcb41c9e573fe10298c75c9e9135c775ca73f63d13aac]\n[key.wy = 089524b475170d4391cc032a0543ea22dab60ea07538f3a37607f0d4ed516634fde545e2f0a6ba8d0d2fe6aded0a771b4b134a5a280e54799fa476ef0ec87d44e1c]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040141a4d714628c192b8ace1a42854da06e0e1ddb82a07618e4efb05d7095cd1eb65425078160594715eaf59fcb41c9e573fe10298c75c9e9135c775ca73f63d13aac0089524b4",
+    "75170d4391cc032a0543ea22dab60ea07538f3a37607f0d4ed516634fde545e2f0a6ba8d0d2fe6aded0a771b4b134a5a280e54799fa476ef0ec87d44e1c]\n[sha = SHA-512]\n\n# tcId = 242\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200da226366601afff780ffe082a0db8e74ea10d4864a5f6876c64f5e78d6598fad57297e92dea7d4453cffcd68ac111d465edc56209ea224f3176b3a8d41a8d1f070\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 147fbcc65d4818e029e0a3af13a1f7c90f0605a00cd0781200eb656a591d669a787620e6fc8cc594aa28a0b0f2939ec73472c494e09cecaf5f331dafd32d5ac31c3]\n[key.wy = 75432bdaeecaa0bec7feddc298c565723fb669ee76e38a4c5ff1701f1b38cda9dc9ac43bff18da2047e4dcd80c05a7bb7e7464829d608b68176b04c87f409f46d6]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040147fbcc65d4818e029e0a3af13a1f7c90f0605a00cd0781200eb656a591d669a787620e6fc8cc594aa28a0b0f2939ec73472c494e09cecaf5f331dafd32d5ac31c30075432bdaeecaa0bec7feddc298c565723fb669ee76e38a4c5ff1701f1b38cda9dc9ac43bff18da2047e4dcd80c05a7bb7e7464829d608b68176b04c87f409f46d6]\n[sha = SHA-512]\n\n# tcId = 243\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242011b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94cb85df5e6c1125394fcd34f6521ffdaddd98f88a99fedcedd9384288bb793cf2f\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0b5b1c3998589b25c96a700bbd450d04da1f273df8053767a3b03ed1a763ed089c0de99bcf54d49c1520d3a09b845296f0445b3bd5b87918d3752cf651e0ff3007b]\n[key.wy = 0e896380876b9419c56096914ff6eec01aee247eefef0741895f14ee280f360e11508c37826af82cd915b9002f046cb51008d9ead21124c591bd8265d1492b35ffb]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400b5b1c3998589b25c96a700bbd450d04da1f273df8053767a3b03ed1a763ed089c0de99bcf54d49c1520d3a09b845296f0445b3bd5b87918d3752cf651e0ff3007b00e896380876b9419c56096914ff6eec01aee247eefef0741895f14ee280f360e11508c37826af82cd915b9002f046cb51008d9ead21124c591bd8265d1492b35ffb]\n[sha = SHA-512]\n\n# tcId = 244\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02420161be37ed5f748e06a89d72c4b7051cae809d9567848b1d8d7ed019221efb06ae81e1264ce49c5d29ee5fe22ccf70899002643aca7b99f57756f2639b6d459ae410\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1aadb41fadc35cf6d11a7c7d01d049b74b37677f04e1bd3dc08450fabae28adcd2d135f966616d283fb18a5e69eabfe7ec41e1a0edb3682f1d39f2af64a94d602b9]\n[key.wy = 14ae81ebf5e3d2d0529479d4ae8eb05f4b42e519608466ad69e7662d6e9b236765f9be535c058f00f0866bbb4b172ef47a03cb97c58dde5750344bb293035f8e97e]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401aadb41fadc35cf6d11a7c7d01d049b74b37677f04e1bd3dc08450fabae28adcd2d135f966616d283fb18a5e69eabfe7ec41e1a0edb3682f1d39f2af64a94d602b9014ae81ebf5e3d2d0529479d4ae8eb05f4b42e519608466ad69e7662d6e9b236765f9be535c058f00f0866bbb4b172ef47a03cb97c58dde5750344bb293035f8e97e]\n[sha = SHA-512]\n\n# tcId = 245\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201e9bbbd64270b9668f7623ef7cbead5483eb07b883cf39fb6884aab67dac7958b0e03144357b9433e69adc696c86c63a23d35724cbd749b7c34f8e34232d21ea420\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1b706fc3f4aae5b86da261a66fbce47eb3b3e1e91544a40a9989fccf74154bbecac042dbbbf411a39090058b62c46fccd1d5eaba0c4879a688ea5fd0a7b4f9a0b4f]\n[key.wy = 1eda01930c6b22745a97f2d59e182598dfdfbfdb463335293901de7fc9d49cf55ed7fcf5d767d4c22f89f171b4137c8415c3ed438089270c41f88eadef3018140e1]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401b706fc3f4aae5b86da261a66fbce47eb3b3e1e91544a40a9989fccf74154bbecac042dbbbf411a39090058b62c46fccd1d5eaba0c4879a688ea5fd0a7b4f9a0b4f01eda01930c6b22745a97f2d59e182598dfdfbfdb463335293901de7fc9d49cf55ed7fcf5d767d4c22f89f171b4137c8415c3ed438089270c41f88eadef3018140e1]\n[sha = SHA-512]\n\n# tcId = 246\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200924449b6c96f3758e3b085c079714f11f28d039b11699f0e9b3e7c553c8fc6c8f5212fec5eac3068713b8ec72fc6e2a90872b94e161a89822887f4a9bd5c9efd74\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 58a1fa96111bf30be76c3b8ba4435666677b6dd05031b5c4a840e1ea81f6025f70e1d395ef63cb59fa71e3674cb678f7250887f5d734e3ec377dbe3ae637d24f82]\n[key.wy = 7a4eaf02cc57e658b5b9fa08ee30e0ef5b3429bb5a10438b0e05bacaebc60317010a334d7f896028aef620f5d9c7cabc38306e032b1b91c2376c3fef3e455a10df]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040058a1fa96111bf30be76c3b8ba4435666677b6dd05031b5c4a840e1ea81f6025f70e1d395ef63cb59fa71e3674cb678f7250887f5d734e3ec377dbe3ae637d24f82007a4eaf02cc57e658b5b9fa08ee30e0ef5b3429bb5a10438b0e05bacaebc60317010a334d7f896028aef620f5d9c7cabc38306e032b1b91c2376c3fef3e455a10df]\n[sha = SHA-512]\n\n# tcId = 247\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201554a01552b58d67a13468d6bc6086329e09e5dbf28a11dccbf91ccc6e2a4cfd4e6a2c5278791c6490835a27b6f7abb8a690bb060de3deb85093d3ae16482c84f64\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 303ba5ef90b05110002fdf74d2b8d4c7ab189c64004859c69d7c4730fcacb5f4d9b761ae987d1f3b63bb3ecb78aeecf4a04ff60f5f367a96ac2da8da27a3687a3e]\n[key.wy = 6673d0d4ccd4c3ce1abc9980fd1885002c3e7b86078214caf7f0962fa51e116363032d7a1b93c92a4d62827549d5a33e4e6b9b6c2ab6ad9c2a15e410c5b1a846b2]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400303ba5ef90b05110002fdf74d2b8d4c7ab189c64004859c69d7c4730fcacb5f4d9b761ae987d1f3b63bb3ecb78aeecf4a04ff60f5f367a96ac2da8da27a3687a3e006673d0d4ccd4c3ce1abc9980fd1885002c3e7b86078214caf7f0962fa51e116363032d7a1b93c92a4d62827549d5a33e4e6b9b6c2ab6ad9c2a15e410c5b1a846b2]\n[sha = SHA-512]\n\n# tcId = 248\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200aa9402aa56b1acf4268d1ad78c10c653c13cbb7e51423b997f23998dc5499fa9d2f403c78b645cfba4eb78f595fe6d6f01dbaaf803f23ac263bf060baa74583abf\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0a94eea843a5c49637041598e30c381f7173bf8cd127f3caf5c16cbc728aa4d99173fb38d6a1b1ec21e40336e8d802249272b0ccbf4f8c3636ef66290a81b58fa5b]\n[key.wy = 1116c23464fad61df8d2d5d1250a5a4c427e9c58e2cf1d059cdd88a7c34984fdd22a4cf18411e1b0224d444a5bd39d5fc97fc0b3648600f19d6ab80aa6a7c083a17]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400a94eea843a5c49637041598e30c381f7173bf8cd127f3caf5c16cbc728aa4d99173fb38d6a1b1ec21e40336e8d802249272b0ccbf4f8c3636ef66290a81b58fa5b01116c23464fad61df8d2d5d1250a5a4c427e9c58e2cf1d059cdd88a7c34984fdd22a4cf18411e1b0224d444a5bd39d5fc97fc0b3648600f19d6ab80aa6a7c083a17]\n[sha = SHA-512]\n\n# tcId = 249\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201ffde03ff820a836e39d3a8435219297da1db193d79e359663eb56654a7ee6f7eb996c8ef12f62344ad211b71057928f96ae75b58e23026476cfc40ed0ef7208a23\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 14f71d2ca5bd2051336854657f09a1fab14c7f2f7865d71bd3fa354bf27b69dc8738972140553b525658b6fd203cc05ca0822e0904bad21b632e0de74a2ad3f0e72]\n[key.wy = 4525f90519f9497425460b31cbb69ab3701a9ea68aaab72c6d65d364d0f0ed4d0524280f113bd69ef1ba9825202b10287a088c4bf30debecb720a",
+    "c0739ec67434d]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004014f71d2ca5bd2051336854657f09a1fab14c7f2f7865d71bd3fa354bf27b69dc8738972140553b525658b6fd203cc05ca0822e0904bad21b632e0de74a2ad3f0e72004525f90519f9497425460b31cbb69ab3701a9ea68aaab72c6d65d364d0f0ed4d0524280f113bd69ef1ba9825202b10287a088c4bf30debecb720ac0739ec67434d]\n[sha = SHA-512]\n\n# tcId = 250\n# edge case for u1\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242013375abb99e0cd3801e7c12993cfe720c83de278938a9e22bb6ea40a7c599ad05a5d3c8e5e5d7b3e16a99e528ef0ce91be0953cb1a9adf757f257554ca47ab053dc\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1d2ecad921dd100a8dc1a7b824b0ac6c9b654ab179833c2881ce237f1b8497ade851302cf50ea5ea169c2a50c0c09cb6ea539a7290a0f3437044b7a2e9ca8d40500]\n[key.wy = 3fd5651535dcba1f331981c216a1c7d9842f65c5f38ca43dd71c41e19efcac384617656fd0afdd83c50c5e524e9b672b7aa8a66b289afa688e45ca6edb3477a8b0]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401d2ecad921dd100a8dc1a7b824b0ac6c9b654ab179833c2881ce237f1b8497ade851302cf50ea5ea169c2a50c0c09cb6ea539a7290a0f3437044b7a2e9ca8d40500003fd5651535dcba1f331981c216a1c7d9842f65c5f38ca43dd71c41e19efcac384617656fd0afdd83c50c5e524e9b672b7aa8a66b289afa688e45ca6edb3477a8b0]\n[sha = SHA-512]\n\n# tcId = 251\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02415555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 165d67972a48fddc2f41c03f79ab5e0d42fd0992c013ead135c3394049645e26ad7c7be96510df59ba677dc94f1146e8e8e8fbe56debcb66920639581956b92b4d1]\n[key.wy = 08aeb66ee0be18abaa909a973c70b5749d688f8e2cd2e6e1613af93d0033492d26a6e82cfb80ac6925ac6bc79b984f73e3ebbff2f223a38676891c1ecd784a8a789]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040165d67972a48fddc2f41c03f79ab5e0d42fd0992c013ead135c3394049645e26ad7c7be96510df59ba677dc94f1146e8e8e8fbe56debcb66920639581956b92b4d1008aeb66ee0be18abaa909a973c70b5749d688f8e2cd2e6e1613af93d0033492d26a6e82cfb80ac6925ac6bc79b984f73e3ebbff2f223a38676891c1ecd784a8a789]\n[sha = SHA-512]\n\n# tcId = 252\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242009f57708fa97eba94c6d4782cdd4e33bb95c1353bde095232e3e2bab277bb5d2b48f55a53ffe928d034c29970a9e5f384a003907d3d9b82a86817cc61fb17f4c59e\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 18cd11252f0a434f446d3af18518c6b84cb0b7bf33758b4d83b97c2a56e0037b54d57d2b0b842e9c17d70504e01896389c066db8f2bfec025259a51dff514668308]\n[key.wy = 1cca54365156c59e2c73c17664f09fcdcfd5b910f9ab48d0899b6a7064de8b80fc7a992e47ee7f23ec82fd80179a19f4cf89b4c02b7218f435298da5d322a982c1e]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004018cd11252f0a434f446d3af18518c6b84cb0b7bf33758b4d83b97c2a56e0037b54d57d2b0b842e9c17d70504e01896389c066db8f2bfec025259a51dff51466830801cca54365156c59e2c73c17664f09fcdcfd5b910f9ab48d0899b6a7064de8b80fc7a992e47ee7f23ec82fd80179a19f4cf89b4c02b7218f435298da5d322a982c1e]\n[sha = SHA-512]\n\n# tcId = 253\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024168d98fa90736eff3e90f8fcfe50838b6fa0bf2cde77bc51e3f41019c8006f4e9cbaeadce7dbb44462da6425be9cfdaecb234c41749ce695be1b5ead2e6b1205f35\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1d6329a8afdea27cf1028a44d19c3c72927590d64628775f324514c81de301aa9be9c775c53a6349d1cbd5ecfc7bd39b373e613a10c1439441b141430fdadac168c]\n[key.wy = 71342d63dba901b93bdc444a1fe2ec6a15108bdf49eb1dfd218373884520d84bce03c5012f5837051cb8abf6a0be78dfdfeeb3a5872dff75b3f874faa6d2243bf]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401d6329a8afdea27cf1028a44d19c3c72927590d64628775f324514c81de301aa9be9c775c53a6349d1cbd5ecfc7bd39b373e613a10c1439441b141430fdadac168c00071342d63dba901b93bdc444a1fe2ec6a15108bdf49eb1dfd218373884520d84bce03c5012f5837051cb8abf6a0be78dfdfeeb3a5872dff75b3f874faa6d2243bf]\n[sha = SHA-512]\n\n# tcId = 254\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200e97ae66bcd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffd68bc9726f02dbf8598a98b3e5077eff6f2491eb678ed040fb338c084a9ea8a4c\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1c963b64cdc3ecb1c35cda5ced9419ac146b060adb04c638cf6b66658013cb25e915a6ad0055668342881ed27f438b50ae4bb86ae3c7c02b727a130c77bad698008]\n[key.wy = 481bfffaead856b4137fd4268ecd74a6c2d4bd6cd13998ce7f0e828b220135d8df23253e681dc90673e0537e7590769a2a441aaaaa3a9901c4fbe44fa9513951ef]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401c963b64cdc3ecb1c35cda5ced9419ac146b060adb04c638cf6b66658013cb25e915a6ad0055668342881ed27f438b50ae4bb86ae3c7c02b727a130c77bad69800800481bfffaead856b4137fd4268ecd74a6c2d4bd6cd13998ce7f0e828b220135d8df23253e681dc90673e0537e7590769a2a441aaaaa3a9901c4fbe44fa9513951ef]\n[sha = SHA-512]\n\n# tcId = 255\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201ae66bcd4cae36ffffffffffffffffffffffffffffffffffffffffffffffffffffb3954212f8bea578d93e685e5dba329811b2542bb398233e2944bceb19263325d\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 5dfbc867d53c57b2945502b8e56d96ca2d4d485aa33452200a2f4ba16042357976afeecf3e63b2fdcd5cdd76076c1a73e496caf9d6de3e8831d955d138e05884ae]\n[key.wy = 1e04aa0b5360a0d3badd0120fbb8cc42a38bf1c61755d00858e40e4b10da4ea2575830dc92e312c20af2b8b167d7a58d178661d48cd932fe47a4bc7145e620ae22c]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004005dfbc867d53c57b2945502b8e56d96ca2d4d485aa33452200a2f4ba16042357976afeecf3e63b2fdcd5cdd76076c1a73e496caf9d6de3e8831d955d138e05884ae01e04aa0b5360a0d3badd0120fbb8cc42a38bf1c61755d00858e40e4b10da4ea2575830dc92e312c20af2b8b167d7a58d178661d48cd932fe47a4bc7145e620ae22c]\n[sha = SHA-512]\n\n# tcId = 256\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242015ccd79a995c6dffffffffffffffffffffffffffffffffffffffffffffffffffffc2121badb58a518afa8010a82c03cad31fa94bbbde96820166d27e644938e00b1\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 78be6c43e366cf63ddc4235e8b969386e95012fbca5cebf1b0a6fe3c03c1257df7cf47b002eb6c4497f310bff6131b5ccb54fd0e8ee7fcf6b49d487e1b54508f68]\n[key.wy = 09b61a547104c8516e0dc35d3d17659ca098d023b0593908fe979c29e62373738a3c30094ba47105a49edbc6e1d37cce317b49d2701470eeb53d9b24dce9d809166]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040078be6c43e366cf63ddc4235e8b969386e95012fbca5cebf1b0a6fe3c03c1257df7cf47b002eb6c4497f310bff6131b5ccb54fd0e8ee7fcf6b49d487e1b54508f68009b61a547104c8516e0dc35d3d17659ca098d023b0593908fe979c29e62373738a3c30094ba47105a49edbc6e1d37cce317b49d2701470eeb53d9b24dce9d809166]\n[sha = SHA-512]\n\n# tcId = 257\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201cd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffffffffffae18dcc11dff7526233d923a0b202cb29e713f22de8bb6ab0a12821c5abbe3f23\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 093f68961005f3040dc1a8ff1416c917bdcc77f1dfa8550",
+    "6c3bb62dac47f7be9529b4cbe57dd2c19e860bd2a0db71d47ef1eca8a20bfc3e0bc5e05c8303001c1960]\n[key.wy = 2b9a3d45f2f5120fee06445f0d34e6138e3ac5b16d2a22f0460cea258c368ca9e478eb7b8253e7c6f2f7250fdc7dcd7243761f8d56f2350ac51e47ee063f41da31]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040093f68961005f3040dc1a8ff1416c917bdcc77f1dfa85506c3bb62dac47f7be9529b4cbe57dd2c19e860bd2a0db71d47ef1eca8a20bfc3e0bc5e05c8303001c1960002b9a3d45f2f5120fee06445f0d34e6138e3ac5b16d2a22f0460cea258c368ca9e478eb7b8253e7c6f2f7250fdc7dcd7243761f8d56f2350ac51e47ee063f41da31]\n[sha = SHA-512]\n\n# tcId = 258\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024122e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b9c4c3f73cc816143fac3412b62de4c63db08f8c57e4c58c31f1b457ca5e57e20a\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 2d2d7d40bf17c4e8b18757e451ddded95e6b1007cd144809d21af31353b03038372c4af204d4414b71060b48b3a8439c632809bd33c4736263044405a1ad766e36]\n[key.wy = 0bb0c5a8848f93fa3e85376b012bf064e303746529a673b852bb5a969c24c0156a8dd26242d0aad4bae43e23631b01fb9d050f9744b59f3b52b1c572217a1d70588]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004002d2d7d40bf17c4e8b18757e451ddded95e6b1007cd144809d21af31353b03038372c4af204d4414b71060b48b3a8439c632809bd33c4736263044405a1ad766e3600bb0c5a8848f93fa3e85376b012bf064e303746529a673b852bb5a969c24c0156a8dd26242d0aad4bae43e23631b01fb9d050f9744b59f3b52b1c572217a1d70588]\n[sha = SHA-512]\n\n# tcId = 259\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242010590b21642c8590b21642c8590b21642c8590b21642c8590b21642c8590b2164298eb57e5aff9343597a542d3132f9e734fdc305125e0ec139c5f780ee8e8cb9c2\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 18ac11dfe62d1f2a8202732c79b423d29f43bec4db6080a220796a10f2685f92c71c7f72d9da0a8acb22680cca018eba2e8ba3bfde1db9a4ef3b97da16474364e96]\n[key.wy = 5aad3b286707bd3ad07a060cabca49c53de4f56c05a0a8de40fd969d7d4f995f7c6701fe5c5321f85318b98be66251fa490088fd727da2454e00b3b94dc6e1241b]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004018ac11dfe62d1f2a8202732c79b423d29f43bec4db6080a220796a10f2685f92c71c7f72d9da0a8acb22680cca018eba2e8ba3bfde1db9a4ef3b97da16474364e96005aad3b286707bd3ad07a060cabca49c53de4f56c05a0a8de40fd969d7d4f995f7c6701fe5c5321f85318b98be66251fa490088fd727da2454e00b3b94dc6e1241b]\n[sha = SHA-512]\n\n# tcId = 260\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201a4924924924924924924924924924924924924924924924924924924924924924445e10670ed0437c9db4125ac4175fbd70e9bd1799a85f44ca0a8e61a3354e808\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 51b2c3e0494564ed48ed3479b596ea4078240550a3c28da33d71d259e8e623e37ab43f396c49363f31c8de8a4644d37e94ed80e0dd4f92c3df2106e2795c2798b8]\n[key.wy = 0a530d5e961f0696bbeb962aca8e71f65956ae04cdc22a4ac65146943e99a4a2fdb477df75aa069c8dd37a5daaea3848079a6a7bc03e0faa3d65d42f8053db2078b]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040051b2c3e0494564ed48ed3479b596ea4078240550a3c28da33d71d259e8e623e37ab43f396c49363f31c8de8a4644d37e94ed80e0dd4f92c3df2106e2795c2798b800a530d5e961f0696bbeb962aca8e71f65956ae04cdc22a4ac65146943e99a4a2fdb477df75aa069c8dd37a5daaea3848079a6a7bc03e0faa3d65d42f8053db2078b]\n[sha = SHA-512]\n\n# tcId = 261\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201d5555555555555555555555555555555555555555555555555555555555555554fa6dbdcd91484ebc0d521569e4c5efb25910b1f0ddef19d0410c50c73e68db95f\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1ba31a6f9c2d227da57de00759e2e844d607bc9bd92bcdf282006884dc347c9284f0dc0623af1e9db22117364a7a80a5b067efa19b204dac8faf2230d80b704addc]\n[key.wy = 0d88b761cd3a4b0947bfc17e204b4d751f76880a82c9b7c6fd93ded55883c995002d8b8bfff1e021189c08d829d16b088f4fb39ad9456eafbc77c20353bc0f3c038]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401ba31a6f9c2d227da57de00759e2e844d607bc9bd92bcdf282006884dc347c9284f0dc0623af1e9db22117364a7a80a5b067efa19b204dac8faf2230d80b704addc00d88b761cd3a4b0947bfc17e204b4d751f76880a82c9b7c6fd93ded55883c995002d8b8bfff1e021189c08d829d16b088f4fb39ad9456eafbc77c20353bc0f3c038]\n[sha = SHA-512]\n\n# tcId = 262\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4fc31322e69da41162a76abf3a1b4507ae66074633446f259661a61c93be30eb5\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 137bbb48ef281133849ed723f5662a19fff9cc7389a0170d311bd34f4dbdc656246db695ea0712d8aceff9d1d0ef7921ec2e3f8b533e4ca122f9f7f446073889334]\n[key.wy = 163e4500d998095f60fa3fed4149d2d9b5b018e03eb5344efe8ffcc1c7d276e7401a4df639c4ab108820062495471be7b29398aadbae440a9bdcd55cf0bb5d96f79]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040137bbb48ef281133849ed723f5662a19fff9cc7389a0170d311bd34f4dbdc656246db695ea0712d8aceff9d1d0ef7921ec2e3f8b533e4ca122f9f7f4460738893340163e4500d998095f60fa3fed4149d2d9b5b018e03eb5344efe8ffcc1c7d276e7401a4df639c4ab108820062495471be7b29398aadbae440a9bdcd55cf0bb5d96f79]\n[sha = SHA-512]\n\n# tcId = 263\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 726dda8b7b6ed25f97f1fc6c3ccf554d60fc71e4fab2a578286d32612e7f3e669faed0b97619aef2d5aff9c8ffd987feddc0d6c38b7eec028191400874803f498b]\n[key.wy = 0c0b8870c612e06c13c57ed6f7ef3d53b5e5fa2db62707b034b5ec13fb47018e31da7ecc991d575943468d701e118eca33122cf6d394b8a6ec0f45bc09701603a26]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400726dda8b7b6ed25f97f1fc6c3ccf554d60fc71e4fab2a578286d32612e7f3e669faed0b97619aef2d5aff9c8ffd987feddc0d6c38b7eec028191400874803f498b00c0b8870c612e06c13c57ed6f7ef3d53b5e5fa2db62707b034b5ec13fb47018e31da7ecc991d575943468d701e118eca33122cf6d394b8a6ec0f45bc09701603a26]\n[sha = SHA-512]\n\n# tcId = 264\n# edge case for u2\nmsg = 313233343030\nresult = valid\nsig = 308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201346cc7d4839b77f9f487c7e7f2841c5b7d05f966f3bde28f1fa080ce40037a74e3001a2b00bd39ee4c93072e9963724941383cf0812c02d1c838ad4502a12c619f\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 16fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797]\n[key.wy = 083f130792d6c45c8f2a67471e51246e2b8781465b8291cbda66d22719cd536bf801e0076030919d5701732ce7678bf472846ed0777937ed77caad74d05664614a2]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004016fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc27970083f130792d6c45c8f2a67471e51246e2b8781465b8291cbda66d22719cd536bf801e0076030919d5701732ce7678bf472846ed0777937ed77caad74d05664614a2]\n[sha = SHA-512]\n\n# tcId = 265\n# point duplication during verification\nmsg = 313233343030\nresult = valid\nsig = 30818802420090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf024201150b0fe9f0dff27fa180",
+    "cc9442c3bfc9e395232898607b110a51bcb1086cb9726e251a07c9557808df32460715950a3dc446ae4229b9ed59fe241b389aee3a6963\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 16fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797]\n[key.wy = 17c0ecf86d293ba370d598b8e1aedb91d4787eb9a47d6e3425992dd8e632ac9407fe1ff89fcf6e62a8fe8cd31898740b8d7b912f8886c8128835528b2fa99b9eb5d]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004016fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797017c0ecf86d293ba370d598b8e1aedb91d4787eb9a47d6e3425992dd8e632ac9407fe1ff89fcf6e62a8fe8cd31898740b8d7b912f8886c8128835528b2fa99b9eb5d]\n[sha = SHA-512]\n\n# tcId = 266\n# duplication bug\nmsg = 313233343030\nresult = invalid\nsig = 30818802420090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf024201150b0fe9f0dff27fa180cc9442c3bfc9e395232898607b110a51bcb1086cb9726e251a07c9557808df32460715950a3dc446ae4229b9ed59fe241b389aee3a6963\n# Some implementations of ECDSA do not handle duplication and points at infinity\n# correctly. This is a test vector that has been specially crafted to check for\n# such an omission.\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 110fb89aff135edb801a1cb5bc49525b81dc74da45090d228122871814f489fdcb02ebee46b703e6b4e6af56c5024422b31fd4252c44d0bfd29d945de782d98543f]\n[key.wy = 1ec425b4c4928e12b619227f1da6d0a9675070d9c5b49ca523050acb718e62643b0e5801543b76dc11f8d694ba09436d8391b477ad2c143ec50c2384c4f688512dc]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040110fb89aff135edb801a1cb5bc49525b81dc74da45090d228122871814f489fdcb02ebee46b703e6b4e6af56c5024422b31fd4252c44d0bfd29d945de782d98543f01ec425b4c4928e12b619227f1da6d0a9675070d9c5b49ca523050acb718e62643b0e5801543b76dc11f8d694ba09436d8391b477ad2c143ec50c2384c4f688512dc]\n[sha = SHA-512]\n\n# tcId = 267\n# point with x-coordinate 0\nmsg = 313233343030\nresult = invalid\nsig = 3047020101024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1c693a3fccbc9f625284239c2725f2a5c90b29b7ce3d07730f7de6031c9e74446d217888ae023aae23df6a4aa153f58c79597d57f42ce5c1354e5dc43a5eb311e13]\n[key.wy = 15f99658443b2e39c3edcbcda70707fc5a4d39545eabe354816d09284a6265e47ebf0a47355828e818a767f8452a6d18451e0e3817a896ff404cb1611bfc4c4b4a3]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401c693a3fccbc9f625284239c2725f2a5c90b29b7ce3d07730f7de6031c9e74446d217888ae023aae23df6a4aa153f58c79597d57f42ce5c1354e5dc43a5eb311e13015f99658443b2e39c3edcbcda70707fc5a4d39545eabe354816d09284a6265e47ebf0a47355828e818a767f8452a6d18451e0e3817a896ff404cb1611bfc4c4b4a3]\n[sha = SHA-512]\n\n# tcId = 268\n# point with x-coordinate 0\nmsg = 313233343030\nresult = invalid\nsig = 3081870242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 17d7bf723678df574ce4366741e1d3787f834af9997b41c8260a074cb1f325d2bae9f8565dc6b51b6cb02dceeb5a1b774ee8dd7057c99e2d94c3c71299a9ce0f1b0]\n[key.wy = 162c65632fff88bdbb17ce2525ccac8df37c501ab0e6626e273fb6cf99000424344c0ac539c9fd6c4f3d28876b257c010d347a45bb010cc058443843a758328d491]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004017d7bf723678df574ce4366741e1d3787f834af9997b41c8260a074cb1f325d2bae9f8565dc6b51b6cb02dceeb5a1b774ee8dd7057c99e2d94c3c71299a9ce0f1b00162c65632fff88bdbb17ce2525ccac8df37c501ab0e6626e273fb6cf99000424344c0ac539c9fd6c4f3d28876b257c010d347a45bb010cc058443843a758328d491]\n[sha = SHA-512]\n\n# tcId = 269\n# comparison with point at infinity \nmsg = 313233343030\nresult = invalid\nsig = 308187024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1e06db423a902e239b97340ab052534ead37e79412c675bf0eb823999e6b731040bff2b0e4fa64edf3962a328921ea5ae4e8f4079eab439e12f92335dfc4863c07f]\n[key.wy = 7ee9f0ecb409cb133c0cd08b85e840b076f3d615e1ef1393b5222338b227d768003da5f3ba1f72f6654ca54ac11c2ba91a6cb5883d6d1a82304ad2b79de09215f3]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401e06db423a902e239b97340ab052534ead37e79412c675bf0eb823999e6b731040bff2b0e4fa64edf3962a328921ea5ae4e8f4079eab439e12f92335dfc4863c07f007ee9f0ecb409cb133c0cd08b85e840b076f3d615e1ef1393b5222338b227d768003da5f3ba1f72f6654ca54ac11c2ba91a6cb5883d6d1a82304ad2b79de09215f3]\n[sha = SHA-512]\n\n# tcId = 270\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 3081870241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 4c3ec8d7d23ce74be8b9c7c27be869c23bafc6874ebc44f47e107422ab1e75ed09bebd7cb1ec4626e442bcf512a25c5ddde26eb08ba37506461830cf9241cbe9c]\n[key.wy = 50a1bc08f4ba8da1d641ac3891823ab519facd4159768b1c0738f0e23450f374e4d6de55cceed95722be635c5dc0023a1498862f87bfe61d77e20e592cc20bb2ca]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040004c3ec8d7d23ce74be8b9c7c27be869c23bafc6874ebc44f47e107422ab1e75ed09bebd7cb1ec4626e442bcf512a25c5ddde26eb08ba37506461830cf9241cbe9c0050a1bc08f4ba8da1d641ac3891823ab519facd4159768b1c0738f0e23450f374e4d6de55cceed95722be635c5dc0023a1498862f87bfe61d77e20e592cc20bb2ca]\n[sha = SHA-512]\n\n# tcId = 271\n# extreme value for k\nmsg = 313233343030\nresult = valid\nsig = 308188024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66]\n[key.wy = 11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650]\n[sha = SHA-512]\n\n# tcId = 272\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 308185024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8\n\n# tcId = 273\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 308187024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0c",
+    "6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66]\n[key.wy = 0e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af]\n[sha = SHA-512]\n\n# tcId = 274\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 308185024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8\n\n# tcId = 275\n# testing point duplication\nmsg = 313233343030\nresult = invalid\nsig = 308187024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 12a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8]\n[key.wy = 12333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e]\n[keyDer = 30819b301006072a8648ce3d020106052b810400230381860004012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e]\n[sha = SHA-512]\n\n# tcId = 276\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 308188024201625d6115092a8e2ee21b9f8a425aa73814dec8b2335e86150ab4229f5a3421d2e6256d632c7a4365a1ee01dd2a936921bbb4551a512d1d4b5a56c314e4a02534c5024201b792d23f2649862595451055777bda1b02dc6cc8fef23231e44b921b16155cd42257441d75a790371e91819f0a9b1fd0ebd02c90b5b774527746ed9bfe743dbe2f\n\n# tcId = 277\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 308188024200f3d90294fbca4a4666ecbd5053c16731b742b50a0ae13722f41afe777c106283197376b127ded991e2ad52d84247165da34e91bc231655f959d988c3c7b9a67c080242014ce0570d16ba8dcb31e392cafacb4c0f0798263bf04bd4776d6135fa22cc0d3820b9c8a9a14f8d2913aed876254496209c3830f2bf6131d4240dc326ff5f7b7d71\n\n# tcId = 278\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 30818702415cfa3b6e6952dd5886275ab7023e7bd3d06a07d84a5137960b3f636ddefabaf6b9db9d7e9785c51bb66206fc1f6859e86a5609599db33b6d2f240cc8aa1bfe490f0242014a57f403fd1f79f2898d62a61dc66135cc1a00f75954d3ee296ff897f8e98d340b1632468060f829e247a498c753096db19cd4b19bfd777d947ca9f7a50738410b\n\n# tcId = 279\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 308188024200f5467782293b3daa6b61d24aef3d841e47565cce6f0a7700b31cc70998544ce654add1502efddcb4c67ae0d9e8732e5315d59c37ff7171e68a8f761cd3ea3e61fe024200c79c315958f8013d20a86d10725a8913141d73d1282b163a02f36c9d280ee4d865901d7232871caccfc320c81d43f1e8cdaa7e646bbf9aa04f0eeb639d0ee0bdc6\n\n# tcId = 280\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 3081880242015feb9fa8803a5d0296c263127d8ee9ed72a94d1ec38a84f8ce2283876388a6fdaee7e232f14da5fa447d8ff72fae4b3872db787befed48b6413c2a27de4c89dae902420126b94cf89238a0837188ceb04a47c2d9800397d1122ea831de47fe11ef146903a35030d2ce08310f2842ac5c9772597083fa6e8c0fb810e58260d6e20bdd566ef2\n\n# tcId = 281\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 30818702417358687f319dab3c22b906cd58dd3556cf982c7c25ef30fefa4abae3f2b9079dc82d5807f32ec8976ac8dc69c1b1b2cbf7103675481f35072726c1d4afd158dcb8024200f6c899c6da4fd6f0b267a96ca927b79e34d250e8af76cc8b0bd71b850bbd23631af36c7269aeb4d837ee7017772cce2ef7567c558f657802df56aec17e576b1155\n\n# tcId = 282\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 308188024200bcd2cfaf0ddf3c2414a2ca1af9114afe2d0b89af80ba797c93a05fc9efc69daa33a0812c464eb29be9d7bc5ec5aea698b018102a0e460f580059e5cd0d6e493f2b0242012c5a138af2d3e0e016f6c7ea6dda84ee4132e788949f73a31539c5e117247ccce9f676eb91462787eb71469c22e831811896513e6d35e9645e84f967839ca490e6\n\n# tcId = 283\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 30818702414dcb6fd277c0fe1919e1c6f85d78b3ff198035005fe1d497f7c8f4803d584fb4c88db946bf7af32f7b54e8db80a694b81be78d4329b5d8e3da5fd22546ad5a1b9d024200f14c765e92da98273ddd53b50e907b7d313914a6bd23c8484d95a3f6f33971d06c4c340fe2cd567c150a16bfe0873c77993e5ad61855ac4705740e7befb24d2b27\n\n# tcId = 284\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 308188024201569a9498513ae97350a86110c1d1960e89e83c26dfec840f6104318b3a84109a60024062a85daf62412c878710d3aefe47f594b68f525ef090497712e0f5caa34e024200e09fbf93ac11ab2b8e3dd0f731218e4ea08b077e4ebc717562f2746d25573dad3532702fbccfbd1bac23fa552d853594590ded4d0977a2efb140e9519d83a7b4a7\n\n# tcId = 285\n# pseudorandom signature\nmsg = \nresult = valid\nsig = 308187024200e0380e08d8a302c9829d02f65436c380c10f0dabfcc6336d4831b1dce7c96c3faff388120e8f1b4319daebe9f8642ce765c39dfb5bae243dec70149b754051f5c302411c4944a7e5ec140e91f01c313fa44de41e196a9576a4c201e1fa1dd58a8a7c021d4f20d25d0f7e172e4231f18ac12ff940f2955cd852b7e6b3b3b45720863cbb62\n\n# tcId = 286\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30818602415adc833cbc1d6141ced457bab2b01b0814054d7a28fa8bb2925d1e7525b7cf7d5c938a17abfb33426dcc05ce8d44db02f53a75ea04017dca51e1fbb14ce3311b1402415f69b2a6de129147a8437b79c72315d35173d88c2d6119085c90dae8ec05c55e067e7dfa4f681035e3dccab099291c0ecf4428332a9cb0736d16e79111ac76d766\n\n# tcId = 287\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 3081880242010217c32045f589b5479feaaf471c68e5a27b6567c19724bec8c580fb50c52f95cd4e8296ac6334844e17dfe21167c7028204d53bd24ae05e79587149d7921ed087024200fb908a87377d788fd65c91a0a935e61a3d8d735b29e2ce2083ffbbf0f0b5dd60bc53877c3155c1a089160ceb6197e39ccd0cd4edaa6449830c4e29f9aae835a9c0\n\n# tcId = 288\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 308188024201ce64622f59112dd0e4397e6902a1ba5c258729b577980b54a745e76ce29d83ba48ede7fb63f374535017c3c73a8940022fd7b6a2e701171890ff54db363879caff024201b84c02f06de11b8d6eee94d37c7d7a352e938452ae76639dfd77c00f0d3f14432edcc0bfae410224838b4ac07f0adec294d86ac06bc04066b269ac1b8c0bf5b67a\n\n# tcId = 289\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 308188024201cfc67612e129ae1f5e60da08b9f4f7ab970e0d1c66be7290cc30d501edc04d7c47781a50e8da32c17f391005231aa2a5401f7456ec13af5a90b972eb1fa133d3ae024200d837a34c9f002ac4d833192d84748471d9bfacf9cf760005f2e4860851309ed9bc7e01b4cb48143c40bad42e9e5fd755b4511b0461bcca84354512dc54b432ff84\n\n# tcId = 290\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 308188024200fc0f11de211a3c868949e897a5c9efa3f2de6a716075ba31eaf4ba6776db234a652a88488bac3d492ba1205e15ff694e71a0073211477bac7f07101c8b6fb70f8502420100891497bd19b5f1ae508ab5114d2a3fd3b3fde2216b38dfd540775d2fb3d1dcb13b2a0880144f4f562eef76c3af133002c4326561b3190e76fc39267d2b4cd164\n\n# tcId = 291\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 308188024200d3842281c596639bf18a3b32457cba814a4d86ed414d6884169ec8b1f3b7442f328df1d7deeb3db491ecfa4a84b5f334fb077923c4df768489698c6cde8691a13a024201f720d385ec6283f6c7378ab19874dace5a9c3f729e4e87e9e369d2e6ca27824eb6e86bb4bc7e3c5578627763c80b73bea3e0d0e2751afa29fd448a4a326c853b36\n\n# tcId = 292\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 308187024165d858f83de40ae1cd9d303e96ac2917ee5c389d5053be0ff05deac9ec902a70c4685305561f3aafcae225b37ef4ba062da3fa70ee2c23549b43d1f824efbcda980242010e77eb4af330ecaf545c3890e369468071f4ea9a104e1e47ed0d1455fbd492688d8e03bfad80a883136cd2fb3910f44a33cac86f515509b0c59a56af27677c6012\n\n# tcId = 293\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 308186024175dc6b7aa29fb66b5b77c5cd4b99aaa1aa7dfeba720a9f85f191cb5682851ee12c226b4b98175d058ada3a9887e7a9d3d82b1553aac4553a3beff5d8f465125b11024176561b3c31d7a8a2770f825805894",
+    "8144c0dec91c23fdff47f3ebeb36e1869fc094738b6f80e90399db1dcfaf25771606c743edf559f77a4ffebbfd697da367bc6\n\n# tcId = 294\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 30818702412d9c3f9a79e234a3f3b9e04ee08bce70a65668880ed90f5a2b4e839475daff5226f420dae3417a553215904d5632936c591e945289a5284f61294cc764ac0a954002420177f9c6ea95857ca73c51268c6ad7d7bfe4cfe0e270b3d221ed950e69fcc39e29882ac894122f6dda70d908fa0bf2ac7f73b9755c86cf92e0218fd5c78fc947addb\n\n# tcId = 295\n# pseudorandom signature\nmsg = 4d7367\nresult = valid\nsig = 308186024126db1b8d3e0d7523b055ea6e31f8b050095f4187a3ef3db62b7157ad9bc0e8934cb1a65508632930d64b89031d1c8786b879ea46cc85d4a029096089148f2454ed024132c8a0f3f44eacfd0451aab9e4c6163cadc97e323722d1e2c9cc2403aae990dc3b227600c37808ffe7e15c8e015a18b2a23aed38b1b3aed179819ac9160911d650\n\n# tcId = 296\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3081880242014141e4d94a58c1e747cbd9ee6670a41eac3c26fb4db3248e45d583179076e6b19a8e2003657a108f91f9a103157edff9b37df2b436a77dc112927d907ac9ba258702420108afa91b34bd904c680471e943af336fb90c5fb2b91401a58c9b1f467bf81af8049965dd8b45f12e152f4f7fd3780e3492f31ed2680d4777fbe655fe779ad897ab\n\n# tcId = 297\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 308187024178192ba6c31398e095b1a5ba49e34f0a6df60263e8324a9d728e292c8dbe477ad9326f3e915f4006795dbeddc92b01fae052143c961b24e624eb70e0b0e6874653024201b470d58c6ec28c2fb155b2047073bc8bec3c2d9e7f50038964dd4b5b721807a679f7252fe72ca977e2bc4d8831fef14a2bf51c7919dfa7a33acdf9a9fc1ca2dbe6\n\n# tcId = 298\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 308187024160bedcd13c22d2353e613cca0f81215c34e51bf0a83faff1da5c8b4c182785358757b35a681e4eaf021af4f43d54ec49d8bfcd8dc5015b42a7a91f263fcb8db661024201050354daf39d5261bd27f36b8c1c38f48707ece9ea9311d13489dcfc5357eda2e57000c10cf0cda7b12f313842fb884a14f902ee9bca5b4da4fbbae0f969691005\n\n# tcId = 299\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3081880242008b51c02f4a5c80c9988646900a6516e7893cd8274013e276e8b0773af1e275030bab64551e2725bf89e06dcde6ae79a126dd01ca850b4896c71eac8b1aee9db0d1024201ce5824d2f5cfd09c3ee239366207391db3f049f67c0885e919b3ce13c52215437b77fc5c5d36465319862cb5fa75e0f54dd63d3754dcca422c99432286be327d43\n\n# tcId = 300\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 308186024136a263c96cf448db82ec4ed8bda627b6e4250011c00da3cda6a8d68f9982f8c4cdfa87bbcad35da4918bb1dd6e9b666bb0ef93493e90266a97ae3ef17e6bf05ea90241691dad07a5de565cf4fbb6457aabc1527f317b3577fe712f85a8722ba13639b552f530367f3d0f6c099dd490284b4b22e0f0867d6fe4b0b50cd137b9875c666486\n\n# tcId = 301\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3081880242016737805388c1f33aa5ba70a93d5d3bb8e2cb1c6afffa9c71423663570a64e5f19a658ddb5e5351d2c724574843c6096c7bd0f5ff016304e2bb7c3c8643c0969a6b024201cc16da8f7858e4716eb7420b1f5935178cd47ad61139e0f6b4f1f98959f70ab25454f84079798931391fccdcf4bad14234db9fac4a2b811ce937691e880476ac62\n\n# tcId = 302\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 3081880242011cff9efd4637941a840054b27db8747ea2b1a44ea29b9f28e5878acaaa06a280082c9afc33e8eff8f029f1d30be2260cc2b287d5acfecbe49ac362a6b9e883e01a0242015af84a78474acb77a1afdafcc3667bcee6638ad97b5ba39ae781b0d32f7f8d3c03e2d524cb2e4afaddf212c28122f268567aae3859cf019ea0112f0d667b376f5b\n\n# tcId = 303\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 308187024164915760336c2e2c29fa207e7fc883dc36ae3b18cded722794e916671f009dd4a205c584172f81aab519bbac4cc12e6c2986b5cd4ca84a03c535bbd0c335bd1fb90242011699a6ca58af781f2bb04533c5a1b1e5cce42c58c7b05243f036cf53ac2a56b5b7bf3255dbd0f92a8dba528a5d6a1c6e021815fb4bda11ef27c0e98583b021ab09\n\n# tcId = 304\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 308188024200805994ccc821372a695824596995e53973d9423dc685f9caa5b0db9ad53445c9312ea55c5337e15e5f98de83d67ae31e31891674e30c50c64f707ba6f28124126902420182e6f40987e37fc182e095ec7a783879910bae48b4c34fb9d5e82af9548d87ce1525ff8996cc66e7094f804bbc0ee76bbb74c94db324cb0b08d73fa31f33e29781\n\n# tcId = 305\n# pseudorandom signature\nmsg = 313233343030\nresult = valid\nsig = 308188024200b28b75b96eac5a7147ed3eb6db677906776bc58942860f5228c492aef5f5067fcad4df9a84446c8783cdb19d7004b6aa262500c066888a757bbb53675e34ce45ea02420135d86f04d3f8a9b14c214324b6d4eb8f3121d43a8a3641de6f0625a07945ce1b3dd4f42bad6bfb34fda0cbb7ddfdfd229040fa609afec6f7fa3a24f33d239250cb\n\n# tcId = 306\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 308187024108135d3f1ae9e26fba825643ed8a29d63d7843720e93566aa09db2bdf5aaa69afbcc0c51e5295c298f305ba7b870f0a85bb5699cdf40764aab59418f77c6ffb4520242011d345256887fb351f5700961a7d47572e0d669056cb1d5619345c0c987f3331c2fe2c6df848a5c610422defd6212b64346161aa871ae55b1fe4add5f68836eb181\n\n# tcId = 307\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 308188024201813f1dcac3d1da48a1a3b2542df932a465c2af1e4f6edbceee83b24c36e08981061e190863eb4ea8876899d0e5e4d4ac14e7fa2ea509ff946418e1108b8d2e64ed02420180bfc16e1747b75d51df791f06220d5473fc3c76ed0453003b13f16159c3808eec089fe40b945f8773eb72ea05bcf0ef33b6d4d5dc47ae4fae6d93b080053fc1af\n\n# tcId = 308\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 30818802420108c9a063ab73bfa5e117d58dc5cc331440fc99307c8b9b9e881a7ef8edf9061e996341863b751ef4b9ad91cd8699be5dd4dc9a2593908f9b04428b0fd1da561493024200b925a24de37fccd50bbc662029e3d143bc9dc5700d7cb5f98fb7859eb7439b67edd016e66be4f8d3c0f7ec7b57bc0a42f48e4a388786b22642c036d31ab9f2bab5\n\n# tcId = 309\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3081870242011b8a3f283aeec301682cabc0b19e816afb3b707e0a833e49bfe0da29aa2bce07b7e85241bc1c04bdeff0baac7585facfd6b583cb6a423c40363beaac451255d4cf02412e0e4d93c7efec6e93e5389003c99b2fb1565d6791c81747eb0bb3a754f89af7d26148a0a77f2b79e650fa77f033f8b37cf39984bd7030d11fc75d805120e77f33\n\n# tcId = 310\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 308187024160c1d217a2485fce433723e1120271925a10dbb5b4ceb196f734c64587f618d47b4eb85996d0eacf642cfbd1536b346648b61f8188f255d1689a13718349627d76024200a91a0dea067d0f97b44cecdf21a2b1a67364a376fcc1afeded777a3170eb99a100f26f8bdd8ab65cb72a2c95eb5c992f5ee83630e1f2d8ae33fa60a10c9d1c32b2\n\n# tcId = 311\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 30818802420090ced19cb14277f90d5bca4825bbeb384f459ad2c375841a5ce4eef5b00e1eb273567e671a48357a7a6d60e389391c5dc54f4e1f8a1b0d4a91aa44d252eb5bb0ef024200f7f5077c3b0485bf5aa1849cb5310886c0599eeda6b33f6d926c2987b373fc9e3d1e16837e8b55a46eb6479e45fafc9c8f94468db385476f472ef0436d1b1527e4\n\n# tcId = 312\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 308187024131b4a11c2da6971ab4b65995b4eef6ab1cc4f1a8d4438a570aac441c303937e503b349ec5e109adb457cee916bdf051092a6ba6c89e75bc12fbabe527cacfa873702420199c79c8c5abe9430ae4774ac9c20b38a435f5d2bbc0143eebb6b47a15bbfcd3068faeb3f3c694a40406e39eed2e27acce93ccfacc74063fcd1179dab96844bb694\n\n# tcId = 313\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 308188024200d8f352204f4c15f5fdd64dbd7870a65ccc4c9a78616fbd976ca16ff2a35aea8aa2f6db0bade2c4daefefc4e7a347efebb91fdfeb01ef808ec2b044d5e9ecc7084802420120a84665d678e8c01dabc04309bc6f314e6c847f34a6134824087df68ec307009f033cb0a336b50549bf6df4fc037a3a6d633f97e382454506b984d8d725df0660\n\n# tcId = 314\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 308187024200ccd1c00546ee2082dfe9438c9348f84f987a56a941296b537509fcfb4bd1e644872eb8fdfce36ef262a2c42d69eb8931ea21be8027ec2fc56a155127e607de096b024134947d4231cff66d0cbf5a568251e06d02eec4120876e48c72a3d840983180938f109df434d26060ff693ede581ff73be04ca961718730a24ed7d24c3863209a42\n\n# tcId = 315\n# pseudorandom signature\nmsg = 0000000000000000000000000000000000000000\nresult = valid\nsig = 3081880242008a13921becfa123084e86edb1cfcad8b5a04a2e20301a11c8f2f6b6b768da5f30c24b550f9b76848b6156c9277b61fd29832d7e0b955b871710a6ad16180e440b5024201db9867ad19b825494584a64ae049252d506116ca98324825d9d9d37f6a0927f874b9aff3990b332cca760464e93d3e6ed2fa7bf",
+    "e51a2131cdfcf3ad45c7afa9d3e\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a]\n[key.wy = 09b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625]\n[sha = SHA-512]\n\n# tcId = 316\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3081870242011c9684af6dc52728410473c63053b01c358d67e81f8a1324ad711c60481a4a86dd3e75de20ca55ce7a9a39b1f82fd5da4fadf26a5bb8edd467af8825efe4746218024134c058aba6488d6943e11e0d1348429449ea17ac5edf8bcaf654106b98b2ddf346c537b8a9a3f9b3174b77637d220ef5318dbbc33d0aac0fe2ddeda17b23cb2de6\n\n# tcId = 317\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 30818702417c47a668625648cd8a31ac92174cf3d61041f7ad292588def6ed143b1ff9a288fd20cf36f58d4bfe4b2cd4a381d4da50c8eda5674f020449ae1d3dd77e44ed485e024201058e86b327d284e35bab49fc7c335417573f310afa9e1a53566e0fae516e099007965030f6f46b077116353f26cb466d1cf3f35300d744d2d8f883c8a31b43c20d\n\n# tcId = 318\n# y-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201e4e9f3a7b800de63407b8703ac545226541c97a673566711f70e2b9ccb21a145ad4637825b023d1ea9f18e60897413711611a85c1179bff9c107368f1c1b61c24c024201de948ee577c3d4e4122a52ecccac59abb6fa937dfb3e4b988cb243efe98740309452ba013112b225b3b1b1384d5f68796845199a2602a8d4505a331b07d101188e\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a]\n[key.wy = 1ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da]\n[sha = SHA-512]\n\n# tcId = 319\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 308187024200b6cf64861a2b16e33976095dbf45a592c7c24228c4a1dd727f303d5eeb87e5388ad05c328f824c40abd3e6ce003fef5cd59dee0069ad6348ea6e57f90f6bdc0a820241228181c180366e5451dfef3593ce664804cb42d5a8d5046b816b3daf6602fafd9ac2dc24b8c93a10024480882558b6ad3d9e905923dcd0fd2a11964754a9b46b8f\n\n# tcId = 320\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30818802420093c8f766827d6dc15c810fa30433153a5e742859205ee8389fbf695c8840dc917440870acc5b160087ffd0cd9a6081029c60a7c26d5e8aa9a0570f4efdeb13dea20242012ec3bbf75a0ad3df40310266648a36db820217ed7fa94e9c8313e03293ef4f6a40e736fb8f208ad8fb883ca509d48046910523645459c27829d54431463b2548c7\n\n# tcId = 321\n# y-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30818802420152388c6da66164b706b41dd4dd48176d6eaf6525f876ef0ff2d147f6966ebfadf1767fa66d04203d3ec9c937a1f0c945aed953e34be444c219fd3b94d3277aa652024201658c1e5b2e563a49d11c883d05c491d628f0a92c3e3dc8db9a4c8d5f0dc846ac22af8b3c5fb5bbe2cfa98614dcffd87de1cee2c5912a5899505a0c5bcaa513e2c6\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 2fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b]\n[key.wy = 1993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5]\n[keyDer = 30819b301006072a8648ce3d020106052b8104002303818600040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5]\n[sha = SHA-512]\n\n# tcId = 322\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3081880242010e89470f981d2c7c5c96587121a67323bb96ff2427739d0d885ea277293efa3b25c0bda04d81466198a3cbfc441f1b1b98f6bcdc2589d9d91a17a7899f70d0461e0242017351b0da8c8d0e4aa0974669d190fa2f90aa50227160594dfb55755002365441de17ea42902128a6f81e554177ed509c0cec31fd5053fae03f62ff76579ba92bda\n\n# tcId = 323\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 3081880242011094ac23ca46a3e2b4ac3baae6504f1bfb3ddf2db9ab40eda32d8e0a05727998f8552a033bb05241e826a86a1d03014eae3aa5fe1a45caac1db3e8138b9cf5906802420147edb15a5080ee2f929f78b6ac86604aae51b674fa46eaae7fdfd90bf64d6189341155f4eba937eae74c9e480eb4fb7e6aafd4285e7fc503ee6ec20f0b1415be06\n\n# tcId = 324\n# x-coordinate of the public key is small\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201d876ae174da31e128babff9f1d15507660bdc7958750844dc4f4291f75a882a22f177f704be6067bf7ce8f06b8626d971e6ef5dcb666fa975c1e11126e04fccce2024201abb12630a68b669e6ad2d8d62654d75dfbc6b54a8e3a9c915be663e080ddcc348e57a10e2b1dd9f03e1b897796ad889b075e5919dc5bf37a112d92c693456e6457\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 1fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca63331]\n[key.wy = 1b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6]\n[sha = SHA-512]\n\n# tcId = 325\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 30818602414ed692af1ed1b4bd5cea3aa8ddc6f3f15d8a6ee0016fa0e8eb958580e7421832ecc0e387c34aafac6380bac419ea45c42ae6426af503847f22c49c2f456338c1a702417aceadde02ace1668bc1a3360d34e125afde230f536c154d91e6c876bee1d34ae06edcbbca0c7cd17646840913164740b12e2e224fe3ef3dec6fd84a81b581c188\n\n# tcId = 326\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 308188024200e01094048fcf7a1e2ec66faedffc40f48c9c93514325bde6b4958d80f0413efde7eec1dc6de65f96009c069397e51da2eb1729efa287afd5552b25a9e427a6d836024201489e7e124f66942e642de992e60b3a86fcce576767719390c3a312fcdeaa560a7fbb0cabb35e05a6d6f3499160fd2dba12d29b613b16dec7494c950d65fdf11fa3\n\n# tcId = 327\n# x-coordinate of the public key is large\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201d296292213380de133dc66eceb8bd857a5c468afe855c05da9db937373b51f9020ca11353415da76bb6af997a486d2370e31adcc0a4531952a3b59428678ee59430242015979a3c609c2c2099ae1b290da3d613b248e3a10de7ad770dffc82fb33e74fc3207533f97285cf4557a6407e9a775e59efeaee4264b2634933a6baf8c406f0c4a9\n\n[key.curve = secp521r1]\n[key.keySize = 521]\n[key.type = ECPublicKey]\n[key.wx = 0c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd491349]\n[key.wy = 08bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff]\n[keyDer = 30819b301006072a8648ce3d020106052b81040023038186000400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff]\n[sha = SHA-512]\n\n# tcId = 328\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201ef8f785c51a25ae2cd93487b5c848d4af133217a91f513",
+    "59c966e7538e68743578122df5830002f96f6fadb5bc44480e3b3b2c804e4c51cf95d059d5646c5cef21024201ba2276cc003e87bea37c3724e58a0ab885f56d09b8b5718f674f9c70f3b5ecfb4ad1f3417b420ec40810e08826efa7d8ad6ca7c6a7840348097f92b2de8d6e080b\n\n# tcId = 329\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 30818802420155978adc4b570d897511f5ecfb65a31947e6e989da17dea716625bb3fa7b92b853623eb0cd9ce2a5e2b4d8c1c2a90ec04fe79d012576ec728a45c5ce47c6d500c0024200f79fa8b94ee282a3d1815892cbf15d7ebdf62cb042c76bb3c710c23e32b75992cc249d84072198e4ed63d72435a07d2ed76f278d7399f61a5b5c997f45692fed22\n\n# tcId = 330\n# y-coordinate of the public key has many trailing 1's\nmsg = 4d657373616765\nresult = valid\nsig = 308188024201a2af29c58184ca861e7cd931f39cea064b199eee563f241cd5ecf6ebb2ade728f1be23cf007ebe8ef0c42d99f9f5190f6815446afc3043a820d7daf27e86b83b8a024201a2acd1822eb539383defff8769aad8bacd50cd24ca7aa6670671418110177808c3f4fbe6041b9cb898359ee61e04824adedd62b39fe5791907a20586333bd3c76d\n\n",
+};
+static const size_t kLen64 = 164842;
+
+static const char *kData65[] = {
+    "# Imported from Wycheproof's eddsa_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: EDDSA\n# Generator version: 0.4\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa]\n[key.sk = add4bb8103785baf9ac534258e8aaf65f5f1adb5ef5f3df19bb80ab989c4d64b]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321007d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa]\n\n# tcId = 1\nmsg = \nresult = valid\nsig = d4fbdb52bfa726b44d1786a8c0d171c3e62ca83c9e5bbe63de0bb2483f8fd6cc1429ab72cafc41ab56af02ff8fcc43b99bfe4c7ae940f60f38ebaa9d311c4007\n\n# tcId = 2\nmsg = 78\nresult = valid\nsig = d80737358ede548acb173ef7e0399f83392fe8125b2ce877de7975d8b726ef5b1e76632280ee38afad12125ea44b961bf92f1178c9fa819d020869975bcbe109\n\n# tcId = 3\nmsg = 54657374\nresult = valid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d\n\n# tcId = 4\nmsg = 48656c6c6f\nresult = valid\nsig = 1c1ad976cbaae3b31dee07971cf92c928ce2091a85f5899f5e11ecec90fc9f8e93df18c5037ec9b29c07195ad284e63d548cd0a6fe358cc775bd6c1608d2c905\n\n# tcId = 5\nmsg = 313233343030\nresult = valid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bf0cf5b3a289976458a1be6277a5055545253b45b07dcc1abd96c8b989c00f301\n\n# tcId = 6\nmsg = 000000000000000000000000\nresult = valid\nsig = d46543bfb892f84ec124dcdfc847034c19363bf3fc2fa89b1267833a14856e52e60736918783f950b6f1dd8d40dc343247cd43ce054c2d68ef974f7ed0f3c60f\n\n# tcId = 7\nmsg = 6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\nresult = valid\nsig = 879350045543bc14ed2c08939b68c30d22251d83e018cacbaf0c9d7a48db577e80bdf76ce99e5926762bc13b7b3483260a5ef63d07e34b58eb9c14621ac92f00\n\n# tcId = 8\nmsg = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60\nresult = valid\nsig = 7bdc3f9919a05f1d5db4a3ada896094f6871c1f37afc75db82ec3147d84d6f237b7e5ecc26b59cfea0c7eaf1052dc427b0f724615be9c3d3e01356c65b9b5109\n\n# tcId = 9\nmsg = ffffffffffffffffffffffffffffffff\nresult = valid\nsig = 5dbd7360e55aa38e855d6ad48c34bd35b7871628508906861a7c4776765ed7d1e13d910faabd689ec8618b78295c8ab8f0e19c8b4b43eb8685778499e943ae04\n\n# tcId = 10\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 11\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 12\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 13\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 14\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 15\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 16\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 01000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 17\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0100000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 18\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0100000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 19\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = 0100000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 20\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 21\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100100000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 22\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 23\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 24\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 25\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 26\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0100000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 27\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 28\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010\n\n# tcId = 29\n# special values for r and s\nmsg = 3f\nresult = invalid\nsig = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 30\n# empty signature\nmsg = 54657374\nresult = invalid\nsig = \n\n# tcId = 31\n# s missing\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0\n\n# tcId = 32\n# signature too short\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946\n\n# tcId = 33\n# signature too long\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d2020\n\n# tcId = 34\n# include pk in signature\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa\n\n# tcId = 35\n# prepending 0 byte to signature\nmsg = 54657374\nresult = invalid\nsig = 007c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d\n\n# tcId = 36\n# prepending 0 byte to s\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0007a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d\n\n# tcId = 37\n# appending 0 byte to signature\nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d00\n\n# tcId = 38\n# removing 0 byte from signature\nmsg = 54657374313236\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab09155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d\n\n# tcId = 39\n# removing 0 byte from signature\nmsg",
+    " = 546573743137\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b3\n\n# tcId = 40\n# modified bit 0 in R\nmsg = 313233343030\nresult = invalid\nsig = 647c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b1d125e5538f38afbcc1c84e489521083041d24bc6240767029da063271a1ff0c\n\n# tcId = 41\n# modified bit 1 in R\nmsg = 313233343030\nresult = invalid\nsig = 677c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bc108ca4b87a49c9ed2cf383aecad8f54a962b2899da891e12004d7993a627e01\n\n# tcId = 42\n# modified bit 2 in R\nmsg = 313233343030\nresult = invalid\nsig = 617c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b9ce23fc6213ed5b87912e9bbf92f5e2c780eae26d15c50a112d1e97d2ea33c06\n\n# tcId = 43\n# modified bit 7 in R\nmsg = 313233343030\nresult = invalid\nsig = e57c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bbb3eb51cd98dddb235a5f46f2bded6af184a58d09cce928bda43f41d69118a03\n\n# tcId = 44\n# modified bit 8 in R\nmsg = 313233343030\nresult = invalid\nsig = 657d1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcd237dda9a116501f67a5705a854b9adc304f34720803a91b324f2c13e0f5a09\n\n# tcId = 45\n# modified bit 16 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1592402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b6b167bbdc0d881cc04d28905552c1876f3709851abc5007376940cc8a435c300\n\n# tcId = 46\n# modified bit 31 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1412402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7fd2ac7da14afffcceeb13f2a0d6b887941cb1a5eb57a52f3cb131a16cce7b0e\n\n# tcId = 47\n# modified bit 32 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492412ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7373ba13ebbef99cd2a8ead55ce735c987d85a35320925a8e871702dc7c5c40d\n\n# tcId = 48\n# modified bit 63 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab54e03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bd35bd331c03f0855504ca1cab87b83c36a028425a3cf007ede4f4254c261cb00\n\n# tcId = 49\n# modified bit 64 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce02e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcb35101f73cf467deac8c1a03b6c3dc35af544132734b7e57ab20c89b2e4750d\n\n# tcId = 50\n# modified bit 97 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f2384d051b9cf3570f1207fc78c1bcc98c281c2bb58d2e8878290bff8d3355fdd4ea381924ee578752354eb6dee678ab4011c301\n\n# tcId = 51\n# modified bit 127 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d851b9cf3570f1207fc78c1bcc98c281c2bb978c866187ffb1cc7b29a0b4045aefc08768df65717194ff0c6e63f4dea0d02\n\n# tcId = 52\n# modified bit 240 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281d2b0576ecf8eaf675f00f3dfbe19f75b83b7607a6c96414f6821af920a2498d0305\n\n# tcId = 53\n# modified bit 247 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c289c2be5241a345c7b5428054c74b7c382fa10d4a5f1e8f8b79a71d3fdea2254f1ff0e\n\n# tcId = 54\n# modified bit 248 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2a63950c85cd6dc96364e768de50ff7732b538f8a0b1615d799190ab600849230e\n\n# tcId = 55\n# modified bit 253 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c0b543bd3da0a56a8c9c152f59c9fec12f31fa66434d48b817b30d90cb4efa8b501\n\n# tcId = 56\n# modified bit 254 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c6b8da07efd07a6dafb015ed6a32fe136319a972ffbc341f3a0beae97ccf8136505\n\n# tcId = 57\n# modified bit 255 in R\nmsg = 313233343030\nresult = invalid\nsig = 657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281cab227aedf259f910f0f3a759a335062665217925d019173b88917eae294f75d40f\n\n# tcId = 58\n# R==0\nmsg = 313233343030\nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000e0b8e7770d51c7a36375d006c5bffd6af43ff54aaf47e4330dc118c71d61ec02\n\n# tcId = 59\n# invalid R\nmsg = 313233343030\nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff463a1908382e7eb7693acef9884f7cf931a215e0791876be22c631a59881fd0e\n\n# tcId = 60\n# all bits flipped in R\nmsg = 313233343030\nresult = invalid\nsig = 9a83eb6dbfd54a31fc1d3c580fc7b2fae4630ca8f0edf803873e433673d7e3d40e94254586cb6188c5386c3febed477cb9a6cb29e3979adc4cb27cf5278fb70a\n\n# tcId = 61\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab067654bce3832c2d76f8f6f5dafc08d9339d4eef676573336a5c51eb6f946b31d\n# EdDSA signatures are non-malleable, if implemented accordingly. Failing to\n# check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7\n# and Section 8.4.\n\n# tcId = 62\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab05439412b5395d42f462c67008eba6ca839d4eef676573336a5c51eb6f946b32d\n# EdDSA signatures are non-malleable, if implemented accordingly. Failing to\n# check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7\n# and Section 8.4.\n\n# tcId = 63\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab02ee12ce5875bf9dff26556464bae2ad239d4eef676573336a5c51eb6f946b34d\n# EdDSA signatures are non-malleable, if implemented accordingly. Failing to\n# check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7\n# and Section 8.4.\n\n# tcId = 64\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0e2300459f1e742404cd934d2c595a6253ad4eef676573336a5c51eb6f946b38d\n# EdDSA signatures are non-malleable, if implemented accordingly. Failing to\n# check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7\n# and Section 8.4.\n\n# tcId = 65\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b32d\n# EdDSA signatures are non-malleable, if implemented accordingly. Failing to\n# check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7\n# and Section 8.4.\n\n# tcId = 66\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b34d\n# EdDSA signatures are non-malleable, if implemented accordingly. Failing to\n# check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7\n# and Section 8.4.\n\n# tcId = 67\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d\n# EdDSA signatures are non-malleable, if implemented accordingly. Failing to\n# check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7\n# and Section 8.4.\n\n# tcId = 68\n# checking malleability \nmsg = 54657374\nresult = invalid\nsig = 7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0679155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d\n# EdDSA signatures are non-malleable, if implemented accordingly. Failing to\n# check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7\n# and Section 8.4.\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c]\n[key.sk = 0a23a20072891237aa0864b5765139514908787878cd77135a0059881d313f00]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c]\n\n# tcId = 69\nmsg = \nresult = valid\nsig = 5056325d2ab440bf30bbf0f7173199aa8b4e6fbc091cf3eb6bc6cf87cd73d992ffc216c85e4ab5b8a0bbc7e9a6e9f8d33b7f6e5ac0ffdc22d9fcaf784af84302\n\n# tcId = 70\nmsg = 78\nresult = valid\nsig = 481fafbf4364d7b682475282f517a3ac0538c9a6b6a562e99a3d8e5afb4f90a559b056b9f07af023905753b02d95eb329a35c77f154b79abbcd2",
+    "91615ce42f02\n\n# tcId = 71\nmsg = 54657374\nresult = valid\nsig = 8a9bb4c465a3863abc9fd0dd35d80bb28f7d33d37d74679802d63f82b20da114b8d765a1206b3e9ad7cf2b2d8d778bb8651f1fa992db293c0039eacb6161480f\n\n# tcId = 72\nmsg = 48656c6c6f\nresult = valid\nsig = d839c20abfda1fd429531831c64f813f84b913e9928540310cf060b44c3dbf9457d44a7721fdc0d67724ff81cb450dd39b10cfb65db15dda4b8bf09d26bd3801\n\n# tcId = 73\nmsg = 313233343030\nresult = valid\nsig = 9bbb1052dcfa8ad2715c2eb716ae4f1902dea353d42ee09fd4c0b4fcb8b52b5219e2200016e1199d0061891c263e31b0bc3b55673c19610c4e0fa5408004160b\n\n# tcId = 74\nmsg = 000000000000000000000000\nresult = valid\nsig = f63b5c0667c7897fc283296416f7f60e84bbde9cbd832e56be463ed9f568069702b17a2f7c341ebf590706a6388ac76ac613c1675ec0f2c7118f2573422a500b\n\n# tcId = 75\nmsg = 6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161\nresult = valid\nsig = 1bc44d7001e6b5b9090fef34b2ca480f9786bbefa7d279353e5881e8dfb91b803ccd46500e270ef0109bfd741037558832120bc2a4f20fbe7b5fb3c3aaf23e08\n\n# tcId = 76\nmsg = 202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60\nresult = valid\nsig = ea8e22143b02372e76e99aece3ed36aec529768a27e2bb49bdc135d44378061e1f62d1ac518f33ebf37b2ee8cc6dde68a4bd7d4a2f4d6cb77f015f71ca9fc30d\n\n# tcId = 77\nmsg = ffffffffffffffffffffffffffffffff\nresult = valid\nsig = 8acd679e1a914fc45d5fa83d3021f0509c805c8d271df54e52f43cfbd00cb6222bf81d58fe1de2de378df67ee9f453786626961fe50a9b05f12b6f0899ebdd0a\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a]\n[key.sk = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a]\n\n# tcId = 78\n# draft-josefsson-eddsa-ed25519-02: Test 1\nmsg = \nresult = valid\nsig = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c]\n[key.sk = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321003d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c]\n\n# tcId = 79\n# draft-josefsson-eddsa-ed25519-02: Test 2\nmsg = 72\nresult = valid\nsig = 92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025]\n[key.sk = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025]\n\n# tcId = 80\n# draft-josefsson-eddsa-ed25519-02: Test 3\nmsg = af82\nresult = valid\nsig = 6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e]\n[key.sk = f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e]\n\n# tcId = 81\n# draft-josefsson-eddsa-ed25519-02: Test 1024\nmsg = 08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0\nresult = valid\nsig = 0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 8fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a]\n[key.sk = d7ad3f1f6bbe0477c3c357a806a19eb41ae3f94025035bc87f281f8ee9fc0e34]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321008fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a]\n\n# tcId = 82\n# Random test failure 1\nmsg = b0729a713593a92e46b56eaa66b9e435f7a09a8e7de03b078f6f282285276635f301e7aaafe42187c45d6f5b13f9f16b11195cc125c05b90d24dfe4c\nresult = valid\nsig = 7db17557ac470c0eda4eedaabce99197ab62565653cf911f632ee8be0e5ffcfc88fb94276b42e0798fd3aa2f0318be7fc6a29fae75f70c3dcdc414a0ad866601\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 2a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082]\n[key.sk = ad9b22793336fcdac10e136c4deea599be187a38eef91c1cf7c7a4ec884dda08]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321002a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082]\n\n# tcId = 83\n# Random test failure 2\nmsg = a8546e50ba31cae3234310d32672447be213fad91a227a19669c53d309b959782b0e6b71f8791fdb470043b58122003157d2d96a43a6cbd7d3a8d86bf4c97391883e268d50af80e1e6e12939c2bd50ca746cdadfad4edf1bda875299740724148efb1ebe73fb60088cda890317658627a5f7ab5a0c075d9d8f3f97b6492b35519e50ff6b38377432a7081f9176bb1c29a862deac1336ca20b097a47829cec10a6a7cec178eda2d12f6dc6c87f910454af0123555ba184e68804d9cced60fd5c8c90943e56599c8f0ba59a38491ba5e5a53460682474c07e40ca142983314fd762856bb1093f359da6eb0a756bd93a3160c10dd8feea6b97e7c6a17cb54bd5d7649c05c66d7bdee056671dfdaf689fa3945bb8e29a429f4bd5d355dce9687b06f01d5e33e3999f0e8\nresult = valid\nsig = 67d84d4c3945aaf06e06d524be63acbfb5dbb1988c4aea96a5ee9f7a9b9eecc29df4f66b8aa1d9e8607a58fb1ef0c2ad69aac005b4f58e34103344a9c8871a09\n\n# tcId = 84\n# Random test failure 24\nmsg = b477b0480bb84642608b908d29a51cf2fce63f24ee95\nresult = valid\nsig = 28fafbb62b4d688fa79e1ac92851f46e319b161f801d4dc09acc21fdd6780a2c4292b8c1003c61c2bcebe7f3f88ccc4bb26d407387c5f27cb8c94cf6ce810405\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051]\n[key.sk = 04a6553d68a9baef78a2175af375458eaa01cdb77350c61e282ef5f0c7116599]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051]\n\n# tcId = 85\n# Random test failure 3\nmsg = cd2212eddb0706f62c995cef958634f0cb7793444cbf4d30e81c27c41ebea6cb02607510",
+    "131f9c015692dfd521b148841e9a2d3564d20ac401f6cb8e40f520fe0cafbeaa88840b83013369d879f013463fe52a13267aa0c8c59c45cde9399cd1e6be8cc64cf48315ac2eb31a1c567a4fb7d601746d1f63b5ac020712adbbe07519bded6f\nresult = valid\nsig = 24087d47f3e20af51b9668ae0a88ce76586802d0ec75d8c0f28fc30962b5e1d1a1d509571a1624ed125a8df92a6e963728d6b5de99200b8e285f70feb6f05207\n\n# tcId = 86\n# Random test failure 20\nmsg = 27d465bc632743522aefa23c\nresult = valid\nsig = c2656951e2a0285585a51ff0eda7e9a23c2dfd2ffa273aee7808f4604e8f9a8c8ea49e9fce4eb2d8d75d36b7238fe6fc13b6c5d9427dd58f8c6615d033c0bd0f\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e]\n[key.sk = c367c8d2ebeeecd70c1e8985b70c3808b75657f243b21ba4f322792540e92257]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b657003210032ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e]\n\n# tcId = 87\n# Random test failure 4\nmsg = ec5c7cb078\nresult = valid\nsig = d920d421a5956b69bfe1ba834c025e2babb6c7a6d78c97de1d9bb1116dfdd1185147b2887e34e15578172e150774275ea2aad9e02106f7e8ca1caa669a066f0c\n\n# tcId = 88\n# Random test failure 5\nmsg = 4668c6a76f0e482190a7175b9f3806a5fe4314a004fa69f988373f7a\nresult = valid\nsig = 4f62daf7f7c162038552ad7d306e195baa37ecf6ca7604142679d7d1128e1f8af52e4cb3545748c44ef1ff1c64e877e4f4d248259b7f6eb56e3ef72097dc8e0c\n\n# tcId = 89\n# Random test failure 8\nmsg = 5dc9bb87eb11621a93f92abe53515697d2611b2eef73\nresult = valid\nsig = deecafb6f2ede73fec91a6f10e45b9c1c61c4b9bfbe6b6147e2de0b1df6938971f7896c3ab83851fb5d9e537037bff0fca0ccb4a3cc38f056f91f7d7a0557e08\n\n# tcId = 90\n# Random test failure 10\nmsg = 7dcfe60f881e1285676f35b68a1b2dbcdd7be6f719a288ababc28d36e3a42ac3010a1ca54b32760e74\nresult = valid\nsig = 7f8663cf98cbd39d5ff553f00bcf3d0d520605794f8866ce75714d77cc51e66c91818b657d7b0dae430a68353506edc4a714c345f5ddb5c8b958ba3d035f7a01\n\n# tcId = 91\n# Random test failure 12\nmsg = 58e456064dff471109def4ca27fa8310a1df32739655b624f27e6418d34b7f007173f3faa5\nresult = valid\nsig = 6aab49e5c0bc309b783378ee03ffda282f0185cdf94c847701ff307a6ee8d0865411c44e0a8206f6a5f606107451940c2593af790ce1860f4c14ab25b2deae08\n\n# tcId = 92\n# Random test failure 15\nmsg = a1\nresult = valid\nsig = 1a74ed2cbdc7d8f3827014e8e6ecf8fd2698ac8f86833acccdd400df710fe0d6b0543c9cfa00d52bf024ab7ce0d91981944097233ec134d5c7abbd44bfd32d0d\n\n# tcId = 93\n# Random test failure 19\nmsg = 11cb1eafa4c42a8402c4193c4696f7b2e6d4585e4b42dcf1a8b67a80b2da80bc9d4b649fb2f35eaf1f56c426fd0b\nresult = valid\nsig = 14ceb2eaf4688d995d482f44852d71ad878cd7c77b41e60b0065fd01a59b054ee74759224187dbde9e59a763a70277c960892ef89fba997aba2576b2c54ba608\n\n# tcId = 94\n# Random test failure 25\nmsg = aa365b442d12b7f3c925\nresult = valid\nsig = 83c40ce13d483cc58ff65844875862d93df4bd367af77efa469ec06a8ed9e6d7905a04879535708ddf225567a815c9b941d405c98e918fd0c151165cea7fb101\n\n# tcId = 95\n# Random test failure 28\nmsg = 475f\nresult = valid\nsig = 71a4a06a34075f2fd47bc3abf4714d46db7e97b08cb6180d3f1539ac50b18ce51f8af8ae95ed21d4fa0daab7235925631ecea1fd9d0d8a2ba7a7583fd04b900c\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a]\n[key.sk = 56c1e22d616cbb6dea869288b4b1c02bb98696583c2f6e650013a03e17049c62]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a]\n\n# tcId = 96\n# Random test failure 6\nmsg = 0f325ffd87e58131ffa23c05ea4579513b287fdba87b44\nresult = valid\nsig = 6669acf94667c5b541afe5307bde9476b13ae7e0e6058a772101ac8eb0a94331428eb4db0a2c68a9b6c1763b8624dab259b0876cdcfaeacc17b21a18e3fc010a\n\n# tcId = 97\n# Random test failure 21\nmsg = 5ffa\nresult = valid\nsig = 931e5152fcef078c22cc5d6a3a65f06e396289f6f5f2d1efa6340254a53526ef5dc6874eeddf35c3f50991c53cd02bf06313e37d93ee1f7022128ffa3b8f300b\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10]\n[key.sk = b7d2f64276df417fed27d8e15b4e90f6fd93dace707294c338bd32bc4bbd8fdb]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10]\n\n# tcId = 98\n# Random test failure 7\nmsg = ec5c7cb078\nresult = valid\nsig = 30490c28f806298225df62103521dcee047153912c33ab8ab8bbdd1ffabd70fd4fdb360f05be535b067d1cf4e78c2cb432206bf280aab3bd21aaa1cb894c5b06\n\n# tcId = 99\n# Random test failure 9\nmsg = 67484059b2490b1a0a4f8dee77979e26\nresult = valid\nsig = 4cd4f77ed473a6647387f3163541c67a1708a3c3bd1673247cb87f0cb68b3c56f04bfa72970c8a483efe659c87009ab4020b590b6641316b3deddb5450544e02\n\n# tcId = 100\n# Random test failure 11\nmsg = a020a4381dc9141f47ee508871ab7a8b5a3648727c4281ae9932376f23a8e1bcda0626b7129197d864178631ec89c4332dbb18\nresult = valid\nsig = 1e41a24fe732bd7cab14c2a2f5134ee8c87fcbd2e987e60957ed9239e5c32404d56977e1b4282871896cb10625a1937468e4dc266e16a9c1b8e9891177eca802\n\n# tcId = 101\n# Random test failure 14\nmsg = a25176b3afea318b2ec11ddacb10caf7179c0b3f8eabbfa2895581138d3c1e0e\nresult = valid\nsig = 2a833aadecd9f28235cb5896bf3781521dc71f28af2e91dbe1735a61dce3e31ac15ca24b3fc47817a59d386bbbb2ce60a6adc0a2703bb2bdea8f70f91051f706\n\n# tcId = 102\n# Random test failure 18\nmsg = a9e6d94870a67a9fe1cf13b1e6f9150cdd407bf6480ec841ea586ae3935e9787163cf419c1\nresult = valid\nsig = c97e3190f83bae7729ba473ad46b420b8aad735f0808ea42c0f898ccfe6addd4fd9d9fa3355d5e67ee21ab7e1f805cd07f1fce980e307f4d7ad36cc924eef00c\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56]\n[key.sk = 7d597c3b7283929d07ed8f01f31d2596823e5e46ab226c7be4234d1a9dcaef37]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56]\n\n# tcId = 103\n# Random test failure 13\nmsg = e1cbf2d86827825613fb7a85811d\nresult = valid\nsig = 01abfa4d6bbc726b196928ec84fd03f0c953a4fa2b228249562ff1442a4f63a7150b064f3712b51c2af768d2c2711a71aabf8d186833e941a0301b82f0502905\n\n# tcId = 104\n# Random test failure 22\nmsg = 25\nresult = valid\nsig = e4ae21f7a8f4b3b325c161a8c6e53e2edd7005b9c2f8a2e3b0ac4ba94aa80be6f2ee22ac8d4a96b9a3eb73a825e7bb5aff4a3393bf5b4a38119e9c9b1b041106\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 2252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1]\n[key.sk = f401cee4bfb1732f0e9b8d8ba79469565c3115296141dbdf7e9c311a0ac1823b]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321002252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1]\n\n# tcId = 105\n# Random test failure 16\nmsg = 975ef941710071a9e1e6325a0c860becd7c695b5117c3107b686e330e5\nresult = valid\nsig = af0fd9dda7e03e12313410d8d8844ebb6fe6b7f65141f22d7bcba5695a25414a9e54326fb44d59fb14707899a8aae70857b23d4080d7ab2c396ef3a36d45ce02\n\n# tcId = 106\n# Random test failure 23\nmsg = 80fdd6218f29c8c8f6bd820945f9b0854e3a8824\nresult = valid\nsig = e097e0bd0370bff5bde359175a11b728ee9639095d5df8eda496395565616edfe079977f7d4dc8c75d6113a83d6a55e6e1676408c0967a2906339b43337dcb01\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = c0a773110f975de3732355bb7ec7f0c41c091c0252966070205516693b992a4a]\n[key.sk = 3d658956410377d0644676d2599542412a4f3b0e4eadfb7f3f836615f42b18bc]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b6570032100c0a773110f975de3732355bb7ec7f0c41c091c0252966070205516693b992a4a]\n\n# tcId = 107\n# Random test failure 17\nmsg = \nresult = valid\nsig = 0280427e713378f49d478df6373c6cac847b622b567daa2376c839e7ac10e22c380ab0fa8617c9dcfe76c4d9db5459b21dc1413726e46cc8f387d359e344f407\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 54cda623245759ad6d43e620a606908befc633d60792bc7798447a0ef38e7311]\n[key.sk = bccb61323840c2a96fc36f7e54ea6c8e55f9d221f7f05791ed60025e06064439]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b657003210054cda623245759ad6d43e620a606908befc633d60792bc7798447a0ef38e7311]\n\n# tcId = 108\n# Random test failure 26\nmsg = 27e792b28b2f1702\nresult = valid\nsig = 14d9b497c19b91d43481c55bb6f5056de252d9ecb637575c807e58e9b4c5eac8b284089d97e2192dc242014363208e2c9a3435edf8928fb1d893553e9be4c703\n\n[key.curve = edwards25519]\n[key.keySize = 255]\n[key.pk = 2362bac514d5fad33802642e979a1e82de6eb6f1bcbf6a5b304f2bb02b9e57fe]\n[key.sk = f2d3023b9c19e241748bc4039a7a43c595701f23675505015213a8a2a0274",
+    "c1b]\n[key.type = EDDSAKeyPair]\n[keyDer = 302a300506032b65700321002362bac514d5fad33802642e979a1e82de6eb6f1bcbf6a5b304f2bb02b9e57fe]\n\n# tcId = 109\n# Random test failure 27\nmsg = eef3bb0f617c17d0420c115c21c28e3762edc7b7fb048529b84a9c2bc6\nresult = valid\nsig = 242ddb3a5d938d07af690b1b0ef0fa75842c5f9549bf39c8750f75614c712e7cbaf2e37cc0799db38b858d41aec5b9dd2fca6a3c8e082c10408e2cf3932b9d08\n\n",
+};
+static const size_t kLen65 = 33154;
+
+static const char *kData66[] = {
+    "# Imported from Wycheproof's rsa_signature_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: RSASig\n# Generator version: 0.4\n\n[e = 10001]\n[keyAsn = 30818902818100ab9014dc47d44b6d260fc1fef9ab022042fd9566e9d7b60c54100cb6e1d4edc98590467d0502c17fce69d00ac5efb40b2cb167d8a44ab93d73c4d0f109fb5a26c2f8823236ff517cf84412e173679cfae42e043b6fec81f9d984b562517e6febe1f72295dbc3fdfc19d3240aa75515563f31dad83563f3a315acf9a0b351a23f0203010001]\n[keyDer = 30819f300d06092a864886f70d010101050003818d0030818902818100ab9014dc47d44b6d260fc1fef9ab022042fd9566e9d7b60c54100cb6e1d4edc98590467d0502c17fce69d00ac5efb40b2cb167d8a44ab93d73c4d0f109fb5a26c2f8823236ff517cf84412e173679cfae42e043b6fec81f9d984b562517e6febe1f72295dbc3fdfc19d3240aa75515563f31dad83563f3a315acf9a0b351a23f0203010001]\n[keysize = 1024]\n[n = 0ab9014dc47d44b6d260fc1fef9ab022042fd9566e9d7b60c54100cb6e1d4edc98590467d0502c17fce69d00ac5efb40b2cb167d8a44ab93d73c4d0f109fb5a26c2f8823236ff517cf84412e173679cfae42e043b6fec81f9d984b562517e6febe1f72295dbc3fdfc19d3240aa75515563f31dad83563f3a315acf9a0b351a23f]\n[sha = SHA-256]\n\n# tcId = 1\n# Legacy:missing NULL\nmsg = 54657374\npadding = 302f300b06096086480165030402010420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = acceptable\nsig = 253e1d19bbe91064f2364c1e7db3ba8eb6dc5b19202e440eab6fbdf28c8c6ec05b812983713c338c72b6e99b8edf506a89ff9fc8e5c2c52362097a56dc228060eca01e1ff318c6c81617691438703411c1f953b21cd74331f87c9b8b189fdffdfe8550bd2bd1d47be915f8604a0f472199dd705e19b1b815f99b68d60bc257c7\n# Some legacy implementation of RSA PKCS#1 signatures did omit the parameter\n# field instead of using an ASN NULL. Some libraries still accept these legacy\n# signatures. This test vector contains such a legacy signature\n\n# tcId = 2\n# valid\nmsg = 54657374\npadding = 3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = valid\nsig = 68ea71ee1911687eb54b3d19cedcfd44719d0b24accccc59bdafd84e4eba48ef0be7f115e7073f9f273286a7dcee3b94cdbe208e30ae496987479d3aa12ab0e12685ab592d7693a494e6ad27d526ed3ab5912c7f81e09983931794c2165c22fd859e0f9af1a93a4dfe144098c562731e6059d236b52cb865996c87a9baf7f103\n\n# tcId = 3\n# long form encoding of length\nmsg = 54657374\npadding = 308131300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 52f46d508e31f030b17c537888585f919037562e15f1924543601a41f9b701ee416ad73d6576b4eaaa64e685289dc478751dfe2d7e588252bfe2d43f4b3a31c6c6c39a9df884a2fc2e45f09c2150a830974b1c9d26090830b37bf06f1d57be1da34ebb016e9db7ce2c34e94872c89567ff6f2ab35a1a9fb6632e100c7d7af834\n\n# tcId = 4\n# long form encoding of length\nmsg = 54657374\npadding = 303230810d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3f34017b3172aaeec72d208308e9b83150699f86634b948847eab56f0169fef51b5636a96866f4f0f4c649400489e047803a91f2b2f32ab715065e20770c4e2788946b85aca5c90efdd6a9458dd9b6f797f96a3de88d2e4896afe147d8c0389943828100061903a30eaff1dadd98d3e49dba56cdcfa5f215d9c615f974f4a0bc\n\n# tcId = 5\n# long form encoding of length\nmsg = 54657374\npadding = 3032300e06810960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1478337676aa47ca72ea7557facff06f6c777f56063f4487d345e43dc56a6bc5f8a891085d53a32c9d1c3cf7f469e7f56847b0b1b9b5b784526078271f21d0550afc40f81e2b8e8dec851d87511cace965edceb83cb96c8d6616e1ee75bb22c54412fc942a6f71c9fc609a31a69d34b774a97c1ba4f85cca28d9993db8543f75\n\n# tcId = 6\n# long form encoding of length\nmsg = 54657374\npadding = 3032300e06096086480165030402010581000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 77ba423e600bdd761ed10e7c00698a87fe1322f5f42b2902a0be7a24b1cf44f613fa55edeb2ded0475f8e1a13e5368f9a2bfc4f2f926ef289a2207bf3689fc1c8ec3e5463064a7f51bbc993966cc4016319b7c95f282372f1ff848d7fca753a81d905b3341b0fbf60ba186e750f3171cfc84288eff8742bda432bd6c8dc04f9f\n\n# tcId = 7\n# long form encoding of length\nmsg = 54657374\npadding = 3032300d06096086480165030402010500048120532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9460ee79bb990bc3fe28cfca92363e6ff6900e3b61b3a402f06024a72b7a65d62094b4419e93900995eb121327f72b26b139bab3e5e2bd0c82e0cf6357f3b16f1c1dd4407a9a820f20e3baaa2259614d9ee3e015e1c1778befa13aff1e545ea1758cba4713631d63180a91b52df394294441642964a024f45b2251c90e002ec0\n\n# tcId = 8\n# length contains leading 0\nmsg = 54657374\npadding = 30820031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 96ac043d3cada45aed0dbdc4662dcf7855553a5effa1077048b51c7e9bfff7c2bb3486ea42894d4b4afb26a3b3bd32cb68d5c4d8ca2622f50d8c56fdc25baf83b9909ecb096419ddc13578dcc8121007f7204ee82c517ae03de70fa23ef2390602029a0cbc8a96c5b781d857dbf12802aa561f5f41ea35aa0babb91b9f891762\n\n# tcId = 9\n# length contains leading 0\nmsg = 54657374\npadding = 30333082000d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 2a70643572a7cda975d9e2c0827837e60eaa78c297b1ff75b84f654a91fe33294ccbeda52676ece50fcc03018151e66c24940bd0574ab85a6599231d587f4a6e0ae841cb6696e7dcfd182cb75001304e36887bc4fe3b373828f8b0e62ac2300a626c9e6a2cd05bb7910e74da2978dae1948f855b3b455cd30367160e21581cab\n\n# tcId = 10\n# length contains leading 0\nmsg = 54657374\npadding = 3033300f0682000960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 27778e39b45dee1e7003f1d315d3466fc111791187ddc056784c158df92097e123021e11918b6df8d905304db732e83d904bc914271b03def4ee129c3fc8adcc4f81b690e09e70e46c8b920093f304e64ecb7358740e976d28538a9eecf09ec1e1cd47df9107968207b21538cabe076bcc07c3862c46a793fcf638c70a972885\n\n# tcId = 11\n# length contains leading 0\nmsg = 54657374\npadding = 3033300f0609608648016503040201058200000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3a879e9f883b158908014f3617cae3315d47afdadd30840494f68d91c04dfe81bd16a40c7d21238cd1816928d989a232a3492325ab0f95d4426e3fb7d58c9908191dc557d8779dabb282287b7860c30e0796283428e0276447235809882ee990deb0f4312c01e7ddf0690406eeacb660acc6957bb670904cfd8d04df5e3ebda2\n\n# tcId = 12\n# length contains leading 0\nmsg = 54657374\npadding = 3033300d0609608648016503040201050004820020532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 2b82155f363a3b283ae455f59e41c29dec2fbd8c7438b0e347aec5b38c7c895cb7d326870e4fbdb935fcbb561f223bd926dbe8b95ef5eaab27920dbe30c641e99f526a9bc356af54198b459b59383135a82cd5b6edab7da0b1a51d939b2f9951e1432d637c4f04a3546ed9c890143ae364602b94eabdaa2a45e4bdf0b5bdfa71\n\n# tcId = 13\n# wrong length\nmsg = 54657374\npadding = 3032300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1dda56dc953aeee7fd76ae7166d92ab9e3d1d9759e76f8f1d7634a73cbf69e39d8249153d7c2d83c9664db13552f0c78df34b8a67e7b6c10bcc61b5ead7ba62ce0ec7ba8ac78d146f7e4cadee6f6250e0bc3100660e7afbe3afa17fa288d97549b4c8cacc00ac5c942673485739f89c9e5e63ad2be97a8f2313f5c5b095e7542\n\n# tcId = 14\n# wrong length\nmsg = 54657374\npadding = 3030300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 692c143b82196a391a3546607336e6f3bc047412645cf0def0d62d1b42234c14da138bb7f451b45073bbda2aba23412e83bc40d4e7de3e0684f2cad7d059f2d6831aa3d2ece4964ca75cd41dce23c5ba495c15345b36947b4b5a051fe1b84e148b5ae21f112d2245b1acbaeef9dc4a0c408829b9d2b1b5ab1d3a40af0a27b99e\n\n# tcId = 15\n# wrong length\nmsg = 54657374\npadding = 3031300e060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 66c31a45b2287425a20f65c3eba9cc58c370882f5fc62921935491fbd516df9baf9b28304a21d9008b61a92779ecfb3b0c03f6d74354f5159956e3fc1d35bd7376289378f05d7a71e05ab32794f2566a54635e8dc64740acbe10a293ceddbebe8499b520f406023a134eb9927ebb788b92488f036d109ec0a40ac52372e847b3\n\n# tcId = 16\n# wrong length\nmsg = 54657374\npadding = 3031300c060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nre",
+    "sult = invalid\nsig = 7b85536bdcda4ad3fc40129f2ff9dc85d9ec049913784064e7358686640446278a2006d93fb33429407597e5d8c783e3f7aee8a7791d69139f3c802a6547f01bf987415eec2447b0e8c4f3aee7ae2085d141fa34ca6634bc109dede93285d5c40cfcd98bd47ceb9cc1890dfff53b7ebb8038533580c7a67fe14c0c422e20cd64\n\n# tcId = 17\n# wrong length\nmsg = 54657374\npadding = 3031300d060a60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 5d77fba3cbb1905d83aa532fcc3227a95d7931bf0c2ab51f8118824de9dc029bd2470adf48b41c694ec7359d00a1336990c30ee368dd40bd681ba74794415d3997e7a756659397bf6abd44ca91c12a8580a3f5d1cdbc7f3be0c23c72334ce9b1419e6540dab73f5ff8ab57d0bbbe92b688bd3495f9344822b622042c2491bc41\n\n# tcId = 18\n# wrong length\nmsg = 54657374\npadding = 3031300d060860864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 7b5476fb78f389d1131764e7a13322f86008924c8c098f6d74f2df4dcc5a504cd786b3eaae33295cd1e87a2bbd1a06cb385674d465110a9a990d52de9a67f1c13ecaaa86383d489423c084fae9ecd2e9b109f4f04b8c013e3409128f3a079c068c1ad27bc2a20e76ad149325b7b0f0bd804a4e33949a98aac49076260702b0b0\n\n# tcId = 19\n# wrong length\nmsg = 54657374\npadding = 3031300d060960864801650304020105010420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6034e1253e4860a29096e392076794cfcea166a30b340cc09f77baa5952c06d148bd89b750c3112930ef210a50a7d3f6569da89912b5e50e824116e73a15536958f75779506d07e67ec9c0cd8de4b51dfbb0fe56926feed18ffbd83b0cdd50d56326c54adf97e629378ae5f0f02fcda3da1aa98cb1d1990946edec711a85a0d8\n\n# tcId = 20\n# wrong length\nmsg = 54657374\npadding = 3031300d060960864801650304020105000421532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a44cd265e1ecea83fc74e9eef746ef173277cc96f69a1798590ddee7ce5b5c34a82ad58a5c042db19005e04eec4159900ea764c0d008c52b94577d1c438661fb767902d9d1bbd6a90bdc4df685ec5951eac81d8b4dd36bceef7b6f919e85b6c994c7cf22a804f15cebe63b77f47b3bc2c2aaa68c6362c27a574b849efafe72e9\n\n# tcId = 21\n# wrong length\nmsg = 54657374\npadding = 3031300d06096086480165030402010500041f532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a160aa43f4873cada34bea5ccd2be9dce07940ee1c08eaad524a5019993bc753ce92cccada706b483f106ff20b327b35e7c83955ad3bbff3f26ced3489877d1b5bf285d61afcb30219c02a440da61030e301aadb901a525345d1a651a21c31a62ac9fb71738c3e215a8941ca9a3c4910679c5e774530c28788f6eddd7a31c024\n\n# tcId = 22\n# uint32 overflow in length\nmsg = 54657374\npadding = 30850100000031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1369c78f816a9baf027e255de0c258125be90f35b8daafee87f2ffef2d465e0694af4401cc5cdc7ca78b08d5688ceefbddc02abc5495d47c6829d696f8370ea427e7e0225eaf22cda720bbb5881edd16b19bbf2ca86654c65b4ad481c13fb38af00d77922f46b311f936c51f4610f6bdb514b366aa05f029c1e63e3cfcf9763d\n\n# tcId = 23\n# uint32 overflow in length\nmsg = 54657374\npadding = 30363085010000000d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 41d4c1ea43cb207af8bfc1552e31da7ca5744b68c4e00c3bf55f4edd4c81e91c01f44fa05290dbaa1fdcdcc775f6032a049b4965345c16aac6994b06cda9e0387dbff96cdb115e014f69bb057faca2f618c70a31edd0beaef7acdcc0fb7c83b2f07a8b9de48aa04b7c973920af5b8dc20aac343251ddf4c2277985c3db1dac2f\n\n# tcId = 24\n# uint32 overflow in length\nmsg = 54657374\npadding = 303630120685010000000960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 76bae6c330b9ab33aa9f2abe8559c51fb95f953a75e48053ab99078069214b509dd1b5080ac6819e32912619372d71a9ff1a67449dd699e5bc6ec0e18d1893dfb5bd571d933926d05b0d9fd7036ba4556e209369d1c57ec49cd9075e583c257c6fd4899c2a8bbb157547812cc692f264bf54712c71ee090b974d99b4d1629696\n\n# tcId = 25\n# uint32 overflow in length\nmsg = 54657374\npadding = 303630120609608648016503040201058501000000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3480a5c22f092f259b5bc4fdb9a33c044c24a645b57d61920effde1dc0bbfe53738023f16025841f9323b40f72c11091941bbdfaf7c2fbf77ad6626dbd6a3b7abb3ee916d96a922b11c86ce80ee67dec619bb98e9246d35a33b11b3a4e2a3a130e8b57ed4bcdd4b4e73aec3f9e3d50d3db5e29cffeb186846c72d09468d018ed\n\n# tcId = 26\n# uint32 overflow in length\nmsg = 54657374\npadding = 3036300d0609608648016503040201050004850100000020532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 5b3d3a198d4b36c6d9641db181fff59407a25bf1571f85e47bad1eaf138079872b93b9eb51aae09b48d6f4ef56badd96a6584277d8f3c6e4a4e11275f72021b50a1665ddaaa56a2a7caa7da6b4d502c5214e17042811154d411dd2197c250264bb69ba43adf668d4f7b81d932afa55e378214bb19ddeb431f702a91dd11e23bb\n\n# tcId = 27\n# uint64 overflow in length\nmsg = 54657374\npadding = 3089010000000000000031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1cc5577d04e34550e7f3d136064547efa30b9413e2c423b5a320eaaaf11cbebb91e13bbe3874e4650e057a8e38c8a366c473f35e0de82b22f846721a09e3f279ebdf54c8df395a9041333f09cb7bed5291bc1842857c4ce6ad5a1c2c476c1efddd5fe42824c25e0581aa7bb8f621d3b53566637c6266bb1bd0a5b7fb79c72616\n\n# tcId = 28\n# uint64 overflow in length\nmsg = 54657374\npadding = 303a308901000000000000000d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6e56d1746105344b34fb8299d173f4a5032cbce3556ca9d1eee35f8b31818efc121a1a9599c24fef8531243016dd6288d67b4bf9fdbf2c90fba5b1661be03531b5e15385ea465d1376010f0af761e8fb1afff7823dcef8dc100d97c192e9a7d03c82321d83fd8ecf67207c65cf182e1104ec5669536070cf1e3fe73c5e27edeb\n\n# tcId = 29\n# uint64 overflow in length\nmsg = 54657374\npadding = 303a3016068901000000000000000960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 37a413f9202591b8860cd9d68515ab522ae800e9a71793b479f1fb74ab8c9b07e72fe82dabe1189d028b813610e5e57c055af2d32837551fdb0cd93d7669a3c02a14c460f4c92136a4d11cfb7dcc76401bb5b699fbc64d302736d68c3591ecd59220107cd63f55c83edd38c4568e6f7749c0d9baebfb7c8ae1bf2179101745a9\n\n# tcId = 30\n# uint64 overflow in length\nmsg = 54657374\npadding = 303a3016060960864801650304020105890100000000000000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9fa8aac224bb50697103d457e7fc870853b23670ee5b8c7395d68ed82b30db18ae34a569abdcdf19238ffca8f5e435327dbe605bdc1a6dd3eaa3c2beb33f00642984a2034bf3b3e8de3ec7009e35069d5b27253c4aadcb4f163148e157252e3b9334abb6cf0299161c12908529f52de9416ec6218af7a6963fcc987c5024ea71\n\n# tcId = 31\n# uint64 overflow in length\nmsg = 54657374\npadding = 303a300d060960864801650304020105000489010000000000000020532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0f50bc6b1b94aeb6805dee51c92860693de47c4925ab90b57a46e0485a9afeed45083eade73bee684cd07048e632d1dd24aa2efc42c1f85e4fd7b7058dbeafb53a3d5b1cb1e7dded3352c3c92ded891839263a501afaa78fedfd04546c43d16f7a52b800abc9ab1ef827ae0eb19d9b52def2435f1477a48dff61800b4db830e4\n\n# tcId = 32\n# length = 2**31 - 1\nmsg = 54657374\npadding = 30847fffffff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9dcc651cc0a1b4d406112c0d1ebd7a9fb5a2c9d9f9cffbeab2d2821e5ed01efa9d191665794649bd1f588b729e8fba1eaa37a5a736a5863973c338a92b2665d6ead13b72a19d2da778febb94b150e8d750340a3b856fca8b3b6e3cbfecb9c397c23f46912ba546ab0f64ed88404ce317f8fb2278b68950e9712d6b11f5cdfcaa\n\n# tcId = 33\n# length = 2**31 - 1\nmsg = 54657374\npadding = 303530847fffffff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0397d14205c2f52423ef69c874294dc2b37d5be5d5647f7e83f1dd6783cb41cce52e6de1dc8c9e93ca1ef887d4c0ea79cd8b26391d638bbd8080bce830bf1bd7fb1de31346f28d609874fafd4a34fb7bee900441f55589ec3c5e190106d8816cadfcfb445834739cafaaa3903ed93cedc41a76aa0ce18fb49a3a73b7b5928735\n\n# tcId = 34\n# length = 2**31 - 1\nmsg = 54657374\npadding = 3035301106847fffffff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 2c3ffd881c1",
+    "c0ce2e4c98282d6011179a89b1e84b17072bcbbb64164e5e05410d0414a1fdbbc04564f3d80f3891f28c3f02e92bf97b4339b5bd4699614e236d4223cef0688c44b297eb9c0e22246b4cb28983b102a446dc76671206c3b77af6897f2f445512abda37bc9c37257dd4f1c6f0e6ec40929eb6b0058682b9d2f6c66\n\n# tcId = 35\n# length = 2**31 - 1\nmsg = 54657374\npadding = 30353011060960864801650304020105847fffffff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 668bd06eafe953fca6a17b0da0f9006ceadb09ad904786b7530148df7eedc146d20a5472c39677d65e59934c00227fb662b3474596e6072f56d2c00c3d31e66f0da85f4670e75c3f2c910c0fec8c98bc31fb2eceff80350b78aec0d316e9bbb331544d8a3d0b1649291396c717e350bebba3d3c3a0b1d55f010879b8c7b7d4f9\n\n# tcId = 36\n# length = 2**31 - 1\nmsg = 54657374\npadding = 3035300d0609608648016503040201050004847fffffff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 87482257ae1d18d0357428b756ae35a48549536a3439ca3c148eee64f4c096d896219097d55c14a25eb1490779f6b1471aed238cc0d6aaf265c12ac086d04de9b79a37518056dfacc12cb4916c17505fc7e2e6c1e0db720a286ea65bde4d3da1d2dcb8d0276e8ce73f3f923209149955285c602572cfd24c82e8d96d45f569e6\n\n# tcId = 37\n# length = 2**32 - 1\nmsg = 54657374\npadding = 3084ffffffff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 03aadd447f36952dfe73ae89e5c656b7d37ec92535e547cca62a7747f3831f2f613c7dc094f3d5c4c6b9e02b21ed4626930ef3948b42ed41f4cf468d2474acadf1c75599c5619e4872e6d3dfd93abe92234165135ed265e0c0f64fddf23e50c1f9fdcede8778a8ca008ab00f8afa887da3f4699df9f1140953232f36d035b03f\n\n# tcId = 38\n# length = 2**32 - 1\nmsg = 54657374\npadding = 30353084ffffffff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 31afd9a0d827755352b16de04de42e98a8c72f08919ed475530a00c762b8a03bde22634dd856a7eede4b4947d780cb3efe55775e16d7f46f209dbcb5569b2d9469cc271aa850f74960f7c741928055925349821e32e1e0fe5a040010a39a4b6a343f7f35c204106b3617e528a99dcaea8a93766adcfe7be31cdb98f7f7f14669\n\n# tcId = 39\n# length = 2**32 - 1\nmsg = 54657374\npadding = 303530110684ffffffff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 16ac0aa2d727ef5fbf0305259ee6fa40827c92419f819673fd64cc2dc2dbfe7ce1cfcf06e26d45f59cb3d9afd30d7a6265863fe856e0a0b1b9508b1e7a2dfb0f87f5ebfc444bbdae504abde7daa33bffb991551940df682c8e2c45edef0563b34d4f11e1955e83c2145ee321165517d1532abd64dc613a280fc30670bba1f898\n\n# tcId = 40\n# length = 2**32 - 1\nmsg = 54657374\npadding = 3035301106096086480165030402010584ffffffff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0fe0c75dae62462e66e7277b03c9113727419f7d4db7b2a567c0c189fb6328e1f73d5d44e2196b436f4c2f0f12950d419774c8a51c55f9b2217f904c4f03d5f5754174719dfb85f62795ef75e6d54e703bf231fd8472250f529f85294f29f6c5653ef585079c3b3d8f931da80a46c8afeef37696fb0e7986d413bb1996b8ad57\n\n# tcId = 41\n# length = 2**32 - 1\nmsg = 54657374\npadding = 3035300d060960864801650304020105000484ffffffff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9ef993e6ccf015b0b0de75b51213a1c3efcaf66bf83655287484ef28d984806226a7af1704fa6a7fc02984b44449f83ae24761021e49ba6117505c1e609406b002215de27d696643c3354fb48e6c64e7300944edaeb96e4872275f75532f5aab94358d4954522fc7903439e99223d8124e79a3f519050b6b576b77d5abe7c3e3\n\n# tcId = 42\n# length = 2**40 - 1\nmsg = 54657374\npadding = 3085ffffffffff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0fbc20d18ef2dce383ef9640232e44fc287cd97bdb1a18614a77a6d72da5db05df264fff4964b3395445a5b75f4098be8c923ec613efa49e87877c08ce52e9e8b491eaab77ed2336179f1e447bc53e0d9fb9cbd2f2c5e180acdc946df4cdb0a878f27dc010adb1d080330e0bed852181bf97dc4372049ac6ab5802c0d650ffa9\n\n# tcId = 43\n# length = 2**40 - 1\nmsg = 54657374\npadding = 30363085ffffffffff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3df42c382b86647a466ffc743dc4713259bd7dfdc909939738e59e3d1eb11d104537762c50eb55d4677a005f7f925ffc7ef0751ffe0c4320a6cf0733e738a404b2672f3dd11fa97bf9d84b786a47c63bbc962d52873765a6de3a57590c2cec68118af81d7dac4f7ce6c101811f2fa364a34fe704d674be5a28531d6e8c4fe120\n\n# tcId = 44\n# length = 2**40 - 1\nmsg = 54657374\npadding = 303630120685ffffffffff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a66d9848a3db7e49d8053c4a3869415c0bb58fd265276c99a66ed1df84e162cfe8f0820229d2ac2f99d9753eed39af46649409cf559ca6edc8c47e550b7a4cf24fac756389e365ad73ddfa67e72d042ec494644c5f277f60864dc90d6cbfdf556396c795192077f51f173477b934871e2a960f7ac3e6e8c8039956a5061bccf2\n\n# tcId = 45\n# length = 2**40 - 1\nmsg = 54657374\npadding = 3036301206096086480165030402010585ffffffffff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 7561668d5b2f8fd3190be8244d4d0550043dc0a7e80dfac83eb6f6ddbf448d424082fafc332e473d434b37ce7605352594ce632f4d5de30951581af907fff6c01814022c31a31b3d130673a56b4ef7763bad595053af0174df395b802722f5046e408c978e2b5a9a63f8ea80e932f76513928253f432c8bdc7ee51872d315b7a\n\n# tcId = 46\n# length = 2**40 - 1\nmsg = 54657374\npadding = 3036300d060960864801650304020105000485ffffffffff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 5a836168587968425c4e103bae20603e0ae6f714ccdc603a865bb3541b65eee9dd0d9ee21cc66c7a83403fce2413b97f1c1239947e94614f6f2eb731387c8b9d956242bd9fb0545eb2c874ca1a167222034649894b41fd0fa935cf52e583a5e9a4b503cf9f2b238c025bf2e22ed78e7a64bcac1d38302cc2361c71b854e79123\n\n# tcId = 47\n# length = 2**64 - 1\nmsg = 54657374\npadding = 3088ffffffffffffffff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 97c602416f2131d34f2a57acecf26365a30c12f77e5beac095533848ce227302092c6f44b47f011d6eb0a91f8024d1935d8bb274c42b57875115a94281fd3cb198f9334758d3200c1c721f6babef332c02a89968a7089f7783993bdd54f809f8372437798d2364040c1faabfb00faabf28cd6ae4ffea29ae2c08a6a7e6074700\n\n# tcId = 48\n# length = 2**64 - 1\nmsg = 54657374\npadding = 30393088ffffffffffffffff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 2a970dc291a1dc935cca6985dda703bcc1ece2e40817ce8fa79b6e8fe84e113686e6e65570d46bf22147bcbc389cb5f86f92dc185f556d15e7614cef119fcd7305a31fd2f8710812f35f9f0bd8a1a6e5be3163de644370c67181b7575635dfb9f717f78631d62db714b2a19cea7079ff13c8926ae0c601e4befb6541b02a7e20\n\n# tcId = 49\n# length = 2**64 - 1\nmsg = 54657374\npadding = 303930150688ffffffffffffffff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6e16d110235cd11e32b114ca9dac0cd6a1b041a6d2c61941d49bb458241281f62a4e2b1bf3cebc3e67e8c062ec67a51a599a553b09732e23e1d09fb2b20be7fd311a7122414d535651718a1421d4239276c227b96506729a09e3ff2779dd1c79de4d402623039b826e2bb4d26d1b56775fce14ed0203a9ebd8f042d981705a77\n\n# tcId = 50\n# length = 2**64 - 1\nmsg = 54657374\npadding = 3039301506096086480165030402010588ffffffffffffffff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0716d252488e08f10a25cec94714e6105bd4e13ff019431190864cb0f4378d315f4bd0fdf186e1f2d45a6e97eb04fb2013273e178ce4f82a0b67bf9d021b1d8ab73d753adf2073ee1ad6190b2163139db63778a3670b7cce23f45efb601bd59644a431cbe534ecdf4c4c58ed02ed03863ee32d296b5736c010305fec655b1a44\n\n# tcId = 51\n# length = 2**64 - 1\nmsg = 54657374\npadding = 3039300d060960864801650304020105000488ffffffffffffffff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 03e52a2ed638bfb9184a0ee3698502af3a19bb959a984957de5101e6f7a62cccc2ec2a6293fa9d76fabf3ce7e4bf35c65a5f864bc003686a1e05b57c5af6ad588e05a5225479422d7b78c5bedddaec7f4b8c1e9ab7478c1ee253847324e025434b76a01b82a40123ab31ec9862c6016885dc6cbfe97801503369fd3688bdaaf8\n\n# tcId = 52\n# incorrect length\nmsg = 54657374\npadding = 30ff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9c4217830da16424a6c80a62e1e1cc0c589e3324267b4498e89af96998f8352",
+    "4b67c703e46860ca55631f1e659096366b60557dbbc8aa8a3a7ff6a887f1afcc55d336458ae25b015061adc391b8a449a7546e48d7e1d783e5684730333b0e2a32c13d36e342e31a9c1c447c0585545e08ce4f6340529413aaba6872280bbd7a7\n\n# tcId = 53\n# incorrect length\nmsg = 54657374\npadding = 303130ff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 5aa35d19b312de94d0123619500c15ec79fd838f6f18e75e79a11e50d0eca9406ecb38de68e11cf107f80ce2d62573bd1e4062fe78f30cf4bdfe9bb571488887d9dfaa2d6031f3b7efdd0dd78f04d980abfe641f490faee10e86dcc9b729bda0b127b448d33b1e1b76373794c284d1aecb5b813a2defdae3723eafaaf3606eac\n\n# tcId = 54\n# incorrect length\nmsg = 54657374\npadding = 3031300d06ff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 971daa114a33b412a3aa1c3a93d5e1cb9810210019fe4e6dd0c70361a99f1a0676563bca2a05915df2ef2e38cab387ea16405d371d1a382ac286f1f97d4fdcf84464413986d54d6e2c7aeb8d5afffdc6de31684ecc7df721957d331bfa588a5f2a65c52f29ba5e4585bc69539e1945f1c4306f8d664d9cedde6684254ac704e0\n\n# tcId = 55\n# incorrect length\nmsg = 54657374\npadding = 3031300d060960864801650304020105ff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1f5bf49483eb6f33a5575ec2a8d49388523ee41223210f05e1f9f73bcb5a8973dfaa0093247460885f034e4ed7cd888c63f9f0f74dba7065f00cbfe5d9cc0dc7aebd7893acc3f32d5cc03763b59a0a846554ef58569f153301dd6080d428c8330718e733b92e76367f4eb75213de1495bdb1a5743deb55a77919adb45bb6bc4a\n\n# tcId = 56\n# incorrect length\nmsg = 54657374\npadding = 3031300d0609608648016503040201050004ff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 7bffc77cda9ff6bfbbd5a92fa6d4cf5a9f48a083c37a9437e5d82c0ad9f625aac8917c8df8bb4db5ef879431bacf360399c6607711082d6bfc5264f40631f2a742a3494c039146c3f41c7b53aa754afd35410a0a26c6957dfec86797268861036bacb5dc8fa6ca2893b26a3e4b186d4ae774a3822aa1e99ba4bf6bc3d53b2c99\n\n# tcId = 57\n# indefinite length without termination\nmsg = 54657374\npadding = 3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3e461f3131735907cec3208f19a7ecfaa8f3bedf587d1c586773899f3fed55cf669ba736c9478b93ff058fc063e62433bb0da4d6da8254a00a6b1e1527dba86d89ca412cb952a988009d8874163683e729c7544b9c83e07b77467b4329e04bdee552ab0513f92dcc7376ed59718b645b50bd50661c783d559eaceb12f7bf5d10\n\n# tcId = 58\n# indefinite length without termination\nmsg = 54657374\npadding = 30313080060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 81312384fb68fc608aa019df2a251d5a77dbff379c99d2804bc5ea766f051a80dcab2f63ec0b60d2b26391b35a83a5b75c7449fb0b32bd28d78f1138dde33b223d141e293bf007c5d028b34cd6055a4ed7aa31881c8514a2a091690405f8a708da65b34730233168dc08cd81733d2717db133f5d54ada593184bd008e5a7f016\n\n# tcId = 59\n# indefinite length without termination\nmsg = 54657374\npadding = 3031300d068060864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1d1150ce975992c50b3cbe98f2373621929c7a90f8dc5a9434a06159fb614acdfbd09851b297505db51aea8132a8f082fe72ea23099aea18494d2a73aaa6b9b6b04ca6d20a88c5dcea917f92c5df7943254fa9c3b1e7eca05a2ae2f796726d9296c880cf0872b8c32082a3a42b9cd099d286b586b0efce95908c8ffd27835572\n\n# tcId = 60\n# indefinite length without termination\nmsg = 54657374\npadding = 3031300d060960864801650304020105800420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 7c64ae50883b449f68f941c9892dc1e1f446bc3a779ce9906bf5f6751dd110162ee03a99d1b556ff380f176263846e76aea5e7078927ec6c076a79c64450f6ce8e7a9faab4040a31c145564107120cb524451e4fec4b1ae3702d0b063c660031b61fb6c2d0cb46d17c5f4605124057d5ce3a0ded2019a14718de1374e0e87124\n\n# tcId = 61\n# indefinite length without termination\nmsg = 54657374\npadding = 3031300d060960864801650304020105000480532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 65e61f63db5ef3a5de4a11aa39e3f4a6d3d952336c19f0fd60255b376d459d318fe4234a3a6c883090617306f98659577f7670054fc4f2d4c82bf7fde24bd1a231c71644d487d65beead86828e48a3e081fa6d4666b86b899ea57c99a67c0ae75947f2a4e5dbce3025421b3213224e29a55faf0cab8d9411b629baabf7c9ba6a\n\n# tcId = 62\n# removing sequence\nmsg = 54657374\npadding = \nresult = invalid\nsig = 5df1c4a701c6fc1f2daf6f4538f29c3452667424c05edcbdaba4a1678c8b5bc0e89656a0e48aef46642e0bb597813688904e9d74cbd377a3d9d2c965bd3ed06f136f10367ea3eecf89a97508389448a31ae0e79ed3725d0c4e99a516daa4116479bc53da5d7c2f26c7ec6310d4cb4174bb781405630a9b1c147b0e1da3a7faf9\n\n# tcId = 63\n# removing sequence\nmsg = 54657374\npadding = 30220420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3e43837b92ebe4df08586fced3dce46aeb2fdb6ec2bd0c58e823f6e6363b9b676786929d13ede60a8d8d0daaf71f0de8880ed0fdac8706eb2f324394145818b641d1049cc7552bc6273d86e901099c78297381faec5c518fb6de429700f3bbfef76cdecbb60088b9f2a77d75b8ff86f06cf23850e3183a267c0ea34f4f839015\n\n# tcId = 64\n# appending 0's to sequence\nmsg = 54657374\npadding = 3033300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000\nresult = invalid\nsig = 26d20fecdcf0b7d6a0472754aecbe115c39d580ce9d78b67d1a6395aa6ce6689bf6d0d96545341fbf04956a48c47f7d30bda017acb1d8e24ce596aacd3e05b1afa571d19f5316142557f765e4c5d080bc5336b79e2c02d8833d076ac9d7794ffbe85c66d0db97e1f5bd2ecb46afb15c19a8fe083fa593420e996a483c2a3a766\n\n# tcId = 65\n# appending 0's to sequence\nmsg = 54657374\npadding = 3033300f0609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1163082ba8d48352df7eab96a0067539faff24374a630aa4393461a0aac716606625d706699dfc22cf3aff89fcc278f83a0adac87aa0bf192dd86a97031515de1933a23849478ebed20e4203abfb47345bc18f38da5d45e829997b10107c536999b2ce10b2781e1db03e10cc2bdbc2e0ff4c3db5d271ce83c1e7e267e7c1e107\n\n# tcId = 66\n# prepending 0's to sequence\nmsg = 54657374\npadding = 30330000300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0ded592bef1fa809841e0d7365e66af12f4239be0928656e7c49a043b9f2b18b9bd2dfe93a810c6e6c8ae6cb8a5c9d6e9d39a96a10b3bbdb92a7b8f575c2db4841c1b628160f956f54e0c58d3b6fd4d640b0a06d39476daba7be04b63a75f38bbf7517d9751d2b12d2dc00e44de7263275dce6b0c0af65d3c04878d6fc1be2ac\n\n# tcId = 67\n# prepending 0's to sequence\nmsg = 54657374\npadding = 3033300f0000060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 95a42e5d9bd9ad5a8579444e8167bdecec16116a7900117b298c82d5560f1d16e9fbe963764727fef9111f2465e66177b576bdb8c70a58e3df6ff69edd2d6827c97d626b09c24cc49f223cd5d2db2916c54fd8f2ac7301723449b1823f2ff48c56849f7d608312d4bb7a97f90ba218f99cb773fba0a34909618f5d25854d7687\n\n# tcId = 68\n# appending unused 0's\nmsg = 54657374\npadding = 3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000\nresult = invalid\nsig = 2344c598a8905b350f20de5cf0cee60253729a54be45b0b19acc109ac15862efab2e7c96e92bc990ed6959a40d725c24c25c8d223a46f490905c1448d8dbf7c9c427bc2e896bdce6d2c1daabdc93ce177f9525ac69d899bded12443338834a16d885456057461740c5140cb9a89a017851f9e99e38c1727fe5ccad9a7a8709d6\n\n# tcId = 69\n# appending unused 0's\nmsg = 54657374\npadding = 3033300d0609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a08cbe4009080f73cef03116ea949d1dbacce7025f7f61040fb4e052754d5b2d74c2dd06c0dfe1d09b97aa5739c809bec6d8cb27e852e9fef353bfa32964b99495a6dc63d6ce77460ac280c74c0cabdef794f74930f7f8827af1c6690d22ec2df3af497837bbe900a890e3feeaca2c0d16b0017155390ff0396a35ecb62b5992\n\n# tcId = 70\n# appending unused 0's\nmsg = 54657374\npadding = 3033300f0609608648016503040201000005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 500df36bd7d0b56642e2d5dab6e4ec0b148e7b8673cfab40e45c5dad5efc469b3321ce027a3a7ff5689366a18a32267d161a1266491b055f11557c35bd0d4f43df11b8a26f7b13c54be423b87b30b1dca956151c3ec3df03b30918a413179b0e064bf434736b323408e3f1330743c8bdbbb9d466dc1e21710c12e2e3b638b172\n\n# tcId = 71\n# appending ",
+    "null value\nmsg = 54657374\npadding = 3033300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250500\nresult = invalid\nsig = 11a382fe570e0cfeb515955b70ec89a9353cda0c5a5d3cfa3e16e41340eccaa18ba21ad87c4a54a7131c4a7cf9afed68b1c1645568bab9b0fe7dfe0437abbe1fb6cf06bb690f46aa2eca034093ded661c38954341f3f35abe484015150307ecafd06d4309836771dfe29bfe56350d68725e0cd02b1479c6f99eeba2d59f40626\n\n# tcId = 72\n# appending null value\nmsg = 54657374\npadding = 3033300f0609608648016503040201050005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 110f3f188df46da58cdd46b5d460ba3d2f8d00d907289634d52a3ce693eb232cd6db738c48c8aa22d923d4f81d55925b3d4ff29ad9869f97a244d37b860cbd4646c6318c041729a7aaf473b61a93cccd62fe223d1be00364f03d722f43c7beff98c3fde573e7e6a0ce7d4a2a4bcf279765e29769bd4f884ce41fb808ac3d541a\n\n# tcId = 73\n# appending null value\nmsg = 54657374\npadding = 3033300f060b608648016503040201050005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 470416ee76f0bbdbd2812b533813e4463b799f4036e6955f3e174f6287e3c73d57c32875607e2eaf06d612cc85170ba5df31286edb645ae9ceb9e62064050f3e7f6b36fe8fdae7a3bd89b6acc523c923b9d3f3e5f57d80c9100b39dde75caf46adcae56668149ce0b80762bc459ac598241dd79c6b4fe0220ad53e3c591243fe\n\n# tcId = 74\n# appending null value\nmsg = 54657374\npadding = 3033300f0609608648016503040201050205000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 100714ee0d38c541c2632e96885a7ce0afcb22f0cbd84c556f19d1b44bce75a8fdf141e975dda1812b4465050d4615a51c3b9816606c7ac88d6b684df938e7a8852835dcf5bf0ee45f2e413290691832095af77eef0e7a86f72167dbb03758e68561f7f06afc6e902ba19fad57e00cb43c0fb2a5ead689a146c79c9e6188bd85\n\n# tcId = 75\n# appending null value\nmsg = 54657374\npadding = 3033300d060960864801650304020105000422532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250500\nresult = invalid\nsig = 44eaf5ded57ac5c25c17eb31c2e071400b46b9022641347b2edb0b14efbd4eac5f71e4bfbe791e164c003667387e57ae22c6b00e69971d7245e381f6459e5f88d9dc0fdb385b777fe99e5e4d79aec057e41a1e457fe2b91a5f4a8878d2eaa1c3ad8393d281eca07ebd287364a19045029fa7ed0e62a21e5e42a88a52ea4abc8b\n\n# tcId = 76\n# including garbage\nmsg = 54657374\npadding = 30364981773031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3b8b17b4c7b66b2fa3be8eb404e32b6fc0b9e56bbe678bddc8f7ef7c042c12ae5290b9c4201b35d10e409f3b7eb7760f5dee7fef09c30ea858b78bc9637dab245b8f83ee83c75a7aa3d5234b0b6dcdec385f8cd305dfef92aa83cc0ecde8f20f08af78b600c1f802695c243502397dd161b6151a72ac20596a7d7efd8e321298\n\n# tcId = 77\n# including garbage\nmsg = 54657374\npadding = 303525003031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 762d30b302cd76b021e237f28017e48488ff3bb30ff9e92db5b1e76eec2ee91c9af03e1c5038afc22591b1cd8cfae648a33ab77901f9f3736e50eea83f7c7a4546dc55c0265fb17dfdd30250fa3881e34e51b4f2e54554ad098eee952ec888e911a0ea5df42c0560bcb4bdd718c88d834b534917e555c38fd1ec3593b2f25b39\n\n# tcId = 78\n# including garbage\nmsg = 54657374\npadding = 30333031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250004deadbeef\nresult = invalid\nsig = 8cbf9d425abef67ff0a7fb648e70b82b1556ac80e46dcff37145b9041bee2bbbfa56817e04994c9cf1123c6df2aeeb1637595eb1e20adef51d657943fd67826ac5d5dfba106ae9cd243f12746917a446ce955034b46ceb0f4d542b7bcd06ad3e6e10899d5338e6d8caf3d4de3cbf45d45a58d946a64d0bc13e97a4ab4e6b6016\n\n# tcId = 79\n# including garbage\nmsg = 54657374\npadding = 30363012498177300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 2f4944e5191dde165950a381eee6cce3fd40214e6a9851919f5441b4efb7ae5724db46e92a747937c3c8f9329facb7a71ad5f380e44dad0436cd05fc312bf3cbf05c4873ab2125d605848cf97ef976f7ba8ab6949bdac5152bf1a66945caeddbd89346965a33a8fe0a0ba63b59beb05a44b6d84e1fd93506edcc48da12d488a6\n\n# tcId = 80\n# including garbage\nmsg = 54657374\npadding = 303530112500300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 975d07b7295268a8662aedbd2b65b5eb10bb496077f41b90d12d34ebc7e492f0c7f3a41d4164a279f06ea616f91968628be4ceecd4a554477bc76cc6b2e6bda4042dc253327c4b8fc40e9242cbc8b835114a7379a3081bae4b2803a99deb4a540f8c149ca5db3a61c7bc9f61cd7e55521660a06603849896c791a18d1c7360e1\n\n# tcId = 81\n# including garbage\nmsg = 54657374\npadding = 3039300f300d060960864801650304020105000004deadbeef0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 37352cd11eb5ff7380bfb7c0d3e8d9979ae7cb489a71c31a077d59496547b0c95a760387ed50eefde0b762222f05a6033740f6e010693edf3ef8ab5f9c57f4eb1f6ccd83287dcc2e90857defe5ba4109bf79ad84ab069c85a25758d22536c6882919245fa2d7e7921b3635d984deeb6555cabdfc46a42c75875d55924c8bac62\n\n# tcId = 82\n# including garbage\nmsg = 54657374\npadding = 30363012260e498177060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 05df1fa9290a68415b86468a57394c052f00abdd6c65eb4fbbd834cc117cee4bba99764906fdc46e78bd9d554d15cf0284a64dd0c19877115c425a1ba70c1a4339a54ba7fd60ec809b9b789dc06997c2f25e890d8bdb1bc945c0daa8c61feab5bca471bd520126b6db3d6077f55428e0e7374da961dc5cba5397604303eec6d5\n\n# tcId = 83\n# including garbage\nmsg = 54657374\npadding = 30353011260d2500060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1fb1960934683292a4c92cf3d582cd5fe68888a5b0f6c2e64538289da7f96a9efcc36bdbf1fdc0cc0b3b36c6af608309de58c6151112f3a78599ade4a718b359547a4cac9a020e5e7e7117d1bfeb3ec21bfe9732825e624b27ddf8a946eb858b30461706f769a54b0478e0753388951d98129383590186b80836608f7e06c72f\n\n# tcId = 84\n# including garbage\nmsg = 54657374\npadding = 30393015260b06096086480165030402010004deadbeef05000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 7e4f953b288c20fd5bec56a00745db9be03590efcb637e2ce2119a0a1846e9f38c0ebc5f2498ebde6217d81c9939b6d6a6f35ba54ee50d6313d3f2579751e7ae8d31ef4b0e99ca2e96c80459a7e5ff51f6f31e9c965be19097de13017c90037aa482d197c986f50bf2d5e1acb3f3024605e46d963410a4a623c898d0d773a78e\n\n# tcId = 85\n# including garbage\nmsg = 54657374\npadding = 303630120609608648016503040201250549817705000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 53b8fdeb2d8aee9796a56afe4934221610ad028ae6f9478c90d4e865f3f78b3d27b383f87086d50fc4d96c5004d8a22a0c5d32afad45fd68fcc3e9115bdfddab605c81f31d0a8ccffcfd5fdbfa0f0a4386649198b11c10f33ec5bd73c713a6af706e617a3a1e967f6ac025e7f283e49bb9ea1fe3a4f27d9f6caaf1bf4981ba06\n\n# tcId = 86\n# including garbage\nmsg = 54657374\npadding = 3035301106096086480165030402012504250005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 90a5d10e2e19f7e016d5126a3d3eb91432611ebfd411b07a4be15aa48c39df33f3a2855f1e150ad34c7f83973bd73eca6575dcbac4086aa0a38db3d6e6ee2e9f419768493fb4829f1f6d67f80359f82d95483d6057de17fd388ae46687c429dea4d9f7a286c95fb1b9df0f1ba40a4263307789952b1bd07cdcb3b5cef10d9d2e\n\n# tcId = 87\n# including garbage\nmsg = 54657374\npadding = 303930150609608648016503040201250205000004deadbeef0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a88d38e8c765b7e439f42294e71c1689a318ed5414efdf474196989829d4989fce8910798f4d7873fb43d3a501fa15c8019813104e4699597246db66f96c838e45aa3596a1d26cbe9f6ee91c077422953b402f7e11f8768a2f132295bff79a0d10ab843cbcf2c921113992336638f4052446f52815328ba4946510a6b701d448\n\n# tcId = 88\n# including garbage\nmsg = 54657374\npadding = 3036300d0609608648016503040201050024254981770420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a34e59121976568352ea031232f6da386623a1c6866e36d6c6c07168de977faf6e008f14fe22a27d42664925f756f4b57f5258ceaa8197c3c172068dabf3c6cd46b3cf0262931bea731249781f28361c25cba9b64f678c0b2692056469624d0204bf2bf9c4e87407372838926e6b34e68cfb31e2870bfb5b0fdfa2ec1e177149\n\n# tcId = 89\n# including garbage\nmsg = 54657374\npadding = 3035300d06096086480165030402010500242425",
+    "000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 7f642b5702c331dd76b7ff66578a2c0547d91c556b7b9751443d911729fb5ce8426515ba068e2839cfdc956eb813c25d65a2d5213b59302c0ed5e6fb95c49002edb1605f8f622912fdc309d92e6e3f188ba19e991fab0a7018ae4f6e70927d91cffec51b2dcc8113908faa1173ec9ed72350aa93a8cadef8bfa7305bae22bdf9\n\n# tcId = 90\n# including garbage\nmsg = 54657374\npadding = 3039300d0609608648016503040201050024220420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250004deadbeef\nresult = invalid\nsig = 0abb75f2fac084da0b99bc823c021c4872e23302a6a25e400b6f25d60f7c903899a69dc548676106b44f37c1e6d2604eb995a16880a2a8e2cc9e0ccb2b984ae482036f69a6ad31a2b5836e73e0d30c3e10f8b93c7587d7c0f2371183edc3b8cd0fd7bc325b1cf75e1079f8d6df53fe495722cc1ce707cca49bc6f4ed2ca6c4f9\n\n# tcId = 91\n# including undefined tags\nmsg = 54657374\npadding = 3039aa00bb00cd003031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9f2234b108a45abaed850e19d2f9576f59bb83dbc6165da61c4798638f9c98587c7eb92a8c901dc4430e4a47dc05681ae811ffcad6f7a604c43551cd0f5d123549435d622f7efec578301efd49dc6b139abbc3c7d6a26858f6d18f09b863a145d6483c9efc6c322fec1341b6362dc1d752c714efcdfb09097a0ce6df7dbe88a9\n\n# tcId = 92\n# including undefined tags\nmsg = 54657374\npadding = 3037aa02aabb3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 24ba137a293599ab7e50a0a4f8c7a5cd02dda6a4568c93f84d00ff47296564563c9051b334db2fd2c081b23d322d4870a61b2435d651d7efb4e1b0920e759f7fd81a937bbc85ff43dbe2b702dec3acf4db68d5fd7b8a2f6d32cc49a7300dd659623b391927a2442d69c6c3c29e59eb80b1d0a95bec6d18a6223cf4357eb7cc96\n\n# tcId = 93\n# including undefined tags\nmsg = 54657374\npadding = 30393015aa00bb00cd00300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 04023dd35fa479f8156794d02935f8669c023c774b95c5a0e02837e32ccaf7a4ba5195835a15de6a21796eb96bdaed868f9e8b7f0a5a21c1a3058f53aadb62d6ee74cd70b2c38f17e42a1f7ffd88955731b4e15368211ad53f617aacbb54a7e7078740ba6daaca81c1b321b748ea1d13f7aece490226636ecac41bdc275175d6\n\n# tcId = 94\n# including undefined tags\nmsg = 54657374\npadding = 30373013aa02aabb300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 253bed76e4b8465ebfffd1b7214ce586294d3bea290517ca2bfc417ba9d8e72d286570c348dc6084fd379c2bf4dae424189964639533e17c409ae18e445210ed4dc98de4ad7336554740d1532d5010a1bd7ebbc33ba48a3365d50669e4f4522d0e5ff7a3bdb1c42c42dee647a8a3ce16633eb33bbc0a869e12cf99f9481dcf85\n\n# tcId = 95\n# including undefined tags\nmsg = 54657374\npadding = 303930152611aa00bb00cd00060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0775598491297eb9004eed66234ded82e047ea2f06837425e6bd27f33b1373667f3ff4961d60f85edede88ec2bba2680151da3763f0df9785b31771da7e643862ff9ba944ab54bb1356ee113e420002a873f1eb381660f3eb84b1d6b25ccb8b82ad12ad0a449c4de205144873329e80ae8a84d1d3c1660b3303cbef28b48a553\n\n# tcId = 96\n# including undefined tags\nmsg = 54657374\npadding = 30373013260faa02aabb060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a73df043d06ae53a37773016a4e21d3f1093c50e079b189c4bd7db3e2e9875b14e5374cb8e7394a9f1b45c7e4e9dd516198bf5055b30ea4d205f39fddaab3da0cec63524bdae2ae166a3874c59057d93855d6e6314fc5da8111ff58666a73c00a105311859f27d2fb92f507531b9d681e219861e4f0b2b979c185af2690eb4f7\n\n# tcId = 97\n# including undefined tags\nmsg = 54657374\npadding = 3039301506096086480165030402012508aa00bb00cd0005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 17e5a889b8139593e192f7af684c918f2751f157214863f88984ff3d8c9e381d1bee5ee788fc82869f4c3d8483e3c17c873a850a7a5c85e4518cbd8531b331a308a0368a868bb7995ce0f8a7ac5ba53b88c31c958dfabb36ed461472505b598418185b864f381342c29dc80e55ca7c2095e7788e7e8d385d61de605f74e431b9\n\n# tcId = 98\n# including undefined tags\nmsg = 54657374\npadding = 3037301306096086480165030402012506aa02aabb05000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a659f7c44e4589e9f6658b0b57e82e65d5ee9fbe2376894f558a7ca4b6e3c5032f953d1dccfb9b76bbc53dd5d1a52cfc092c6ca279b37c0a43c99ec0553d7ef4d9bf9361a1c4a3fb7496aa58c0af518312e18819fffdafd1a230a38440a6fbb0e69babaa977b8b5fe08ed7c6d59c0391ccd80b42a0c0102264b0ed6af8524e9e\n\n# tcId = 99\n# including undefined tags\nmsg = 54657374\npadding = 3039300d060960864801650304020105002428aa00bb00cd000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 83fd4599a47bc0852ee1a12b2d97fceae6d8442fd089df1d21ecc252a410982410bbd2cc6bbca219502c2934ac593a09beefdeb54b0692b3e5724b79b0f5c53541b62b0c4bf80a658af71d5964fc6a1fd7823370d00e24dcead4bdc86bcd883fe3f48dc7f8468ce99b7580306007021b68b48ace274e3c09a1b5e21fc7542ef0\n\n# tcId = 100\n# including undefined tags\nmsg = 54657374\npadding = 3037300d060960864801650304020105002426aa02aabb0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 4bab6fc6948143f8ec7c8ad86a0c5cda5bd8151c24ca7916857778729c882581603363fde0ae2a28b6f8f2c8ce8d5f6b6e731bf8ef735bd31318069544295b54b04ff2abd1e11900373931164586d7c830bae704f7314eebf1d32b3a171274ed456e335d2a0b998ac441053ef096a037bfa6e5cdf3835c45ede383f0ee8feeec\n\n# tcId = 101\n# using composition with indefinite length\nmsg = 54657374\npadding = 30803031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000\nresult = invalid\nsig = 2d9940c172e83a1ce38ce52741e694c7b62c77a63c0523ef68ffde402b0cdf7102afa7005a731d399757b69d313c2970a61f785c12fe79aad5398a956a2c004faec802691b00246cb759b0db432739febfef9abece7bd95e6ad980eb9d8b53886f739035b71fecd5e5ef0f0c0990a9f8fc0aa5d18089471dbd53488c23630415\n\n# tcId = 102\n# using composition with indefinite length\nmsg = 54657374\npadding = 30353080300d0609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 69fd1dfca1b436593840f946e6113a79018c6cbc4e2b4562b12d06c03c7cfc1e724841ec59aeb0371c67a76a089a3f83f837255719bd648bc0888339c54223c25a238e717d1a90691fcf9690a3fef132f034cc03926ba8ae21dbb68467669cd19837907ca58237b6619be08a92ccf8e5756e3caec34a3c2a4622d7154a72256f\n\n# tcId = 103\n# using composition with indefinite length\nmsg = 54657374\npadding = 3035301126800609608648016503040201000005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 58c64866f9c1b6cd94c33fd708375ee8462f89efb1c72322174a1c5ed9117885bfa4a02ef0acc16d6a078800b84e9fbdb7f8f4f232091326811e71639fc1321b31c15c9fccb68f77c79b2e39b817478539636966c0adb23407401a4c68e6cf5589104a5557650ac389e4fb2a64191014c4e8f9af48f8a28f555d5cc32d7a87aa\n\n# tcId = 104\n# using composition with indefinite length\nmsg = 54657374\npadding = 3035301106096086480165030402012580050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0ba4e7900332ef20ad600bd4b8c0bab55c1030138c6131c1cf14a45fa98e10ea297ff6c2b8de3d92bcab6f1d303f4f8168848b2fee58ca40fb1f1c7eeb808c212b413f6f302d2e3904c2be2fa77fac21d04352a0abb07aae028e54d9e08ce37a6c210ae47095890d668cc1c296c9db1b5ddec30b722790260dc26c85e35f6692\n\n# tcId = 105\n# using composition with indefinite length\nmsg = 54657374\npadding = 3035300d0609608648016503040201050024800420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000\nresult = invalid\nsig = 6f7b739d7e604a1123a232be4d0909a890eb3ad115f822b91592563a55fa59711f7ad17d1370abd4a6af6dac7ba08b6ae111291b0c8fd0626bc068022a8eff5ea5b797cc7fd35a81130a9394f051d2bb6bdf6190c11b964dbe2e4021a71ee8b405d0baf91ad5897d9ce22c8c1dd0e7dfee0e6abd979f5a1cd9443116c212b806\n\n# tcId = 106\n# using composition with wrong tag\nmsg = 54657374\npadding = 30803131300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000\nresult = invalid\nsig = 53e00d738939553ca6f742ccc3671c88fd2319dc438d046f06011e088b57df8703813a53fa9c68a8b2de333445fb739726ac2b6ce3b2800e3082f48b823a06d0b2a83fc4c0b2e6a40fc2d86b73030e974f101dc6fd6a24abcc6cb347eeed08",
+    "a4c8086d1fc5fd68b0b36fce0c79e5187c38c8a4cd35973b1755643aa28496fbd4\n\n# tcId = 107\n# using composition with wrong tag\nmsg = 54657374\npadding = 30353080310d0609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9382e341df276efda17aaa4410801a3ba0e4ccd5f0b61cde2416c7a8345cab1bb1fcc4a4a1d7c4a03a9d9ef68c83f2b3e08fc5893324159cd3dbae159bab67b109e55db550b540aa6142531528281732f63235785e145ea0defac4e67e825b30fbe9ff19687436d600ca412053e2430a1d1b637d4db255f1616713f3a2ad135b\n\n# tcId = 108\n# using composition with wrong tag\nmsg = 54657374\npadding = 3035301126800709608648016503040201000005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 01ed4d8d4a342729f18182bc4f7645ca0a5216b57d4d26b874832983d19741673aa7c0e01705ada27ab779b9b84f431e83c621a2dd7ae5f501ec369273d297144b76477f4408bca5ef6a59053c1ffde80bc228f99dcaaffb4c520c507b3a941399042f0c535015d86b2b5a95696b71ed61ff2bb585442b85fa2477268b71f77e\n\n# tcId = 109\n# using composition with wrong tag\nmsg = 54657374\npadding = 3035301106096086480165030402012580040000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 21782ca777e07848b600c37bb0a881707e580fe822d5dbb78f4809251a5cd74cb6f3636194cec8bab9040339da6531c730060ff5ac39ac9ad56a2371fe21e02ce08da18778d2256276c47ef0261d9c453360fbc4a2cc1dc7a8965ac2ccc17b460b0fe359ae4fa53f75efc68e96762cff5d98be46fbeacce2edf1d1bf5e158653\n\n# tcId = 110\n# using composition with wrong tag\nmsg = 54657374\npadding = 3035300d0609608648016503040201050024800520532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000\nresult = invalid\nsig = 1eb6de862a77d435e62635b620be37fc8be499500c19b4d87b3f993b9710f55476d3f3ac27d5ab2c1ec36dded088bc50ba5c0540934fdbb5ed3309babd766726ae833aec211a526caa82bf08f1704b66128f24c912c8c3719170090fe1a2738b0da32f91d35546a9a499618428d368b326203aeafce635668d3d5fde15762d84\n\n# tcId = 111\n# Replacing sequence with NULL\nmsg = 54657374\npadding = 0500\nresult = invalid\nsig = 1803d41a0c822fda4ac7757702f93d48c6f6c2dc853e706fbc95f3fd4abcd376d0682907da9eff695ae52001d34bd241030899ffc8e2b9316a63500675be891eb560fab23fbc855ccf13a76785b6618f4a99406e367cf76ad9da4d59dc8378eeb1144ec3738aaee1c81c3e6862526b9f00829f1ff849eb7191b709fad6e944e9\n\n# tcId = 112\n# Replacing sequence with NULL\nmsg = 54657374\npadding = 302405000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3e33872aaf9b4484c80bdab42c7f14f2d0efc8c54bc2a0353cd2227638b9e1ce4ed63b9e89e2848f35f6de307d66eae9fab775f3a8883cfba5c8b71d86a213b284043027433cdae708b0714523ff2f5074f1ff89cb0635ee4f34eed7aef7d798c2e19be4594438325f5af4e9a7f575230681c925da54c74ebcd438e3c1e0fcd4\n\n# tcId = 113\n# changing tag value\nmsg = 54657374\npadding = 2e31300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 5770bbbb883f93f7c29bdab32e496f2e9063110fe648705fd0b1dc927052fc9ace9b36d898d19cd4f862b777b7c790d767b8313f735ff567c34cfb31f29644540645beea182cabdf789ff9ac3f68cc20444af0b9d4ec0bc8992945063fdb733cccef7590a10bdf491bc21c38f25ff65a581b40343e30529c3dbb71f62189ba3f\n\n# tcId = 114\n# changing tag value\nmsg = 54657374\npadding = 2f31300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 15bfb4fc46316e5445357e1e8aad401573dbd72f4ed10210fb0e6343c88d61e5e1ec52e940a123f29bae98210793ba6d9e09329a00a85565b573957d14ec6ef37999ceefa994c870f010bf4a63cb04af09c87f7810e3289014f50a5c051a3fe5294ed186c1bc8e1de9b663863619e3972d9bc0460438b56f63aec3315c10f904\n\n# tcId = 115\n# changing tag value\nmsg = 54657374\npadding = 3131300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 65619cb9c793501f05673b24e7d9385c8b9f02fdbe3bb2e688c266068fcf2508a141797db8dc2ddd6b3ab649654a5d806d05f8508026c4f17bcb0a923b117965419171b86098589128563699fd8123f966f746518067d62c8d9ebbbfdc969671b198335cf51fa4b2919c03e66f1042346893c34829c774ed8dd9f31abc7ae2cd\n\n# tcId = 116\n# changing tag value\nmsg = 54657374\npadding = 3231300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 359dfbf40d3c2383f58bef1d518abe9852ca80d797393e4e1a9380ef08aa851d585213e8897c6f701ab680b0f63ccf5ea4216331918ca9a984fb6ba549f4bd066ec1fc4f1ed053fa5658b01df674a21322ba7e21fba6cbb3a8eb5565fb7bc269f99c65981efa650dde613ccd6d3927cdae45922d94dcf7ca5188bf5acf84035f\n\n# tcId = 117\n# changing tag value\nmsg = 54657374\npadding = ff31300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 24a61067121e9b4363b816b7c5750584c23f3c3200ca929fdedbe95d7504c56ea7dffd762074e44e96e22147943f2b704003967270b2be1bd1baadc3861c4cae91bd41530c67220349db4481d324d9927d52fe85618ddab2598996c5813f3299e1afb020b24003fa94f94a0c6c02b3183295e0de79eda021dccc5539cd7874ce\n\n# tcId = 118\n# changing tag value\nmsg = 54657374\npadding = 30312e0d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 11b8d1dc2fa2afbc32f048d7454ba032b432a2ecd438506aa72c697a5c118e9e231a0c6b6340b5564402b7e837c59dd36f726fd626621b8f543964198484087eded70e7bb1dd63df2cea33198b9d02dd28e3b8bd006ba991a8b3bf06ac928bef45cba2362f2e11a5fbfb0310e84e8b7ba1e17c315adc1f34519134c36689619d\n\n# tcId = 119\n# changing tag value\nmsg = 54657374\npadding = 30312f0d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6299afeee512d61202fbcf1f37a2bf6003d6d37e71dbbcfe14f8c3079c552d75fddb55ffbbf13b548a60c722c5ff816c09c6e5f14ba4b3c4d1ab31c9b66bb0666b5e5dc9e36eb70bf403251e2526955f6025c8bac3502f887ad1e5afae6f252209d09a1e1697431f571a95313e6058e55bbb555c75d34e608db2ad50819cd865\n\n# tcId = 120\n# changing tag value\nmsg = 54657374\npadding = 3031310d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6e23ce9405034595a7f7a77f66431d18fb770bbf009f6980f1516df788d3631f9d8de65313d6b23007d62f86cce97df492bcf4727db160a862eeb8900b43333553e1c33b1768eedfbbda7aacc8dc9863e7a4347b3d37e00619468d7a0b5a7385c42bf0edb3dc24588ec261c739a181c42beef46ffdb4317afd7e87cb6250a246\n\n# tcId = 121\n# changing tag value\nmsg = 54657374\npadding = 3031320d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 8748f029d5294dc917cf4fb347e0046f903c088fd976ca97b1322738549df7c56cd67349d66596338fe418b29de9e8af8872fcdbb55e1a6f74e9965fe7a365b846b667d0ae50df23083be73cceb59db545a3e1a560f6ce0e9eaee57b5f95b8487a3987c00f364d0f148ead6d7e6a37b05456b913b7a79c0547b80da2a2893881\n\n# tcId = 122\n# changing tag value\nmsg = 54657374\npadding = 3031ff0d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 2bfc087003f3b98f0c8c5273de34f5e4d5047e909cd80e222072f6a7926ced5ae169131342640f2be11bde2f7565c3c63d0335614dd278915514de8421f4521f0138109a5c9778f86647b8a42815b6b861f173f5a6df893873f99c5e62bc3c086150e3b7d7abb943ecbe5806068abc433e9052d9bdfa19a58d19da463dbf3b23\n\n# tcId = 123\n# changing tag value\nmsg = 54657374\npadding = 3031300d040960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0fe03eea6c50ab664bebc7d64346762aa29b08b61f2877973cd543c9533c9d0451db8d836eb46e8d64283306efd7ef6387cdc3c794f7474f2e7d51b9df078095adc85fb810cae52434c9cee5048fbff72610778397fd83204f44bb87f7637373d111dd16e18287bd9ffe816683bc3663f586082fe0811ff6a06c0264b67f7716\n\n# tcId = 124\n# changing tag value\nmsg = 54657374\npadding = 3031300d050960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9eb8ca45243e6cfaba1209dd8bf9568ca23075a170363db359cece419b732f62796210ee7522ed71490ca66b452f9eab5bc1e2f00b81861909f003d3b0f2e03513b3db51ebcf19e6fc679d686a559f216c761352ddcd84d05b62c96bbfad63209d97205866296c66c01cf273b9657c64a3f8088d3be7be7cf93e176a76921230\n\n# tcId = 125\n# changing tag value\nmsg = 54657374\npadding = 3031300d070960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresu",
+    "lt = invalid\nsig = 313d3aab5559becd0d917c83b5a0e34a7bbc3482018dc624564370202f3a71f687f056d3032b11f32278bc650d9a25d4b73be42e44b68298554d4c9399fbb4fc919f63f1649496775912f99c6b57eca8dbbec359f0a3dee046f3d54c31eac523eff73bead2a9a4f20bcf74e8d48776801d429a11bee061588d291efe0fd6e746\n\n# tcId = 126\n# changing tag value\nmsg = 54657374\npadding = 3031300d080960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 748b9e64195314003ca31f726bb3d3294abd8eb376365acc5b1cd36934bbe1a9bae99ceb7c1a40c910bca6007ced7961ecc9ac74c7a6424cc87b6b9610320ab9c5b527d986c6e8ed21e677bbe2ee7752e2dbcfceecc2dd6da3f6c6b9c81435e9e060dcd67ba834729761dfc9570b79bb1b8ead7bc1325c2233e445eeed12dcad\n\n# tcId = 127\n# changing tag value\nmsg = 54657374\npadding = 3031300dff0960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 7379bc96dd40d37a7f8e58f87c10fb94f250a964a55b2abead479b368e60e442e6eb864952308eb45eef1d318b6a5ffce634fcb886dbfa062060b9809cf89a09a26fd334ca22a1917fd219900ec0c68164c308cb9cbca3fb2b89ed8637c5540f7a5886ab1e52c503e20edd6316e41c746e53917e107ef5308590800ad378ac97\n\n# tcId = 128\n# changing tag value\nmsg = 54657374\npadding = 3031300d060960864801650304020103000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 4a2478918565be6b46fe61e5f66cd1befb7a3026b5a1502e9a42636b0b924a02e85d7ffdfd8671b1d6d3e604e3ac6a5302db4e0ae0975d0661efa018d6ba0c632a6381368dcb75926542c74823a8c6d8732619764d5a61062fb3b17ae243bd691c97c8f9821af9526abcb522ec8e9dca32de1989e576e336af9dddc3e766541b\n\n# tcId = 129\n# changing tag value\nmsg = 54657374\npadding = 3031300d060960864801650304020104000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0f6972e592edfcc3d7df9366f8f20682f95003970d9fc5932715bbfbea6a7a3bcb311f270e7228f0ba6e94c44699c95ee4c55daf55e59ea65d136b61f0eb64487e72a4649802e25dcf463b79cdafd854b35ffc2e100b08d3e24bb131fa46440d49e4f6ec9f8bff61ee652755b9207a5661fbad44fcc511db385712da10908dff\n\n# tcId = 130\n# changing tag value\nmsg = 54657374\npadding = 3031300d060960864801650304020106000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 61a002789a9eb5a71a1bfba260059cd75da7405336563b0910a75b9d56a89bed595f0f493973bfb3ec62b1a218abf9a3b1fc7bd18fbb04204b232f4c632f641364f0c65a6ca73b75225547714e60a854797195e46edc05a746e8d84f64b2151aae5880c2f33a8e7a68bd7e334325f68a87b65f553513d1f9e77904f6ab1cb2d3\n\n# tcId = 131\n# changing tag value\nmsg = 54657374\npadding = 3031300d060960864801650304020107000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 5ec392c91cc165ae59013337e7f7d5f2f9b3a6d45b6f6beee6dbf93e7b9607900f4672555a57de6e9e1aee1fc9b7adfc0dc00e122e84b0233c0d615dd0d79764fdc9d1b0e541f2de0083ab479f313a07f55f51390d1c2274858b219b1ec0601b82a2f7648ae95ec17099067a173e3e83959b6c06f149af0e4610761aab5be1a5\n\n# tcId = 132\n# changing tag value\nmsg = 54657374\npadding = 3031300d0609608648016503040201ff000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6173aef07a7057c3e97f6b7d4d7266918876f9fad86000b4c8ec7f83ee491563115b0cb5d580df8c97feb0d95866eabb79147926f5395c5189554749f4a2c75c0d96325971635be029062e1f27536c5041bb42f42e1fa10e21bb8e9a2e2502f2a7299dfe3bd8720ecb8a57238056ab0eb546de8dc0e56b317c73ab1e19772596\n\n# tcId = 133\n# changing tag value\nmsg = 54657374\npadding = 3031300d060960864801650304020105000220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3b80c72f3b7ada8b38b30527bca41180b4a89b066f44a17b9df5963dca46517d9160326afee7a34b650b9e7746e764958ce6a0a6268481a8df40e0a95a81ab0f0bd20c050becfc0c4b03ebda19749a4a1dd3ce925fafd9a4006a835eedf221a6ceab6aac6bc74f743fe171ef8c01935f8901e1ec9ff6e33ae8311851fa14a65e\n\n# tcId = 134\n# changing tag value\nmsg = 54657374\npadding = 3031300d060960864801650304020105000320532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 8c4cb8e7fc5c5cde3f1d9bc79ec679ad6ebce8c63c7488b137e8b77641ada2c4de35f87b97a17f2a7b96e58dda634e725efbd9a60b45477eea53bac9ba6305e209ee153505517f598f5e9e1ae79395dc87a1a86da144eaed76ed86454cce2278d20ff4ec88b8383702032637dabf00a613be8edc95601007108eccd910d6eff3\n\n# tcId = 135\n# changing tag value\nmsg = 54657374\npadding = 3031300d060960864801650304020105000520532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 8fba298e33e6d9f1a107036deceaaa094e5d4cb8d9dfad3ba46cbebd672a7c407c00ec44b0030cf8b4bd296b3daffc4fd220ac1b1b0c0827484f965cc3dbadd6cb313544db3260fff9311ea335cb3e004764860ef2cbd9d7affa06352424133db4ead84225a89a1a998b2a56e17e55c5b74c80597d3714cfc030c398b52dd933\n\n# tcId = 136\n# changing tag value\nmsg = 54657374\npadding = 3031300d060960864801650304020105000620532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 4b0eaf3ae1c7a3322dcfabee0569aaafba51e0f34fa6afc325bacc853ccd2daa3dca56c918325bf553af02ddd19fb597c368dd18892d52d9e935dc51d38347ebae2a7f90c78504355f6899ab4452d5f51d2025381d81042a08582dc50bc1078246ee69652043bb747969a7450659e333193990f34a8ce3f036221193e700489c\n\n# tcId = 137\n# changing tag value\nmsg = 54657374\npadding = 3031300d06096086480165030402010500ff20532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1fe7b390bcbd5bc1904e676111653e14e581e7817b45294bb790e4e62f3010aaaa77e246b29729f2b7da65a2f437b8d9c4fe3b26baad367a19fd7b1758d04c2f788c45e5309a833522b46d7255dd5ef70ed006ef966aa7c648bd0b893b8e1566961c16e9554fb729ec81819f1b3da890d413a153f487c030c7581da9531bf134\n\n# tcId = 138\n# dropping value of sequence\nmsg = 54657374\npadding = 3000\nresult = invalid\nsig = 317379f37cb7f21fd03259a27db3575d491a248df82e67b39d4956a1c619094fcde001544f0fa70c64dc0d0440fb21d2860a20a911cbb397792bf3eafa5cc050e78b1e7bb29d041cfa0287bdf54a90a7a8bff5c870e898fe34bb522477daf8e003bc22891b789ff215869cceb92610c4b03210d19506058d941e6fce7a3cd786\n\n# tcId = 139\n# dropping value of sequence\nmsg = 54657374\npadding = 302430000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 2de802ddacb7e47e27875943d5098419bca3b170bf74f1c4b4a8ac420d4469d9aea97592fbeaaa1dcb5fd20bb97afc5f7abae17a9bb85c5490db97010c5217c88f9f52b5e209cf5fba5f0594f4e4450114dd0348ece336870a1333f7660caf959056ba13b77d35239eea164ddbc8808f8e7e1beb070f551b6e95f90d5bdbd925\n\n# tcId = 140\n# using composition\nmsg = 54657374\npadding = 303530013030300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 09342a8fb8402b5e50fbf8c5d1cae415ce02c0a803adfed88188982129e8480918dc21616bb5f8381e8dfe13f63234090c32e542a005df70df5e8e00dd2a478d10fff1b61efbdcf0e410236f7c031c9a5f7cd0db9098f8a32a6a49f408e72c4a29b7d27e8041ba605bf089bbdb9777e19b31ecca0d49b90d54701721af79cf3a\n\n# tcId = 141\n# using composition\nmsg = 54657374\npadding = 30353011300106300c0960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3ef90c414a64601c538c286f2c35f32445039799b8c266eed605027578edda796a409d905a751bf5c1cdea97840437fa82733d8f27efbbc05da732887078a8f547bbfb54607a54f893df7dde0c35c45f9c2402bed0405c72e98175e5b9d6f90224e07d12e8c1bbad2fc8b1a14c42dd5fb7e554db5edae89d335705c672cd7b55\n\n# tcId = 142\n# using composition\nmsg = 54657374\npadding = 30353011260d0601600608864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 3ad3e4ec3636b5eb8aac2161c04d228491ca0d9da2abd69d8904054373940b39b5c025c011c9b9508a25ec25b24a0837cdd6a27cb5c8ba3683d90ba5912ede9a21f2f7e851dc49dfebea8807576be703a6a87ca44c370db76812b9929a54fb8e2259453ccaf47da1b8ddc5b7322c20197604b9e028ec00bd7eb48012274d5b81\n\n# tcId = 143\n# using composition\nmsg = 54657374\npadding = 3035300d060960864801650304020105002424040153041f2eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 778d93be708d56defbb6dedcfec2a917a3772b2810e26143db1f9d0f26c4fbb8de8db5818aa32ebb2cdcd7960e593ace2c3c3eb682c930cbffcfa6b34438ee2a786a9707d5d10902f7f4d8fc677106275fcb6cb08f56f341e0f52af590e0bdfa2f2bf95693265e87f5046bcf3e6de34810e8eaa479f3afa2b0a98b175007c209\n\n# tcId = 144\n# trunca",
+    "te sequence\nmsg = 54657374\npadding = 3030300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e\nresult = invalid\nsig = a3e0e0cb9f7cdf8a2b95139f7c475f274bb63252385f62e66f82158f429e74d83df9ab1040717d34b6a5e009b6ac95960826ee83bb298ecf900425ff03a8f156053b57eac6086d61dd3a8085b84c83bebbe3270164e3147ddee8966a026796401fa48da70f5d949386eccad26b0016543f3f90c8ac2874100dce13f03845509c\n\n# tcId = 145\n# truncate sequence\nmsg = 54657374\npadding = 30300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 84345c9d3de7b5da2156d3669a731c4baf6726c4c231bc8bcaef950d7ac37ca8d86e9c9558404f313de3fdf09024d25491b0a933cc3958033210b1c4f90070ddd083005873762566ff2cd7f6915b4cb430f5e7e1bca8c2ec32b4ddee48aba667f9d614a27c3bb40c6cb7f0cd77d3d17257f197974d1871cc09c9583cc6af8e15\n\n# tcId = 146\n# truncate sequence\nmsg = 54657374\npadding = 3030300c0609608648016503040201050420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 227aaebca262d2189c479ab46d8715a34100bc1975c2d3991a4ade27376f068756cc9d89e903713bc28394d202d81b32126d7eb09154261841227cba6ea0a60d0ed9302f816fb4dd241dcd2d746d5c1b068c42c0b2bd567ef799cbfd0a83e8a30c4fa2f7296dceca38c36ab597ba992f658ef7955d32d38847870afbca35d836\n\n# tcId = 147\n# truncate sequence\nmsg = 54657374\npadding = 3030300c0960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a4316d438c7091b3bd5ec09aeea9095cb5046d8f08642b087c34985c34377bdafe74285d00862fba20572ce7a06dfe62b4fc08704d1cfb161cd88478e7e1c5451e0bdcce0fdd83c0e37fba5168ae03fcf4ccf60fa12c9b0acb39fe99b06933b9e0774f41151e0564ef805144c0cb76101672c287912197155d91bf036e84d1ce\n\n# tcId = 148\n# indefinite length\nmsg = 54657374\npadding = 3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000\nresult = invalid\nsig = 447904593d2796cb9851fc38f6494697af3eff1997568a320a0e6a50d62b484d7254c99cad3897f7383da73ee48ee824f7f6819c7dfce18021e7cb43b48cd77532c6af28e9adbe8005c576415c379bb7bd164a49010f0b243f60064f1986d1923146be8e8a4eceb9263445f32e49e5cef3e500467f3cfa9102b51b2772df803a\n\n# tcId = 149\n# indefinite length\nmsg = 54657374\npadding = 303330800609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 01ce4a92bfbefd1de73607085c875704ff40751537bbce8ae2df9b10db01443154f415a936b38f937f7514763e20de0c55a1b441c5b10a09c7e09a7070cbc88becfaa8d39ab1cb93f4e2d1dfbc973715b04bf5d21f2cbab061ce36c81642fea43d0b11317961886d8783c628947b8f14be0864674e84c4af5f9dbb1f95b327a1\n\n# tcId = 150\n# indefinite length with truncated delimiter\nmsg = 54657374\npadding = 3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e2500\nresult = invalid\nsig = 0781175cedf15de5b498cca16fbe6bcee460775eb1c98013719c80f30716abf0d205d40bfcae1fbe188e0ccd1bef673ecdfdb83da619ab2e4d04bcd60e31d1028d7c7cac64d403e0b79b75fc09a43ad0a54cd7e7bfab90cc5b5d0e91924dc6dcaf28478e7b1f54c3ead799d0361174a013b7e4e1eeba7dd20ad0536949beeef8\n\n# tcId = 151\n# indefinite length with truncated delimiter\nmsg = 54657374\npadding = 3032308006096086480165030402010500000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 5fa498524bd8190088734b8622061f55ee6ace39dd9a2e9ffac021e1612b42e294af4bf27c9ede0a6eee38e60fe0ebb8dbc49b2be7148b09711f9762ed4be7e02d4288e62fa7f203ae8143d3f17b288cb22386f43e6a5d84f9c1f5437add50c67846569cfb4fadaeb35e02b6910e47893890b880624349b13545a6c35d2d72d0\n\n# tcId = 152\n# indefinite length with additional element\nmsg = 54657374\npadding = 3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e2505000000\nresult = invalid\nsig = 1a095bdaa1398cd4973120d58e430f5c9a12e4a0467d3abe5d44909e9427c42a082286745b4919a955115b7e1a74389130b2ba3606772d9720fbd1b6834f46a2c582ead78ff6a3d69a6298096d83f9b1ab56aab6a5882db313d84509c0314d6278ddce652dd816915baaa274308e93e52b906c83852247a75fc3dd6e5205de8d\n\n# tcId = 153\n# indefinite length with additional element\nmsg = 54657374\npadding = 3035308006096086480165030402010500050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1967e2397ccf4ca1cd1be11a27d7a60a0a324edccd069e4278570c4c45f052b434ae4e3365565a010f26249ef439dc060cee00d3e8247a3eaaa150a1834dd622fceea6224c0ab58526388cd1d62d9e151194dcbcc3212f36fd9ccb766ef59c4f0a3489fbb60d103a27edc48748af0b6d2295d9382c6bd50d5ca089ccfff27a43\n\n# tcId = 154\n# indefinite length with truncated element\nmsg = 54657374\npadding = 3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25060811220000\nresult = invalid\nsig = 3516e125c8f18f77d801f216d334f6bc24fae8de5750c0f6f712ef405041f66a49d57907aca7bef67138bb34dd5e57db5d3de6e98d4fcc4024b18df92c51b926b60cab06ef39b4e5e18eaeabff04f68e9920dc1165bc1d128b1b1ebe6628debf9c34b936016c221ac98ccf97ddc31e3e92103f7bbff0045ae0418e7580745001\n\n# tcId = 155\n# indefinite length with truncated element\nmsg = 54657374\npadding = 30373080060960864801650304020105000608112200000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9f60d52203b96a459ace5c0022d2dc4f5ce3cf772efb615d421ba51a2dfb0e86d01e5def5da80944c315f8b0bada43d27afec520dac6ba6cc419008d60d1a334f2c17234efbcceab67087d9199781e46b79b1dc5353f120ec2c5484e64aa058636a61e6f4efab4b436e714c7a017c405b4f0d0caf9459eb19ca897f2db9c2e4a\n\n# tcId = 156\n# indefinite length with garbage\nmsg = 54657374\npadding = 3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000fe02beef\nresult = invalid\nsig = 3efc2c6198d04b0cc86d8bdae3f3ca04f0614078a3fb195fae3b2ee36fd5b1dc3f2e0fcc57f51ec9329b99479348cc3650d7a391b6821e7203fa8298d4c944d9f0a25dd3586327580e1ce3c7a4101d52e502a0de2b0a50dd1371e214eff4a9c44563d1e3e69bbcb7ed2a58e894fbe2f3a5375e5032d29d10d518d6aafcf13ef7\n\n# tcId = 157\n# indefinite length with garbage\nmsg = 54657374\npadding = 30373080060960864801650304020105000000fe02beef0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 4d8ade9eab5e5dc7bb18630ab57757edb41569ca9e9785f2b1edd281c017c05ebbe0857c4369374ccc79d8a24725563822723f0882fb83713549cdf7f5e0738b20ab3aa28868f98984046b9c4c5e75bb58d9ff194d8b9bc4383765d7b2ddad332cd5809346ef18169d22a7b2d1b4f6f8637215899e344b063d609ea484825253\n\n# tcId = 158\n# indefinite length with nonempty EOC\nmsg = 54657374\npadding = 3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250002beef\nresult = invalid\nsig = 89459f8da03d8744b6f7a6ce6723332aba211af3742058450ab2af7905d757e7b5901500b2458df59a68b68b818ee0e7bdcab6270f39ad577027258ca5bfb2d0602da91b5cadbc32181c86fdf96fa3169cf960051dd0d6302562d74ea82f462b90b7035102bc08ce51d35d404fc9d3841c3cb5d4c99f02816b8842bd93297f67\n\n# tcId = 159\n# indefinite length with nonempty EOC\nmsg = 54657374\npadding = 30353080060960864801650304020105000002beef0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 93c85d6e90100f96cde10158e25368e4f00c7870d39164c0a30a12fee1a6e9389c31be480ccff7c2ea9fda14455a4a5e4694982dfe9f2d5c6c59071da725c01e3add86648e85af4069f60a0944258e139db101799341d7e36437a411f727a693f1103b1b2f01469c26a15fa74e4ecaa09f112ff37fa61d9c3def0c8c4069fca6\n\n# tcId = 160\n# prepend empty sequence\nmsg = 54657374\npadding = 30333000300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 361f80a57ddb48796e50b3e6467cb00a9e1e193330ecd2cd6a31f649b49eac27e295450efe03e09e59f1829cc661d36b0fe904602c644aad7ec8cb2ca3099078b6d4f7b9233dc159fd1a6189451fedbd176e436f6605f2b889fc7197ebb520accd7f90e543da44453c7ba1948e83e31f5907d1989d982acbb348ca2216fe050d\n\n# tcId = 161\n# prepend empty sequence\nmsg = 54657374\npadding = 3033300f3000060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 674c01596bf71fccd36aa81b000be007f6cff713e5f6ffe58b25e790f9a1f6542ba3f68e1eeaf1bb1ac6c3d55aeaf08140f6cc3d0474f6bd87ee442568346553ceb34efb5301a4d3a5b3f28a5fb038ccfe8444524d18adfa042aa1685fc3a5f9005da5688853b86",
+    "60ba74f0e32c5be38c743b0048ca9b9fc19a35a5ff4e2c48f\n\n# tcId = 162\n# append empty sequence\nmsg = 54657374\npadding = 3033300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e253000\nresult = invalid\nsig = 07ba2b5d519b1f60dc455d6ad90b4135cb45c5da5a2a2c9b8cb954165394a0f40145ebf2b1a3ff1d47f5031d542d25041fe9b6d78aab623c40eedcd8467618168ad02af8a696573c5c63cae0b2c26583b0240848d663fdd0195322bc2c8dbf9b5db2ff9cc3e75e70480e51da0d6dd402fa87772ddef5256467205cf41a42d18a\n\n# tcId = 163\n# append empty sequence\nmsg = 54657374\npadding = 3033300f0609608648016503040201050030000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9fd302307455d4e946c1ccee65b0941c3550c823279cc52c4f29ecff72a12ac40ef6b7e37b7dd774b7735bbae89b0792908bafc47f0b0a11637042fc8541b346151bdadc3990e64b6d1807dd0e7f9266ceb3f686a9813341f835562d3c8c84868a1f98db97d3e695ce4a25fce80b828d010d6323120362ac48700abff8a7116e\n\n# tcId = 164\n# sequence of sequence\nmsg = 54657374\npadding = 30333031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 247aa1cb69ccb72795c93809d7c3a5e52de98ec5285196058a6ab18ec2f5d9fef5545ab5df923f63bd58f5f247b3d824bf161bcb56d325d4e2fc7eb3765dd81b5580422abf2a3bca8d8af94cf6a9a3133b1494f66d5cbe938d30b9308b5ce2cc6d3df37d3299b6a7616d40afcc7935d80225e1a89a7a63ebff13a66e21280a6a\n\n# tcId = 165\n# sequence of sequence\nmsg = 54657374\npadding = 3033300f300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6d6248f823020a9604bbafe5acc103d9bd020624585c95805533de22afa3b6b1b511f8805296ee4d3e96d707c91e55df8959464ddb6d6a3d62b1cb248754302b2833406300f4975d913f1b90f95e3673e2c57d6181d73a360e8c818b8a9dd1e7a4fdcd68683f11dd47c2d395f20b0ce9c59eede6ae6aa58a707c4ea8d1a73a9a\n\n# tcId = 166\n# truncated sequence\nmsg = 54657374\npadding = 300f300d06096086480165030402010500\nresult = invalid\nsig = 941d41c39aa8bf3879d16cb78c5486589e7b97e56a0249c4f613060d26b786598fd2d34bc4e99cc8888137975937307d6a328059a09f3b994bf955c7de4a2841a0d10bbbebb2db3b332656f258c66c8d50cf9155ba94e1cb21a78e6147af76958ddd997665b6d8f67ea8f5e1fdbebd7df635f20494489c895d33ae4c7f248bad\n\n# tcId = 167\n# repeat element in sequence\nmsg = 54657374\npadding = 3053300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = a32afeafa2c3b58bef55776ef6daaac6647485dde100d968e0449d1a2d5a121807ca2fdd70e2e9cf524cae4f263e11837000df85f0886b718ff45cd316c8d031b746dabfb956dd6118a37e0dabcda1ce9c728afd9a5f2448f5b15d27982218888d457752485119f53219315bf63141c9c0802327226a096403ece022cb27c0df\n\n# tcId = 168\n# removing oid\nmsg = 54657374\npadding = 3026300205000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6098a732419cd71887548ccf4fbf3edeaf9fe7b220bd747ae1b995b746de1f4d7b48c73ddb71903f50ccf7c93be9c8219de5a75ecc302ab50356069dfaf642f32ec580a283519fbcf04784860b0660174dfb7e1e527bb320960bde8f6c605bc3c1055b878d2adbb44e1b6c41add15cb603345c4fe2d1c0158fa03f21b4c015e0\n\n# tcId = 169\n# appending 0's to oid\nmsg = 54657374\npadding = 3033300f060b608648016503040201000005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 2f08cdca4d621007acd15b1f4e3c39882a8aef706878e8f101e7fb250798a3528dcbf4d3327ceb0754a2ca0850794094dde8a875cb947d624d386ddb9593259c53ef2311260ac3c9cd1277050ec98d105188f590f198ba908ddcf3f9ed18f5a96cc6b353fadde007658f87ff4c201db7621d69c8278305f3e9f2041a2dddfad0\n\n# tcId = 170\n# prepending 0's to oid\nmsg = 54657374\npadding = 3033300f060b000060864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 10078ea73abb9bbb879c9d8139b1758170fb73b34f39cdc83e6a725439e315a5cba4421fe15e8c80d8fda0a9aba9a12c23aab41f7328d4191e6c7c3a53a505ab518dce078439347945671ab06a2cd5375457b3bf181c40a1a4be1ea8305c9a401488532c7cdc1150fb9c46a2e846ce4a2fd9ee863d0b0b8af7f10360acc47f10\n\n# tcId = 171\n# Replacing oid with NULL\nmsg = 54657374\npadding = 30283004050005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 783575badcdfbe1a4c1483938e7de2e42908fda1bed644ee99505cae3aae5aa78819deed857176764586ac8c5c0a3febf1e344d7e2eabe062c688e4caa499709fd8db5f389d92e60388d8e61af7b0789434f3c07b06cc4c89b88923c4d4fc81fc36b0d43d71327e596088844862f95b8f80bea52465533a9e04a2457bb7bba51\n\n# tcId = 172\n# dropping value of oid\nmsg = 54657374\npadding = 30283004060005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 69a74665f61787b54b522937c534e95e91917f5dd4fa9e3472add6e21dc033a275408f35c71ff6cc029e25986fe6dced8ed053a9040aac32fc444e9252d2bd4081fe3e51ace15a0f694c0b8953dd6afa7f8cac67f4d8e17513b415c14b439a634274893885907e2ea428a6e242154a58a031fedae31c73df7cd4e2f5591496cb\n\n# tcId = 173\n# modify first byte of oid\nmsg = 54657374\npadding = 3031300d060962864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 1f581f5e39f76f319d933a82e44fc977bead2796fea24fe0546f9c4727d3e2502b532a3be241a0a97238f255e3290a0ecca458961d791e12e2865d96bae663695f5e34cb8c483a7842f2c7cde241c108d1e0a6c85d7b768753016a573035a651dcd1326aab662812262aa73945bd0b47224a66b6ce2b97e1800ce93c366ca16e\n\n# tcId = 174\n# modify last byte of oid\nmsg = 54657374\npadding = 3031300d060960864801650304028105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 36e0f5972a6be797cbe5ce66f3b16243138a219b50434430d16a85df61458f57d51fd72b1c9d8364c4a277ca51eebb550a55969270137e0970b10faa6dc95e96a510f647b7967bad5d6b6689c8a470302b70ae2eae6e95099523b66b6838e4183b2099d20c6f4dc24f7b9acb0e9a387ea8c030ebcb6bf02b9caa8afa07596d99\n\n# tcId = 175\n# truncate oid\nmsg = 54657374\npadding = 3030300c0608608648016503040205000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 7b2f6581fb0b4f913ed38c0ea20dff2bd60723f2bc3f1022ceb946e48adb75b1e0be031dd8b706d82967f93c6b6ba496d8c4b49aea9970e139b18fefdce30a4ec04f77625eaca4c7d1265cebbbcf53b63a113cf06bc50e4a416a771cd28785a0075631a3ef60c9212e224aaa063e7d8109c27e248e6422b26acd02ec012b7bf3\n\n# tcId = 176\n# truncate oid\nmsg = 54657374\npadding = 3030300c0608864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 4dc9e86e076a395b530868d9fec9f858bd6e8c10cc1e32cae7653abb3f23991c677e970ee468c7f35022f3241f5d35673a8cf4ce9134b1e63a994dc7abc8cf4b9dbbb126b314312539931a0163c911f0234f5c3f683c9376f2ecaa3294d71a1274f6c63b84ea8faf826eacb05e4fa5459b787ff384b2cfe0f1f4c755f32b5c50\n\n# tcId = 177\n# wrong oid\nmsg = 54657374\npadding = 3032300e060a3262306530333032316105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 760b8204d02a9fc5e9fdca0355d28f7d27ad27748e4c073496760f43231d1e3a818ebb53d1a071119864af412f491f56b7afd9f4690bcc279d5ea529ee91ffb99f5ad4c8f1c5caa23c3bc5dc4ee2f33fdcfde84f8ff4356a94df78feca2f1636b9cdb92db4fb9684a287766aded89818041004407358185508f3d340639f4f32\n\n# tcId = 178\n# wrong oid\nmsg = 54657374\npadding = 303a3016061236303836343830313635303330343032303105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 5f29f2ded51871e2cdcf743ec8da102a4612babbc8c994fce8d38eac83b1cba5ef060ea42a48b342e602a16f679d4fd0167e3044b252c8afe5b8b0635081ba0351e19971bc52df431140ea4251519f1ba889e0f0141dc789db0e1906376a75131a61f57b866f2882abe70a81f4d0c65fd600799d1f6c71ca2f2e95188abce526\n\n# tcId = 179\n# longer oid\nmsg = 54657374\npadding = 303c30180614363038363438303136353033303430323031303105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9dd00e8991844457b0580e3b3abd6f6adac8d016521df40f972c67f9f8420af2b175c6d99be923e5a320baee434738200e8a111483b6f274583e396112c3ecff11f53bee290a0c58ce0c92a061871f2c9c54631f39793cb8a4dbdf069fa65412f760efb58f89958b7028e6aaedf11d8ccb5371fabd3a2208243af19e04a5363a\n\n# tcId = 180\n# oid with modified node\nmsg = 54657374\npadding = 303a3016061236303836343830313635303330343032313105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d6822",
+    "99550d7a6e0f345e25\nresult = invalid\nsig = 43ea91ce7612e0e151d4526afd6146fafba081fc5ef78d50a8ccfa9079fe21e3270d4b9c884130bfe9fa86577ea505c19193801ae37f03cd3021887dca580f9be60ffeceab0e84747a427a2a6d0d6f2e2c43417e2a449270f6b545e3e149ab09efb158acc015b99277a79286790ca27d33e8f53a7c72f0bbce5d774fd7da3558\n\n# tcId = 181\n# oid with modified node\nmsg = 54657374\npadding = 3042301e061a363038363438303136353033303430323838383038303830303105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 24bf2bfcbd891a7b7dcdbd44a2d38aaba2e28195f0b955073bd51ee4824a55b84cc772501abb75bb0b6087415e7755ed101eb08d892a93e52206fe7d775a710aae5ef1cc0687613c1601cc9c33f0865bc67bc7676e911c3991e7bd08cace5d5b12c5ca2e6120d70fcb626d465c10aac07f884b024f9051d6885afd3c7fbc4e12\n\n# tcId = 182\n# large integer in oid\nmsg = 54657374\npadding = 304c3028062436303836343830313635303330343032383238303830383038303830383038303830303105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 60e4e065e10cdb25b89c778724289fd61c73ccde8d66efbfdc77d05fa5e8839d821639c6a5f303e35fad3fa8c4716f207ba395637d46ecadb6dcadbe28f3a065c999e380966da63bb5c92ec5283877a514c33ae97197130bb2a7a5c0d805113805ca33afd886bd63966de732ac87b7d22675468e5123e611985c4473a8116234\n\n# tcId = 183\n# oid with invalid node\nmsg = 54657374\npadding = 303d3019061536303836343830313635303330343032303165303305000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0704bc9e3679a62b6d07da2ea8c5597693987d710c98704768f60259e9697b4e8dcc84a5cefd53b45844134f167830ca5c6cf572923b3543f6ddcf274ae14e3b191fd7934db877439e0f95b5e3c8f04eb3aa2b4682cfe213b3756ec5b349eb295e8112e017869163c0312d6903646fbf9cb692d2311240c2cb968ca95d431d94\n\n# tcId = 184\n# oid with invalid node\nmsg = 54657374\npadding = 3032300e060a6080864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 6674ec2352f0d3e90f4b72086f39815db11b056babc57644c8a703014f439baa46e8ed961714d5c7b5f0ec97ba3fe5ab867c16b7e1de089868dcb195fc20cc42fa1b3d3060f50cca77281bb6be18d65a1ee8e5a381e21e7f02e819752b71327a28719c7284f6425bc9241abb08d000faf58d48848d7f4b8d68b28266e663f36b\n\n# tcId = 185\n# appending 0's to null\nmsg = 54657374\npadding = 3033300f0609608648016503040201050200000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 8d18a5e0a81522b56eb9e4f43bee15475cdfc7881006150cc230e76028283375a13425fe5a106f2626346a65817010a5510b157b234a16fcb9426909a524a288161537be91ab13033ed296f5f8c1e5c3bdb963f12d7b5eded46106f7c2dc1ae9c451415303cb7e6a3f59809b922183b9638197909d5730e5b1e89705fbbe8464\n\n# tcId = 186\n# composed null\nmsg = 54657374\npadding = 3037301306096086480165030402012580aa00bb0000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 80c9add3930a98b726fe543b4350c593d28e77f9f53f1ea04c2bfca30f157309eeb41e5a675bc0045823df8e99f2e55d2567f4b78e36eb8af1b45c50e33e6634dcfdc4094407b760d8b60f76995edd05920a6a89e22168a788557bfc7cf01d47d21448a65f9766bb217bcac1124020b6b062fd0e7bbe3e142ec88652eb617513\n\n# tcId = 187\n# appending 0's to digest\nmsg = 54657374\npadding = 3033300d060960864801650304020105000422532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000\nresult = invalid\nsig = 51640e26e8764936a7d9d709b3e0f52a5f1843453f2c6107a8e7fd6dad8b1c02ecc71659cd4134be952c03ee83c190bea4ea7260e5472c3cdf87b6ad45b5c974957ee9b4bf6f30152c2d939f722cff32e5482db96f3e283532b96716d3624daf16767e0ecdad16c97e56e4e076d64b92af329d2d6a2f8d14b59d1b84853659ab\n\n# tcId = 188\n# prepending 0's to digest\nmsg = 54657374\npadding = 3033300d0609608648016503040201050004220000532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 9080bd4ac03b7ecedd45f8165360d4848bdfe1c9212ee1a4debc1aa92886cd7947a2df5435789bbb0b3e8f78815aac80e2cff14e1939e9ec32f42e7c29ed4029c88cafb64e8523dc85217c40d1bba900468a69c5bd4d12ac67401698fbffaa5159907ad459d3843e12487b3b2315c585881bc42e45543f7cf25110ab7e0a19f4\n\n# tcId = 189\n# Replacing digest with NULL\nmsg = 54657374\npadding = 3011300d060960864801650304020105000500\nresult = invalid\nsig = aad9443d445aff562925a33c0abb7bca890d279d2934efd8ce2e648f88b08c589cdfc751e9668bd63d2bb97b652821ab4ac0a85c97c3087dc139250e1a0c1e31ac7db7cda5805532c5b32fd302063e02a190fef7594b2fbce7fb364ea6d7eec1f2823e8b2304cd55f062f61f6528a1f0702dcd1e9a66b5b807a44b76670f3935\n\n# tcId = 190\n# dropping value of digest\nmsg = 54657374\npadding = 3011300d060960864801650304020105000400\nresult = invalid\nsig = 5f66f645307346216d3ba9c3d8b29e96270cb3b2e686a676fe975c10b8c26fda8d8eb172628bb3dcd726160c13ab8c5afb1d6ae943ea4c18d00465d97c0d2bcc27a63c18457ff8d6e3f5ba373b4be7b6f4c610f83578613f4fe41a40d86230afce0bb8d4496425a5bf0a80c6b1b1e2a981cd44c31a9aa603748c3d2fd2b85478\n\n# tcId = 191\n# modify first byte of digest\nmsg = 54657374\npadding = 3031300d060960864801650304020105000420512eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 0f7ecb8d1f49a6af74361f72d7f552047611fddb9209a54ff0beec9f6494087067fbb3b8a46eaae41208b7a2725921e1a1408a82aab52b77ca3c6774e17f2eb1cc77d239adc23d7860dcc30602fa625eb5e54626d49fa1bccc8402463ac7ff7ffce3b723b6f0e541028a76775de752b56e95df62fe8eee6b5f5ae95240e8fced\n\n# tcId = 192\n# modify last byte of digest\nmsg = 54657374\npadding = 3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345ea5\nresult = invalid\nsig = 542f314c7986948793e53fa9ecca03cacac17d4c9e69ae3d71e57c36ddb293cd07397f7aa48d4ad1a1c59e61f12d766754eb2b3691c4c703446fa072fb709722ce0db92c804e920f8401fea399c5a72f9d99807b8063487bd57d717563eaecdb313bd6d479e2e720e5773a247b5e78a2534ae19c8970075f5114a347a85a7162\n\n# tcId = 193\n# truncate digest\nmsg = 54657374\npadding = 3030300d06096086480165030402010500041f532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e\nresult = invalid\nsig = 888cd9bdece5ceeef0fea92727ef1a1d996960f3f551bf108682f8103590323669ba1ab48becd14a49b87a900434d0ca7670d094b08b2f851834757bef580d2d3278d85b88036ea90d4c2a673dfafeb0c3701332c2b77493110d9b28dade7e985ec27240c90498372fc00ac8e0e5547e4d59cdd19022b8d961f3b63630b5448d\n\n# tcId = 194\n# truncate digest\nmsg = 54657374\npadding = 3030300d06096086480165030402010500041f2eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 762c745262627d0df634d6cce41fb8af3cb855fc2d974b8093b035e9d11e510b9b7e7d61581b8f262fc1c4b8a6da3f6d609512e32f16416c7449c623c1773417032ddf2a559d7eb3af129fd02f83b5e35f5b5c065b1e0bc6481f38b6361f0b018b5e7166e8e67dddcf1550222f125efde241a27b0e7f670d15346dde082a8c4e\n\n# tcId = 195\n# wrong hash in padding\nmsg = 54657374\npadding = 3030300c06082a864886f70d020505000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 27830ed405bc9d34009ec6258b766100273b4dcf2a9b3cf6ae31029837c6e24cf6e819734c1fd10c2c23db34d227d98d3498850f083ecd78b648baccfd4647a572607dedbc2b8ab7a595c0594ece904380e7f395ba4840a81367e99275cde1064fc6f7fbd564c5f26ddd0103991ae8262eaf16623685b43f77ea7a05d080166a\n\n# tcId = 196\n# wrong hash in padding\nmsg = 54657374\npadding = 302d300906052b0e03021a05000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 8bbc9167821885a728260bf9831120ecc42c14b2b07854169c86421146367d1bec66d8c3daadd115f16a29754e7fa8fb70a63966f7838484615d4364311b6c3f6e73ecd8ced0adb52db2c374297119f5fe571bd5396529d13b7225e87db5b5b0df38e4c56f2349071b09ff5c1ded919b398d4aff38c6ae29af6f6ff99d3e8836\n\n# tcId = 197\n# wrong hash in padding\nmsg = 54657374\npadding = 3031300d060960864801650304020205000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 4cdfa8cd615bcdefa253d75212e4ed0a1fd60841656c6a749690cb0c6c3cd723b518560c3b11a734010acf6e38f0526338351d9b58351826b360c851d3c86429f38eb689e8555aa2a23157e197faebdd29bc49f84c10dacca655cd5fa50fdec86a72f0ff1c7f8feeec31fee188fbfa72776a7b5cdae1c1506830bd3a00181b13\n\n# tcId = 198\n# wrong hash in padding\nmsg = 54657374\npadding = 3031300d060960864801650304020305000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25\nresult = invalid\nsig = 024746d8dd71ecfe33cf0ad7ab8ddab9dfeb5740ec47b8ddd668f07b8f7610f726692404ac14c3a1947ff4246fe0a9e216131489125e71df68d60930fa",
+    "c06a20e948a3e4948aff5e3f9772155f8bd6772b1cefd8180ae719afc061e2f0d68a69769930b8d90ca4ecd6c7b20d04f0cc939502e698ad1c500403763c0205f6870d\n\n# tcId = 199\n# wrong hash in signature\nmsg = 54657374\npadding = 3020300c06082a864886f70d0205050004100cbc6611f5540bd0809a388dc95a615b\nresult = invalid\nsig = 3a152ced8b5e0efa33cd57d4afe67f31ed3b9fb22e7b0ff32795cd9510374fa09fc63a3366465f83ba4d44e36418a5c1d171b6ca05d8c74a242983d5e5912cd05bdbd75fcfd5b4eda7cadab21e6dcefca8e2ab7303871ef360beff45564a01bdc887d9e849e407c6aa5b12055647f6c9df49758d1272f7cb476f51088e21f246\n\n# tcId = 200\n# wrong hash in signature\nmsg = 54657374\npadding = 3021300906052b0e03021a05000414640ab2bae07bedc4c163f679a746f7ab7fb5d1fa\nresult = invalid\nsig = 3765b8800e6ccf29544d834034e39f8fe7a2e6dfd7e6b4a8f81df091bbfd7aa17edfa6005024fe04d35c340a2215fd3f1cf4b4dfdd3c8ad09e6df2c2256c7541e19c2e80051d1ef5df5c384bfb6be88c4415eb2740db2d9fb3214890a8a0f19146dfb7897bacc02700a89139dc8fb21b2a7bbfbd43604d7f384cc00aecefb4ef\n\n# tcId = 201\n# wrong hash in signature\nmsg = 54657374\npadding = 3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3\nresult = invalid\nsig = 5c5b097c21ac2eb156de39d1eaebe3b96082f54b0171469a94edf7d2027ebfdebc0837f766cfefec577e7b797c7a082df2ecc826e55d39927b01c2da26f8f6814ec993e3b93ee87a3418322b65ac652b3bba6d34373a13fd40b66be489938fadf67bbda762f6ee09a1ddc41382051d4a9a946e0df832bc65b7d5dd58cc5a402b\n\n# tcId = 202\n# wrong hash in signature\nmsg = 54657374\npadding = 3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31\nresult = invalid\nsig = 0ede4ac9ffcb6d3d42c75cf73303a28ba6089941f68dcf392a75b071f6c149a109cab95b80a679ca3b29ae44e51c18a2db4c72211ae6b959c7f22e854c45f20f5560446f33be4819f08d981d2fb176d48039ac4acd28127d593f9e219ad40e2a5ee911b334b3b8bb290f2327524e3faae2c028745e03d58882bfe503c4ff04b2\n\n# tcId = 203\n# using PKCS#1 encryption padding\nmsg = 54657374\npadding = 0002ff...00<asn wrapped hash>\nresult = invalid\nsig = 6c0b3edf5f6e5d3f07057d0b752e89cfdd1c289ad18a0ba94670cd36547734e2c7bb32dd49709f0f7149944c450c23b7f2d360e3602cad5ddff7fd9d711eef6dd4c32e66c4433f041fffefe112024a655bc5bacbd0914bbb2b2a41a91b1293fe9478ddca926a13e6131cc5e9b70625eac1e533ce8171a2dc7b2c4a490e966445\n\n# tcId = 204\n# using PKCS#1 encryption padding\nmsg = 54657374\npadding = 0002ff...00<hash>\nresult = invalid\nsig = 1acce04e348a5c8377c54d8ddd8ec2d8c5cb9b195863c32eb716745f3462b5f249b612aefb31ba484949d0a0cb5cb8e1f06c1cec58fe5ffff6ba796218c46c3e527c7ab0c4276ccbafd133812faec33721a08542e7e3a34449bebbb28bd0f28994c6801ba5c971991004e31de8f728f6bc37a4ec7b049c1f2dc64d4be9415462\n\n# tcId = 205\n# invalid PKCS#1 signature padding\nmsg = 54657374\npadding = 0001ff...ee00\nresult = invalid\nsig = 61a4066d0b64964100ecf583325cad10b53912aba1bf3606720d2bdd8e21120bb0b5e4323987d96039819ccce0e5e90854bc0e5c239ab198f75b00355a04e4eb1f855f76697cd65732820575306eb9323954bc5913568a7278fcdeff8e8acad4481e3559f8c44a0be3bc02bae437c3146e4516632b3fe788c3a0e44171155728\n\n# tcId = 206\n# PKCS#1 padding too short\nmsg = 54657374\npadding = 000001ff...\nresult = invalid\nsig = 979a313677883b0980997f1cb525f43401739945860149dcad80f602df8abed4fd85bcd6e174d9183a5a44008fd77b5a5abcffbcfd4f47ccd2dabef963d9b228310d99000ed0cebbf61438cbe586985bcffb3923a8467a97ae791d0b04925c0894b5a41583d6de72d4369f481f66abce41a577fb128fc0b0aeec746ec089d834\n\n# tcId = 207\n# CVE-2017-11185\nmsg = 54657374\npadding = n\nresult = invalid\nsig = ab9014dc47d44b6d260fc1fef9ab022042fd9566e9d7b60c54100cb6e1d4edc98590467d0502c17fce69d00ac5efb40b2cb167d8a44ab93d73c4d0f109fb5a26c2f8823236ff517cf84412e173679cfae42e043b6fec81f9d984b562517e6febe1f72295dbc3fdfc19d3240aa75515563f31dad83563f3a315acf9a0b351a23f\n\n# tcId = 208\n# invalid length\nmsg = 54657374\npadding = 2 bytes too long\nresult = invalid\nsig = ab9014dc47d44b6d260fc1fef9ab022042fd9566e9d7b60c54100cb6e1d4edc98590467d0502c17fce69d00ac5efb40b2cb167d8a44ab93d73c4d0f109fb5a26c2f8823236ff517cf84412e173679cfae42e043b6fec81f9d984b562517e6febe1f72295dbc3fdfc19d3240aa75515563f31dad83563f3a315acf9a0b351a23f0000\n\n# tcId = 209\n# empty signature\nmsg = 54657374\npadding = \nresult = invalid\nsig = \n\n# tcId = 210\n# 0\nmsg = 54657374\npadding = \nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 211\n# 1\nmsg = 54657374\npadding = \nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 212\n# 2\nmsg = 54657374\npadding = \nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 213\n# n-1\nmsg = 54657374\npadding = \nresult = invalid\nsig = ab9014dc47d44b6d260fc1fef9ab022042fd9566e9d7b60c54100cb6e1d4edc98590467d0502c17fce69d00ac5efb40b2cb167d8a44ab93d73c4d0f109fb5a26c2f8823236ff517cf84412e173679cfae42e043b6fec81f9d984b562517e6febe1f72295dbc3fdfc19d3240aa75515563f31dad83563f3a315acf9a0b351a23e\n\n# tcId = 214\n# n+1\nmsg = 54657374\npadding = \nresult = invalid\nsig = ab9014dc47d44b6d260fc1fef9ab022042fd9566e9d7b60c54100cb6e1d4edc98590467d0502c17fce69d00ac5efb40b2cb167d8a44ab93d73c4d0f109fb5a26c2f8823236ff517cf84412e173679cfae42e043b6fec81f9d984b562517e6febe1f72295dbc3fdfc19d3240aa75515563f31dad83563f3a315acf9a0b351a240\n\n# tcId = 215\n# -1\nmsg = 54657374\npadding = \nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n[e = 10001]\n[keyAsn = 308189028181009e62337ef7d4fabec2561bb45a18a362022b23666571bbc762c1c717a14a46d8f58119072aa26245e71fc6945540335163798fcbdea04b3104ee23f2c3874bbfb3e7e0c1ba5f1fca909265274414db6957a5eb668e0e36a388784355d528e51a6a4a9a9c6b6ab912812a268dac9dcacf1c13507768e63b1f82f8af29c3786a170203010001]\n[keyDer = 30819f300d06092a864886f70d010101050003818d00308189028181009e62337ef7d4fabec2561bb45a18a362022b23666571bbc762c1c717a14a46d8f58119072aa26245e71fc6945540335163798fcbdea04b3104ee23f2c3874bbfb3e7e0c1ba5f1fca909265274414db6957a5eb668e0e36a388784355d528e51a6a4a9a9c6b6ab912812a268dac9dcacf1c13507768e63b1f82f8af29c3786a170203010001]\n[keysize = 1024]\n[n = 09e62337ef7d4fabec2561bb45a18a362022b23666571bbc762c1c717a14a46d8f58119072aa26245e71fc6945540335163798fcbdea04b3104ee23f2c3874bbfb3e7e0c1ba5f1fca909265274414db6957a5eb668e0e36a388784355d528e51a6a4a9a9c6b6ab912812a268dac9dcacf1c13507768e63b1f82f8af29c3786a17]\n[sha = SHA-1]\n\n# tcId = 216\n# Legacy:missing NULL\nmsg = 48656c6c6f\npadding = 301f300706052b0e03021a0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = acceptable\nsig = 707e19417b5b3cb975795e5d53cb2db69bf80699e69114955aea5ff45755eb365fd34a18290db1975c32388eaed0d446b44138bf18b012f7da3ed067de6e444a5a66a35633c875254ed3d1b120ce657873e888af703e649076b368e90d761cb3e14cf79099026cb4a4c1f20c771c1d7544fccebd6d642506146e3d28acb6cf6b\n# Some legacy implementation of RSA PKCS#1 signatures did omit the parameter\n# field instead of using an ASN NULL. Some libraries still accept these legacy\n# signatures. This test vector contains such a legacy signature\n\n# tcId = 217\n# valid\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = valid\nsig = 8aa2c8a167fa230a1d1ea6bf5286d3ba6e675ca57cc5ca8cb26fdf465810c19af36cbdf843319f7af9b2954f372ef16891918aaa2ab64dbd1cd0ea54351ff2b3437fae5ec947971662c1f75ef6892b6899b77343fe87665c5b74df322b59f017e5488a67ec836ccc3f873788d60992d43f64b736507c455b649119373ba1aea4\n\n# tcId = 218\n# long form encoding of length\nmsg = 48656c6c6f\n",
+    "padding = 308121300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5b4cb0b22300dc4913e7c1cb82e86663462e4b30d03053f697d59252e01339cd230b72afc8623e185db939108f3a47814f418b5411dbd3365d45b609f93b1f4fa10b7b908430a9f7d97037161cbeb2a1af0223b6657179a9bd2efa8c40a2f57b20755042b401e81d3fa3d4faf69d05cfdf3b7c3d5d3cce8fe036e9899db34de5\n\n# tcId = 219\n# long form encoding of length\nmsg = 48656c6c6f\npadding = 302230810906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 264bb84974efc808ded6a363c50bba6c1ad8acea4d26f86afb81839d8ecfe7041db3ace271f308399bf3bd2effd70c3b17e968f084867a0d95299a8dd0bc27e516925d3b8c0e748d5f91dfc87eebc383ecfdf6bf46cd28912bd4cfb9949f7660f1dbdba527db82cfca5aad1f99cebb1d7b554d4038238a4755b25c2348397e2f\n\n# tcId = 220\n# long form encoding of length\nmsg = 48656c6c6f\npadding = 3022300a0681052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 23fad8546f338cec2aa7fd93387b8f1e735e3fc3337350276efad8950161e6cbc7dfd28c7272be65c9dd469cbfc8ddeb6945880234a60c0778d5e8f185b95b0caeda346ce5b8231f94c076d056e2aa7245072ee055f37e7392ad4c158dab92263e4803d82939c7ede603c3467c14c61a5743df002358cc63eab3648d8ca8ec2a\n\n# tcId = 221\n# long form encoding of length\nmsg = 48656c6c6f\npadding = 3022300a06052b0e03021a0581000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 64513a079e0bd31939110d49d36101fd2a49c6d940637b9900fd317a64d174ef64acea808329b700954471c8282d1f246ca3172481fddfda77bbe24deb8d3d20200e78ee9cfbd97b063c1da700a50f635cc32ed74efc59407b8af422e01f728997c9a2dd6f8fd0fc89c9c5a9b0a2038cb006f3e8a8bd86ec129db6ae95b18ffd\n\n# tcId = 222\n# long form encoding of length\nmsg = 48656c6c6f\npadding = 3022300906052b0e03021a0500048114f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 79547cc01aba5ccca5e0337304e02c48455df528e61037516262e151d4378f3447a730b894d63974c3df0cecd708bffd53742c908b718ea1e09786f00b58f434a10e5014fc5ee96c8c87aa0cd73348a470c369b71bee3d78e3b7a640d605736f3b3691253d853473e34e0eee9533abf655e0e490744a354309c3639ca5e0e084\n\n# tcId = 223\n# length contains leading 0\nmsg = 48656c6c6f\npadding = 30820021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6dde5d8a638e4cda4551a295aa037c0db901578d70b6943d58f842e2b334822e986506768fbd73bd46e62f11acc308eb9b0f9fc8831729fdf630bb0b9ac8a9ce484e1fdf5d1099659ff452c132096d085b624e521ec0cd76449f50e57fa39adfb91d1c4cad4b9651cfda905689c24b3118970f78ca6240b48cba83d19da8ae91\n\n# tcId = 224\n# length contains leading 0\nmsg = 48656c6c6f\npadding = 30233082000906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 28a4c4957ee24b104aa7f68d8d7fe5275abfe1c449f6e2d41d2741081e4e0248ff40acbfe0bf7652af44f4f369de583c355af6a5af87500330710b976f1bd3a705c216255d71589c341b237024337d38161946dd0ee3fc822b06c96775c6be57a906eb7c6178751537bb181e47acae959862253c34e979c3def80038488d0482\n\n# tcId = 225\n# length contains leading 0\nmsg = 48656c6c6f\npadding = 3023300b068200052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 08cc5258ab3d68d796e5dd868d676ce9c2774d1eb6a16b4bbf0acaa0baf9d812ed0138a17ab8a64dbb913e33a88a388883889bfde6922cca5ca98d5fd1ac13fa87eb1b5701cb4ef5271057b39cceafa0f8509f9151383058a1349460db1895b3d7fbc043771ebd48538e9c208c34719f21b2d60dfb7a06a3ef42d1f2a90826b8\n\n# tcId = 226\n# length contains leading 0\nmsg = 48656c6c6f\npadding = 3023300b06052b0e03021a058200000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 118bdd711ce909f3e6894be2c5f7fbd21b6e542205e63447848bd6be079874f2858e9640ca8723cd4f73d1d272780aef52200d991cf620f7345f20ed4b5c978f93dfa495a24680c762ff1f1c4c3d0513b818b2cdedc63cacaa76af3b4672e0c3eae523b410d7c03ce4b9d2f65f92e580e4e7f04d3f62047db3968e33f0f1f40c\n\n# tcId = 227\n# length contains leading 0\nmsg = 48656c6c6f\npadding = 3023300906052b0e03021a050004820014f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7c2ddfeb9611939302c4791b44d2eaec63ba700853c84c928e11f50a5fb15c47a2f0ad91962aa88e944c0a655db19ea4bda87e386ae820fea49725c75e13b26a7c7d9dc63e353259d318246a3ec3c4b7d2ff8e6af164fe73ef35eeb76e921a523f48db83d541b3abca995d807968cb960fe192ffc0501a0840a1f5bf1b332123\n\n# tcId = 228\n# wrong length\nmsg = 48656c6c6f\npadding = 3022300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5065698891c73f55ade9d829053b14086b977af8f8ddcb9d2b5d236bced0821b00cca31a26b43a838ed36f96d823205fe79644ab4d431d2072f823bf9dd60bde8c2af3e2f4af0fcd734f285c0f8e0b9e5cfb5b7cf5d4131ad2122862c7bb6d9a9d6a7ec674703c79e4712ea84bc178da4bbf08355b2c248a5887a9b87702f70d\n\n# tcId = 229\n# wrong length\nmsg = 48656c6c6f\npadding = 3020300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 33ab162433e5c9677c2ef33d2949c64167afc165223a79ea96bc1096e0654db370f84b30f3ae03da910e6343fdc9f7413e9422f76dfe4287dfaf7250567076a4b2cba812b784410ff19f412df89f1af8b9a5ea4809b7f60b8b5b4063d07dd17311b5b0b75599ea8988c605b06cee2b6bcf79f20ad7c4bd67cf179511ceb9fb21\n\n# tcId = 230\n# wrong length\nmsg = 48656c6c6f\npadding = 3021300a06052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7cb2655e9bc1e633b46656d28db5bf457cfd6a6557ebe511a694ecd36987fcf94a6de7a3f73d47777990697b5663fe59b838fc0a7fcc0604a08e951fb1ef4dcdae0bc09c6733815a65ed465e86e98bd08ccce8df0a7822f1dd74fd8ff7add8314387ed2bb5474c7c282333bcc962af3f0506a15971f30967f49bbb22cf3e99d4\n\n# tcId = 231\n# wrong length\nmsg = 48656c6c6f\npadding = 3021300806052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5e147003f7061b46a6046dc91374cbb2f1113ddb56dee64f203a513b421330655c123fc2c51a79ce70fef2884b6b444ff8639d5448a0781f8f0503009cac89a58fa0bf73b698011d80986379dfa0b8923591f2c310cdea8982f8b87dffc4ce27e5a1a75f44c40e95898d0ae12cabb94fff41116f1d96dfc8fb5834965b750cbc\n\n# tcId = 232\n# wrong length\nmsg = 48656c6c6f\npadding = 3021300906062b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8cf10e501268713c12ae5c26c5982c082a912ba2d22501a12438118067ac19957b0191498fb2113d1ca2db5fad32761f282b4c7684827b35a1709297c9bded1fe61a4e1963d32aaf4cd0ba5c51ad9c1aa3494c47afca86a264293d9a940310d6c1d8bc3e51ea3e12488e87f624e738f3568b21ab5f7a8b299b5eb0d7147ca794\n\n# tcId = 233\n# wrong length\nmsg = 48656c6c6f\npadding = 3021300906042b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8ee3b703c37759112397fbc6410d9c95a93084f544a26756071b298ba563b2c22962befb038d995912ef5b48f5ffb9d187be72f835d0afa764eaaaffa2cf42b0918e8b364bdef42a482e571cb949342654c91e3012776620cdb590323326e2861d1abdae6ea2fae95d7304b25255aae9d7309324bfb6b47cc2555e5191e95a79\n\n# tcId = 234\n# wrong length\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05010414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7ab24ebda94da9c07a8742a96884e7006e36c15fadc0d41721d8192581ace97b040af10f79bdf1041ce48bfbdfe0e2807042ef91efb0136acd592346bc8c572bd0da5f6400406971b8d84b021c0550e32b9ae8cc4481b8979979170d7690158dc95f2fea00e05566a2369a3eb34794cfa6792128d72774eb0fb504490a5e9484\n\n# tcId = 235\n# wrong length\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000415f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 49877ff5a25db5d9736e7c0198f7908dd0eaf2f2ac754d6456073df7a1b8d87f49fe9ed7caac03e92cf8bf253626c2ec049c4dd4615bacc5a617ffd874934ad868db7c5d7db8e37bddaa22b557b49bf8ee769bcd0d0faee45adaeca042fdfabe0864256a64389208ea8a825d373c439e220a60fb30ddf96427741e5771b89200\n\n# tcId = 236\n# wrong length\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000413f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6acf67de89d21ac6c0e0360dc872eabd3d9f315a46921fbc835391f4e5df2d5a73826cccc3ae099c76c5e0b5dcf13f76316cad72f2715be8927fe83273cb5b10dce6b4a58236e90028146519ee975599e2cfce518be7e20701b82d24e1448654a89a52cdad64c33ef916e1d3a40eaeb07a7b1509a151ca7a8c3f37b734dbcdd3\n\n# tcId = 237\n# uint32 overflow in length\nmsg = 48656c6c6f\npadding = 30850100000021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8291239e82027853aad5ec6526dc14eb2e4d6f62459cec895e311302e531a472dc720a55f01089ad3ff96608cd0804dcc4816441f92e77b9dc59d85a7b750cef32013fc888ce4bab028152ed07d31e1232cfbdcdbf096",
+    "cfbbed22be93a8cca41ffd69575c3e47aa6f3c4bb895690622ad253c60db7fad789b3508252120f2905\n\n# tcId = 238\n# uint32 overflow in length\nmsg = 48656c6c6f\npadding = 30263085010000000906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 0c0a60f4426a0922599d12bf623821ef3a69e88b8f3df39c998b91951bf8fd9f12f379db75bd051943076b73f145f6de4e82c050bdff9989bfb7430c6b4483502d291e666fc1b93e61a2e7dfc4f3b3d0f695ac605772a8f54a85148b76285aa0ae2a993d5061dccac1afeb9605771de9b51d6891e875c384d8827faef2388555\n\n# tcId = 239\n# uint32 overflow in length\nmsg = 48656c6c6f\npadding = 3026300e068501000000052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 52d65dbd6d48dce0dbc538883d3508588966c4932afcb22457221c34414a59d8effbcb805c6320b5edb024c745afec75bb7c698d9e903fffeaf7a4ee8c36d7f44482f5116d8d7758f08c889ad777405f204e1c5b75e1dd2721f46679fa13a98f8bfc07885ad67a43fe4c05ded4c36f8d7e1bf5695bd348192986f1b40c60527e\n\n# tcId = 240\n# uint32 overflow in length\nmsg = 48656c6c6f\npadding = 3026300e06052b0e03021a058501000000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 485b9c137230f1bd439b4b5753be8267f386e1725d63d6c29bef2759c8fc81d4bfe2b5759e9dfd1772fe2cb661d320ec8fc831cf6e4abe8e18d622893a7ee92c64907c15427e7748faa3d1445e7721260e70be4f32167d60462fae53bfc2d943501b8634e443a940d9f41a1391119305a0367799909a7b83fdf7374721d4efcc\n\n# tcId = 241\n# uint32 overflow in length\nmsg = 48656c6c6f\npadding = 3026300906052b0e03021a050004850100000014f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 73c06cbffd5b65aa863f4d61321d840689ab69885ecc340748b8c4ad290945074fb58c73a419ea9f56e9ad70d1b133567a6c3e8e42a9b009241179eb154d7fd1603b6e25db969bb62eac8477addf62f1437d225c57725f3a017073c7418e70adf1e5caf81740e9503ff395b956bc90aced537e846968d879e1a17f4823aa3ffc\n\n# tcId = 242\n# uint64 overflow in length\nmsg = 48656c6c6f\npadding = 3089010000000000000021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5d718291abc4c814b265b5eb7c41d96648ada9e6baeca90e4dc851a1655a64aadc072ed9402f583f6f56b1d885c9423f4b708afa978c3c941969188b44b04d4d787bb6079e3527d6c1e36cd5fffbd33178cb6f23c4e1302b3a59cebe6353b6b10a005e6f24a5ef8350900b3717646917d1efdaf8aab1a3e994d5627a8d11e577\n\n# tcId = 243\n# uint64 overflow in length\nmsg = 48656c6c6f\npadding = 302a308901000000000000000906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1849ce77edf490fe5825f6bd1d6b4c312227fa9296ebb4f5e9a48dcb9b9a8918362a92d8a620dd3cec378f67beda0216b4c39fe07903bdeaed853f8884ba017fafce472c751284cfcd4db8fd5b93dd821eb43a202747927f1bcb947ad76ebd9d6085b616e8f8485b31889b95f28c4bf06dd4852142ac2f5ae707d1ed4f23cb5e\n\n# tcId = 244\n# uint64 overflow in length\nmsg = 48656c6c6f\npadding = 302a301206890100000000000000052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 0d3eb2ba13141b7d5fb65b0ebca47b979bb51778e762bde3c4cf33b02f84b0567214eaf31dfdc8197c2e84d9a85af76e8bf832a5ca2797af79b0293d85f513e421714e364ac5a5551a066063f008d6eb7c3bfdda6c6fed53e0161cb607ff7e78916f301cd81dd63f351eab77395c718b56d8d0b73b4806229999fb98aaa7751a\n\n# tcId = 245\n# uint64 overflow in length\nmsg = 48656c6c6f\npadding = 302a301206052b0e03021a05890100000000000000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 88b8e16d5527fc54feac2b63c905964e71c47701dad5944aba4847460b235c09e9ffa8bc6e59390dfa8d739893cbb32f5b06ec7f1fc918ffa0c364e0b5985dc05aafe98a8b86b18168d7705231dede7f0ffef76e6805a35a0ed9a78bebedcc274169f242aab6c33541c840a1e50cf09720b2aecfc356ed88ce1090bc54499f6c\n\n# tcId = 246\n# uint64 overflow in length\nmsg = 48656c6c6f\npadding = 302a300906052b0e03021a05000489010000000000000014f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 54bbb6fa9891afe6101547c34599fd1fb4bfb3dbe0c57fcaba3bd3700f0ee7d658ccd24bde5394aadc7480f181b90576a74de3c705b85bf214d9d8284be4b00b12678891989c3e3e16f53185fa590c016c29fd6ea02f97f1a872100969fdc57654b691122f2eddbeb6dc558ade5854fc8f26c11c5c32638bd4f7253099c7d1bf\n\n# tcId = 247\n# length = 2**31 - 1\nmsg = 48656c6c6f\npadding = 30847fffffff300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 0dd112d02c49ae5057f4b89c14b871e5a446e96dca84c6d0d012c95615cf43ebd42e79d034fdcdc93de62e3b11dc11dba63dacf300190d443e3796e0c95a5db3955f799ec1bcdd4ecf69b708fec727b76401e989f5cdd612773f65e1a357e0b2942b78aac09dea9eb0d86463aca289a0af876eb4ee031bdf10e0df27516ebafa\n\n# tcId = 248\n# length = 2**31 - 1\nmsg = 48656c6c6f\npadding = 302530847fffffff06052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 603d34e2f71dabf90d862e828a0579fef915972f070c495da35fb279808ccf4bdbb0a43f666d203aa494f0a3012f5a4518c2a83fd8a8d3f1537be15174f22a355124657fef6e1b673c4010e8514cb133f63a15a7245ba9fd8acd03c080e4e89531c0ee3b41612e34b136c07c469c042b2b2718dc600cc1f4069063d0989fa188\n\n# tcId = 249\n# length = 2**31 - 1\nmsg = 48656c6c6f\npadding = 3025300d06847fffffff2b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 11238413d11b4c1e0e311fee14bc4b3370c9943fc22c8b9429487bcb920e091d9edd0341bfc79070337854884267cbbc0f41dc34746c3e56096bc03cfa9d58e812d2bb9cf7dd90f3f16c048036255c0338c3777073a925f565ca9c9f78c7edb856f20a541275f84eef9a022e94dfeeeae4f07416cfefd742c21da502a1fe80c1\n\n# tcId = 250\n# length = 2**31 - 1\nmsg = 48656c6c6f\npadding = 3025300d06052b0e03021a05847fffffff0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8364095ecbfbd1f50f2964bce941395095071e45e9ab55edfef6ec767dc3790ac237a11132e6e087e96c226fd338783d4de817abfb9e134c2dd61dd4e400188f50be2a7cf3f96804011b5240da29bb1e8f7d4337c8e1f2af0acc1536057b0114a23172c6d37f9128ba4c2b719158ad70c5c44033e532c58d0d79c4508470465e\n\n# tcId = 251\n# length = 2**31 - 1\nmsg = 48656c6c6f\npadding = 3025300906052b0e03021a050004847ffffffff7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8a3d7f621509191a435d03f94a338c1aeb99a824eac10a7c8575d1848f16af74dd87db6137a590d3e0cffa18cb5c52e1ab42688c2d50afa5a29730a98d6cd60e24f13c7dfd8500a9442954a23e773560a11b1a2a3fc087a28ff2520aeeff2a058928c9af14e90125b0d534bfec11eb1a02227e7d513569f3f8dc6e35f6fe6136\n\n# tcId = 252\n# length = 2**32 - 1\nmsg = 48656c6c6f\npadding = 3084ffffffff300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 149a74b89d1eb542f383ce0f24f8665b1387529770f561cee91f39e3af3e82c1cb0f589f4d6d5e9fbe92a8105993d55c205cbf9b4ec4c3085739ae1ae2ef4615d43040926813981d4b626f3c71e08981b8c900952eb23d8b9da218fc3f1f113a27682ead4466157e9043188d331a9632c8972ac7bca5729132bcf4b76309fcf4\n\n# tcId = 253\n# length = 2**32 - 1\nmsg = 48656c6c6f\npadding = 30253084ffffffff06052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 3b55f4f1b497c53dc4fe59e8e2c8bd48f9199bae420e43e5a22fcefe047a5fd6422de99742ab6b3f946a908d382852359f5f80037976287f4806ee3edbfb94a01d81fcc9c28afbbe8d824089bca34f939d5298152bfa11e69e047a6379723d5d187c1cee5f437517ea237d0a024d2d21316666f867411b0b84f6010dbf3fc2f7\n\n# tcId = 254\n# length = 2**32 - 1\nmsg = 48656c6c6f\npadding = 3025300d0684ffffffff2b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 99a4a625ecb0c1c339c42b058d05f8cc6cd47bb29deb1df909fc16083e08ea18f482dc3932f0f81a0881c8a4e450d52da647fe501baa9363ce0261729beb173e3c6b3ecfb392ce93d89ea4c0e911ee2b95574a966c23276b9495b2ef6dee3a054c728c4ebb1cb294c703e1320a7d3cace4acdb57c605ab1c197448d5b890e71c\n\n# tcId = 255\n# length = 2**32 - 1\nmsg = 48656c6c6f\npadding = 3025300d06052b0e03021a0584ffffffff0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4473370a0f1cbe032dd66017379c5605c69fb77c74af9f119f93b4df107cda358dd074a7c8a2a4b3afb3bdd4d6074be90e6e8018fe482121cea28e7d42b4a64e0fad25c86d4792099812b74dfd225efefe1a4c9b664a3786c9e2070bd7ec4bbf666a4fdacf5966d121fd17169db07d47f04beae689080c76592527346d3741ec\n\n# tcId = 256\n# length = 2**32 - 1\nmsg = 48656c6c6f\npadding = 3025300906052b0e03021a05000484fffffffff7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1157bd4955170a4d8dbb6c3e20faf50fdc20140cd2f0ba30f2b3b059742b747f501e8fd4df0c614d247d7c7ffb91365e6bfb5ce36d21364cde0ddf7d9b10c1b1fa0ef1aa37deecfcb0002094a6b2971854f70912e62e91275091ecdbf0c218c0a3a4d7c5ddc7eed97c317f46ea2b554d391d08a5d015ffdf1c51d",
+    "e55f8048d1f\n\n# tcId = 257\n# length = 2**40 - 1\nmsg = 48656c6c6f\npadding = 3085ffffffffff300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 50af5b10a7fb4f26fe6abe148cbf8169fc5f7260e732f4ae4ccb79877a3b1c8d6fbc476a43db9f5e94c8c13fb256ce767aacd02445b47bcc54f535ce67251ee94a63b33dac77cff65d3de5aff42f12939f10320d40ac448cde70bcd8a40fa20dc91354f97521d847e45aaeb9fe38a8c9c0a3ebaaa34046a620654e305cbc3289\n\n# tcId = 258\n# length = 2**40 - 1\nmsg = 48656c6c6f\npadding = 30263085ffffffffff06052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4635e85ef3201bd0c0f1e57a2fda4c1a7b68f36db6ca9f1f034c75bad695a67964086d3d7f7a7505ff10cd77f1017908634f309fd5e0d4a406c1c579b08b397305e0e6a57390738c2e663449a72c0894bb3beb0933cd12c469181b139ee21ca9954dfd88b0ebc6f0e8d29c7b45b2bf5714e17ea9950e0d5b476b55aa0b717bfc\n\n# tcId = 259\n# length = 2**40 - 1\nmsg = 48656c6c6f\npadding = 3026300e0685ffffffffff2b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6cec5f74cea80f137a424880ca5254507315b6e50376a969a444aa0c33d5a9079fbdd417662c16048a249a94d251685742ebe4fba882e797bc77f6d28105136b2ba9bd5ec3080343d00d7bb9f579a334c945c1239680c11170e0470e801bdf6f9789a5428cf97b0af0f2fa77db2f8fc00182b1bf9601acde6fd5158b4f57bcaf\n\n# tcId = 260\n# length = 2**40 - 1\nmsg = 48656c6c6f\npadding = 3026300e06052b0e03021a0585ffffffffff0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 0513eb217a06590004cbfcb0bc94c0c6f79b488fffbba9d85e289e42b91824c8c4e1dc04f3ad6f6ce6e8480c96889bef3c62105bdff8af972264cf0110b4e522fd26ff6af8147990143828fa3aa2ba25066369357e19fce0b8f90d048ac1ef19380fe493fb70ac9660d5258dc0657a6270166d3400c2421bbf57bcfe10e2ad64\n\n# tcId = 261\n# length = 2**40 - 1\nmsg = 48656c6c6f\npadding = 3026300906052b0e03021a05000485fffffffffff7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5b0df944013467b97409704eb2130b06e537f746c5387dbb858651f4446887f874977dfbe9d5fd26d0be6ed9ed9381b9a8511710d0756434ce897cb00863c652ddf3a6b2df37f9308a46dcf2027ea523f124c9f32c2d9a09b5d1928e2677dfaf5e0d8a00c3d0edc5c1441f017011a16f2e0788fb2d8d22e395b4d79a8375ba49\n\n# tcId = 262\n# length = 2**64 - 1\nmsg = 48656c6c6f\npadding = 3088ffffffffffffffff300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 52be2fd82c24a1fcbcc3d832732eb97b1032933fa6af3b7fd8d63fca652d4b3a40c8488695414049f416f4eb01095767d75325662accd8c47bb75500ea4a99ac1fbd01815d0b8ddf450e097380c53715298c22fd3150b8417a66f499495372f07e98578e407ca2d226c69533c80b08f58e1fc0ca1cacb8652fc9374e12f6278e\n\n# tcId = 263\n# length = 2**64 - 1\nmsg = 48656c6c6f\npadding = 30293088ffffffffffffffff06052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 2703db8b7d2f7a879c235f95a9a39870074efea76b73663c50c4581eb2debb494472402d271b115a14fdc14eaea36cdb4c199260abd321d8cfbd1f56b1954761c5c61ad3ec1e440b53f1cceb156d8638b597eee1eb717b110f30fcea92f47e7c1ba438b1b161967f555bd14f0bcbcd21833aeb2c6b8b3f5c4727d07ddf009b11\n\n# tcId = 264\n# length = 2**64 - 1\nmsg = 48656c6c6f\npadding = 302930110688ffffffffffffffff2b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 927d2fcf22048a79d64b34aaa94de24a10770a95e32f0a6e2b9bd5a9c1e502e9fca540e54aca240091923bf4a64fd703b30fb5cec96c8da5431373bfec653da1ab25cff5024e1a029cca12469db0ca362ecefadf60991fc1c1615154450d9e1b54abad613f5ddccb5545e615c6168d0247f8e7c061659c9946c3af1e373a618a\n\n# tcId = 265\n# length = 2**64 - 1\nmsg = 48656c6c6f\npadding = 3029301106052b0e03021a0588ffffffffffffffff0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1da7bb65b41d9e5fb8b895882b9b6c2aa5ba32e7297c8eb3d64e5ae4311ad229692296cc27eb84e8673c29b65c35b1d52038d8b4136b334f4bd385621d7ddd6e0b5718c65834dcee0e7841a154f1953b130573995ad5cb29849490366936ee8a383f33f6cab3221d21d86c42ad8fff91efc5257ab8e9279df968d477167e75cb\n\n# tcId = 266\n# length = 2**64 - 1\nmsg = 48656c6c6f\npadding = 3029300906052b0e03021a05000488fffffffffffffffff7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4c3a7204c4807d5b44fc36eff6b0513730fde67c74eb7a7d0484b7a5b89e444e89b07170ec0ff4ec4f58b9f13c3bb82cba0081b737f62277dbbc678933dc3faad4dcdd61c8b4d62c7a1c9a6dc40c564b36bcfb9aff90e9c642afd81a8c9911351e3f0b78e0ad6850c937a69ee2a639be88473682d7c4a6edc77365cfcfe91075\n\n# tcId = 267\n# incorrect length\nmsg = 48656c6c6f\npadding = 30ff300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 32107f36c8b86cee3154d197a6e281869070fa9947177aff8cfea5942b3fbc323452b002f957f19083b57d59e6279d80821fa33c1f450ef5f805eabf1782f729dad2f9d0e63462e901dcd449c7fb14a8c42ec9599d30cf1b16b45550061f5b6f7f91c4c2bcb1613daaec5984e634fdd65a19cf24cd29d093406d7f5f4c443a23\n\n# tcId = 268\n# incorrect length\nmsg = 48656c6c6f\npadding = 302130ff06052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5ebb4faf49a82b1fda92b2ccc8de0d158bf62f819359d06c6a4a2a508bf728635296d188d5a221b40cde9d51e107b8e8f73ed2a0c3cbd92325ddea1cad1f72ff6491133ab7a2847f3d339cb2317e8b9e336516a7a9d84fa8fb2b481df9e1ec397fe97d18227ab98c2fa55f080569aedc7025af770674a5b33c61b811922058dd\n\n# tcId = 269\n# incorrect length\nmsg = 48656c6c6f\npadding = 3021300906ff2b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 531ddbfca4d3202639ecda32eed51b2fcffaa0cc6a0e97bdc1df71ab3b800f3e80f661b118d9cd82dfa1ae35cc3a364dd2a1c688e90cb6b6a215485e5e30679838bea37edcbe982ae858ebb461a45ff687332be102eb65746d9539a693b489c3cd5901adecc2d4afeca278fcf3b21774f2d11090f436d949d4ef96480839b678\n\n# tcId = 270\n# incorrect length\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05ff0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4ec4e1b4bb0ce0b002b8cc0b47fbc2baa9be415e35d77fb95906620322a63fed39595837d1a547cffc5f50c34a4daebf3a15d7d7ede9e583ffefb77ca4e4cd953b91a8608ede58a5500dbb71ad24bfa2b07bbec03b702c53baf4a1053d4834376b205854cee7e0dbaa1ec60f72ef238fbce20d76f9549b485b41173da58356aa\n\n# tcId = 271\n# incorrect length\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a050004fff7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7d54aa05c2043d5f6330ab97726ae0407d0f6be65cc1146b374d3e7f75583beb5ad0ba0361b2cd6bcfcfa01987cfdd4423047fa6f909b3fe3840262c55b3f2c0385cd8474cb92eedf9eb9113e9e83d0ae220124493c3df2380df4cea3e88b81d9e3947feebd788c2417c644974f6b909c1e44b75b74240b370f8663e9a1f63b3\n\n# tcId = 272\n# indefinite length without termination\nmsg = 48656c6c6f\npadding = 3080300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1573e93ebc5caf4eba58c9d80b89c0b62de2073a85f5872a22ea283f37366fbb8c6c7f4b0a4f459505d95da2921d8aefa640d81f5dffb9e0e679c69ccb310eda59f36d49b33219b30ee3b0f680e2794654c99e63effef73b09891f67c403283999943d4ded2c823797ac2773aed7a0af88cade66f4a203fe91c8d86d720fbd36\n\n# tcId = 273\n# indefinite length without termination\nmsg = 48656c6c6f\npadding = 3021308006052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 9dc2d9a253cf809bf178002806d1c9883f5c74a0734f70dea7e322f2ea00a00a3bc864dc4f0fa90bdf0af0a8e46f893f6405a63998ed27f18cdffd1b46a183763e3bcfc4c491a023468f1b355d12be2118e4381d960fa2548afa12a6ea46da03268d1d050bd942ec8c2bf584f8d2ff00ff975860686311b1dd17d1ad6f262d66\n\n# tcId = 274\n# indefinite length without termination\nmsg = 48656c6c6f\npadding = 3021300906802b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 3b1240c785cab25d0ebd26078da7323bd28352a878cd405419cef18938d27dede67112d32f6a60d22b14c78e0f5c392bc9f53f2a71769e21a9dd4b5d8495a203ff0e715a1173ce69f3c966d83e8ac9a45ad534c36b77d1cd120a6a3236ce023099b19acb39a25ec420f8765829b77cb048a5136b597645caafbc34d3c09723c1\n\n# tcId = 275\n# indefinite length without termination\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05800414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 84bbedc08a146e7f8923dbc116c9793d1bac3608d71f962664d2a155bc06b8a02d3a346e067f347cdf50ba537c14c1c8bfabcae5ff982e5543b626f89627d1a4bace0928115d22d2b0daa5285afab45c9d54e5fe1832494f432b32bafb8a922360f5f545b15dc189b7e64dfbe96372b401ad519162488f0123934a9c0512b4d3\n\n# tcId = 276\n# indefinite length without termination\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000480f7ff9e8b7bb2e09b70935a5d78",
+    "5e0cc5d9d0abf0\nresult = invalid\nsig = 15a6c89db01ecf6d5f4d3a1535bdadcab861655619500b010851340b88cf8ec2547bf402137751006ac9d675b42308f939eed23d010fa36006eee53b94d63c3ef3800665038ffb4f017c1f3f5f8e9b909fd555e67cb002fbe261a42bd7b617525c5027d5af82aae2b6fd29abe4f503dc5f2620aff14d7b7798fdb8d4a7629db2\n\n# tcId = 277\n# removing sequence\nmsg = 48656c6c6f\npadding = \nresult = invalid\nsig = 14951bfe3fa22176d5ff4ad5f7dec0d0954e25a2381c91bc17707034ba19087c9f5b167d250129b95b41c883c69a5628196f9733cdff2daacb49ab61ee430582aab7c785e4f70f2320ea1d18da9ed0bd4f96e597977c2aaf0c2b8a3dfd8015d08195e3446efe12788fb7cbfd612d309a13952682b65f03a8c9440fd735fb2078\n\n# tcId = 278\n# removing sequence\nmsg = 48656c6c6f\npadding = 30160414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 40868e6b6d88f66b2478d680ea58466d642e141951f69c1f25bc3f23211100441857b33253b4cf1668b6568b858d1c604e6062022c71c0d764f260c1924972ce44a89b508a3a220cc5b545c4166974e6b619d3d6cfd0b72be7f31070e743eb7611230b4da746f64dec399f71bbe8aa998a99f746bd422be6d02f0e80f5e9a337\n\n# tcId = 279\n# appending 0's to sequence\nmsg = 48656c6c6f\npadding = 3023300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000\nresult = invalid\nsig = 34bff75efb6f79769cdf1dae7cbf4be4644b03b7e44ba74a277281e229a6bdd96f922884fdf97705a456ad07e13f90578ce2b3aad819879be2c4097ebe5329e8eb72598005d02c6e73d8ecdbb45fab138cd88259320397f6b90a5108adab63ea07e1b86f5e20455368cfec220782a63aa7aea41761ead5952f9c7da59135f0e9\n\n# tcId = 280\n# appending 0's to sequence\nmsg = 48656c6c6f\npadding = 3023300b06052b0e03021a050000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 96d9ab79a2c8db9e9a483d5c36c0c3ee430eed6bd8385e4b7b655b7428a28d609ef4a9d413269572cc4be679497329042a1e1b0b090cfbc9a9236b94942e33e2e54a593efc3821ced8110042f4e56a521f4f46a3305dfcd1b899c0f092aeba78ecb8731a91c2a64bfbe7e00d46d85275a04c2269a74cbdf3ee6d6aa4867c8728\n\n# tcId = 281\n# prepending 0's to sequence\nmsg = 48656c6c6f\npadding = 30230000300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 26ec2f6585eb6e732d8430faad988f8223db0f11b8e56c14370697f083f16daf1ce571f73ed43162b40abe8736a43b99cb3c6c6e4a2fd5e2cc75bf779f10abd718eb0f252fa867b4d08cd8ab3f80745c2d368ceaac264427b96dac8b4b7aeeb3303cf4bdb7a45cac40f991c1fe53e8dc530c6dd76302dd8f6bfcd86d6ab290b2\n\n# tcId = 282\n# prepending 0's to sequence\nmsg = 48656c6c6f\npadding = 3023300b000006052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 9e4c79c5fe53b5514cd9a3f3d6d898b53f92859d7f862f66b08585ebd6efcead5b69df6d12b1dfed30abf729558f340def7ffd341bc599102ee3cad5459b11457a2a463cdc40594fea9b7d8d0a99b952aa442a25f77991d34a2dbb0b5d73946d5780c176f0cd977a4e2c26b3b25406b7092c2d8ca14205007fcd0b776d01278b\n\n# tcId = 283\n# appending unused 0's\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000\nresult = invalid\nsig = 94c2d05aa194c25bbf274f9b1a312f87128d3c177cda66961cc8388a3ed5c658cdf320bc6af14e57b1569ee6f96280e5fa98ca6eb67017cf3077fa63d9f7a916c445dceacf73d06fe53060a11a4c9ebf0e6203890c0da57324d86fa92e8f9b854c262b57046b1422c9aabd40edbef96f97c015690a4dd1f84bcc02867067d35c\n\n# tcId = 284\n# appending unused 0's\nmsg = 48656c6c6f\npadding = 3023300906052b0e03021a050000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 789468845b4388391ff3baafc966a3957f2db65a01fb34132be2445c22b303fcdaa4379c14a9291f3a7e1f23948c5c6b3d1d61934d3e5689267a14b122017df19da59a762114b4db56b17fd61043caede4ad0c8f89ddf180456d5695b337525f6dee1d1806c69a14868ccbe6edfa523795a9422057a3dd9ca8636e5026ca74ea\n\n# tcId = 285\n# appending unused 0's\nmsg = 48656c6c6f\npadding = 3023300b06052b0e03021a000005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 65929dfb1cfa05e3a405e1fd566e86a0627ad471101f5b2ace5d2a225641a521ecf2638b5de2c9f691dc0d4260ec49ce2b05bac8064e5a16881bba6dcf7fbb890896c27ca5fad9bfe6259aaaca16d94f01c24f13e30285caa9d610ad26457376c332bba7ab26d6bf832c7aeb2746faa914936c9ee51f9475861db055a89a1cf0\n\n# tcId = 286\n# appending null value\nmsg = 48656c6c6f\npadding = 3023300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00500\nresult = invalid\nsig = 81bacc6576415739b7cdf7ec09bbe148be54e8e9b1941992d6c3108cfd3bf095e9f2b4d0c9101136def16587e2121e6ce9d705be253c1597b4963ec43e99ff48d2cfc1ca6141a7c6c309d7a09312dcc5d2b985c38c89bc532578e19f544a0d22262306482973163a93a0e7845479214300f00cb9a01bc5253650d79446c4aa7d\n\n# tcId = 287\n# appending null value\nmsg = 48656c6c6f\npadding = 3023300b06052b0e03021a050005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 42b488de85d7a4dfd153e07d965116dc20c05b971faf7c7c899dda96b3325947a36652cf1c6861011307c47b45fccdf1520c39a56e5ecc1292f336ae19256a2e68ca1d3e8930456e53b3778ccaf50a79f8bbce54489281f7dfd376473951f1a893460503cdec4ed81c722906fbde5b9553ace4f794e600b00e79b11822d13ff0\n\n# tcId = 288\n# appending null value\nmsg = 48656c6c6f\npadding = 3023300b06072b0e03021a050005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 497311a6c38b7b78634e563139cd5255d5db5f49950b9a45928f0e0b84c9db2bda1072389bdd5c44b229a4038d5dd111e4681fd94fa09775e7670fa7de90f1362621f1ca85fb9c79d941fc34b121f60e38b211b3bbed00edbada6f53aaec2555ed59145af32235232a322519fd408ace24b819e0e3c9bd0a6597d84f9530d208\n\n# tcId = 289\n# appending null value\nmsg = 48656c6c6f\npadding = 3023300b06052b0e03021a050205000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 637bfa1961468a3ceae4f91bb9fdf7815d171cdc947a8cedb8beb9077f2096b65500a15c99f512c34acde371be79690acb660bcfe55c0d1a812d12d079f516a6d48b3d35c5c10f21987ac6ba830839a83b1d140c15c57a9df09dd0b1cceb323b1c9a0d854510116d0fa5d16443ea5fec8fc1ec782c76936beef5bd420d789494\n\n# tcId = 290\n# appending null value\nmsg = 48656c6c6f\npadding = 3023300906052b0e03021a05000416f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00500\nresult = invalid\nsig = 7fbadbb2cb7b323b8f1dfe78abd8e6b78df62aee4cd2d261ba32c05fa321caabf2ec7486bc9811999e48b3b1b06fa1c590fb7b014fe6137165357b4977821e74323eb64a338e98cb0133cc2a9a46e1691fe45dec76781e60022eecbaa6773e911589e831ac2a485c9654fdf3cfc73b66029295eef4c8065f831abafd960ac0b7\n\n# tcId = 291\n# including garbage\nmsg = 48656c6c6f\npadding = 30264981773021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7d63040570a002364293787b3c0340b7c460eea2cc307d4a6542662a04c0f07ebbc27457f1745129eeddf08156c977e8e346b112024b50c2e3d3686b8e87dd0e35d4f5499cb14049e61e81a5b43fe306ef02b644f20f8db8ed738de9dc630dca8de629a9bc268bee600b7c13c35eaebbbd4e018df9659354efd9bcd5452f578d\n\n# tcId = 292\n# including garbage\nmsg = 48656c6c6f\npadding = 302525003021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 0cc6704e2d24718199b007a9a590a3a63aad1d5f769bb29d2c233f38cd994ad8359522e9c1af260bd8c526de9528de4bf67ea0a34286eaf9e015e4276be490214a52e4f66d44d6f71b7e5c07850a18072ef3e15ce31ad0a085ac59501abc4552a5a2762d484ab494a281801eeebe59d20187f3b6a168cf23f0893b3ea100bba8\n\n# tcId = 293\n# including garbage\nmsg = 48656c6c6f\npadding = 30233021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00004deadbeef\nresult = invalid\nsig = 2916f598221ebb2894a79ae4580d3e7cf6af6a5d345d4be8b254b9efa08d267e3c25570a515ae47a22fe24a914218bd7bb8322e96d49cf16076cd5cefab88db6609438d939f392c2c985272c7561726e51c85ade312ea1b77cc96b0d681f6f2695106d6e8dd5fd5556ed88151cc0a4302f61f5f3db1e714ce11356fd6c6d46e2\n\n# tcId = 294\n# including garbage\nmsg = 48656c6c6f\npadding = 3026300e498177300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 934016d53fdc1e94095ad0c3b39fd01983a037a5344c486edf74efe2daa9da8e1b8e597176faba7ecc9562d432ff98dc205d00cb3937221a6efd35c42674058db4edeec5b6bc86f49e31201e8c6d5b0fe3d0463e2b36bfcd9bbfd055e89034446da971bc3dfe793350f2f85862baf328c542199ad55fd56bd1f75094eb5e09e2\n\n# tcId = 295\n# including garbage\nmsg = 48656c6c6f\npadding = 3025300d2500300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5ef2282d6b3b03eeb68b8f1fa17bb20d7f3bd2a66f2450ad97048183c3647de4cf533442f92e2ea850b09c552be9e99419a48891e4952a0d4d886cc1a7115563a49c3490fb8e146b368d3a9f9d98567d6ad03799e6d6415cd325a413d43be0ddd2d5b3706c0bb0432989bda8a5d4543b832638ff3ee4ceaaf239acf0c1ac2f53\n\n# ",
+    "tcId = 296\n# including garbage\nmsg = 48656c6c6f\npadding = 3029300b300906052b0e03021a05000004deadbeef0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 88f59da879a63cb4fa4523cda167443e78b2878e8143a54cb0e237ff51e45d34d17d59ce704b72c185346c7093b79fcc0700516dec9c5cb8c3bd7bc21a1f46f593b38b4dc52f80e06a1eb7631bf2590dc7001c122bd2fbe260547c9d13010094ad1e5e75255cbbda3539b1454e3914e6c1e8c93f58b36381b844c39d08770c64\n\n# tcId = 297\n# including garbage\nmsg = 48656c6c6f\npadding = 3026300e260a49817706052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1458cdaa71d53e60633583b0ca0edd905eaae3dc86350c4803a5fb5d1620b31713930cbe5d21d9530cd791c1cd10007078799a9359b09f39c61394f0d2ffe366efd4485830aceff2296da12a1f9b6677a1b8349cf6b832e7b9821e1be8d5e39a7e892062926066312b231306ba32cff73b03e9be39f12eb1a559e7e18d912f85\n\n# tcId = 298\n# including garbage\nmsg = 48656c6c6f\npadding = 3025300d2609250006052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7f2c73434ec35a0db8a6e89d81171d7df1e1479d4b5e00da0d5e1223c95ebf9eaecb9f5d7b2705ea3e06f42828fc6c6c3cd3af52e3dc20c164789785aa88cbdb63c4b973b4f871c085670039612d4a9f50f0ff84e38c576b09bcc9d55d6c66418f0e8737b1c0e8abc3c2dcee84d7861e58d4cbe887d022a3250f28059c5d4288\n\n# tcId = 299\n# including garbage\nmsg = 48656c6c6f\npadding = 30293011260706052b0e03021a0004deadbeef05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 51d48f38227999d2d1af07719ec317d34e2ee5e42650a6b59b2d0057b7df31a2b551a736c621f5a8e4345fa755f57e55ff80a61c041c7c28e9148b020913b72d6a0ea7cf2f956b567eaed32ea647687505e11d756581fa1d0b593207c6f2db3a75a0923a375731b925779fc3ade0a00997ce4cda3ec6e981e91e1af78b12dc26\n\n# tcId = 300\n# including garbage\nmsg = 48656c6c6f\npadding = 3026300e06052b0e03021a250549817705000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 55dc53df20ba602ce3b36914347d0a2c22ece2b11ca27b9f8807ffd36545ae33f4a665b6a125253a5cd7c358c52d75b65cac14f9553252ec770c25ad03693a1b6f44470a7418bb55ef5d6a0528ff0174119b1b43c1fd1d07a2506603def7f66d45afb99ba70178b3774cc1f3b4421addb8fee0c22e86416b0b1f3c19356ee38f\n\n# tcId = 301\n# including garbage\nmsg = 48656c6c6f\npadding = 3025300d06052b0e03021a2504250005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1ff67456aa711438c0bf7e46aedf2cd4ebca7d0e9f8b3f98af54c949a1e27026281f77ecc61ae1a981afda0bf7aae38619c5447508b0fea79a588d0d2806ae0f67b32d6dac4b2ad58dfd413d235543666ddfe31d8545015edf25b5b90cf0f8c592f048d009a293dfd1e7bb50a37d52c1540bccf99d8fe2c1299cdbc563d96b45\n\n# tcId = 302\n# including garbage\nmsg = 48656c6c6f\npadding = 3029301106052b0e03021a250205000004deadbeef0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6af2cd04b32de5d3cf8ce985bca6f581e96dfb4ec483b1d2c06cf4439bde888524b2e6675c4fd4e10277752d269c87fe1c4eb70a72a2596cf53f1f4f0ba3e82212e72e09774781c888a96e8870658bd9c248bb1f0f7e3c44f4cd284dd6c611cda266f2f841ec1215295edb5291ff1e5111701258441f06b1ed85e16452a02cf5\n\n# tcId = 303\n# including garbage\nmsg = 48656c6c6f\npadding = 3026300906052b0e03021a050024194981770414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 0541e9a8f0735076b58133e205803982f403cd1203407ebff3534a48eb35f06842fd496d505739fb07dd85f48b3b24685e1d6c7be539edc862cd9b6869097c7344847201842aeea3ebe3595557cb93269898e2109226a2f4eca5bfef0851a5fceb2d6bac753faf6dec4911610e6b40d827a00502537a6fe743d616558813df8a\n\n# tcId = 304\n# including garbage\nmsg = 48656c6c6f\npadding = 3025300906052b0e03021a0500241825000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5e21d6a684e3daf0be25155cf79874a6bfaee2b771d38ab8895f031cf25a9a05fc8e1d421ce78944bf57a3f0214ee090c42cec51decdc0dc3ab376deaa4603d59eb3ec8b4470e6d8b00b53651873d48f6f2cbd035bacd0f7b24633a025b8ea9dc7c55dfc6578601849e9aaaccdf5fd4d1611b45ed3abe2010079e64de8ab74e0\n\n# tcId = 305\n# including garbage\nmsg = 48656c6c6f\npadding = 3029300906052b0e03021a050024160414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00004deadbeef\nresult = invalid\nsig = 1f96486457eb037dc9e2464e507d720adcf90f48a0dd1d42bf4239df64e5ef25556ec27290a8d87fc9fb89ad0a8547980f6b2bd7efd0dbe425559bdf08005fb762b92d0aea2f33c17002ab9a911e457532f0134d2e35db6b3393436de160faca0a2c82509ec929d2893bf82a83bfe1a59fc9189e7ca846998b39919d3ec4d6ed\n\n# tcId = 306\n# including undefined tags\nmsg = 48656c6c6f\npadding = 3029aa00bb00cd003021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 48eedcec184b7ade4fb34efac030a4ce140fcd91a1a1e986bf5232e8db9160f076d9ae36ca23246efd53ece2014ea56d5e596b42ce66e3c585d5e6a4cadcd779c6df0d8c43e7945cf02a07dd3851258ed021ade9cfe6fc3df222ebbd6b9e3f39b4331a11c4ea401592883b4f8da7372526f4f3e7acfdad447846ac8160e5ce38\n\n# tcId = 307\n# including undefined tags\nmsg = 48656c6c6f\npadding = 3027aa02aabb3021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 107ae9af715ac312dcae1f831a818dd55caa33e659ac6f1a15ef41ebed6207cb54a7faa7e45b519a3ca9c304a645f24ee9ad3eb83d6856ce4809e5d7137ed30e919c9615382e9e8767495495cb7dc4cc27e2ee8932c47cdc6c9154391993108cf952fbada535823368843adbfb06d874c14634659f7dd89b02a14377a5c1e8c0\n\n# tcId = 308\n# including undefined tags\nmsg = 48656c6c6f\npadding = 30293011aa00bb00cd00300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 34b98ee9fe1600e2806f67ea122dfc989aa727f16c8e2cf704b1f05026105b595528692c16a052725a2ea47c4ea2ef13c2f5f9a9304d11607a25b8cb261e64658c6047627e9a7651730b81376d9fd978547c270d15f5c57126e3b41b39ca687d6c8be52bf2552104ca06ef64dfe317095b835cdac2840d4f0d3febcc3863684c\n\n# tcId = 309\n# including undefined tags\nmsg = 48656c6c6f\npadding = 3027300faa02aabb300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 358ce2879366fcebb1212839560958d6a3cfc4cffe2a05e9c7ccbdf18b6427f419a2c1e85fd82e27bc63315a9742d141ca157a435c4f20758e4011b8b0b33b9fb5f0006170c3bbdf4d2fe16888404dbf8b9c00ef30bf45ea68371b76a692f98e79c6c5a574e410a8505d5166112f43cffc506a9d46276cbedfec64f1b2697584\n\n# tcId = 310\n# including undefined tags\nmsg = 48656c6c6f\npadding = 30293011260daa00bb00cd0006052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5affee843b343a6d142406d3d89366a9149d642ca12a661c5d0eb0c1b5e15d3c90dc134eb76aff110b1964ed6566469c47e54aba7145c5601412cd38c630e05236c169f2ac6491795408d410a763f0090e299ad9022ebacfcf2f8f0f248674402479db2387e9eefe47c86c2430e529cd13e213753332fc4a3541de49dd1f3920\n\n# tcId = 311\n# including undefined tags\nmsg = 48656c6c6f\npadding = 3027300f260baa02aabb06052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5cf35c6711fb8b297ec405496e8db527ad1cbcc55ce6122b24ed917fb989c28e369354900abb96f41457f15754fd1060710c6e984db30eb73300cfd890454e97957a589de151225827b5a12384717a7ad92aeb941e1e148e8d008e11598bc7b8a3eac35f2af5584f61335a608c5206e5e24cf934ef2009367f3403e8da2dd0cb\n\n# tcId = 312\n# including undefined tags\nmsg = 48656c6c6f\npadding = 3029301106052b0e03021a2508aa00bb00cd0005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6e037fa40b3ce48ea72b28bc1ce8cc01188e6f84addcbefa2c729179043b3804d6ff1f25d85c2b9d72acce9c9c64e3f63ecffac670f76b2be75d63b3cee45b72f8758345021177ed13b66ecf0082e3c4418cc92713bb9867c8d28b78f30ff599e82f17734d0772e1e733c0b74fbf31c4f1ee99dbb89b5b113a7f628742d3b2a2\n\n# tcId = 313\n# including undefined tags\nmsg = 48656c6c6f\npadding = 3027300f06052b0e03021a2506aa02aabb05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5e7bf33ad4d9393d6b368764fac6395ed8ba3da7bf04a0f95d8426684bf0e9f2f78c9e49189bbeec883955af428e6e4527b871aeac21feb8231162f5380077c1fdf63a7cd4be65f813663dd82e732cfb3e1cd09298abbc42fbddc3551772f492627e657febca487db5c03c54850327eacc44dbf4a7c230f1c8166138cbd95587\n\n# tcId = 314\n# including undefined tags\nmsg = 48656c6c6f\npadding = 3029300906052b0e03021a0500241caa00bb00cd000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 0c57e98c13628c8188a0095b98d312cf0fa1a1d2039700ab4c607fe75ea0fab11c2c84e5d22d26b014ae1c2aa948efbb1197e39eafc49cf9f010a7b2be4ab9dfa94ad48ce5dcd5c7fd405f55922146cbc541b9ebc1c89f30a2a3f7cf4a8b14797ff4a60922ac710e7496931ff69e4c0d4e06375c05a7ef1910cbd6c3cae5bbb8\n\n# tcId = 315\n# including undefined tags\nmsg = 48656c6c6f\n",
+    "padding = 3027300906052b0e03021a0500241aaa02aabb0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 874f05aca449fe8b39b29dff1eb20b145ca4bccd25981176d33b6b41a1dcb48b7a668782549013deeceae3599309f541bfd4a15eb984a401bec4f0facce679c0608d962964b85df739ad19a926de875f6404ca5b209891d380f6e53140b1bfc05a2cf1db336d3a01e8777614299b6e2f683f2406b295f3366d77505cb2e56875\n\n# tcId = 316\n# using composition with indefinite length\nmsg = 48656c6c6f\npadding = 30803021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000\nresult = invalid\nsig = 123c3ba6d4a5de10837fe12e9b2c61ecb00c93c7d25aa440b7c739df817ccb37be122c5f5570e44a943ee345590c5ca0597605c1487986dfb75245f8e89e4f29aaf3c8eb5c5e8944a63baee4d0143ea2765b0f297a1da8a51981c26a807cf4f9a1aee00bb75cedfbf6466098f7aa27f1e3e63f4f0b7b8c40fc837c23248e914c\n\n# tcId = 317\n# using composition with indefinite length\nmsg = 48656c6c6f\npadding = 30253080300906052b0e03021a050000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 2220dc736ee3c63b5d5915050c6687b3861b52e664ce1ab501681d6e40990f02dfaf96f240adf2dfec05edcb268f6dda4129f901f7416660d56ab3a4145bc354fd11a1dc4e1535a4b8a61498508019ac38b61636356a641b8fb4d4739eb84b4fc49647fad35668ead0743aea841214a6e628ab2b5488de6e60d012c0566fe78d\n\n# tcId = 318\n# using composition with indefinite length\nmsg = 48656c6c6f\npadding = 3025300d268006052b0e03021a000005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 51fc2dc54c9a46a30ea1c7ea262e86c85110f8bbe42d5abaa3eafb13fa7f3e2424090476c2e50e5eb74d3b6f5e5fe379f3935afe5ed940d443fbcb8686f999c6fdc9e508a5fc7c27bc17169eb5d8e0421ebe7d04260c60435f56d4f614ab9dc0b9298c45fd660c352d35d2985831622eea08010bc27c887f95cb33699759e630\n\n# tcId = 319\n# using composition with indefinite length\nmsg = 48656c6c6f\npadding = 3025300d06052b0e03021a2580050000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 87fb9a61395878aafc1fb4a872d8e2db7db123ce4b2d67cd36a7f6e7e190d0bef9487f54340c28fe55d1bd9c38afe166924c787169890493d5cd2a5c79317064313b77a481ddb8bff9a917da32899448d9104ab67dcc856aee617a0a65631609f0632d58bb6585b4dd0c4a8bb41fa0dab99a08489feda41f1e7e5e1fde382952\n\n# tcId = 320\n# using composition with indefinite length\nmsg = 48656c6c6f\npadding = 3025300906052b0e03021a050024800414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000\nresult = invalid\nsig = 442ac72092d6956bc846d7be909704dc4633e3e59e6ff4bcc97bc9d412645dc17ec3db8bd885150bacfbb085dc90bdf26129637876a4d5713beee0385cb5ea7fa6ae57208df368b4ba95720a716d58ca6ee5a03ede1cc7f2ef31d8c459576ef72f6ba1b5d9409efc74932543ed601f957913a12304c2e29dac219d78ed12203a\n\n# tcId = 321\n# using composition with wrong tag\nmsg = 48656c6c6f\npadding = 30803121300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000\nresult = invalid\nsig = 2ebe12f793a821425e9513256ce1517b03b6bc19e2c2347e94651054caffb1f5d6101d4f3402d5945b4aecd04dacc3ba89d1123916d44941715951e9fd59bf0614a0534762e86275a8f1b0b16fd9a9d146946cff740c206ba6b27b26e8d1fc43b2b4d117e144973091674607844f86fce6f07a2a63acf8df67d3827141ad432b\n\n# tcId = 322\n# using composition with wrong tag\nmsg = 48656c6c6f\npadding = 30253080310906052b0e03021a050000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6e4d642285fa7a46daf985135181712e84efd52cebe8885b52c61a5cec753c1f8c8ba42886b584faf1551da81232214c2088060e6843d0d319a5e877bd4c500f6832f537306285011e5d8b98e2fe00bd38885211478f27b0d037c34d79d7f4d5828403d20b5463a7e1e2de2398c79fed33bc9eee2fdab52bb40acf9fb68a16a8\n\n# tcId = 323\n# using composition with wrong tag\nmsg = 48656c6c6f\npadding = 3025300d268007052b0e03021a000005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 0de20757fb64e3633c36e8965fcc20631e9e890152e3a1d2d6a91fbe9ebd56bb99126050c79b41ef0c107086106738a91d0e815d3218404c1db9d4e8526e085ae10195b9cee788fdf7ba9d28c614bce268af0cc58b8a959fb4c24bfceeb5bcfcc4e326d9de825bcbd8eed0df37de2add59f8879326a7e6bfa2a36eb48eba2f36\n\n# tcId = 324\n# using composition with wrong tag\nmsg = 48656c6c6f\npadding = 3025300d06052b0e03021a2580040000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 2e48a4122de8e1779d169f5a6ab72eba7ca3b0c31ea73d41fd82047e18559ff9706acb85f92872124b4020ae001dadc76b61c0e166df0af677f886cde8e13dc8c2b5c93d62cee44cf3bbdc74756d249d3c59834e079154f6646a8c69a2320cf7bc3925523bc2ca3f8fa7d63650321d2a4de3ef3726f74a2020ff5db397454242\n\n# tcId = 325\n# using composition with wrong tag\nmsg = 48656c6c6f\npadding = 3025300906052b0e03021a050024800514f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000\nresult = invalid\nsig = 6726053471ecf6651529165c96db60559a525efb27d31de913a44d885d33e404fa9dd7d28de94a7d8dfaed297ae500a55bb3535d77dad3031f7edf7bcd636534621d870c28fe64f7b4752f59cb1490208405bf38dc054311473286c52a59a8c6060827ce9a2ccaae9739030927aaa5225d45655be1fd826eaa6b27a8e20a4f31\n\n# tcId = 326\n# Replacing sequence with NULL\nmsg = 48656c6c6f\npadding = 0500\nresult = invalid\nsig = 1cbd58b8b3007c4298bd1c10273da63a72b7957ef834ef906323f8d0108f150fa5e6a9eca58b8ea4b995ca553d80e801e9cf2bdce6716f577349af9074c73608d17105dcfa419689325cc9d8b92c0170c32359fe74231e9f694e7bd363f03fa94f0a6b9a12a708477eaa08fcba05d6afc1145c1eaab404effde4e187493a41a0\n\n# tcId = 327\n# Replacing sequence with NULL\nmsg = 48656c6c6f\npadding = 301805000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 03c82831e52e73e3d48e7773398712972715ee37d68c7cc7985a75a4e9b3316e294a8a73e2613d561dc385beec1405cf3a11eb1b02bd9fd7419bf648414392a6392e543684770ab5e387dcf73a4517e7af0085adc91d1a96a1354aa60c262f2c889ec32769b7a86d5c2e820f9d461bdd33e5d85345717c34d80b23fcd0cd45bb\n\n# tcId = 328\n# changing tag value\nmsg = 48656c6c6f\npadding = 2e21300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4aba9d2c7a58610d7d3f1050cf5c1558369823c1a344c1573b64d3e8483e04995176f05c255ba67e8bfdcc6c7ca640a4ae423bb3c027f8b14318467e6ce1086db7307c0c9c56acd0372c9f53ad17e117df0557e5548d8d7bb6b9545ace3354f5400b832accea7c60c2585b34881461ee6595f0fd564de7f49a7f0228a042c39d\n\n# tcId = 329\n# changing tag value\nmsg = 48656c6c6f\npadding = 2f21300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1f83a1013b293203ebf73ee142d7207bfe7f5f0159327ee40f1325a05ab6819b3e80682b2f4fbd8e65f3ac603e1d73f5d9dd264e25e4d3b473a1d665de67a770482291802c0bca8358cdb20f6bd4e98fdc3a6a533f5a809ae7f2257e997884563141fa95e84e352e949216d5f4e590c61d92fd9ae8191d48f2c128c781700f59\n\n# tcId = 330\n# changing tag value\nmsg = 48656c6c6f\npadding = 3121300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6c6f5ab24760dce19183684fca84e7858c9b0f0b0688c47df365fca8266ccfe5a90f419bad520c97a3b56d3b4c3bd1c9c176bfcaa8f785572dfda5e11a6bd503d817b6201995208b37f1f9f72c8e15105f28f600e56a17d3f8f6ca3a2c63ffad74e640b3e43c5671d22a15793d3c70d9118427aef8a96f9bccca7e66bf792cbf\n\n# tcId = 331\n# changing tag value\nmsg = 48656c6c6f\npadding = 3221300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8c7108f3eab93fdfe930ff1a149a071019936122a4ba0524e309c9af89664f4a202a4f49a4288d80f759521de7e0e04409b5d9f4cb93a722724e34bce76607f9a4c46081abc5a606cda70a859ac1fc931afd10d22a7a4c224cffea888979cb314e9a8dd75a85059bc282c923ca5fd6b508cf4e0c21a93f5d179d05228316eed2\n\n# tcId = 332\n# changing tag value\nmsg = 48656c6c6f\npadding = ff21300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5200334dfd766b1052dbe9d422f94b979b60afe3d9a2d60aa5eccf0e449357296eccc321561534450ddec51de1b6dc6b94e1e8b1ca52714230f9f7081a36eab655827defce738670c769953dce9696110689c1db5d475c4b1b030db86cab46745b4f23d68dbe3951e089786101d19548816f78343c942f31373519aabee6e520\n\n# tcId = 333\n# changing tag value\nmsg = 48656c6c6f\npadding = 30212e0906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 3fc2126ef4b90f42dc8817fb368e4fc5ca34105ae98b3298425af76d2a304ffdabf8d246a53385e0b1c2a2c46205d64eae7be9edb22d5d9bbfa50bca0ca7a8b279ca8eb0ef3aa94d48ec1120010148a58bb576258ec2fd57d10c3d60ed4d94160c5256a24973e5a8333a4f54c288a18494eeff5579e52ee8a45af1ef9943d6a8\n\n# tcId = 334\n# changing tag value\nmsg = 48656c6c6f\npadding = 30212f0906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7d4161dd1d73800001b2eecaf19313743",
+    "91b36fa244d1f92f233a89fc0ee3a95c3766f0c666f5bd0bc5e2d5b25fbe5ce72afe9784488b2076fcfec45dd0a59a9cef95effc524cc57fb55207631341caaa8369c10cbc6cd0726efcb9cd3db7157c9e58d7b84929705bbfb23d7641d90cee85cfa20b0ebc91b7ba98f910c41a13f\n\n# tcId = 335\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021310906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6c848e100c2c5a650b3f27b641848ded3d54a8930d4acfaff8d7a9df3b5aaebb906c50ee5334130ca14f0bcedc5b036b8d6725bdeb56a6af1856e50d3700d9f1735e50f10ba2319e316ae707db874dc56044a9196ff42e1836d051448dccab90f163dce2b31b4405edddc9611e0909f9082b29e8e45f18c8ee7ab12a8502f39f\n\n# tcId = 336\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021320906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8cda31b963c774894aeea363abc4af9a8b83cd4aec6cc9197423e7bf9f6935bce978a148d9179f47c092f3de5bf9229f37f86e7586d8fe197cabf27b99a902e561d722b0359a738523aef87286d19cb36d7b430aef83d9828df1aa334ec3835648b3b2af8c2c65f9ac8990d2f4df370d49da6f81dc93cb7035ee931093d843dc\n\n# tcId = 337\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021ff0906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 426aa261ad32507dbd08dc315b39368e8909824128abb746c65743fee574b42840489d54c8c5d6c5553e8ae1a3f14bdf4ae3677fec308864ad9d5ac5439976e9379904c6ae5a24e73daa34822e846a0eced7314b4cddc0111c21387d56f89f03a470b79514dfa97c405c8ca9dfbb6f2e3610a8eb5d6c52b37b200a1519026e7e\n\n# tcId = 338\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300904052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 126d30c8acb2fdaee4e622a2b4f2a16c56b50d03c3fa4ef5a417e9aac346512483e1f4fb7217ff640197d31b0d6f4c41403945dcef37da312f33eb845fb862ec9994060b085c005c6feb382547a4fa1a7d6e7383c81c8ff7a51b539cb55c94d41fa804d9d6968b57a2e8c946f5260d835167b3b5a8302bb054638b9842ac963b\n\n# tcId = 339\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300905052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 939e9204d0c47d391d83224328faad620f6d293ac79b619769c6fb1eea378111fae89d2def2721055598a5db3f006fcc96f4497aad2e41ffc84573caef22c26d19b66cff4cb4ea6aa7563239cffa1e7ab3d5c0c297b2306963dbceeb502ab76ba11dce1f4fd63af7d54ed9283541e45225e7503a991ff4631bee725eeeee66af\n\n# tcId = 340\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300907052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 074d2f5e6eed13d3beb33cd6434d539e69a6554fc6485bfed21c1ea0350e268dd90d29977b2c43f6d0332fc3a7f1027117bc3ea86981cf2547090931755d84f934f589a7eef4243bc8185fc38c21f0e65ee7c19a7f8651f17e8dcc10bed8206c07191f3e146a871e5f93e52a080ae34c551834810076a1d6161c94e0c4e40624\n\n# tcId = 341\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300908052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 44715b61effca0e94098d7dba43839ab8999dca771968c09b9263a9d732d000db443e4253394eb357cb05bc0d2a715d4d9a0a64b64e3ae7938e040bc9ce6f2b2a5172a564bf970a56a12dbe54d96bc9a6d5d1ee78b112e7c5447015dd461ce824062161f513f17cce02f259a80fa78e655b9c09d5f129fcab8df0a045d19142f\n\n# tcId = 342\n# changing tag value\nmsg = 48656c6c6f\npadding = 30213009ff052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5ec2194d5f835d6dba9c4ab2bdebbed946f106fcd2a3c6a623e67e6f8ed7ffd8eb4d41f0bbfdcaad34a34d84f9a735f78de159748efe2fe3629f7f185e681dbc5c48025469fc890222e5be9884c550e5cc483f6854184df13162f20d1daeab78eccbc52988815997887e4e52ab7b756885442c7ddb557e726642bccabdfe78fb\n\n# tcId = 343\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a03000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 2fb77b5a5766d1e898af896192abf3f347100053b920dbaa931a8f210f1b84d522b283e59f6f6f5b7b13d4a3ffd21d2e0b64d1b275501b0bfadd23e89361f327e8fc7f29992dde2e5ecd85ae81cc1740228f983b02bb9875eb30597fd247a8351ba87a5ad5ae32cc4596b4105904a19e5805b92c266f66a9516fc2ca519ceb14\n\n# tcId = 344\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a04000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 01c320bad86713b33ee0c9a537b5312d00fdf41eddda0e3328ebabbac7ff5502296d78f2c00183055b47cc03f91701c0d7d2ff4ce7c8d26b8481b296ad60acff9c0149dfb7100869526ee9dc7f5fff5aebf2af32975950213e34c7da77377ae3fcc0b4b9ed5369f0fb2115a06c1b2a3fee7201ae2d84442738e37f8cf0b5ee08\n\n# tcId = 345\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a06000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7a8fe54e250dbd71ab620a9b6b3c15f9dcc04a5d04dd70d6cef5fd48b13ddda846f60b38470f14e05123754bd227cdb4f2c2ad0c29d0b93dae4fde5eae3aca4ecdfb0efccad8c0b0e44544d4a5dc2b1c4956e11667e34306bfc475085b146eaa341d754845df2022fc11638021f3098836bc2d2569fa4ca5f20657709a5ad120\n\n# tcId = 346\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a07000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6a853a5244bf6d3795dd7047da88403f24831169f0fe2f7b789109f279d01e092d5e35d837644c4b83614bd40ae164290cb4fe6fb6eea7dd271195d0b81715a32184342c8c83a82ab6fc62ad58e299b619489d5670c65a6f9faae11909a825da0c4486ea2ba1002f5f8d1dfaccfee2312c9098ee684675f920e61a3f6ff11480\n\n# tcId = 347\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021aff000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 16f7787a9f5760f025b2e03886ae1a6c83a99a7495eb57e01b687434a1aa27e5f73e0440a0e6d45d7dae80b7f3d9dda8e2bd37540eac08bfd75f13371daa98a334af10762a55b684bef3c67ee6072717ee9fe67397fd612837e0c449d0404382a1b59adb19bebe32f29b1374b36f9649c0c5fe838252c15e2c8b92ba02bf607d\n\n# tcId = 348\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000214f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 71629cae46ffacf0f7af338c56deb86464d037b1c38baf338eea05164a1bc15db208b8e3054d828dfa10aa5595d20e9010d071baff42f5d39264ba7a10ab263a30cf169021bafc2647bccb1f624abd87ea18750fb3380e7b0bcc0e12f96ffb6b98caebf9f2faee4644c8d6f0d8d33511725ac390f99fae9b40968de60a50dbb2\n\n# tcId = 349\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000314f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6756b3ad008422f5d738f6fddf98b5c049f177a4617e6425c61e512eaf6be60a9e51bccedc85f5c7ebdf74027b526b4d275aca2931bb8e63be243211ade9df54d7b8c65d6c9695586c81dbe7ea8cebf5eae8e34e68676938ccb5bd377821eb55f7f30a7635cfee75c7b35c99e1874e75ca2e07ecf6adb6d58fa704fafd444b92\n\n# tcId = 350\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000514f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 348028df7eff398437ff6b48730cec081276fd2adbff36c6051244763cf3e99d642a1db43c287126532da2663c9c7a57c1d62a4877ad94489d4b0c7c89f7eb6c37766321bcfeffe21240f63347cdc2bbb52c85426a42fe7144f81617bf27b741e7e7080e092d887c59484d5d48e09f2d64a951738de9e1335b9f4777e7d2b9a7\n\n# tcId = 351\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000614f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 656312f836bcfdfb4e38f88994a2295bb55ecff0e745974753b22a15c67c64c92c329693917050fae66f565310f8ef8cf4b37dd47eae088adafc34cb0a2eb1d34223ff51bd230d3946fd8d4abb8ed8d4c923bdff7011052e07b358bc5d59deca4a3d82999e54fb5d521564e9ce1fc69c3968adf31a5837fdecc0c9552297ecda\n\n# tcId = 352\n# changing tag value\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a0500ff14f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8fe1efcfcfb09cb4bcea76590fb8fac5ad9428898848d3c20efb256ba2532dcd77603bbc2cb7c5902e099081f6a54ecfa4b0669d5391c10f391aebfc636fef14bb7bda71f12e0d9f164a2ad47abba6103986eba5cbb0b1a4bc3887a51ebe614e0dfa60afe1c5c0bd76911d01450952408384fb88e795897c0ed64e28c5f00b71\n\n# tcId = 353\n# dropping value of sequence\nmsg = 48656c6c6f\npadding = 3000\nresult = invalid\nsig = 2b58ee609310e66e3d812f20eb3a9e2995bbd5947b5569c0c23aad8638590a43c8610e25fe6c248b74392ebe9f4edabb1e5b918e227f49bb9df288f5755d06f7a22e8e7e3d63b21ac023d35067142f301bde6f6ce017ffdd256647861801e3dcf38b18888b9986eb2c944937fe1706e28988f0781b7acc83c4a0ef4b40b25b44\n\n# tcId = 354\n# dropping value of sequence\nmsg = 48656c6c6f\npadding = 301830000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1bf19d3dbdc4d1ce61350bb52d11ef6ec",
+    "de6816b875ce7fa7361bb2edf84115313cb95d21f3472b7d178e27c0701c6ab528a735fc0ced0a8af81c78d96227ffecc545c8cb7a49fe269e97d647b5b01e0996f29689504b1ff4e4d8e08fab6756ce9603c0bd622b4e74eb8c18373ac1efd5074d08ddaf8fd7c3204e25fc0c99328\n\n# tcId = 355\n# using composition\nmsg = 48656c6c6f\npadding = 302530013030200906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 5e1f0d448504349b31c8a5ed03e066c7dd7878622fe42d645bae8592aee87e1056504d92a88a3626c54fe3da07649ae6bb30315f3c3b358beed1afd38d414785906dbbc6d0e188f9006756a545a1d1979a496449689ee3cc067072624ef5f2de8a1f6f0c798e8bbbb9b6e14db12512feaff11063dc3ca3a5b3bd5926bcabbd78\n\n# tcId = 356\n# using composition\nmsg = 48656c6c6f\npadding = 3025300d3001063008052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 18d30faf84664f79faa0dd0285c408fe54793df5858ed7cc367d62847470e32f433edb77c30f0d0dd549220cb18eba18d1076820ec27ac37bbd8b989b847ed8c84ed1930e7ea8566a9d043807b0f03fae51aa0046483343ae06831743fa79f4438190164e9d5e75610bb5fb9201365dd9dd4aa6b5dcafcfd73161dde7da40e99\n\n# tcId = 357\n# using composition\nmsg = 48656c6c6f\npadding = 3025300d260906012b06040e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 981a4523b61116d28d4bdb8d80969f7fe1cfbb06f4dd218d05fa332680b1342d20f0e4d4a1a6401ad777615fc56e3ca2fccaf07139f43ebe1d92d20605f8c894d88e8c062487fa86f51b2026dd12ba68077c3551d928990848bf0de07cd880194f2ac276af86c1e55e25044be3c7204ddafdcd61795a9e3b7885a88f43aa6b8f\n\n# tcId = 358\n# using composition\nmsg = 48656c6c6f\npadding = 3025300906052b0e03021a050024180401f70413ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 98d603185c1e2927622056c9053a62e17ea4aab5808418725cf8887720f5f3500cfe6ffa00513e45b72c9fe44d288d06555bf715282f6feb685df2f44bfcb3ed541653139eeeaeabeae9d52514495b604512a9ad6223f68a860612b668f5a0993ebd5c9ce9cc00baa80484d60b01c23a6abf40be03cd1cce3317563b1f9326f5\n\n# tcId = 359\n# truncate sequence\nmsg = 48656c6c6f\npadding = 3020300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0ab\nresult = invalid\nsig = 3b5c1e0d3dc103755b67feb766d58968f94e8d8af6a209f6d28e7c0541a4fdf7a6976f664414f5ee0beb9369a59681291fb2c902853fcaa01bd065fb7a1da967849cf45bf558e375058591b3af1b5c8a18da21d5dd7598e7e3aebe0478180200294b86d88b1c39e224bc1dc22f1a8e537e05db467b5a04dc70ab9346c79fddd0\n\n# tcId = 360\n# truncate sequence\nmsg = 48656c6c6f\npadding = 30200906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 61b6f98e16e4809448e56d9845850b748bdb64064ed4851c141c57e93c37744bd91f54f5ffd9264f151294e6f73bc8d5a51daa06b9121bfea1f28847229875ab87a7297dc383987db1f6bc1133e344a95af6d34fd18105d154ca951e4e6f64f9fde7994207ddd5eb6bb2a07037f13c8d853a8b8684431d5ecf1cc9bde41cda49\n\n# tcId = 361\n# truncate sequence\nmsg = 48656c6c6f\npadding = 3020300806052b0e03021a050414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8c05912e8ebe5f2cc9fcbc2410bcb63b217756cd961db8caba316634c6ce191f365a21137602373f357461e9020b702025c61e3571cac6967a8f68375a9cd4792222b59c54e21649776f6e7d5995448779f7f9d32bb4e0e4e2b612b5c2b8574d98d01b9cdd26965541c0a67d484e13d4f49095ff7030b180569058376c7926a5\n\n# tcId = 362\n# truncate sequence\nmsg = 48656c6c6f\npadding = 30203008052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 8bf895e0a26741d142767e67e73f102180a5e2083ee27d869585cd02c0211673641ab3e4f84cfdb2748b0a3a39db047fca2261c7ab3a7bac575990741d15c543f83f9da27fb5da3362ad1ce1a0eccf853b9e0a36f851b6cb5734cd22bc3b621193db37e13dd06d8854ff111dac2c939618aa041abce70123cb14d62d527223c1\n\n# tcId = 363\n# indefinite length\nmsg = 48656c6c6f\npadding = 3080300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000\nresult = invalid\nsig = 5280f9fd14542d5b61a951893b081540d922ba15a7a650aced363106d97b69aff5b1ad624528b7560dce27c3a3e8f8657c8b0e9b83ab63342550fea7469ec14ef1cf48ed33515d56c7872d5eae8cf2480ae7549a8ce4c56748d08c4f3a61bd13b9c9ead6bcaa113bf3f85a112057658689ea075fc8ac7d74216918d588865ec7\n\n# tcId = 364\n# indefinite length\nmsg = 48656c6c6f\npadding = 3023308006052b0e03021a050000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 88cd60c74205ced62ae7bf35eae4c86826ca946a9b3bf190ab8069734489058191b6a501b6766fce0f5a3e5f7a39c0deae40aa66ab36b5a2a39d955650118ded3a8dba0df5b50056058cd643630133c4f2cbaaf8055cbe96e63e8fef8074fa23e1f1d5a1b5cb5ecde5fde92c78441f2907aa53ae9e3e09f0a7a7628e4e2be5df\n\n# tcId = 365\n# indefinite length with truncated delimiter\nmsg = 48656c6c6f\npadding = 3080300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf000\nresult = invalid\nsig = 380b0826787815b1d32147ac0b7f5489998f5a16c3e6347663b9d002c46f46cff6b15b304ec5dd74de921c58099c91da3f67ad905122b644e50b1f85cededceb3db8a0ad66bcc016588e3db5dd6094c94deff70824a79818adb0c693c83b981c5452f5ab17e26e480e3488d9e40547019d3508a40027c64532a07923de83352d\n\n# tcId = 366\n# indefinite length with truncated delimiter\nmsg = 48656c6c6f\npadding = 3022308006052b0e03021a0500000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 464463484db67af5a057d878954fda2cb153a7105242cdd3506c5011a33131f77765ccdcbe38e4feda51447638c03d80064741cbfbf9efab1ff6613c1e57ff42220ade66b88c3913ca3475edf30f0b25ec7c4ad18135453cf186f791a1329e022df21381c2344d8a638e512984fa0e170a97d756504dddb4edd5212d6d4c820b\n\n# tcId = 367\n# indefinite length with additional element\nmsg = 48656c6c6f\npadding = 3080300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf005000000\nresult = invalid\nsig = 5d0d2d969b550f531294bfc8ce70542c5b1a6789284ed59b98156260f53a97303a5905d004fb09eecb4d8b3d7ff8bb8d11f0c4d7a2f5ef7f8a78eda41a9b4816d04930a6817185488e75bd9919eabe31a2a390adb2369e6d40db644eb0b082619e1fc904668d7619d530f9d4e89cdbd177d99df563c73bbd6a41b25290d825df\n\n# tcId = 368\n# indefinite length with additional element\nmsg = 48656c6c6f\npadding = 3025308006052b0e03021a0500050000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 70b3453abd3ceca3f14bf02e04fc0c98dfddb08ffea15c326f995de6b14f4a441cedb259cf1a003a90d7658697920ca08e128adeb78c62030906a9357ed8125352f15266adc740050da4c84ae067db4a4963f859bb05935f2a4684c42c1ecf9e48f47426b213de2c534275fb59b7dea7981178c7b1b95b20f5ede8937ddd4c83\n\n# tcId = 369\n# indefinite length with truncated element\nmsg = 48656c6c6f\npadding = 3080300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0060811220000\nresult = invalid\nsig = 45c3b875d8401e38e121f23cef2a5d9032c6a5a797233ec733b74a8ce1ef1f3ffe141ff8af63170b2e2e345e70977ae0f23168ba41aca2ca55a8053312f1c132a907765e8fb2046c954c5ac7a212eec919de8d699e6f22f4cd7d274a9baf978fcb1c58a26f8bd4a434224eae04eeb5f1a0cfee6e6f41ad0ba5d3de3e801b6533\n\n# tcId = 370\n# indefinite length with truncated element\nmsg = 48656c6c6f\npadding = 3027308006052b0e03021a05000608112200000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 857d6308505c1fce9ccfb680ace1c4c539fb13e7b6f4ee052fd207f2d6b62ef35bf1e6bd66c37d51ac5dd8c3192aa8d2148b5f5a9887bd60d16f8a870932c0172d105f72097f1985c0402584f18b222539790611080c19678071d54ecd73cc7dd10fcab4269f5231d1084eeaae87288e12974f360e4e81271af8d1a5bcac9e8d\n\n# tcId = 371\n# indefinite length with garbage\nmsg = 48656c6c6f\npadding = 3080300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000fe02beef\nresult = invalid\nsig = 1f1b19d8efe38a0e104b533e3ad1e517658f3d96e2031da71b9e66bcd96bcbd9183d7ecef929b5999391bbe308bfd7bd39322d8c64732a5d782a5f04047ef6430ccc528755a052f84059ca767a7ab729287d45a96b3d3586fe92413cbc1c8e653e56e705d9168c821bcfbfe97662f0992718ea2357084e80970e50fca22c6b17\n\n# tcId = 372\n# indefinite length with garbage\nmsg = 48656c6c6f\npadding = 3027308006052b0e03021a05000000fe02beef0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 7da218198082bc7e83b0970262545f05c31959db8a96e1e4c4572fd76cd4b96e1c4f0b7960ccd225ae865195e51e179e64736ee6ae70af86fbd8102b34704b1bfdf77ea5dbb23dffd120cdfb6229fcce0e90ef0cc06f13a4a87d6c8b0e6b275a3b89a8a4ccb08b311a57ce835d7e16e8d83509e186fbd9143fd588119ad4d473\n\n# tcId = 373\n# indefinite length with nonempty EOC\nmsg = 48656c6c6f\npadding = 3080300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00002beef\nresult = invalid\nsig = 725ee31ee7c04b139adc17a362f84817c7550f5b8c49091733888429b906f822f4069733d15b071e2c2392b558871279d7194",
+    "b2ee6660e550bba9b725bdeb4d1a6dcfc82a217c638d53c9c4c18e06e49038ec3c09e1b0cc789803409125380e0bba9e5bc4c9ea949c59d38b8fe6a280c825e79a32daa8dd3a0f0f7012d8fe159\n\n# tcId = 374\n# indefinite length with nonempty EOC\nmsg = 48656c6c6f\npadding = 3025308006052b0e03021a05000002beef0414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 902d192102ea702346d9e8cec57a1124f8b43ac34456ddf4a7ed4f6f55cb2dc3d3b88015f8da76cbbb1b09ae134fe333c9d482e5af92f3fc2f25630b196bd07571aaba9980dd940d281fece0b2e12b9a04254392ba52a62a4b59447c53396db16056a27436acac363f8921ee4eed52966930e371984f5b4d4f0fb09efba10dd9\n\n# tcId = 375\n# prepend empty sequence\nmsg = 48656c6c6f\npadding = 30233000300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 91c68a2673606cff82abf69c9e2d591315595a3a0b612d6d2708528be0184c9116195f58cb4109a69f8d2f7cbf4036affcebe7a1615a914833b921b915ea12b16324e6e74f95d6eb5b03201d67b945f03296ffb37ef7cda908e83f44dbed24a54e81b71f840668fa4fd82b29c0e1c5b1c021d481c73a662668603d3fbf5182dd\n\n# tcId = 376\n# prepend empty sequence\nmsg = 48656c6c6f\npadding = 3023300b300006052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 17c921fb3a8535f2e472df2c447a60f2fe49a4afeefa065f1c84e50dc97f989268ae6bf1e8d77f5b2edd59c2c7f3653b7565902c5b889ec7007fb9006f244257649888a4a1883146c88828717d381018b1f00d656d5e092172f49fadb42f913a92ae1eb4e01e3c2490e1dc52a109e37094188bcaa181898d97ea2c0203a885a8\n\n# tcId = 377\n# append empty sequence\nmsg = 48656c6c6f\npadding = 3023300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf03000\nresult = invalid\nsig = 077b2d2e79ff380612aa3f9c79e8b7a580ffafdab8ca3ec86501c40248b3459c0c7b2590fc18ccfba2b0e7a34c67b8d3a7ed92fa686170475666570d38464720b4983e5c374f1b6c604226284a62e20a8a37341abd72f238aec8a2cdfeff00c512c28e608ce98e4bf3640c61509ec56f7e2143216214eb5b06bfd0fa448ba633\n\n# tcId = 378\n# append empty sequence\nmsg = 48656c6c6f\npadding = 3023300b06052b0e03021a050030000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 2121389e8b2282bf6022c45e7a3ac9f42bd7f13ea37060f6989bacc72fb6e887db8128024698a5c76adea034c69604b1f56e062627c840cd2f80802e6f2764606b96b78506614198844319bf7726b95afdfd19d5ffda1ccb159646bee5c3d81adf56f2b54edf749ca99a86bc9452f6a307eae06f028f86b4af17137f6a2352cb\n\n# tcId = 379\n# sequence of sequence\nmsg = 48656c6c6f\npadding = 30233021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 059efdc649108b988ee6a63697701a3c98bf7c770dd525844dd6e936d0f468b3c786f82a03c4b1d23caca0dd2a62a6ac43f58b6cb311a819f7b9f48cb9b59b17306deebf1d69a7d93a2d9381e48ddd0ef1d0a07dc5a5568eeefb3832dbbad503e21141f6dd58a5bf503a469d49dd3edc5f3a712b7e63d8ae734ee1808a9654f9\n\n# tcId = 380\n# sequence of sequence\nmsg = 48656c6c6f\npadding = 3023300b300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 21d94c3d46c49bc86f376e2d4fba1495f98558e9f76136ba001f1f90befb6311771b700c1252894a5348491c262329e99cc52ee68e577615ebe73d59210f8ddd8b91ddced5fe98cd832b57a4c583318377892bb15bb7d545cc7a182fb47c3149b99e4db5f12df9105a055d0925d8f3d747a2f25ba1dd00a5184afa46695197e3\n\n# tcId = 381\n# truncated sequence\nmsg = 48656c6c6f\npadding = 300b300906052b0e03021a0500\nresult = invalid\nsig = 690c052df7c7079aa3bbcc9d4699ac50bf0dd90b1d6822046c7ad1429900ce2c4882af9decd580fab0698e5ce3185bcc234561e051533283d022831fd8b19434e4bdbc84223ddcd99d1a8f28a9ba222394312d11d81ee95831b4264d5434c3122c30afaf6b990ccb4f6991f60e78195d3aed5f670c4c2fdc034a514b92c67519\n\n# tcId = 382\n# repeat element in sequence\nmsg = 48656c6c6f\npadding = 3037300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4f4f38364932377af52adb8c51c5bd705088ddbfda713458377c3997915766ae05da5c797cbf24a9c73d36fa61b1b0bfb9c14e429c0b66fd6fe1ec041b9d14946588dc384a7a69bf2ab69fd8da67d0e1fab2dbf1838959cadd0d3ca03c9c0bc929d207be60ff8e08bfbb03f4423cd81fc5f587bbff3985d2beef69dce295b903\n\n# tcId = 383\n# removing oid\nmsg = 48656c6c6f\npadding = 301a300205000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6ea8317813355faec271a659d62cc94f7408fe73178a2de00407136a53b69d77136b9ef4533e3cda580761f42a683d4a02a2abb7aeb941a44854832d18950d8efc43ae8de29c0c97873761d126e15e7816d173dcaf9315dfa045681d9a4b37b2ce1578ffcbfb4c30cba6e1746ec3f95d310839d75ea873ffcc0ee82513342a71\n\n# tcId = 384\n# appending 0's to oid\nmsg = 48656c6c6f\npadding = 3023300b06072b0e03021a000005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 990ac0a5dbe9f30114427c45925353e49c235ec8fc5b19724bffa75eb7e93987ed97dc3107e2ec26b9bb2c51d53f92158fca0baea0d881cb829e0bfcbc88f0021bf967e44a245eadf78fa8eed67aee696fde1a2a79e05a7c6a049f3af282a394f743bb4eedc9798b2d3290e8255a2339fb7a694e789a6fa38e2a236b948f48e1\n\n# tcId = 385\n# prepending 0's to oid\nmsg = 48656c6c6f\npadding = 3023300b060700002b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 3c8995341ca2811f9e976e8157e708aa59b38f8e1a24ed16d8b30a19fa23c5df8b1ac2b3c82fbf91800918a2ad6b9320b10e39fb391254a3d954a278faffa97a2052513ccc8b17783faed189b8a4d997d7baba3053d6ab6493e2e36b3ee5046ea62d37a835a51390252dff088cc3a0a33cd1a82e557a0be0d5871b4fa18c05e2\n\n# tcId = 386\n# Replacing oid with NULL\nmsg = 48656c6c6f\npadding = 301c3004050005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4e7f335369655f3868010396eb1a0c567b0763075a98e179b99f8511e0ce16e50b47dd3ffcedd55201082bf811e8206cabea8d20b4d0cebef5d9731fbce38c620f8baf25ff1dc5ebee28eefbdf0846361d2a7d54edddefefd04b8756b09f410016ade65bd30bae6e03db0d39c13099e397abababafedd89a56c072618ddea236\n\n# tcId = 387\n# dropping value of oid\nmsg = 48656c6c6f\npadding = 301c3004060005000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 87b5cb8841fa252f38c375b39ccce2d0361397a8436d2f37ca3e2293e554ca27fea1095683e42f274ccead1876d89dbb4e5dcca8e28972aeabe3d818144e96c020bef1de944724d1c2a813c633f8e7f8b6f8c8950d2c89dd26534430ff9cb6f5f08b332638b1385770a69bbbf6f76342b8270e2bd440df058c2ad55f9a0dd679\n\n# tcId = 388\n# modify first byte of oid\nmsg = 48656c6c6f\npadding = 302130090605290e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 20a593b6637cf415ddb40ffa364d78cd34ede10f492b7247ad8ad8d5cf9e58ad9ae23735e668bf9a5ec5ad0c0980566b8612054728f2f8fd84f9664611473462357f8a1cfd66c3bd844bb306ba900d2c9a8450df66cb05f6eecad196217b28cb828759385707753189a94993323a59d13e96b3fb3fd9200649a6d63ac5bda82a\n\n# tcId = 389\n# modify last byte of oid\nmsg = 48656c6c6f\npadding = 3021300906052b0e03029a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 021cd5941f0021896d96282a1f8716b0d39305437cf862a3e447b27f1d8a8617a0ce4534c7502c730c4b03bf098f854194ae87def4db9381e00ba6d7551dcdfe2f04ac881522786e933881685d78a24fe3422bb99b53b1f517b8c942e6a19b224d183c357c296dfe5d3b178174c487176945890a707309c1329023a658c3cf9e\n\n# tcId = 390\n# truncate oid\nmsg = 48656c6c6f\npadding = 3020300806042b0e030205000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 3fcd54aa3d66afce987282cbfe09f0a6eb30d0c94227bef8a2c9fccba44f1c8aa080b361b13eed4c9d0d37caf26fe61ddac8347102d9080cb17f2cfdba7e217df3f8c19039d466241264ae8caf15652c8f72a6ae292dc71c80049d679034ad19bc745d6155cb2efde963f738cfea08f7bba8894f472beff5deebe33173033317\n\n# tcId = 391\n# truncate oid\nmsg = 48656c6c6f\npadding = 3020300806040e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4ad8a7e4a92ee9aeb1bf3ee9392abe141d435a6ebd1799d90f5417e6daef65d37bf33c8c5255d52ce5d8b2cc223cd0c68a6061450df5c6694e2b911c8c25e6384a70fb19a50e10bfbc494fe5a62d9db915b7c77a27d17788f0567110bb046b8aa42d3ee1ea444c20b983226cf094f4cbfab24855c68f1e2e9fefd41b2dc7903b\n\n# tcId = 392\n# wrong oid\nmsg = 48656c6c6f\npadding = 3026300e060a3262306530333032316105000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 773070dea29e40cc9ca6ba047ac60013f8b5a2835c71e42aae5f0b04cfb78e229a59643ddaefc4ec9fecfcd7247d5bd344dcb4009c7f0e0c6d0b9f512e60c05e7b81420a03af3c5bd8f205d7393f6f32eaa0e4e51ae1a70ae3a8ffe04bbd576524fb1ea0b72930d03cc3e5d8762e7a2004ff0cb0202515c67fec1693ee7cd41d\n\n# tcId = 393\n# wrong oid\nmsg = 48656c6c6f\npadding = 302e3016061236303836343830313635303330343032303105000414f7ff9e8b7bb2e09b70935a5d785e",
+    "0cc5d9d0abf0\nresult = invalid\nsig = 350274641f0d1af9b1574ad9c8b907ffcb5240825488a15f811abf56920c6b71d1c4d0fdec8322fbceedb2189bd7932738902830162171cb67243096ff0d42f7dddb3416eca5cd9b6a86e504a2351e4d87c75c2ab6bfdb005208afeb1cb6e542da32490aa5a0509db3926df6aec56fef56ebee5543d61f7cc3a35984a43c1a9d\n\n# tcId = 394\n# longer oid\nmsg = 48656c6c6f\npadding = 30283010060c32623065303330323161303105000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1ffcf9548a1c98d254f3be4aaa250650fb5f95d10b6468406c9a7498aa84213117b99a82f40727504f6a563bd471c1987aa45a13cd6b6a6c501a8e455516f29fb5cfe9e4703fb9529a06010a557353ca13efd3b1cbc7f0381a84e14690a54879f8c9a3da6d8aa19d3f372d7f1a87badcdd871179abe6bcbe1c18f4b38f87a3af\n\n# tcId = 395\n# oid with modified node\nmsg = 48656c6c6f\npadding = 3026300e060a3262306530333032326105000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 17bd4b3bb00dd491d68c76810f5779e996eec04bc50606ad30166d9e26948c308ff766246cb5bbb362dc33129865a241a505332a0f46fcb882acead6c6bb5c1b8300381e3f9dcf89938b081e0c6106c51e8857252907d5b5998a0689335340b2d8bf186cd091753858f4c9f72faf4db828c3f23bb99fd1235d665b7703a9945d\n\n# tcId = 396\n# oid with modified node\nmsg = 48656c6c6f\npadding = 302e3016061232623065303330323838383038303830316105000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 2bd908594b8677b6359473f30a827ced749a0b81e6bc060fc71f5ca8c54f26176394efc3b9dd34b6b425269afaf601a2402f5db7c1fbb95bf4d9a90f58af7dbf5c11e9993f3a6373df216dc9e51b25bbdca70e32f6a96cbe42d5efbf67f4c6cf64e0a5c6b5ee80aa0ff7976184a5ce33b7a7c2c8a079a207ba7b7e1c8a2ddf2b\n\n# tcId = 397\n# large integer in oid\nmsg = 48656c6c6f\npadding = 30383020061c3262306530333032383238303830383038303830383038303830316105000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 13e8d2f76b24fac71cdfdf7bfc448ce55ca7a25b58feca2a51a3e9e40b3c75bad26a04e3799c66edd5871fd4dd62c7b35d0b062e1c0f7b05ba4b0e9c6635a40236abef106f3b3d862ff1bca0ee290f3283dd38c081db0df39573134d40693835f56b4b97387f3e3cc3fa3d9f9155611a5bd413d34857c774331223301e2d0207\n\n# tcId = 398\n# oid with invalid node\nmsg = 48656c6c6f\npadding = 30293011060d3262306530333032316165303305000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1d847fccddad46487b0fcf75f743e9550e4c6e68fabe27e55374cf5ef9240bb37490041d24ae74bae0ac5e49196057cb150abcbaea8fabf3f936b0b2cf6d91c49f3bdaca01689b70fa34152580bcb22c67196c5b9634fb2f0d75f523fc7050a6134d870190e528cc18e6960d288e5b597930888a36ca4e6c455f5b88300ac160\n\n# tcId = 399\n# oid with invalid node\nmsg = 48656c6c6f\npadding = 3022300a06062b800e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4738deff4b32a30dd68b0abc1971dd2af9a500b5f6922558b96ac9b1ab4a50328b2ba9a48e7c207a02ddf642728930f4004d337483eaa0a01fb038a7a6c289672bdaf1016120f2faea563f179d3d623d3ec9bb5d936ea2a7f74d2bd70a06c83e904df55f5142c5c6b6f75221397dabcb19e069436b94ca764a5016141496503d\n\n# tcId = 400\n# appending 0's to null\nmsg = 48656c6c6f\npadding = 3023300b06052b0e03021a050200000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 977a5c762a4dcbe9551a4a0bcfe96114aa59187e6dd0164cbbec2d28ff9d11e413a1de7f274704c24229c99ce9b5a3d98872db56310be7259a2fa44e652c4d02f8802360d3a29ded2a7de0a183001e74b3aa3fe594867294461d6a23160481ecdee9c05c28ce066021847a23366cb147013f57ce53a24791dd1873527f1323f0\n\n# tcId = 401\n# composed null\nmsg = 48656c6c6f\npadding = 3027300f06052b0e03021a2580aa00bb0000000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 79a42d1f294f82bd6ad48818f1f634733fbefea7def5ea32a1ed56de994ac047011695a0c8a11813d042ee6784cb172da76aa0ed892e53d4bf99fc21301a91181e7c93a56646190aeeb4a1c212d34d17484521580d84adb41b2a5cc285963509d0c832e5a2252e5cb028839d9db7bdabb7689219b97d699277ed004ca6389b61\n\n# tcId = 402\n# appending 0's to digest\nmsg = 48656c6c6f\npadding = 3023300906052b0e03021a05000416f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf00000\nresult = invalid\nsig = 37ddb1b141539dfc350974039429b948cfd8acc40ecab7270b3e560f0876cec68fa22c8dbf09c8c25955819a5cfc6d251ab99cd06c013792207caa2ada95d4fc01a6d89329e211869c02c648a64b721e92ef3aa767569ba2f0c7c376772926a95ededa5d3f0ce10ab3b2b25f70fee1702dfedb0605ef6401f3f44c464ee98110\n\n# tcId = 403\n# prepending 0's to digest\nmsg = 48656c6c6f\npadding = 3023300906052b0e03021a050004160000f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 85c2c430e7cc2e989e729186cb1256a5f7e78bbb6e135b36a43059389f57cc7fd67ccf20becc0d9e63731ae4ee77e926754ee5226991f9bd46203f7fb88562b00974dad035b1a0f39cba567dc0ed3cb3f7bf51326e62b0f82d8aaf8cc8dfb96c08c64235dc2a4f612bc29a8d4fb4b1edff1cd517d1c981a809ce9708a547a765\n\n# tcId = 404\n# Replacing digest with NULL\nmsg = 48656c6c6f\npadding = 300d300906052b0e03021a05000500\nresult = invalid\nsig = 5cd36e6403f666a5392101235b8f94dc80a87c03cffceaf72a9b6c37189bd028f94df3d6df776bc35f7090d2e0048d5e2ad327d4f6c4defe83538d7500b650aa47162e0d1536136a43cdc4cb9e12780496f696e781ede83fff94626f98d7f4d3c8ef865aa3d042b85a1c00b70c31757ab27c68f79bbb709e714a41558216ceaa\n\n# tcId = 405\n# dropping value of digest\nmsg = 48656c6c6f\npadding = 300d300906052b0e03021a05000400\nresult = invalid\nsig = 708e3d4577c0ced7b4d729b5124169f67836738bc18f82537dbe1c9a48054769ed0888751a823eedd05408ed934a555655d473dcec0fb5c6f19aee82f1dedf3f4fa14171c3ccbd3f1f9920f233a21be4341134f25636cbdd55918e9da76568c3ba55c630ee3e9eaa4dba7bd989fe0534925d1c47592214eb4869bcd42b60c92d\n\n# tcId = 406\n# modify first byte of digest\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000414f5ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 82bc0a32f50b69da0533a0b7d966f86597c2685bbc9b44fc1d58518ef8c161efe6e6369945f1806ff709304c9f60430699b22c550d1f5f4d773c1d31667afbbc4cc824e75f0aab92d9d513e2f86f414d853e5dadf34893b6525765c11f67ca4b2dfae48584a760637016e3231fb89031d549ddbe6fa1bb90c7bc792e3f13f8a9\n\n# tcId = 407\n# modify last byte of digest\nmsg = 48656c6c6f\npadding = 3021300906052b0e03021a05000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0ab70\nresult = invalid\nsig = 44b0c75a3abc8f2bd7575787b1349ddda91a5e432b85333030562e7c391344cb1e6dfe328f11491b92c2eefe38ee5fd8aefef2e02b0527fd35a9556e23dc9c1d6eb20bfe3b21bd8b2992c076d7c228821fe5b36f2af42d1c365f49219184c4ee11d2beac7dc08860cd57dc80484cc5702d49d1b9cf6e7cd3f7cccf05bf701c4b\n\n# tcId = 408\n# truncate digest\nmsg = 48656c6c6f\npadding = 3020300906052b0e03021a05000413f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0ab\nresult = invalid\nsig = 313624a0449c7f2f19878797dab59c91ed45ca0910aed355737635283d56edc7f470628e119a70f7d40b238e0ead042ec1c1c377272fa3ca975cc21eeec934f758ce70f19e00f592a0e5a4aad8e9956d9fd7dbbc126b6a001f20c42b517ba54511630382612f2bacb9711c87d9a19897c8c44f7905f548b558fada6a2c9912c7\n\n# tcId = 409\n# truncate digest\nmsg = 48656c6c6f\npadding = 3020300906052b0e03021a05000413ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 4a3539eaceb4691d856020b9acc11854892df705ad7994759dea2efe0c5384e8f86ebeb3f4360ab0bc7d35c8ca520c8d0a1c869f3979ddedbb60437e798332a0ef7a52ca86b430ebc6aa57114f6057c8f18066ca1483cbe8a8ad3a1e96476a21d53ac6f6a4e18ee965371ebe58184fdcec67f0d42cd16d6ce6800ec87978b759\n\n# tcId = 410\n# wrong hash in padding\nmsg = 48656c6c6f\npadding = 3024300c06082a864886f70d020505000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 1d8eb339d60f873bf3dd07816dbd8a5b5e61805e26654e5a5869fcbef176a61a3b2c173778ce5fb7323dee2f4e42a272474576e8942ce04c66a17d2ccc093e529df580d047159f7c1266af51b7a7f07f43a28e309111540a80fa76b25b6d86f9d2fc99a28d1715567545509f80beb700fe9cfb82be7bc801794b7d32eb9b584d\n\n# tcId = 411\n# wrong hash in padding\nmsg = 48656c6c6f\npadding = 3025300d060960864801650304020105000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 949fecb83ddc236d3c622c9b6118fe0bf524080594c731636eb735e7d1285b5b6c527a2346b51c42fcf706184c4edd79ac98750dcf35973920aa19dee689cb7654b4785d2755b0dde4113c293e301f4e0331cf166bd8c7ae07031165fa4c02a3d6d70422fe42c7c6077a1f1dcbdc0de257363d51951ed1e2b8cb66684d42a8b4\n\n# tcId = 412\n# wrong hash in padding\nmsg = 48656c6c6f\npadding = 3025300d060960864801650304020205000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 3b2ead8d64cf96e26db3ba9d1ff63a187a715d04e3a7dfcf6c85790896793bc19c0ea6c5266cd4ebc25b859a07ad6459942eb46f3efcb9adbc29f3fa5acf0013d5baf3089e3ec5cd3401ae282670d27493b0ee33e391a9d32283b2",
+    "24036405c9d61bbb470dc8a69762bc35483d3d26c1c8e16c311e5d3e284f1d51383ce7bdcb\n\n# tcId = 413\n# wrong hash in padding\nmsg = 48656c6c6f\npadding = 3025300d060960864801650304020305000414f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0\nresult = invalid\nsig = 6b23ad94314f022d64a7b525aa933b7aef8184b66473572bf41c00f899dbeeb95755da7c749a0ce5cb09d3567ebd4ceb0033a1b16cfa13e85fd1745640a5306229a14a9c67c07f75058ad1dfebee25c44ba3bbf75fa053ef74717ea7f972dcf7d7d23901a3aed841e0ca419aa570a605e0d189d2b51ce3f00497c0bf16998ade\n\n# tcId = 414\n# wrong hash in signature\nmsg = 48656c6c6f\npadding = 3020300c06082a864886f70d0205050004108b1a9953c4611296a827abf8c47804d7\nresult = invalid\nsig = 53ee28bf3582045ff9a6f7d813b9453fc5813245b198d98cb141f6f36202240746b9d3778006aa4cd3905bffed0fde38157d8e8809228871fb48037706ddaaebd31ecebe3dae0516539509bfaea18dc1fc3c7f29620f3214db5d70005e1323094aa8f94ac9d64d9d02ff2010178425027145740b40640a43ff24db043a7a2d2b\n\n# tcId = 415\n# wrong hash in signature\nmsg = 48656c6c6f\npadding = 3031300d060960864801650304020105000420185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969\nresult = invalid\nsig = 171b1a7fa8cf97283809515866708d449f184d675613cbd33e91586f8e238946f860915f0fb6a390bc7cedfcf7d1621f49f3c6f39b7412d75660fbe3c2326c48399b7d41dfceeadabf0cbfc4b7dd756d8bdc38d28e80fb60e743fdf6d81973959d2c6b111fa0d8f3c9c8677c0c8030001b12f3e2c5990822154b1b762162dd7d\n\n# tcId = 416\n# wrong hash in signature\nmsg = 48656c6c6f\npadding = 3041300d0609608648016503040202050004303519fe5ad2c596efe3e276a6f351b8fc0b03db861782490d45f7598ebd0ab5fd5520ed102f38c4a5ec834e98668035fc\nresult = invalid\nsig = 9810d39416595ad79cf376b41e6e5f94fb89f61ae78bc5a0c710fab15d369dd7f050b035e5c2b8cdfe10d06be739bae08b47afd0b7dd2b226905f3ee718ccd5b5fb5b951558a62d83a2f3ba5dd1990d2d3e05c461e33ccaa1bbc22350c3ca157351a5b88ad3b1f524fc5cec5c1714a8ab3ef709e462434a6048133846fd1d85b\n\n# tcId = 417\n# wrong hash in signature\nmsg = 48656c6c6f\npadding = 3051300d0609608648016503040203050004403615f80c9d293ed7402687f94b22d58e529b8cc7916f8fac7fddf7fbd5af4cf777d3d795a7a00a16bf7e7f3fb9561ee9baae480da9fe7a18769e71886b03f315\nresult = invalid\nsig = 57532194f33bfddba2e848b9342342114e2c6dcffe228cb97b72ac9e26b77cd336a6fa5c8152db0d536c6fb3cc48487a89cfcf42990593fd0dad420b46fa87ea2b9c9962025dcc2b8a6d5a0476408a62d9c276fb5eb8e97e5f1726918fef41c0d12ad420525a803d804002061c3bf355a3c4fee4ce42016cb0e0531d2657726d\n\n# tcId = 418\n# using PKCS#1 encryption padding\nmsg = 48656c6c6f\npadding = 0002ff...00<asn wrapped hash>\nresult = invalid\nsig = 572ecc55660cc4f8888559092f54e4ee0dc6a57d0722bcba6b608869bc0e86ed53f8d88180b40c006ff10dbf32ba2c6bf3558e22a688f7d68a6d38740b99dd2a2eaa6fc94fe9fa76a0bf775c0eca5751ce7837a3da3db7dc648fb94ed0def4996eb40e168d49417dfd82c86f2c586fc49dfa37a6335b8a76aee84c755610948b\n\n# tcId = 419\n# using PKCS#1 encryption padding\nmsg = 48656c6c6f\npadding = 0002ff...00<hash>\nresult = invalid\nsig = 849f48195c7ae50b762ff93e350bacdf52e3eef5f86dbec5115d74ccfb2c9a49cc91115f6935b71deb424865666ba070299e17e64c3ce5019e1481ee195cffb4fc1f92f026cea579bbe9f78d7c665dd7f65af7c3221bae50d5c0b50ede25a3993979d167a86db511b9ace4f11c331f892f06e72d17e934da9a83a3c703b3409b\n\n# tcId = 420\n# invalid PKCS#1 signature padding\nmsg = 48656c6c6f\npadding = 0001ff...ee00\nresult = invalid\nsig = 29b9b831e6694768910397fbe53e0a6868f75e3910d600e3421349bc4321d93067c78f6294b00e52e9c2fafdef67e0a460c3d76e6196fec6aab5c4964a4782c5da021466908d106193ec1b6b0bae4c9a5e3fcc4a355565c1dcfb76c489b4c3ad11b6f2182188470edf748eaf81646fcc164c60c1a55e9334076d8b5ce3d09808\n\n# tcId = 421\n# PKCS#1 padding too short\nmsg = 48656c6c6f\npadding = 000001ff...\nresult = invalid\nsig = 583dc8ac657ac9d55c74b6505f1a7a4b2225c038f36cc66d76a7eb8c818195b138e8bb2b26ac5a01ce32aa3f590815f0ecdf693877bdb12c5dd55b947b91f83d66639874ca263d1227dd0b6531e3eedf0b1e87a92b8db4be7c3c40d70865f56c8e0b6cf6607d47ed44acff9c4360d65f847f4ae947a13e4a56dff1d11503bc9b\n\n# tcId = 422\n# CVE-2017-11185\nmsg = 48656c6c6f\npadding = n\nresult = invalid\nsig = 9e62337ef7d4fabec2561bb45a18a362022b23666571bbc762c1c717a14a46d8f58119072aa26245e71fc6945540335163798fcbdea04b3104ee23f2c3874bbfb3e7e0c1ba5f1fca909265274414db6957a5eb668e0e36a388784355d528e51a6a4a9a9c6b6ab912812a268dac9dcacf1c13507768e63b1f82f8af29c3786a17\n\n# tcId = 423\n# invalid length\nmsg = 48656c6c6f\npadding = 2 bytes too long\nresult = invalid\nsig = 9e62337ef7d4fabec2561bb45a18a362022b23666571bbc762c1c717a14a46d8f58119072aa26245e71fc6945540335163798fcbdea04b3104ee23f2c3874bbfb3e7e0c1ba5f1fca909265274414db6957a5eb668e0e36a388784355d528e51a6a4a9a9c6b6ab912812a268dac9dcacf1c13507768e63b1f82f8af29c3786a170000\n\n# tcId = 424\n# empty signature\nmsg = 48656c6c6f\npadding = \nresult = invalid\nsig = \n\n# tcId = 425\n# 0\nmsg = 48656c6c6f\npadding = \nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 426\n# 1\nmsg = 48656c6c6f\npadding = \nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\n\n# tcId = 427\n# 2\nmsg = 48656c6c6f\npadding = \nresult = invalid\nsig = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 428\n# n-1\nmsg = 48656c6c6f\npadding = \nresult = invalid\nsig = 9e62337ef7d4fabec2561bb45a18a362022b23666571bbc762c1c717a14a46d8f58119072aa26245e71fc6945540335163798fcbdea04b3104ee23f2c3874bbfb3e7e0c1ba5f1fca909265274414db6957a5eb668e0e36a388784355d528e51a6a4a9a9c6b6ab912812a268dac9dcacf1c13507768e63b1f82f8af29c3786a16\n\n# tcId = 429\n# n+1\nmsg = 48656c6c6f\npadding = \nresult = invalid\nsig = 9e62337ef7d4fabec2561bb45a18a362022b23666571bbc762c1c717a14a46d8f58119072aa26245e71fc6945540335163798fcbdea04b3104ee23f2c3874bbfb3e7e0c1ba5f1fca909265274414db6957a5eb668e0e36a388784355d528e51a6a4a9a9c6b6ab912812a268dac9dcacf1c13507768e63b1f82f8af29c3786a18\n\n# tcId = 430\n# -1\nmsg = 48656c6c6f\npadding = \nresult = invalid\nsig = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n\n",
+};
+static const size_t kLen66 = 186818;
+
+static const char *kData67[] = {
+    "# Imported from Wycheproof's x25519_test.json.\n# This file is generated by convert_wycheproof.go. Do not edit by hand.\n#\n# Algorithm: X25519\n# Generator version: 0.4\n\n[curve = curve25519]\n\n# tcId = 1\n# normal case\ncurve = curve25519\nprivate = 4852834d9d6b77dadeabaaf2e11dca66d19fe74993a7bec36c6e16a0983feaba\npublic = 9c647d9ae589b9f58fdc3ca4947efbc915c4b2e08e744a0edf469dac59c8f85a\nresult = valid\nshared = 87b7f212b627f7a54ca5e0bcdaddd5389d9de6156cdbcf8ebe14ffbcfb436551\n\n# tcId = 2\n# public key on twist\ncurve = curve25519\nprivate = 588c061a50804ac488ad774ac716c3f5ba714b2712e048491379a500211998a8\npublic = 63aa40c6e38346c5caf23a6df0a5e6c80889a08647e551b3563449befcfc9733\nresult = acceptable\nshared = b1a707519495ffffb298ff941716b06dfab87cf8d91123fe2be9a233dda22212\n# Public keys are either points on curve25519 or points on its twist.\n# Implementations may either reject such keys or compute X25519 using the twist.\n# If a point multiplication is performed then it is important that the result is\n# correct, since otherwise attacks with invalid keys are possible.\n\n# tcId = 3\n# public key on twist\ncurve = curve25519\nprivate = b05bfd32e55325d9fd648cb302848039000b390e44d521e58aab3b29a6960ba8\npublic = 0f83c36fded9d32fadf4efa3ae93a90bb5cfa66893bc412c43fa7287dbb99779\nresult = acceptable\nshared = 67dd4a6e165533534c0e3f172e4ab8576bca923a5f07b2c069b4c310ff2e935b\n# Public keys are either points on curve25519 or points on its twist.\n# Implementations may either reject such keys or compute X25519 using the twist.\n# If a point multiplication is performed then it is important that the result is\n# correct, since otherwise attacks with invalid keys are possible.\n\n# tcId = 4\n# public key on twist\ncurve = curve25519\nprivate = 70e34bcbe1f47fbc0fddfd7c1e1aa53d57bfe0f66d243067b424bb6210bed19c\npublic = 0b8211a2b6049097f6871c6c052d3c5fc1ba17da9e32ae458403b05bb283092a\nresult = acceptable\nshared = 4a0638cfaa9ef1933b47f8939296a6b25be541ef7f70e844c0bcc00b134de64a\n# Public keys are either points on curve25519 or points on its twist.\n# Implementations may either reject such keys or compute X25519 using the twist.\n# If a point multiplication is performed then it is important that the result is\n# correct, since otherwise attacks with invalid keys are possible.\n\n# tcId = 5\n# public key on twist\ncurve = curve25519\nprivate = 68c1f3a653a4cdb1d37bba94738f8b957a57beb24d646e994dc29a276aad458d\npublic = 343ac20a3b9c6a27b1008176509ad30735856ec1c8d8fcae13912d08d152f46c\nresult = acceptable\nshared = 399491fce8dfab73b4f9f611de8ea0b27b28f85994250b0f475d585d042ac207\n# Public keys are either points on curve25519 or points on its twist.\n# Implementations may either reject such keys or compute X25519 using the twist.\n# If a point multiplication is performed then it is important that the result is\n# correct, since otherwise attacks with invalid keys are possible.\n\n# tcId = 6\n# public key on twist\ncurve = curve25519\nprivate = d877b26d06dff9d9f7fd4c5b3769f8cdd5b30516a5ab806be324ff3eb69ea0b2\npublic = fa695fc7be8d1be5bf704898f388c452bafdd3b8eae805f8681a8d15c2d4e142\nresult = acceptable\nshared = 2c4fe11d490a53861776b13b4354abd4cf5a97699db6e6c68c1626d07662f758\n# Public keys are either points on curve25519 or points on its twist.\n# Implementations may either reject such keys or compute X25519 using the twist.\n# If a point multiplication is performed then it is important that the result is\n# correct, since otherwise attacks with invalid keys are possible.\n\n# tcId = 7\n# public key = 0\ncurve = curve25519\nprivate = 207494038f2bb811d47805bcdf04a2ac585ada7f2f23389bfd4658f9ddd4debc\npublic = 0000000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 8\n# public key = 1\ncurve = curve25519\nprivate = 202e8972b61c7e61930eb9450b5070eae1c670475685541f0476217e4818cfab\npublic = 0100000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 9\n# edge case on twist\ncurve = curve25519\nprivate = 38dde9f3e7b799045f9ac3793d4a9277dadeadc41bec0290f81f744f73775f84\npublic = 0200000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 9a2cfe84ff9c4a9739625cae4a3b82a906877a441946f8d7b3d795fe8f5d1639\n\n# tcId = 10\n# edge case on twist\ncurve = curve25519\nprivate = 9857a914e3c29036fd9a442ba526b5cdcdf28216153e636c10677acab6bd6aa5\npublic = 0300000000000000000000000000000000000000000000000000000000000000\nresult = acceptable\nshared = 4da4e0aa072c232ee2f0fa4e519ae50b52c1edd08a534d4ef346c2e106d21d60\n\n# tcId = 11\n# edge case on twist\ncurve = curve25519\nprivate = 48e2130d723305ed05e6e5894d398a5e33367a8c6aac8fcdf0a88e4b42820db7\npublic = ffffff030000f8ffff1f0000c0ffffff000000feffff070000f0ffff3f000000\nresult = acceptable\nshared = 9ed10c53747f647f82f45125d3de15a1e6b824496ab40410ffcc3cfe95760f3b\n\n# tcId = 12\n# edge case on twist\ncurve = curve25519\nprivate = 28f41011691851b3a62b641553b30d0dfddcb8fffcf53700a7be2f6a872e9fb0\npublic = 000000fcffff070000e0ffff3f000000ffffff010000f8ffff0f0000c0ffff7f\nresult = acceptable\nshared = cf72b4aa6aa1c9f894f4165b86109aa468517648e1f0cc70e1ab08460176506b\n\n# tcId = 13\n# edge case on twist\ncurve = curve25519\nprivate = 18a93b6499b9f6b3225ca02fef410e0adec23532321d2d8ef1a6d602a8c65b83\npublic = 00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffff7f\nresult = acceptable\nshared = 5d50b62836bb69579410386cf7bb811c14bf85b1c7b17e5924c7ffea91ef9e12\n\n# tcId = 14\n# edge case on twist\ncurve = curve25519\nprivate = c01d1305a1338a1fcac2ba7e2e032b427e0b04903165aca957d8d0553d8717b0\npublic = eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 19230eb148d5d67c3c22ab1daeff80a57eae4265ce2872657b2c8099fc698e50\n\n# tcId = 15\n# edge case for public key\ncurve = curve25519\nprivate = 386f7f16c50731d64f82e6a170b142a4e34f31fd7768fcb8902925e7d1e21abe\npublic = 0400000000000000000000000000000000000000000000000000000000000000\nresult = valid\nshared = 0fcab5d842a078d7a71fc59b57bfb4ca0be6873b49dcdb9f44e14ae8fbdfa542\n\n# tcId = 16\n# edge case for public key\ncurve = curve25519\nprivate = e023a289bd5e90fa2804ddc019a05ef3e79d434bb6ea2f522ecb643a75296e95\npublic = ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000\nresult = valid\nshared = 54ce8f2275c077e3b1306a3939c5e03eef6bbb88060544758d9fef59b0bc3e4f\n\n# tcId = 17\n# edge case for public key\ncurve = curve25519\nprivate = 68f010d62ee8d926053a361c3a75c6ea4ebdc8606ab285003a6f8f4076b01e83\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03\nresult = valid\nshared = f136775c5beb0af8110af10b20372332043cab752419678775a223df57c9d30d\n\n# tcId = 18\n# edge case for public key\ncurve = curve25519\nprivate = 58ebcb35b0f8845caf1ec630f96576b62c4b7b6c36b29deb2cb0084651755c96\npublic = fffffffbfffffbffffdfffffdffffffffefffffefffff7fffff7ffffbfffff3f\nresult = valid\nshared = bf9affd06b844085586460962ef2146ff3d4533d9444aab006eb88cc3054407d\n\n# tcId = 19\n# edge case for public key\ncurve = curve25519\nprivate = 188c4bc5b9c44b38bb658b9b2ae82d5b01015e093184b17cb7863503a783e1bb\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f\nresult = valid\nshared = d480de04f699cb3be0684a9cc2e31281ea0bc5a9dcc157d3d20158d46ca5246d\n\n# tcId = 20\n# edge case for public key\ncurve = curve25519\nprivate = e06c11bb2e13ce3dc7673f67f5482242909423a9ae95ee986a988d98faee23a2\npublic = fffffffffeffff7ffffffffffeffff7ffffffffffeffff7ffffffffffeffff7f\nresult = valid\nshared = 4c4401cce6b51e4cb18f2790246c9bf914db667750a1cb89069092af07292276\n\n# tcId = 21\n# edge case for public key\ncurve = curve25519\nprivate = c0658c46dde18129293877535b1162b6f9f5414a23cf4d2cbc140a4d99da2b8f\npublic = ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = valid\nshared = 578ba8cc2dbdc575afcf9df2b3ee6189f5337d6854c79b4ce165ea12293b3a0f\n\n# tcId = 22\n# public key with low order\ncurve = curve25519\nprivate = 10255c9230a97a30a458ca284a629669293a31890cda9d147febc7d1e22d6bb1\npublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId",
+    " = 23\n# public key with low order\ncurve = curve25519\nprivate = 78f1e8edf14481b389448dac8f59c70b038e7cf92ef2c7eff57a72466e115296\npublic = 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 24\n# public key with low order\ncurve = curve25519\nprivate = a0a05a3e8f9f44204d5f8059a94ac7dfc39a49ac016dd743dbfa43c5d671fd88\npublic = ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 25\n# public key with low order\ncurve = curve25519\nprivate = d0dbb3ed1906663f15420af31f4eaf6509d9a9949723500605ad7c1c6e7450a9\npublic = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 26\n# public key with low order\ncurve = curve25519\nprivate = c0b1d0eb22b244fe3291140072cdd9d989b5f0ecd96c100feb5bca241c1d9f8f\npublic = eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 27\n# public key with low order\ncurve = curve25519\nprivate = 480bf45f594942a8bc0f3353c6e8b8853d77f351f1c2ca6c2d1abf8a00b4229c\npublic = 0000000000000000000000000000000000000000000000000000000000000080\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 28\n# public key with low order\ncurve = curve25519\nprivate = 30f993fcf8514fc89bd8db14cd43ba0d4b2530e73c4276a05e1b145d420cedb4\npublic = 0100000000000000000000000000000000000000000000000000000000000080\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 29\n# public key with low order\ncurve = curve25519\nprivate = c04974b758380e2a5b5df6eb09bb2f6b3434f982722a8e676d3da251d1b3de83\npublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 30\n# public key with low order\ncurve = curve25519\nprivate = 502a31373db32446842fe5add3e024022ea54f274182afc3d9f1bb3d39534eb5\npublic = 5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 31\n# public key with low order\ncurve = curve25519\nprivate = 90fa6417b0e37030fd6e43eff2abaef14c6793117a039cf621318ba90f4e98be\npublic = ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 32\n# public key with low order\ncurve = curve25519\nprivate = 78ad3f26027f1c9fdd975a1613b947779bad2cf2b741ade01840885a30bb979c\npublic = edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 33\n# public key with low order\ncurve = curve25519\nprivate = 98e23de7b1e0926ed9c87e7b14baf55f497a1d7096f93977680e44dc1c7b7b8b\npublic = eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 34\n# public key >= p\ncurve = curve25519\nprivate = f01e48dafac9d7bcf589cbc382c878d18bda3550589ffb5d50b523bebe329dae\npublic = efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = bd36a0790eb883098c988b21786773de0b3a4df162282cf110de18dd484ce74b\n\n# tcId = 35\n# public key >= p\ncurve = curve25519\nprivate = 288796bc5aff4b81a37501757bc0753a3c21964790d38699308debc17a6eaf8d\npublic = f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = b4e0dd76da7b071728b61f856771aa356e57eda78a5b1655cc3820fb5f854c5c\n\n# tcId = 36\n# public key >= p\ncurve = curve25519\nprivate = 98df845f6651bf1138221f119041f72b6dbc3c4ace7143d99fd55ad867480da8\npublic = f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 6fdf6c37611dbd5304dc0f2eb7c9517eb3c50e12fd050ac6dec27071d4bfc034\n\n# tcId = 37\n# public key >= p\ncurve = curve25519\nprivate = f09498e46f02f878829e78b803d316a2ed695d0498a08abdf8276930e24edcb0\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\nresult = acceptable\nshared = 4c8fc4b1c6ab88fb21f18f6d4c810240d4e94651ba44f7a2c863cec7dc56602d\n\n# tcId = 38\n# public key >= p\ncurve = curve25519\nprivate = 1813c10a5c7f21f96e17f288c0cc37607c04c5f5aea2db134f9e2ffc66bd9db8\npublic = 0200000000000000000000000000000000000000000000000000000000000080\nresult = acceptable\nshared = 1cd0b28267dc541c642d6d7dca44a8b38a63736eef5c4e6501ffbbb1780c033c\n\n# tcId = 39\n# public key >= p\ncurve = curve25519\nprivate = 7857fb808653645a0beb138a64f5f4d733a45ea84c3cda11a9c06f7e7139149e\npublic = 0300000000000000000000000000000000000000000000000000000000000080\nresult = acceptable\nshared = 8755be01c60a7e825cff3e0e78cb3aa4333861516aa59b1c51a8b2a543dfa822\n\n# tcId = 40\n# public key >= p\ncurve = curve25519\nprivate = e03aa842e2abc56e81e87b8b9f417b2a1e5913c723eed28d752f8d47a59f498f\npublic = 0400000000000000000000000000000000000000000000000000000000000080\nresult = acceptable\nshared = 54c9a1ed95e546d27822a360931dda60a1df049da6f904253c0612bbdc087476\n\n# tcId = 41\n# public key >= p\ncurve = curve25519\nprivate = f8f707b7999b18cb0d6b96124f2045972ca274bfc154ad0c87038c24c6d0d4b2\npublic = daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = cc1f40d743cdc2230e1043daba8b75e810f1fbab7f255269bd9ebb29e6bf494f\n\n# tcId = 42\n# public key >= p\ncurve = curve25519\nprivate = a034f684fa631e1a348118c1ce4c98231f2d9eec9ba5365b4a05d69a785b0796\npublic = dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 54998ee43a5b007bf499f078e736524400a8b5c7e9b9b43771748c7cdf880412\n\n# tcId = 43\n# public key >= p\ncurve = curve25519\nprivate = 30b6c6a0f2ffa680768f992ba89e152d5bc9893d38c9119be4f767bfab6e0ca5\npublic = dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = ead9b38efdd723637934e55ab717a7ae09eb86a21dc36a3feeb88b759e391e09\n\n# tcId = 44\n# public key >= p\ncurve = curve25519\nprivate = 901b9dcf881e01e027575035d40b43bdc1c5242e030847495b0c7286469b6591\npublic = eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 602ff40789b54b41805915fe2a6221f07a50ffc2c3fc94cf61f13d7904e88e0e\n\n# tcId = 45\n# public key >= p\ncurve = curve25519\nprivate = 8046677c28fd82c9a1bdb71a1a1a34faba1225e2507fe3f54d10bd5b0d865f8e\npublic = ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = e00ae8b143471247ba24f12c885536c3cb981b58e1e56b2baf35c12ae1f79c26\n\n# tcId = 46\n# public key >= p\ncurve = curve25519\nprivate = 602f7e2f68a846b82cc269b1d48e939886ae54fd636c1fe074d710127d472491\npublic = efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 98cb9b50dd3fc2b0d4f2d2bf7c5cfdd10c8fcd31fc40af1ad44f47c131376362\n\n# tcId = 47\n# public key >= p\ncurve = curve25519\nprivate = 60887b3dc72443026ebedbbbb70665f42b87add1440e7768fbd7e8e2ce5f639d\npublic = f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 38d6304c4a7e6d9f7959334fb5245bd2c754525d4c91db950206926234c1f633\n\n# tcId = 48\n# public key >= p\ncurve = curve25519\nprivate = 78d31dfa854497d72d8def8a1b7fb006cec2d8c4924647c93814ae56faeda495\npublic = f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 786cd54996f014a5a031ec14db812ed08355061fdb5de680a800ac521f318e23\n\n# tcId = 49\n# public key >= p\ncurve = curve25519\nprivate = c04c5baefa8302ddded6a4bb957761b4eb97aefa4fc3b8043085f96a5659b3a5\npublic = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\nresult = acceptable\nshared = 29ae8bc73e9b10a08b4f681c43c3e0ac1a171d31b38f1a48efba29ae639ea134\n\n# tcId = 50\n# RFC 7748\ncurve = curve25519\nprivate = a046e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449a44\npublic = e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a",
+    "903a6d0ab1c4c\nresult = valid\nshared = c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552\n\n# tcId = 51\n# RFC 7748\ncurve = curve25519\nprivate = 4866e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba4d\npublic = e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a413\nresult = valid\nshared = 95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957\n\n# tcId = 52\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 0ab4e76380d84dde4f6833c58f2a9fb8f83bb0169b172be4b6e0592887741a36\nresult = acceptable\nshared = 0200000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 53\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 89e10d5701b4337d2d032181538b1064bd4084401ceca1fd12663a1959388000\nresult = valid\nshared = 0900000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 54\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 2b55d3aa4a8f80c8c0b2ae5f933e85af49beac36c2fa7394bab76c8933f8f81d\nresult = valid\nshared = 1000000000000000000000000000000000000000000000000000000000000000\n\n# tcId = 55\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 63e5b1fe9601fe84385d8866b0421262f78fbfa5aff9585e626679b18547d959\nresult = acceptable\nshared = feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f\n\n# tcId = 56\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = e428f3dac17809f827a522ce32355058d07369364aa78902ee10139b9f9dd653\nresult = valid\nshared = fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f\n\n# tcId = 57\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = b3b50e3ed3a407b95de942ef74575b5ab8a10c09ee103544d60bdfed8138ab2b\nresult = acceptable\nshared = f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f\n\n# tcId = 58\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 213fffe93d5ea8cd242e462844029922c43c77c9e3e42f562f485d24c501a20b\nresult = valid\nshared = f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f\n\n# tcId = 59\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 91b232a178b3cd530932441e6139418f72172292f1da4c1834fc5ebfefb51e3f\nresult = valid\nshared = ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03\n\n# tcId = 60\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 045c6e11c5d332556c7822fe94ebf89b56a3878dc27ca079103058849fabcb4f\nresult = acceptable\nshared = e5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 61\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 1ca2190b71163539063c35773bda0c9c928e9136f0620aeb093f099197b7f74e\nresult = acceptable\nshared = e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 62\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = f76e9010ac33c5043b2d3b76a842171000c4916222e9e85897a0aec7f6350b3c\nresult = valid\nshared = ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 63\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = bb72688d8f8aa7a39cd6060cd5c8093cdec6fe341937c3886a99346cd07faa55\nresult = acceptable\nshared = dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f\n\n# tcId = 64\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 88fddea193391c6a5933ef9b71901549447205aae9da928a6b91a352ba10f41f\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000000002\n\n# tcId = 65\n# edge case for shared secret\ncurve = curve25519\nprivate = a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63\npublic = 303b392f153116cad9cc682a00ccc44c95ff0d3bbe568beb6c4e739bafdc2c68\nresult = acceptable\nshared = 0000000000000000000000000000000000000000000000000000000000008000\n\n# tcId = 66\n# checking for overflow\ncurve = curve25519\nprivate = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2\npublic = fd300aeb40e1fa582518412b49b208a7842b1e1f056a040178ea4141534f652d\nresult = valid\nshared = b734105dc257585d73b566ccb76f062795ccbec89128e52b02f3e59639f13c46\n\n# tcId = 67\n# checking for overflow\ncurve = curve25519\nprivate = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2\npublic = c8ef79b514d7682677bc7931e06ee5c27c9b392b4ae9484473f554e6678ecc2e\nresult = valid\nshared = 647a46b6fc3f40d62141ee3cee706b4d7a9271593a7b143e8e2e2279883e4550\n\n# tcId = 68\n# checking for overflow\ncurve = curve25519\nprivate = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2\npublic = 64aeac2504144861532b7bbcb6c87d67dd4c1f07ebc2e06effb95aecc6170b2c\nresult = valid\nshared = 4ff03d5fb43cd8657a3cf37c138cadcecce509e4eba089d0ef40b4e4fb946155\n\n# tcId = 69\n# checking for overflow\ncurve = curve25519\nprivate = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2\npublic = bf68e35e9bdb7eee1b50570221860f5dcdad8acbab031b14974cc49013c49831\nresult = valid\nshared = 21cee52efdbc812e1d021a4af1e1d8bc4db3c400e4d2a2c56a3926db4d99c65b\n\n# tcId = 70\n# checking for overflow\ncurve = curve25519\nprivate = c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2\npublic = 5347c491331a64b43ddc683034e677f53dc32b52a52a577c15a83bf298e99f19\nresult = valid\nshared = 18cb89e4e20c0c2bd324305245266c9327690bbe79acb88f5b8fb3f74eca3e52\n\n# tcId = 71\n# private key == -1 (mod order)\ncurve = curve25519\nprivate = a023cdd083ef5bb82f10d62e59e15a6800000000000000000000000000000050\npublic = 258e04523b8d253ee65719fc6906c657192d80717edc828fa0af21686e2faa75\nresult = valid\nshared = 258e04523b8d253ee65719fc6906c657192d80717edc828fa0af21686e2faa75\n\n# tcId = 72\n# private key == 1 (mod order) on twist\ncurve = curve25519\nprivate = 58083dd261ad91eff952322ec824c682ffffffffffffffffffffffffffffff5f\npublic = 2eae5ec3dd494e9f2d37d258f873a8e6e9d0dbd1e383ef64d98bb91b3e0be035\nresult = acceptable\nshared = 2eae5ec3dd494e9f2d37d258f873a8e6e9d0dbd1e383ef64d98bb91b3e0be035\n\n",
+};
+static const size_t kLen67 = 23096;
+
 static std::string AssembleString(const char **data, size_t len) {
   std::string ret;
   for (size_t i = 0; i < len; i += 8192) {
@@ -2939,6 +3224,51 @@
   if (strcmp(path, "crypto/x509/some_names3.pem") == 0) {
     return AssembleString(kData52, kLen52);
   }
+  if (strcmp(path, "third_party/wycheproof/aes_cbc_pkcs5_test.txt") == 0) {
+    return AssembleString(kData53, kLen53);
+  }
+  if (strcmp(path, "third_party/wycheproof/aes_gcm_siv_test.txt") == 0) {
+    return AssembleString(kData54, kLen54);
+  }
+  if (strcmp(path, "third_party/wycheproof/aes_gcm_test.txt") == 0) {
+    return AssembleString(kData55, kLen55);
+  }
+  if (strcmp(path, "third_party/wycheproof/chacha20_poly1305_test.txt") == 0) {
+    return AssembleString(kData56, kLen56);
+  }
+  if (strcmp(path, "third_party/wycheproof/dsa_test.txt") == 0) {
+    return AssembleString(kData57, kLen57);
+  }
+  if (strcmp(path, "third_party/wycheproof/ecdh_test.txt") == 0) {
+    return AssembleString(kData58, kLen58);
+  }
+  if (strcmp(path, "third_party/wycheproof/ecdsa_secp224r1_sha224_test.txt") == 0) {
+    return AssembleString(kData59, kLen59);
+  }
+  if (strcmp(path, "third_party/wycheproof/ecdsa_secp224r1_sha256_test.txt") == 0) {
+    return AssembleString(kData60, kLen60);
+  }
+  if (strcmp(path, "third_party/wycheproof/ecdsa_secp256r1_sha256_test.txt") == 0) {
+    return AssembleString(kData61, kLen61);
+  }
+  if (strcmp(path, "third_party/wycheproof/ecdsa_secp384r1_sha384_test.txt") == 0) {
+    return AssembleString(kData62, kLen62);
+  }
+  if (strcmp(path, "third_party/wycheproof/ecdsa_secp384r1_sha512_test.txt") == 0) {
+    return AssembleString(kData63, kLen63);
+  }
+  if (strcmp(path, "third_party/wycheproof/ecdsa_secp521r1_sha512_test.txt") == 0) {
+    return AssembleString(kData64, kLen64);
+  }
+  if (strcmp(path, "third_party/wycheproof/eddsa_test.txt") == 0) {
+    return AssembleString(kData65, kLen65);
+  }
+  if (strcmp(path, "third_party/wycheproof/rsa_signature_test.txt") == 0) {
+    return AssembleString(kData66, kLen66);
+  }
+  if (strcmp(path, "third_party/wycheproof/x25519_test.txt") == 0) {
+    return AssembleString(kData67, kLen67);
+  }
   fprintf(stderr, "File not embedded: %s.\n", path);
   abort();
 }
diff --git a/third_party/unrar/BUILD.gn b/third_party/unrar/BUILD.gn
index a330d27..12a3a1c 100644
--- a/third_party/unrar/BUILD.gn
+++ b/third_party/unrar/BUILD.gn
@@ -57,14 +57,8 @@
       "src/volume.cpp",
     ]
 
-    configs -= [
-      "//build/config/compiler:chromium_code",
-      "//build/config/compiler:no_exceptions",
-    ]
-    configs += [
-      "//build/config/compiler:no_chromium_code",
-      "//build/config/compiler:exceptions",
-    ]
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [ "//build/config/compiler:no_chromium_code" ]
 
     defines = [
       "_FILE_OFFSET_BITS=64",
@@ -74,6 +68,13 @@
       # The following is set to disable certain macro definitions in the unrar
       # source code.
       "CHROMIUM_UNRAR",
+
+      # Disables exceptions in unrar, replaces them with process termination.
+      "UNRAR_NO_EXCEPTIONS",
+    ]
+
+    deps = [
+      "//base",
     ]
   }
 }
diff --git a/third_party/unrar/DEPS b/third_party/unrar/DEPS
new file mode 100644
index 0000000..4e143b6
--- /dev/null
+++ b/third_party/unrar/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  '+base',
+]
diff --git a/third_party/unrar/README.chromium b/third_party/unrar/README.chromium
index ca19bb91..d3d73dc 100644
--- a/third_party/unrar/README.chromium
+++ b/third_party/unrar/README.chromium
@@ -11,3 +11,9 @@
 This library is used to decompress and analyze .RAR and other related files that
 have been downloaded by the user to check their Safe Browsing reputation. It is
 only for Chromium on desktop.
+
+Warning:
+Please note that changes have been made to this library to terminate the current
+process in which this library is running, when it encounters some error
+conditions. This is acceptable for Chromium because the library executes inside
+a sandbox, but may not apply more broadly.
diff --git a/third_party/unrar/src/errhnd.cpp b/third_party/unrar/src/errhnd.cpp
index e862bb3a..6e62a6c 100644
--- a/third_party/unrar/src/errhnd.cpp
+++ b/third_party/unrar/src/errhnd.cpp
@@ -1,3 +1,9 @@
+// NOTE(vakh): The process.h file needs to be included first because "rar.hpp"
+// defines certain macros that cause symbol redefinition errors
+#if defined(UNRAR_NO_EXCEPTIONS)
+#include "base/process/process.h"
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
+
 #include "rar.hpp"
 
 ErrorHandler::ErrorHandler()
@@ -320,7 +326,11 @@
     mprintf(L"\n%s\n",St(MProgAborted));
 #endif
   SetErrorCode(Code);
+#if defined(UNRAR_NO_EXCEPTIONS)
+  base::Process::Current().Terminate(Code, false);
+#else
   throw Code;
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
 }
 
 
diff --git a/third_party/unrar/src/model.cpp b/third_party/unrar/src/model.cpp
index e91b44070..b0b3a4a1 100644
--- a/third_party/unrar/src/model.cpp
+++ b/third_party/unrar/src/model.cpp
@@ -43,13 +43,27 @@
   InitRL=-(MaxOrder < 12 ? MaxOrder:12)-1;
   MinContext = MaxContext = (RARPPM_CONTEXT*) SubAlloc.AllocContext();
   if (MinContext == NULL)
+  {
+#if defined(UNRAR_NO_EXCEPTIONS)
+    base::Process::Current().Terminate(RARX_MEMORY, false);
+#else
     throw std::bad_alloc();
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
+  }
+
   MinContext->Suffix=NULL;
   OrderFall=MaxOrder;
   MinContext->U.SummFreq=(MinContext->NumStats=256)+1;
   FoundState=MinContext->U.Stats=(RARPPM_STATE*)SubAlloc.AllocUnits(256/2);
   if (FoundState == NULL)
+  {
+#if defined(UNRAR_NO_EXCEPTIONS)
+    base::Process::Current().Terminate(RARX_MEMORY, false);
+#else
     throw std::bad_alloc();
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
+  }
+
   for (RunLength=InitRL, PrevSuccess=i=0;i < 256;i++) 
   {
     MinContext->U.Stats[i].Symbol=i;      
diff --git a/third_party/unrar/src/unpack.cpp b/third_party/unrar/src/unpack.cpp
index 1cda19c..f619afd 100644
--- a/third_party/unrar/src/unpack.cpp
+++ b/third_party/unrar/src/unpack.cpp
@@ -1,3 +1,9 @@
+// NOTE(vakh): The process.h file needs to be included first because "rar.hpp"
+// defines certain macros that cause symbol redefinition errors
+#if defined(UNRAR_NO_EXCEPTIONS)
+#include "base/process/process.h"
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
+
 #include "rar.hpp"
 
 #include "coder.cpp"
@@ -89,7 +95,13 @@
 
   // We do not handle growth for existing fragmented window.
   if (Grow && Fragmented)
+  {
+#if defined(UNRAR_NO_EXCEPTIONS)
+    base::Process::Current().Terminate(RARX_MEMORY, false);
+#else
     throw std::bad_alloc();
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
+  }
 
   byte *NewWindow=Fragmented ? NULL : (byte *)malloc(WinSize);
 
@@ -99,7 +111,11 @@
     {
       // We do not support growth for new fragmented window.
       // Also exclude RAR4 and small dictionaries.
+#if defined(UNRAR_NO_EXCEPTIONS)
+      base::Process::Current().Terminate(RARX_MEMORY, false);
+#else
       throw std::bad_alloc();
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
     }
     else
     {
diff --git a/third_party/unrar/src/unpack50frag.cpp b/third_party/unrar/src/unpack50frag.cpp
index 745b1b3..ffe1c6b5 100644
--- a/third_party/unrar/src/unpack50frag.cpp
+++ b/third_party/unrar/src/unpack50frag.cpp
@@ -46,9 +46,15 @@
         break;
       Size-=Size/32;
     }
-    if (NewMem==NULL)
+    if (NewMem == NULL)
+    {
+#if defined(UNRAR_NO_EXCEPTIONS)
+      base::Process::Current().Terminate(RARX_MEMORY, false);
+#else
       throw std::bad_alloc();
-    
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
+    }
+
     // Clean the window to generate the same output when unpacking corrupt
     // RAR files, which may access to unused areas of sliding dictionary.
     memset(NewMem,0,Size);
@@ -58,8 +64,14 @@
     MemSize[BlockNum]=TotalSize;
     BlockNum++;
   }
-  if (TotalSize<WinSize) // Not found enough free blocks.
+  if (TotalSize < WinSize)  // Not found enough free blocks.
+  {
+#if defined(UNRAR_NO_EXCEPTIONS)
+    base::Process::Current().Terminate(RARX_MEMORY, false);
+#else
     throw std::bad_alloc();
+#endif  // defined(UNRAR_NO_EXCEPTIONS)
+  }
 }
 
 
diff --git a/tools/code_coverage/coverage.py b/tools/code_coverage/coverage.py
index 00df624..f0f99d44 100755
--- a/tools/code_coverage/coverage.py
+++ b/tools/code_coverage/coverage.py
@@ -1281,6 +1281,11 @@
   assert os.path.abspath(os.getcwd()) == SRC_ROOT_PATH, ('This script must be '
                                                          'called from the root '
                                                          'of checkout.')
+
+  # This helps to setup coverage binaries even when script is called with
+  # empty params. This is used by coverage bot for initial setup.
+  DownloadCoverageToolsIfNeeded()
+
   args = _ParseCommandArguments()
   global BUILD_DIR
   BUILD_DIR = args.build_dir
@@ -1304,8 +1309,6 @@
   _ValidateBuildingWithClangCoverage()
   _VerifyTargetExecutablesAreInBuildDirectory(args.command)
 
-  DownloadCoverageToolsIfNeeded()
-
   absolute_filter_paths = []
   if args.filters:
     absolute_filter_paths = _VerifyPathsAndReturnAbsolutes(args.filters)
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 18037ad4..167be6f 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -14949,6 +14949,9 @@
 
 <histogram name="DataReductionProxy.ResponseProxyServerStatus"
     enum="DataReductionProxyResponseProxyServerStatus">
+  <obsolete>
+    Deprecated 2018/05.
+  </obsolete>
   <owner>sclittle@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <summary>
diff --git a/tools/perf/core/benchmark_sharding_map.json b/tools/perf/core/benchmark_sharding_map.json
index 46e8b83..46a5df8a 100644
--- a/tools/perf/core/benchmark_sharding_map.json
+++ b/tools/perf/core/benchmark_sharding_map.json
@@ -1782,7 +1782,7 @@
     }
   },
   "Win 10 High-DPI Perf": {
-    "build117-b1": {
+    "build194-b7": {
       "benchmarks": [
         "blink_perf.dom",
         "blink_perf.paint",
@@ -1800,7 +1800,7 @@
         "v8.runtime_stats.top_25"
       ]
     },
-    "build118-b1": {
+    "build195-b7": {
       "benchmarks": [
         "blink_perf.bindings",
         "blink_perf.canvas",
@@ -1825,7 +1825,7 @@
         "v8.browsing_mobile"
       ]
     },
-    "build119-b1": {
+    "build196-b7": {
       "benchmarks": [
         "battor.trivial_pages",
         "blink_perf.layout",
@@ -1850,7 +1850,7 @@
         "wasm"
       ]
     },
-    "build120-b1": {
+    "build197-b7": {
       "benchmarks": [
         "blink_perf.parser",
         "blink_perf.svg",
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index a96bfb7..1bdcb27 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -251,10 +251,10 @@
       {
        'gpu': '8086:1616',
        'os': 'Windows-10',
-       'pool': 'Chrome-perf',
+       'pool': 'chrome.test.perf',
        'device_ids': [
-           'build117-b1', 'build118-b1',
-           'build119-b1', 'build120-b1',
+           'build194-b7', 'build195-b7',
+           'build196-b7', 'build197-b7',
            'build180-b4' # Added in https://crbug.com/695613
           ]
       }
@@ -1024,6 +1024,40 @@
       },
       'device_ids': [
       ],
+    },
+    'android-pixel2_webview-perf': {
+      'tests': [
+        {
+          'isolate': 'performance_webview_test_suite',
+          'num_shards': 7
+        }
+      ],
+      'platform': 'android-webview',
+      'dimension': {
+        'pool': 'chrome.test.perf-webview-fyi',
+        'os': 'Android',
+        'device_type': 'walleye',
+        'device_is': 'O'
+      },
+      'device_ids': [
+      ],
+    },
+    'android-pixel2-perf': {
+      'tests': [
+        {
+          'isolate': 'performance_test_suite',
+          'num_shards': 7
+        }
+      ],
+      'platform': 'android',
+      'dimension': {
+        'pool': 'chrome.test.perf-fyi',
+        'os': 'Android',
+        'device_type': 'walleye',
+        'device_is': 'O'
+      },
+      'device_ids': [
+      ],
     }
   }
 }
@@ -1146,10 +1180,9 @@
   if tester_config.get('testing', False):
     browser_name = 'reference'
   elif tester_config['platform'] == 'android':
-    if tester_config.get('replace_system_webview', False):
-      browser_name = 'android-webview'
-    else:
-      browser_name = 'android-chromium'
+    browser_name = 'android-chromium'
+  elif tester_config['platform'] == 'android-webview':
+    browser_name = 'android-webview'
   elif (tester_config['platform'] == 'win'
     and tester_config['target_bits'] == 64):
     browser_name = 'release_x64'
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 66317dd..b62278a 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -32,6 +32,7 @@
 crbug.com/551950 [ Android_Svelte ] blink_perf.layout/* [ Skip ]
 crbug.com/832686 [ Nexus_5 ] blink_perf.layout/subtree-detaching.html [ Skip ]
 crbug.com/832686 [ Nexus_7 ] blink_perf.layout/subtree-detaching.html [ Skip ]
+crbug.com/839494 [ Android_One ] blink_perf.layout/subtree-detaching.html [ Skip ]
 
 # Benchmark: blink_perf.paint
 crbug.com/574483 [ Android_Svelte ] blink_perf.paint/* [ Skip ]
@@ -351,6 +352,7 @@
 crbug.com/798465 [ Win ] v8.browsing_desktop/browse:news:flipboard [ Skip ]
 crbug.com/813165 [ Win ] v8.browsing_desktop/browse:media:flickr_infinite_scroll [ Skip ]
 crbug.com/805934 [ Mac_10.12 ] v8.browsing_desktop/browse:tech:discourse_infinite_scroll [ Skip ]
+crbug.com/839470 [ Win ] v8.browsing_desktop/browse:social:twitter_infinite_scroll [ Skip ]
 
 # Benchmark: v8.browsing_desktop-future
 crbug.com/773084 [ Mac ] v8.browsing_desktop-future/browse:tools:maps [ Skip ]
diff --git a/ui/aura/window_event_dispatcher.cc b/ui/aura/window_event_dispatcher.cc
index 31f80f2..dd79a62 100644
--- a/ui/aura/window_event_dispatcher.cc
+++ b/ui/aura/window_event_dispatcher.cc
@@ -28,6 +28,7 @@
 #include "ui/base/hit_test.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/compositor/dip_util.h"
+#include "ui/display/screen.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/gestures/gesture_recognizer.h"
@@ -227,10 +228,7 @@
 
 gfx::Point WindowEventDispatcher::GetLastMouseLocationInRoot() const {
   gfx::Point location = Env::GetInstance()->last_mouse_location();
-  client::ScreenPositionClient* client =
-      client::GetScreenPositionClient(window());
-  if (client)
-    client->ConvertPointFromScreen(window(), &location);
+  ConvertPointFromScreen(&location);
   return location;
 }
 
@@ -264,6 +262,13 @@
   return host_->window();
 }
 
+void WindowEventDispatcher::ConvertPointFromScreen(gfx::Point* point) const {
+  client::ScreenPositionClient* client =
+      client::GetScreenPositionClient(window());
+  if (client)
+    client->ConvertPointFromScreen(window(), point);
+}
+
 void WindowEventDispatcher::TransformEventForDeviceScaleFactor(
     ui::LocatedEvent* event) {
   event->UpdateForRootTransform(
@@ -860,10 +865,14 @@
   if (Env::GetInstance()->mouse_button_flags())
     return details;
 
-  gfx::Point root_mouse_location = GetLastMouseLocationInRoot();
-  if (!window()->bounds().Contains(root_mouse_location))
+  // Do not use GetLastMouseLocationInRoot here because it's not updated when
+  // the mouse is not over the window or when the window is minimized.
+  gfx::Point mouse_location =
+      display::Screen::GetScreen()->GetCursorScreenPoint();
+  ConvertPointFromScreen(&mouse_location);
+  if (!window()->bounds().Contains(mouse_location))
     return details;
-  gfx::Point host_mouse_location = root_mouse_location;
+  gfx::Point host_mouse_location = mouse_location;
   host_->ConvertDIPToPixels(&host_mouse_location);
   ui::MouseEvent event(ui::ET_MOUSE_MOVED, host_mouse_location,
                        host_mouse_location, ui::EventTimeForNow(),
diff --git a/ui/aura/window_event_dispatcher.h b/ui/aura/window_event_dispatcher.h
index 02d9f4b1..a16b9180 100644
--- a/ui/aura/window_event_dispatcher.h
+++ b/ui/aura/window_event_dispatcher.h
@@ -147,6 +147,10 @@
   Window* window();
   const Window* window() const;
 
+  // Converts a point from screen coordinates to the coordinate space used by
+  // the Window returned from window().
+  void ConvertPointFromScreen(gfx::Point* screen_point) const;
+
   // Updates the event with the appropriate transform for the device scale
   // factor. The WindowEventDispatcher dispatches events in the physical pixel
   // coordinate. But the event processing from WindowEventDispatcher onwards
diff --git a/ui/base/win/direct_manipulation.cc b/ui/base/win/direct_manipulation.cc
index 0d9d7b3..5da6460c 100644
--- a/ui/base/win/direct_manipulation.cc
+++ b/ui/base/win/direct_manipulation.cc
@@ -18,7 +18,8 @@
 
 // static
 std::unique_ptr<DirectManipulationHelper>
-DirectManipulationHelper::CreateInstance(HWND window) {
+DirectManipulationHelper::CreateInstance(HWND window,
+                                         WindowEventTarget* event_target) {
   if (!::IsWindow(window))
     return nullptr;
 
@@ -33,7 +34,7 @@
       base::WrapUnique(new DirectManipulationHelper());
   instance->window_ = window;
 
-  if (instance->Initialize())
+  if (instance->Initialize(event_target))
     return instance;
 
   return nullptr;
@@ -54,9 +55,8 @@
   std::unique_ptr<DirectManipulationHelper> instance =
       base::WrapUnique(new DirectManipulationHelper());
 
-  instance->event_handler_ =
-      Microsoft::WRL::Make<DirectManipulationHandler>(instance.get());
-  instance->event_handler_->SetWindowEventTarget(event_target);
+  instance->event_handler_ = Microsoft::WRL::Make<DirectManipulationHandler>(
+      instance.get(), event_target);
 
   instance->viewport_ = viewport;
 
@@ -74,7 +74,7 @@
 // the fake viewport.
 const RECT VIEWPORT_DEFAULT_RECT = {0, 0, 1000, 1000};
 
-bool DirectManipulationHelper::Initialize() {
+bool DirectManipulationHelper::Initialize(WindowEventTarget* event_target) {
   // IDirectManipulationUpdateManager is the first COM object created by the
   // application to retrieve other objects in the Direct Manipulation API.
   // It also serves to activate and deactivate Direct Manipulation functionality
@@ -115,7 +115,8 @@
   if (!SUCCEEDED(hr))
     return false;
 
-  event_handler_ = Microsoft::WRL::Make<DirectManipulationHandler>(this);
+  event_handler_ =
+      Microsoft::WRL::Make<DirectManipulationHandler>(this, event_target);
   if (!SUCCEEDED(hr))
     return false;
 
@@ -208,8 +209,9 @@
 }
 
 DirectManipulationHandler::DirectManipulationHandler(
-    DirectManipulationHelper* helper)
-    : helper_(helper) {}
+    DirectManipulationHelper* helper,
+    WindowEventTarget* event_target)
+    : helper_(helper), event_target_(event_target) {}
 
 DirectManipulationHandler::~DirectManipulationHandler() {}
 
diff --git a/ui/base/win/direct_manipulation.h b/ui/base/win/direct_manipulation.h
index 28601ce..c0b603a 100644
--- a/ui/base/win/direct_manipulation.h
+++ b/ui/base/win/direct_manipulation.h
@@ -40,7 +40,8 @@
               Microsoft::WRL::FtmBase,
               IDirectManipulationViewportEventHandler>> {
  public:
-  explicit DirectManipulationHandler(DirectManipulationHelper* helper);
+  explicit DirectManipulationHandler(DirectManipulationHelper* helper,
+                                     WindowEventTarget* event_target);
 
   // WindowEventTarget updates for every DM_POINTERHITTEST in case window
   // hierarchy changed.
@@ -99,7 +100,9 @@
   // Creates and initializes an instance of this class if Direct Manipulation is
   // enabled on the platform. Returns nullptr if it disabled or failed on
   // initialization.
-  static std::unique_ptr<DirectManipulationHelper> CreateInstance(HWND window);
+  static std::unique_ptr<DirectManipulationHelper> CreateInstance(
+      HWND window,
+      WindowEventTarget* event_target);
 
   // Creates and initializes an instance for testing.
   static std::unique_ptr<DirectManipulationHelper> CreateInstanceForTesting(
@@ -135,7 +138,7 @@
 
   // This function instantiates Direct Manipulation and creates a viewport for
   // the passed in |window|. Return false if initialize failed.
-  bool Initialize();
+  bool Initialize(WindowEventTarget* event_target);
 
   void SetDeviceScaleFactorForTesting(float factor);
 
diff --git a/ui/file_manager/integration_tests/gallery/open_image_files.js b/ui/file_manager/integration_tests/gallery/open_image_files.js
index 0f597a3..589185e 100644
--- a/ui/file_manager/integration_tests/gallery/open_image_files.js
+++ b/ui/file_manager/integration_tests/gallery/open_image_files.js
@@ -16,7 +16,7 @@
   var launchedPromise = launch(testVolumeName, volumeType, [ENTRIES.desktop]);
   return launchedPromise.then(function(args) {
     var WIDTH = 880;
-    var HEIGHT = 603; /* Inner height 570px + native header 33px. */
+    var HEIGHT = 602; /* Inner height 570px + native header 32px. */
     var appId = args.appId;
     var resizedWindowPromise = gallery.callRemoteTestUtil(
         'resizeWindow', appId, [WIDTH, HEIGHT]
diff --git a/ui/file_manager/integration_tests/gallery/photo_editor.js b/ui/file_manager/integration_tests/gallery/photo_editor.js
index 2f429265..1d16edc 100644
--- a/ui/file_manager/integration_tests/gallery/photo_editor.js
+++ b/ui/file_manager/integration_tests/gallery/photo_editor.js
@@ -105,8 +105,8 @@
         then(function() {
           return gallery.waitForSlideImage(
               appId,
-              532,
-              398,
+              534,
+              400,
               'My Desktop Background');
         }).
         then(function() {
@@ -375,7 +375,7 @@
  */
 testcase.resizeImageOnDrive = function() {
   return resizeImage('drive', 'drive');
-}
+};
 
 /**
  * The enableDisableOverwriteOriginalCheckbox test for Downloads.
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index 36ff28c..69492b442 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -216,8 +216,9 @@
       }
     }
 
-    if (is_posix && !is_fuchsia) {
-      # Windows has USE_EGL but doesn't support base::FileDescriptor
+    if (is_posix && !is_fuchsia && !is_mac) {
+      # Windows has USE_EGL but doesn't support base::FileDescriptor.
+      # libsync isn't supported or needed on MacOSX.
       # Fuchsia is excluded due to a libsync dependency and because it's
       # unknown if the required EGL_ANDROID_native_fence_sync extension works
       # there. If it does and there's a use case, this could be revisited.
diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc
index 220a7ca..b37e969 100644
--- a/ui/gl/gl_fence.cc
+++ b/ui/gl/gl_fence.cc
@@ -18,7 +18,9 @@
 #include "ui/gl/gl_fence_apple.h"
 #endif
 
-#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_FUCHSIA)
+#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_FUCHSIA) && \
+    !defined(OS_MACOSX)
+#define USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC
 #include "ui/gl/gl_fence_android_native_fence_sync.h"
 #include "ui/gl/gl_surface_egl.h"
 #endif
@@ -92,7 +94,7 @@
 }
 
 bool GLFence::IsGpuFenceSupported() {
-#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_FUCHSIA)
+#if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC)
   return gl::GLSurfaceEGL::IsAndroidNativeFenceSyncSupported();
 #else
   return false;
@@ -105,7 +107,7 @@
   DCHECK(IsGpuFenceSupported());
   switch (gpu_fence.GetGpuFenceHandle().type) {
     case gfx::GpuFenceHandleType::kAndroidNativeFenceSync:
-#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_FUCHSIA)
+#if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC)
       return GLFenceAndroidNativeFenceSync::CreateFromGpuFence(gpu_fence);
 #else
       NOTREACHED();
@@ -120,7 +122,7 @@
 // static
 std::unique_ptr<GLFence> GLFence::CreateForGpuFence() {
   DCHECK(IsGpuFenceSupported());
-#if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_FUCHSIA)
+#if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC)
   return GLFenceAndroidNativeFenceSync::CreateForGpuFence();
 #endif
   NOTREACHED();
diff --git a/ui/platform_window/win/win_window.cc b/ui/platform_window/win/win_window.cc
index 1474296..a1023c9e 100644
--- a/ui/platform_window/win/win_window.cc
+++ b/ui/platform_window/win/win_window.cc
@@ -125,7 +125,9 @@
   ::SetCursor(cursor);
 }
 
-void WinWindow::MoveCursorTo(const gfx::Point& location) {}
+void WinWindow::MoveCursorTo(const gfx::Point& location) {
+  ::SetCursorPos(location.x(), location.y());
+}
 
 void WinWindow::ConfineCursorToBounds(const gfx::Rect& bounds) {
 }