Create list_internal_identifiers.py

This is the equivalent of `list-identifiers.sh --internal`, which is
useful for generating an exclusion file for ABI/API checking.

Signed-off-by: Yuto Takano <yuto.takano@arm.com>
diff --git a/tests/scripts/list_internal_identifiers.py b/tests/scripts/list_internal_identifiers.py
new file mode 100755
index 0000000..d58cb3f
--- /dev/null
+++ b/tests/scripts/list_internal_identifiers.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+#
+# Copyright The Mbed TLS Contributors
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+This script generates a file called _identifiers that contains all Mbed TLS
+identifiers found on internal headers. This is the equivalent of what was
+previously `list-identifiers.sh --internal`, and is useful for generating an
+exclusion file list for ABI/API checking, since we do not promise compatibility
+for them.
+
+It uses the NameCeck class from check_names.py to perform the parsing.
+
+Returns 0 on success, 1 if there is a script error.
+Must be run from Mbed TLS root.
+"""
+
+import argparse
+import traceback
+import sys
+from check_names import NameCheck
+
+def main():
+    parser = argparse.ArgumentParser(
+        formatter_class=argparse.RawDescriptionHelpFormatter,
+        description=(
+            "This script writes a list of parsed identifiers in internal "
+            "headers to \"_identifiers\". This is useful for generating a list "
+            "of names to exclude from ABI checking. "))
+
+    parser.parse_args()
+
+    try:
+        name_check = NameCheck()
+        internal_headers = (
+            name_check.get_files("include/mbedtls/*_internal.h") +
+            name_check.get_files("library/*.h")
+        )
+
+        result = name_check.parse_identifiers(internal_headers)
+
+        identifiers = ["{}\n".format(match.name) for match in result]
+        with open("_identifiers", "w", encoding="utf-8") as f:
+            f.writelines(identifiers)
+
+    except Exception: # pylint: disable=broad-except
+        traceback.print_exc()
+        sys.exit(1)
+
+if __name__ == "__main__":
+    main()